Weather system added, mostly decoration. Some tweaks to residents. Moved altar to its own menu, s for sacrifice. You can no longer burn incense outside the base.

This commit is contained in:
Storm Dragon
2026-01-20 12:30:26 -05:00
parent 9b7fbc8266
commit 4caa5caefb
28 changed files with 1973 additions and 72 deletions

View File

@@ -145,7 +145,9 @@ void clear_world_objects() {
clear_zombies();
clear_bandits();
clear_flying_creatures();
clear_mountains();
clear_world_drops();
}
void reset_game_state() {
@@ -174,6 +176,8 @@ void reset_game_state() {
base_max_health = 10;
max_health = 10;
favor = 0.0;
incense_hours_remaining = 0;
incense_burning = false;
blessing_speed_active = false;
inv_stones = 0;
@@ -186,6 +190,9 @@ void reset_game_state() {
inv_small_game_types.resize(0);
inv_meat = 0;
inv_skins = 0;
inv_feathers = 0;
inv_down = 0;
inv_incense = 0;
inv_spears = 0;
inv_snares = 0;
inv_axes = 0;
@@ -211,6 +218,9 @@ void reset_game_state() {
storage_small_game_types.resize(0);
storage_meat = 0;
storage_skins = 0;
storage_feathers = 0;
storage_down = 0;
storage_incense = 0;
storage_spears = 0;
storage_snares = 0;
storage_axes = 0;
@@ -283,6 +293,7 @@ void start_new_game() {
spawn_trees(5, 19);
init_barricade();
init_time();
init_weather();
save_game_state();
}
@@ -430,6 +441,8 @@ bool load_game_state_from_raw(const string&in rawData) {
if (get_raw_number(rawData, "player_base_health", value)) base_max_health = value;
if (get_raw_number(rawData, "player_max_health", value)) max_health = value;
if (get_raw_number(rawData, "player_favor", value)) favor = value;
if (get_raw_number(rawData, "incense_hours_remaining", value)) incense_hours_remaining = value;
if (get_raw_bool(rawData, "incense_burning", bool_value)) incense_burning = bool_value;
if (get_raw_number(rawData, "time_current_hour", value)) current_hour = value;
if (get_raw_number(rawData, "world_map_size", value)) MAP_SIZE = value;
if (get_raw_number(rawData, "world_expanded_area_start", value)) expanded_area_start = value;
@@ -459,6 +472,9 @@ bool load_game_state_from_raw(const string&in rawData) {
if (get_raw_number(rawData, "inventory_small_game", value)) inv_small_game = value;
if (get_raw_number(rawData, "inventory_meat", value)) inv_meat = value;
if (get_raw_number(rawData, "inventory_skins", value)) inv_skins = value;
if (get_raw_number(rawData, "inventory_feathers", value)) inv_feathers = value;
if (get_raw_number(rawData, "inventory_down", value)) inv_down = value;
if (get_raw_number(rawData, "inventory_incense", value)) inv_incense = value;
if (get_raw_number(rawData, "inventory_spears", value)) inv_spears = value;
if (get_raw_number(rawData, "inventory_snares", value)) inv_snares = value;
if (get_raw_number(rawData, "inventory_axes", value)) inv_axes = value;
@@ -487,6 +503,7 @@ bool load_game_state_from_raw(const string&in rawData) {
if (equipped_arms != EQUIP_POUCH) equipped_arms = EQUIP_NONE;
if (equipped_arms == EQUIP_POUCH && inv_skin_pouches <= 0) equipped_arms = EQUIP_NONE;
if (incense_hours_remaining > 0) incense_burning = true;
if (inv_small_game_types.length() == 0 && inv_small_game > 0) {
for (int i = 0; i < inv_small_game; i++) {
@@ -518,6 +535,8 @@ bool save_game_state() {
saveData.set("player_base_health", base_max_health);
saveData.set("player_max_health", max_health);
saveData.set("player_favor", favor);
saveData.set("incense_hours_remaining", incense_hours_remaining);
saveData.set("incense_burning", incense_burning);
saveData.set("inventory_stones", inv_stones);
saveData.set("inventory_sticks", inv_sticks);
@@ -528,6 +547,9 @@ bool save_game_state() {
saveData.set("inventory_small_game", inv_small_game);
saveData.set("inventory_meat", inv_meat);
saveData.set("inventory_skins", inv_skins);
saveData.set("inventory_feathers", inv_feathers);
saveData.set("inventory_down", inv_down);
saveData.set("inventory_incense", inv_incense);
saveData.set("inventory_spears", inv_spears);
saveData.set("inventory_snares", inv_snares);
saveData.set("inventory_axes", inv_axes);
@@ -554,6 +576,9 @@ bool save_game_state() {
saveData.set("storage_small_game", storage_small_game);
saveData.set("storage_meat", storage_meat);
saveData.set("storage_skins", storage_skins);
saveData.set("storage_feathers", storage_feathers);
saveData.set("storage_down", storage_down);
saveData.set("storage_incense", storage_incense);
saveData.set("storage_spears", storage_spears);
saveData.set("storage_snares", storage_snares);
saveData.set("storage_axes", storage_axes);
@@ -605,6 +630,8 @@ bool save_game_state() {
}
saveData.set("quest_queue", join_string_array(questData));
saveData.set("weather_data", serialize_weather());
saveData.set("world_map_size", MAP_SIZE);
saveData.set("world_expanded_area_start", expanded_area_start);
saveData.set("world_expanded_area_end", expanded_area_end);
@@ -685,6 +712,12 @@ bool save_game_state() {
}
saveData.set("mountains_data", join_string_array(mountainData));
string[] dropData;
for (uint i = 0; i < world_drops.length(); i++) {
dropData.insert_last(world_drops[i].position + "|" + world_drops[i].type);
}
saveData.set("drops_data", join_string_array(dropData));
string rawData = saveData.serialize();
string encryptedData = encrypt_save_data(rawData);
return save_data(SAVE_FILE_PATH, encryptedData);
@@ -755,6 +788,9 @@ bool load_game_state() {
max_health = int(get_number(saveData, "player_max_health", 10));
base_max_health = int(get_number(saveData, "player_base_health", max_health));
favor = get_number(saveData, "player_favor", 0.0);
incense_hours_remaining = int(get_number(saveData, "incense_hours_remaining", 0));
incense_burning = get_bool(saveData, "incense_burning", false);
if (incense_hours_remaining > 0) incense_burning = true;
if (x < 0) x = 0;
if (x >= MAP_SIZE) x = MAP_SIZE - 1;
@@ -770,6 +806,9 @@ bool load_game_state() {
inv_small_game = int(get_number(saveData, "inventory_small_game", 0));
inv_meat = int(get_number(saveData, "inventory_meat", 0));
inv_skins = int(get_number(saveData, "inventory_skins", 0));
inv_feathers = int(get_number(saveData, "inventory_feathers", 0));
inv_down = int(get_number(saveData, "inventory_down", 0));
inv_incense = int(get_number(saveData, "inventory_incense", 0));
inv_spears = int(get_number(saveData, "inventory_spears", 0));
inv_snares = int(get_number(saveData, "inventory_snares", 0));
inv_axes = int(get_number(saveData, "inventory_axes", 0));
@@ -809,6 +848,9 @@ bool load_game_state() {
storage_small_game = int(get_number(saveData, "storage_small_game", 0));
storage_meat = int(get_number(saveData, "storage_meat", 0));
storage_skins = int(get_number(saveData, "storage_skins", 0));
storage_feathers = int(get_number(saveData, "storage_feathers", 0));
storage_down = int(get_number(saveData, "storage_down", 0));
storage_incense = int(get_number(saveData, "storage_incense", 0));
storage_spears = int(get_number(saveData, "storage_spears", 0));
storage_snares = int(get_number(saveData, "storage_snares", 0));
storage_axes = int(get_number(saveData, "storage_axes", 0));
@@ -900,6 +942,13 @@ bool load_game_state() {
is_daytime = (current_hour >= 6 && current_hour < 19);
hour_timer.restart();
string weather_data;
if (saveData.get("weather_data", weather_data) && weather_data.length() > 0) {
deserialize_weather(weather_data);
} else {
init_weather();
}
string[] treeData = get_string_list_or_split(saveData, "trees_data");
for (uint i = 0; i < treeData.length(); i++) {
string[]@ parts = treeData[i].split("|");
@@ -1061,6 +1110,13 @@ bool load_game_state() {
world_mountains.insert_last(mountain);
}
string[] dropData = get_string_list_or_split(saveData, "drops_data");
for (uint i = 0; i < dropData.length(); i++) {
string[]@ parts = dropData[i].split("|");
if (parts.length() < 2) continue;
add_world_drop(parse_int(parts[0]), parts[1]);
}
update_ambience(true);
return true;
}