#include "game.h" #include "config.h" #include "state.h" #include "ble.h" #include "nvs.h" #include "esp_err.h" #include #include const int start_life_opts[] = {20, 30, 40}; const char NAME_CHARS[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; const char *counter_names[NUM_COUNTERS] = {"POISON", "EXPERIENCE", "ENERGY", "LORE", "STORM"}; void settings_reset_defaults(void) { g_brightness_pct = 10; g_start_life_index = 2; g_num_opponents = 3; strncpy(g_player_name, "PLAYER 1", PLAYER_NAME_LEN); g_player_name[PLAYER_NAME_LEN] = '\0'; g_ble_enabled = 0; g_led_max = 26; g_game_id[0] = BLE_GAME_ID_0; g_game_id[1] = BLE_GAME_ID_1; g_menu_hold_ms = 500; g_lr_hold_ms = 500; g_display_flip = 0; g_delta_timeout_ms = 1000; g_sleep_timeout_min = SLEEP_TIMEOUT_DEF; } void game_reset(void) { g_life = start_life_opts[g_start_life_index]; g_eliminated = 0; memset(g_cmdr_damage, 0, sizeof(g_cmdr_damage)); memset(g_counters, 0, sizeof(g_counters)); } void check_elimination(void) { if (g_life <= 0 || g_counters[0] >= 10) { g_eliminated = 1; return; } for (int i = 0; i < g_num_opponents; i++) if (g_cmdr_damage[i] >= 21) { g_eliminated = 1; return; } g_eliminated = 0; } void settings_load(void) { nvs_handle_t nvs; if (nvs_open(NVS_NS, NVS_READONLY, &nvs) != ESP_OK) return; int32_t val; if (nvs_get_i32(nvs, "brightness", &val) == ESP_OK) g_brightness_pct = (int)val; if (nvs_get_i32(nvs, "start_life", &val) == ESP_OK) g_start_life_index = (int)val; if (nvs_get_i32(nvs, "num_opp", &val) == ESP_OK) g_num_opponents = (int)val; if (nvs_get_i32(nvs, "ble_en", &val) == ESP_OK) g_ble_enabled = (int)val; if (nvs_get_i32(nvs, "game_id", &val) == ESP_OK) { g_game_id[0] = (uint8_t)((val >> 8) & 0xFF); g_game_id[1] = (uint8_t)(val & 0xFF); } size_t len = sizeof(g_player_name); nvs_get_str(nvs, "pname", g_player_name, &len); if (nvs_get_i32(nvs, "menu_hold", &val) == ESP_OK) g_menu_hold_ms = (int)val; if (nvs_get_i32(nvs, "lr_hold", &val) == ESP_OK) g_lr_hold_ms = (int)val; if (nvs_get_i32(nvs, "disp_flip", &val) == ESP_OK) g_display_flip = (int)val; if (nvs_get_i32(nvs, "delta_to", &val) == ESP_OK) g_delta_timeout_ms = (int)val; if (nvs_get_i32(nvs, "sleep_to", &val) == ESP_OK) g_sleep_timeout_min = (int)val; if (nvs_get_i32(nvs, "life", &val) == ESP_OK) g_life = (int)val; char key[8]; for (int i = 0; i < MAX_OPPONENTS; i++) { snprintf(key, sizeof(key), "cmdr%d", i); if (nvs_get_i32(nvs, key, &val) == ESP_OK) g_cmdr_damage[i] = (int)val; } for (int i = 0; i < NUM_COUNTERS; i++) { snprintf(key, sizeof(key), "cnt%d", i); if (nvs_get_i32(nvs, key, &val) == ESP_OK) g_counters[i] = (int)val; } nvs_close(nvs); } void settings_save(void) { nvs_handle_t nvs; if (nvs_open(NVS_NS, NVS_READWRITE, &nvs) != ESP_OK) return; nvs_set_i32(nvs, "brightness", (int32_t)g_brightness_pct); nvs_set_i32(nvs, "start_life", (int32_t)g_start_life_index); nvs_set_i32(nvs, "num_opp", (int32_t)g_num_opponents); nvs_set_i32(nvs, "ble_en", (int32_t)g_ble_enabled); nvs_set_i32(nvs, "game_id", (int32_t)((g_game_id[0] << 8) | g_game_id[1])); nvs_set_i32(nvs, "menu_hold", (int32_t)g_menu_hold_ms); nvs_set_i32(nvs, "lr_hold", (int32_t)g_lr_hold_ms); nvs_set_i32(nvs, "disp_flip", (int32_t)g_display_flip); nvs_set_i32(nvs, "delta_to", (int32_t)g_delta_timeout_ms); nvs_set_i32(nvs, "sleep_to", (int32_t)g_sleep_timeout_min); nvs_set_str(nvs, "pname", g_player_name); nvs_set_i32(nvs, "life", (int32_t)g_life); char key[8]; for (int i = 0; i < MAX_OPPONENTS; i++) { snprintf(key, sizeof(key), "cmdr%d", i); nvs_set_i32(nvs, key, (int32_t)g_cmdr_damage[i]); } for (int i = 0; i < NUM_COUNTERS; i++) { snprintf(key, sizeof(key), "cnt%d", i); nvs_set_i32(nvs, key, (int32_t)g_counters[i]); } nvs_commit(nvs); nvs_close(nvs); }