TRX/src/config.c

205 lines
6.6 KiB
C
Raw Normal View History

#include "config.h"
2021-03-14 13:50:30 +01:00
#include "game/const.h"
2021-03-18 16:14:28 +01:00
#include "filesystem.h"
2021-03-18 21:03:32 +01:00
#include "json.h"
#include "util.h"
2021-03-14 13:50:30 +01:00
#include <stdlib.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 { \
2021-03-18 20:53:12 +01:00
T1MConfig.opt = func(root_obj, QUOTE(opt), default_value); \
2021-03-07 15:59:00 +01:00
} while (0)
#define READ_BOOL(opt, default_value) \
2021-03-18 20:53:12 +01:00
READ_PRIMITIVE(json_object_get_bool, opt, default_value)
2021-03-07 15:59:00 +01:00
#define READ_INTEGER(opt, default_value) \
2021-03-18 20:53:12 +01:00
READ_PRIMITIVE(json_object_get_number_int, opt, default_value)
2021-03-07 15:59:00 +01:00
#define READ_CUSTOM(func, opt, default_value) \
2021-02-22 21:36:00 +01:00
do { \
2021-03-18 20:53:12 +01:00
T1MConfig.opt = func(root_obj, 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(
2021-03-18 20:53:12 +01:00
struct json_object_s *obj, const char *name, int8_t default_value)
{
2021-03-18 20:53:12 +01:00
const char *value_str = json_object_get_string(obj, name, NULL);
if (value_str) {
2021-03-07 15:59:00 +01:00
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-03-07 15:59:00 +01:00
return default_value;
}
2021-03-07 15:59:00 +01:00
static int8_t ReadBarLocation(
2021-03-18 20:53:12 +01:00
struct json_object_s *obj, const char *name, int8_t default_value)
2021-02-22 23:21:35 +01:00
{
2021-03-18 20:53:12 +01:00
const char *value_str = json_object_get_string(obj, name, NULL);
if (value_str) {
2021-03-07 15:59:00 +01:00
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
2021-03-18 20:53:12 +01:00
ReadBarColor(struct json_object_s *obj, const char *name, int8_t default_value)
{
2021-03-18 20:53:12 +01:00
const char *value_str = json_object_get_string(obj, name, NULL);
if (value_str) {
2021-03-07 15:59:00 +01:00
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;
}
}
return default_value;
}
2021-03-11 14:54:59 +01:00
int8_t T1MReadConfigFromJson(const char *cfg_data)
2021-03-07 15:59:00 +01:00
{
2021-03-11 14:54:59 +01:00
int8_t result = 0;
2021-03-18 20:53:12 +01:00
struct json_value_s *root;
2021-03-11 14:54:59 +01:00
struct json_parse_result_s parse_result;
2021-03-18 20:53:12 +01:00
root = json_parse_ex(
2021-03-07 15:59:00 +01:00
cfg_data, strlen(cfg_data), json_parse_flags_allow_json5, NULL, NULL,
2021-03-11 14:54:59 +01:00
&parse_result);
2021-03-18 20:53:12 +01:00
if (!root) {
2021-03-11 14:54:59 +01:00
TRACE(
"failed to parse config file: %s in line %d, char %d",
2021-03-18 20:53:12 +01:00
json_get_error_description(parse_result.error),
2021-03-11 14:54:59 +01:00
parse_result.error_line_no, parse_result.error_row_no);
2021-03-18 20:53:12 +01:00
goto cleanup;
2021-03-11 14:54:59 +01:00
} else {
result = 1;
}
2021-03-07 15:59:00 +01:00
2021-03-18 20:53:12 +01:00
struct json_object_s *root_obj = json_value_as_object(root);
2021-03-07 15:59:00 +01:00
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_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);
2021-03-17 13:56:05 +01:00
READ_BOOL(enable_compass_stats, 1);
READ_BOOL(enable_timer_in_inventory, 1);
2021-03-07 15:59:00 +01:00
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_illegal_gun_equip, 1);
READ_BOOL(fix_fmv_esc_key, 1);
READ_BOOL(fix_secrets_killing_music, 1);
READ_BOOL(fix_creature_dist_calc, 1);
2021-03-07 15:59:00 +01:00
READ_INTEGER(fov_value, 65);
READ_BOOL(fov_vertical, 1);
READ_BOOL(disable_demo, 0);
READ_BOOL(disable_fmv, 0);
2021-03-11 20:14:26 +01:00
READ_BOOL(disable_cine, 0);
2021-03-07 15:59:00 +01:00
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);
2021-03-18 20:53:12 +01:00
cleanup:
if (root) {
json_value_free(root);
2021-03-11 14:54:59 +01:00
}
return result;
2021-03-07 15:59:00 +01:00
}
2021-03-11 14:54:59 +01:00
int8_t T1MReadConfig()
{
2021-03-11 14:54:59 +01:00
int8_t result = 0;
2021-03-18 16:14:28 +01:00
MYFILE *fp = NULL;
2021-03-11 14:54:59 +01:00
char *cfg_data = NULL;
2021-03-18 16:14:28 +01:00
fp = FileOpen("cfg/Tomb1Main.json5", FILE_OPEN_READ);
if (!fp) {
2021-03-11 14:54:59 +01:00
result = T1MReadConfigFromJson("");
goto cleanup;
}
2021-03-18 16:14:28 +01:00
size_t cfg_data_size = FileSize(fp);
2021-03-11 16:56:00 +01:00
cfg_data = malloc(cfg_data_size + 1);
if (!cfg_data) {
2021-03-11 14:54:59 +01:00
result = T1MReadConfigFromJson("");
goto cleanup;
}
2021-03-18 16:14:28 +01:00
FileRead(cfg_data, 1, cfg_data_size, fp);
2021-03-11 16:56:00 +01:00
cfg_data[cfg_data_size] = '\0';
2021-03-18 16:14:28 +01:00
FileClose(fp);
2021-03-11 14:54:59 +01:00
fp = NULL;
2021-03-11 14:54:59 +01:00
result = T1MReadConfigFromJson(cfg_data);
2021-03-11 14:54:59 +01:00
cleanup:
if (fp) {
2021-03-18 16:14:28 +01:00
FileClose(fp);
2021-03-11 14:54:59 +01:00
}
if (cfg_data) {
free(cfg_data);
}
return result;
}