2021-02-28 21:25:35 +01:00
|
|
|
#include "config.h"
|
|
|
|
#include "game/const.h"
|
|
|
|
#include "json_utils.h"
|
|
|
|
#include "util.h"
|
2021-02-22 21:20:50 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2021-02-22 21:36:00 +01:00
|
|
|
#define Q(x) #x
|
|
|
|
#define QUOTE(x) Q(x)
|
2021-03-07 15:59:00 +01:00
|
|
|
|
|
|
|
#define READ_PRIMITIVE(func, opt, default_value) \
|
|
|
|
do { \
|
|
|
|
if (!func(json, QUOTE(opt), &T1MConfig.opt)) { \
|
|
|
|
T1MConfig.opt = default_value; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
#define READ_BOOL(opt, default_value) \
|
|
|
|
READ_PRIMITIVE(JSONGetBooleanValue, opt, default_value)
|
|
|
|
#define READ_INTEGER(opt, default_value) \
|
|
|
|
READ_PRIMITIVE(JSONGetIntegerValue, opt, default_value)
|
|
|
|
|
|
|
|
#define READ_CUSTOM(func, opt, default_value) \
|
2021-02-22 21:36:00 +01:00
|
|
|
do { \
|
2021-03-07 15:59:00 +01:00
|
|
|
T1MConfig.opt = func(json, QUOTE(opt), default_value); \
|
2021-02-22 21:36:00 +01:00
|
|
|
} while (0)
|
2021-03-07 15:59:00 +01:00
|
|
|
#define READ_BAR_SHOWING_MODE(opt, default_value) \
|
|
|
|
READ_CUSTOM(ReadBarShowingMode, opt, default_value)
|
|
|
|
#define READ_BAR_LOCATION(opt, default_value) \
|
|
|
|
READ_CUSTOM(ReadBarLocation, opt, default_value)
|
|
|
|
#define READ_BAR_COLOR(opt, default_value) \
|
|
|
|
READ_CUSTOM(ReadBarColor, opt, default_value)
|
2021-02-22 21:36:00 +01:00
|
|
|
|
2021-03-07 15:59:00 +01:00
|
|
|
static int8_t ReadBarShowingMode(
|
|
|
|
struct json_value_s* root, const char* name, int8_t default_value)
|
2021-02-22 21:20:50 +01:00
|
|
|
{
|
2021-03-07 15:59:00 +01:00
|
|
|
const char* value_str;
|
|
|
|
if (JSONGetStringValue(root, name, &value_str)) {
|
|
|
|
if (!strcmp(value_str, "flashing-or-default")) {
|
|
|
|
return T1M_BSM_FLASHING_OR_DEFAULT;
|
|
|
|
} else if (!strcmp(value_str, "flashing-only")) {
|
|
|
|
return T1M_BSM_FLASHING_ONLY;
|
|
|
|
} else if (!strcmp(value_str, "always")) {
|
|
|
|
return T1M_BSM_ALWAYS;
|
|
|
|
} else if (!strcmp(value_str, "never")) {
|
|
|
|
return T1M_BSM_NEVER;
|
|
|
|
}
|
2021-02-22 21:20:50 +01:00
|
|
|
}
|
2021-03-07 15:59:00 +01:00
|
|
|
return default_value;
|
2021-02-22 21:20:50 +01:00
|
|
|
}
|
|
|
|
|
2021-03-07 15:59:00 +01:00
|
|
|
static int8_t ReadBarLocation(
|
2021-02-22 23:21:35 +01:00
|
|
|
struct json_value_s* root, const char* name, int8_t default_value)
|
|
|
|
{
|
2021-03-07 15:59:00 +01:00
|
|
|
const char* value_str;
|
|
|
|
if (JSONGetStringValue(root, name, &value_str)) {
|
|
|
|
if (!strcmp(value_str, "top-left")) {
|
|
|
|
return T1M_BL_TOP_LEFT;
|
|
|
|
} else if (!strcmp(value_str, "top-center")) {
|
|
|
|
return T1M_BL_TOP_CENTER;
|
|
|
|
} else if (!strcmp(value_str, "top-right")) {
|
|
|
|
return T1M_BL_TOP_RIGHT;
|
|
|
|
} else if (!strcmp(value_str, "bottom-left")) {
|
|
|
|
return T1M_BL_BOTTOM_LEFT;
|
|
|
|
} else if (!strcmp(value_str, "bottom-center")) {
|
|
|
|
return T1M_BL_BOTTOM_CENTER;
|
|
|
|
} else if (!strcmp(value_str, "bottom-right")) {
|
|
|
|
return T1M_BL_BOTTOM_RIGHT;
|
|
|
|
}
|
2021-02-22 23:21:35 +01:00
|
|
|
}
|
|
|
|
return default_value;
|
|
|
|
}
|
|
|
|
|
2021-03-07 15:59:00 +01:00
|
|
|
static int8_t
|
|
|
|
ReadBarColor(struct json_value_s* root, const char* name, int8_t default_value)
|
2021-02-22 21:20:50 +01:00
|
|
|
{
|
2021-03-07 15:59:00 +01:00
|
|
|
const char* value_str;
|
|
|
|
if (JSONGetStringValue(root, name, &value_str)) {
|
|
|
|
if (!strcmp(value_str, "gold")) {
|
|
|
|
return T1M_BC_GOLD;
|
|
|
|
} else if (!strcmp(value_str, "blue")) {
|
|
|
|
return T1M_BC_BLUE;
|
|
|
|
} else if (!strcmp(value_str, "grey")) {
|
|
|
|
return T1M_BC_GREY;
|
|
|
|
} else if (!strcmp(value_str, "red")) {
|
|
|
|
return T1M_BC_RED;
|
|
|
|
} else if (!strcmp(value_str, "silver")) {
|
|
|
|
return T1M_BC_SILVER;
|
|
|
|
} else if (!strcmp(value_str, "green")) {
|
|
|
|
return T1M_BC_GREEN;
|
|
|
|
} else if (!strcmp(value_str, "gold2")) {
|
|
|
|
return T1M_BC_GOLD2;
|
|
|
|
} else if (!strcmp(value_str, "blue2")) {
|
|
|
|
return T1M_BC_BLUE2;
|
|
|
|
} else if (!strcmp(value_str, "pink")) {
|
|
|
|
return T1M_BC_PINK;
|
|
|
|
}
|
2021-02-22 21:20:50 +01:00
|
|
|
}
|
|
|
|
return default_value;
|
|
|
|
}
|
|
|
|
|
2021-03-07 15:59:00 +01:00
|
|
|
void T1MReadConfigFromJson(const char* cfg_data)
|
|
|
|
{
|
|
|
|
struct json_value_s* json = json_parse_ex(
|
|
|
|
cfg_data, strlen(cfg_data), json_parse_flags_allow_json5, NULL, NULL,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
READ_BOOL(disable_healing_between_levels, 0);
|
|
|
|
READ_BOOL(disable_medpacks, 0);
|
|
|
|
READ_BOOL(disable_magnums, 0);
|
|
|
|
READ_BOOL(disable_uzis, 0);
|
|
|
|
READ_BOOL(disable_shotgun, 0);
|
|
|
|
READ_BOOL(enable_enemy_healthbar, 1);
|
|
|
|
READ_BOOL(enable_enhanced_look, 1);
|
|
|
|
READ_BOOL(enable_enhanced_ui, 1);
|
|
|
|
READ_BOOL(enable_shotgun_flash, 1);
|
|
|
|
READ_BOOL(enable_cheats, 0);
|
|
|
|
READ_BOOL(enable_numeric_keys, 1);
|
|
|
|
READ_BOOL(enable_tr3_sidesteps, 1);
|
|
|
|
READ_BOOL(enable_braid, 0);
|
|
|
|
READ_BOOL(fix_key_triggers, 1);
|
|
|
|
READ_BOOL(fix_end_of_level_freeze, 1);
|
|
|
|
READ_BOOL(fix_tihocan_secret_sound, 1);
|
|
|
|
READ_BOOL(fix_pyramid_secret_trigger, 1);
|
|
|
|
READ_BOOL(fix_hardcoded_secret_counts, 1);
|
|
|
|
READ_BOOL(fix_illegal_gun_equip, 1);
|
|
|
|
READ_INTEGER(fov_value, 65);
|
|
|
|
READ_BOOL(fov_vertical, 1);
|
|
|
|
|
|
|
|
READ_BAR_SHOWING_MODE(healthbar_showing_mode, T1M_BSM_FLASHING_OR_DEFAULT);
|
|
|
|
READ_BAR_SHOWING_MODE(airbar_showing_mode, T1M_BSM_DEFAULT);
|
|
|
|
READ_BAR_LOCATION(healthbar_location, T1M_BL_TOP_LEFT);
|
|
|
|
READ_BAR_LOCATION(airbar_location, T1M_BL_TOP_RIGHT);
|
|
|
|
READ_BAR_LOCATION(enemy_healthbar_location, T1M_BL_BOTTOM_LEFT);
|
|
|
|
READ_BAR_COLOR(healthbar_color, T1M_BC_RED);
|
|
|
|
READ_BAR_COLOR(airbar_color, T1M_BC_BLUE);
|
|
|
|
READ_BAR_COLOR(enemy_healthbar_color, T1M_BC_GREY);
|
|
|
|
|
|
|
|
CLAMP(T1MConfig.fov_value, 30, 255);
|
|
|
|
|
|
|
|
free(json);
|
|
|
|
}
|
|
|
|
|
2021-02-22 21:20:50 +01:00
|
|
|
int T1MReadConfig()
|
|
|
|
{
|
2021-03-07 15:14:35 +01:00
|
|
|
FILE* fp = fopen("Tomb1Main.json5", "rb");
|
2021-02-22 21:20:50 +01:00
|
|
|
if (!fp) {
|
2021-03-07 15:59:00 +01:00
|
|
|
T1MReadConfigFromJson("");
|
2021-02-22 21:20:50 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
fseek(fp, 0, SEEK_END);
|
|
|
|
int cfg_size = ftell(fp);
|
|
|
|
fseek(fp, 0, SEEK_SET);
|
|
|
|
|
|
|
|
char* cfg_data = malloc(cfg_size);
|
|
|
|
if (!cfg_data) {
|
|
|
|
fclose(fp);
|
2021-03-07 15:59:00 +01:00
|
|
|
T1MReadConfigFromJson("");
|
2021-02-22 21:20:50 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
fread(cfg_data, 1, cfg_size, fp);
|
|
|
|
fclose(fp);
|
|
|
|
|
2021-03-07 15:59:00 +01:00
|
|
|
T1MReadConfigFromJson(cfg_data);
|
2021-02-28 21:25:35 +01:00
|
|
|
|
2021-02-22 21:20:50 +01:00
|
|
|
free(cfg_data);
|
|
|
|
return 1;
|
|
|
|
}
|