commeownder/main/game.c

108 lines
4.0 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;
}
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, "player_id", &val) == ESP_OK) g_player_id = (uint8_t)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_str(nvs, "pname", g_player_name);
nvs_set_i32(nvs, "player_id", (int32_t)g_player_id);
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);
}