Sound has been updated. As a result snares can be collected from a bit further away as it is now harder to tell when you're about to step on it. A few string updates. Mountain terrain added. May require rope for traversal.

This commit is contained in:
Storm Dragon
2026-01-19 15:00:01 -05:00
parent 93dfd7347b
commit 5a16f798ac
12 changed files with 774 additions and 172 deletions

View File

@@ -145,6 +145,7 @@ void clear_world_objects() {
clear_zombies();
clear_bandits();
clear_mountains();
}
void reset_game_state() {
@@ -161,6 +162,13 @@ void reset_game_state() {
fall_start_y = 0;
sling_charging = false;
searching = false;
rope_climbing = false;
rope_climb_up = true;
rope_climb_target_x = 0;
rope_climb_target_y = 0;
rope_climb_start_y = 0;
pending_rope_climb_x = -1;
pending_rope_climb_elevation = 0;
player_health = 10;
base_max_health = 10;
@@ -302,6 +310,32 @@ string serialize_bandit(Bandit@ bandit) {
return bandit.position + "|" + bandit.health + "|" + bandit.weapon_type + "|" + bandit.behavior_state + "|" + bandit.wander_direction + "|" + bandit.move_interval;
}
string serialize_mountain(MountainRange@ mountain) {
string result = mountain.start_position + "|" + mountain.end_position + "|";
// Serialize elevations
for (int i = 0; i < int(mountain.elevations.length()); i++) {
if (i > 0) result += ",";
result += mountain.elevations[i];
}
result += "|";
// Serialize terrain types
for (int i = 0; i < int(mountain.terrain_types.length()); i++) {
if (i > 0) result += ",";
result += mountain.terrain_types[i];
}
result += "|";
// Serialize stream positions
for (uint i = 0; i < mountain.stream_positions.length(); i++) {
if (i > 0) result += ",";
result += mountain.stream_positions[i];
}
return result;
}
string join_string_array(const string[]@ arr) {
if (@arr == null || arr.length() == 0) return "";
string result = arr[0];
@@ -645,6 +679,12 @@ bool save_game_state() {
}
saveData.set("bandits_data", join_string_array(banditData));
string[] mountainData;
for (uint i = 0; i < world_mountains.length(); i++) {
mountainData.insert_last(serialize_mountain(world_mountains[i]));
}
saveData.set("mountains_data", join_string_array(mountainData));
string rawData = saveData.serialize();
string encryptedData = encrypt_save_data(rawData);
return save_data(SAVE_FILE_PATH, encryptedData);
@@ -982,6 +1022,45 @@ bool load_game_state() {
bandits.insert_last(b);
}
string[] mountainData = get_string_list_or_split(saveData, "mountains_data");
for (uint i = 0; i < mountainData.length(); i++) {
string[]@ parts = mountainData[i].split("|");
if (parts.length() < 5) continue;
int start_pos = parse_int(parts[0]);
int end_pos = parse_int(parts[1]);
int size = end_pos - start_pos + 1;
// Create mountain with minimal init (we'll override everything)
MountainRange@ mountain = MountainRange(start_pos, 1);
mountain.start_position = start_pos;
mountain.end_position = end_pos;
// Parse elevations
string[]@ elev_parts = parts[2].split(",");
mountain.elevations.resize(elev_parts.length());
for (uint j = 0; j < elev_parts.length(); j++) {
mountain.elevations[j] = parse_int(elev_parts[j]);
}
// Parse terrain types
string[]@ terrain_parts = parts[3].split(",");
mountain.terrain_types.resize(terrain_parts.length());
for (uint j = 0; j < terrain_parts.length(); j++) {
mountain.terrain_types[j] = terrain_parts[j];
}
// Parse stream positions
if (parts[4].length() > 0) {
string[]@ stream_parts = parts[4].split(",");
for (uint j = 0; j < stream_parts.length(); j++) {
mountain.stream_positions.insert_last(parse_int(stream_parts[j]));
}
}
world_mountains.insert_last(mountain);
}
update_ambience(true);
return true;
}