109 lines
4.1 KiB
C
109 lines
4.1 KiB
C
#include "game.h"
|
|
#include "config.h"
|
|
#include "state.h"
|
|
#include "ble.h"
|
|
#include "nvs.h"
|
|
#include "esp_err.h"
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
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);
|
|
}
|