Files
echoes-of-the-ash/scripts/update_locations.py
2026-02-05 16:09:34 +01:00

282 lines
12 KiB
Python

#!/usr/bin/env python3
"""
Update locations.json with missing interactables from world_loader_old.py
and spawn configurations from npcs_old.py
"""
import json
from pathlib import Path
# Load current locations.json
locations_file = Path("gamedata/locations.json")
with open(locations_file, 'r') as f:
data = json.load(f)
# Helper to find location by ID
def find_location(loc_id):
for loc in data['locations']:
if loc['id'] == loc_id:
return loc
return None
# Add missing interactables to start_point
start_point = find_location('start_point')
if start_point and 'start_point_sedan' not in start_point.get('interactables', {}):
if 'interactables' not in start_point:
start_point['interactables'] = {}
start_point['interactables']['start_point_sedan'] = {
"id": "sedan",
"name": "🚗 Rusty Sedan",
"image_path": "images/interactables/sedan.png",
"actions": {
"search_glovebox": {
"id": "search_glovebox",
"label": "🔎 Search Glovebox",
"stamina_cost": 1,
"outcomes": {
"success": {"text": "You find a half-eaten [Stale Chocolate Bar].", "items_reward": {"stale_chocolate_bar": 1}, "damage_taken": 0},
"failure": {"text": "The glovebox is empty except for dust and old receipts.", "items_reward": {}, "damage_taken": 0}
}
},
"pop_trunk": {
"id": "pop_trunk",
"label": "🔧 Pop the Trunk",
"stamina_cost": 3,
"outcomes": {
"success": {"text": "With a great heave, you pry the trunk open and find a [Tire Iron]!", "items_reward": {"tire_iron": 1}, "damage_taken": 0},
"failure": {"text": "The trunk is rusted shut. You can't get it open.", "items_reward": {}, "damage_taken": 0}
}
}
}
}
start_point['interactables']['start_point_dumpster'] = {
"id": "dumpster",
"name": "🗑️ Dumpster",
"image_path": "images/interactables/dumpster.png",
"actions": {
"search_dumpster": {
"id": "search_dumpster",
"label": "🔎 Dig Through Trash",
"stamina_cost": 2,
"outcomes": {
"success": {"text": "Despite the smell, you find some [Plastic Bottles] and [Cloth Scraps].", "items_reward": {"plastic_bottles": 3, "cloth_scraps": 2}, "damage_taken": 0},
"failure": {"text": "Just rotting garbage. Nothing useful.", "items_reward": {}, "damage_taken": 0},
"critical_failure": {"text": "You disturb a nest of rats! They bite you! (-8 HP)", "items_reward": {}, "damage_taken": 8}
}
}
}
}
# Add missing interactables to subway_tunnels
subway_tunnels = find_location('subway_tunnels')
if subway_tunnels:
if 'interactables' not in subway_tunnels:
subway_tunnels['interactables'] = {}
subway_tunnels['interactables']['subway_train_sedan'] = {
"id": "sedan",
"name": "🚗 Rusty Sedan",
"image_path": "images/interactables/sedan.png",
"actions": {
"search_glovebox": {
"id": "search_glovebox",
"label": "🔎 Search Glovebox",
"stamina_cost": 1,
"outcomes": {
"success": {"text": "You find a half-eaten [Stale Chocolate Bar].", "items_reward": {"stale_chocolate_bar": 1}, "damage_taken": 0},
"failure": {"text": "The glovebox is empty except for dust and old receipts.", "items_reward": {}, "damage_taken": 0}
}
},
"pop_trunk": {
"id": "pop_trunk",
"label": "🔧 Pop the Trunk",
"stamina_cost": 3,
"outcomes": {
"success": {"text": "With a great heave, you pry the trunk open and find a [Tire Iron]!", "items_reward": {"tire_iron": 1}, "damage_taken": 0},
"failure": {"text": "The trunk is rusted shut. You can't get it open.", "items_reward": {}, "damage_taken": 0}
}
}
}
}
subway_tunnels['interactables']['subway_medkit'] = {
"id": "medkit",
"name": "🏥 Medical Supply Cabinet",
"image_path": "images/interactables/medkit.png",
"actions": {
"search_medkit": {
"id": "search_medkit",
"label": "🔎 Search Cabinet",
"stamina_cost": 2,
"outcomes": {
"success": {"text": "Jackpot! You find a [First Aid Kit] and some [Bandages]!", "items_reward": {"first_aid_kit": 1, "bandage": 2}, "damage_taken": 0},
"failure": {"text": "The cabinet is empty. Someone got here first.", "items_reward": {}, "damage_taken": 0}
}
}
}
}
subway_tunnels['interactables']['subway_rubble'] = {
"id": "rubble",
"name": "Pile of Rubble",
"image_path": "images/interactables/rubble.png",
"actions": {
"search": {
"id": "search",
"label": "🔎 Search Rubble",
"stamina_cost": 2,
"outcomes": {
"success": {"text": "You dig through the debris and find some [Scrap Metal].", "items_reward": {"scrap_metal": 2}, "damage_taken": 0},
"failure": {"text": "The pile seems to have been picked clean already.", "items_reward": {}, "damage_taken": 0},
"critical_failure": {"text": "You cut your hand on a sharp piece of glass! (-5 HP)", "items_reward": {}, "damage_taken": 5}
}
}
}
}
# Add missing interactables to office_interior
office_interior = find_location('office_interior')
if office_interior:
if 'interactables' not in office_interior:
office_interior['interactables'] = {}
office_interior['interactables']['office_desk1'] = {
"id": "rubble",
"name": "Pile of Rubble",
"image_path": "images/interactables/rubble.png",
"actions": {
"search": {
"id": "search",
"label": "🔎 Search Rubble",
"stamina_cost": 2,
"outcomes": {
"success": {"text": "You dig through the debris and find some [Scrap Metal].", "items_reward": {"scrap_metal": 2}, "damage_taken": 0},
"failure": {"text": "The pile seems to have been picked clean already.", "items_reward": {}, "damage_taken": 0},
"critical_failure": {"text": "You cut your hand on a sharp piece of glass! (-5 HP)", "items_reward": {}, "damage_taken": 5}
}
}
}
}
office_interior['interactables']['office_desk2'] = {
"id": "rubble",
"name": "Pile of Rubble",
"image_path": "images/interactables/rubble.png",
"actions": {
"search": {
"id": "search",
"label": "🔎 Search Rubble",
"stamina_cost": 2,
"outcomes": {
"success": {"text": "You dig through the debris and find some [Scrap Metal].", "items_reward": {"scrap_metal": 2}, "damage_taken": 0},
"failure": {"text": "The pile seems to have been picked clean already.", "items_reward": {}, "damage_taken": 0},
"critical_failure": {"text": "You cut your hand on a sharp piece of glass! (-5 HP)", "items_reward": {}, "damage_taken": 5}
}
}
}
}
office_interior['interactables']['office_corner'] = {
"id": "house",
"name": "🏚️ Abandoned House",
"image_path": "images/interactables/house.png",
"actions": {
"search_house": {
"id": "search_house",
"label": "🔎 Search House",
"stamina_cost": 3,
"outcomes": {
"success": {"text": "You find some useful supplies: [Canned Beans], [Bottled Water], and [Cloth Scraps]!", "items_reward": {"canned_beans": 1, "bottled_water": 1, "cloth_scraps": 3}, "damage_taken": 0},
"failure": {"text": "The house has already been thoroughly looted. Nothing remains.", "items_reward": {}, "damage_taken": 0},
"critical_failure": {"text": "The floor collapses beneath you! (-10 HP)", "items_reward": {}, "damage_taken": 10}
}
}
}
}
# Update danger_config from npcs_old.py
data['danger_config'] = {
"start_point": {"danger_level": 0, "encounter_rate": 0.0, "wandering_chance": 0.0},
"gas_station": {"danger_level": 0, "encounter_rate": 0.0, "wandering_chance": 0.0},
"residential": {"danger_level": 1, "encounter_rate": 0.10, "wandering_chance": 0.20},
"park": {"danger_level": 1, "encounter_rate": 0.10, "wandering_chance": 0.20},
"clinic": {"danger_level": 2, "encounter_rate": 0.20, "wandering_chance": 0.35},
"plaza": {"danger_level": 2, "encounter_rate": 0.15, "wandering_chance": 0.30},
"warehouse": {"danger_level": 2, "encounter_rate": 0.18, "wandering_chance": 0.32},
"warehouse_interior": {"danger_level": 2, "encounter_rate": 0.22, "wandering_chance": 0.40},
"overpass": {"danger_level": 3, "encounter_rate": 0.30, "wandering_chance": 0.45},
"office_building": {"danger_level": 3, "encounter_rate": 0.25, "wandering_chance": 0.40},
"office_interior": {"danger_level": 3, "encounter_rate": 0.35, "wandering_chance": 0.50},
"subway": {"danger_level": 4, "encounter_rate": 0.35, "wandering_chance": 0.50},
"subway_tunnels": {"danger_level": 4, "encounter_rate": 0.45, "wandering_chance": 0.65}
}
# Update spawn_config from npcs_old.py
data['spawn_config'] = {
"start_point": [],
"gas_station": [],
"residential": [
{"npc_id": "feral_dog", "weight": 60},
{"npc_id": "mutant_rat", "weight": 40}
],
"park": [
{"npc_id": "feral_dog", "weight": 50},
{"npc_id": "mutant_rat", "weight": 50}
],
"clinic": [
{"npc_id": "infected_human", "weight": 40},
{"npc_id": "mutant_rat", "weight": 30},
{"npc_id": "scavenger", "weight": 30}
],
"plaza": [
{"npc_id": "raider_scout", "weight": 40},
{"npc_id": "scavenger", "weight": 35},
{"npc_id": "feral_dog", "weight": 25}
],
"warehouse": [
{"npc_id": "raider_scout", "weight": 45},
{"npc_id": "scavenger", "weight": 35},
{"npc_id": "mutant_rat", "weight": 20}
],
"warehouse_interior": [
{"npc_id": "raider_scout", "weight": 50},
{"npc_id": "scavenger", "weight": 30},
{"npc_id": "mutant_rat", "weight": 20}
],
"overpass": [
{"npc_id": "raider_scout", "weight": 50},
{"npc_id": "infected_human", "weight": 30},
{"npc_id": "scavenger", "weight": 20}
],
"office_building": [
{"npc_id": "raider_scout", "weight": 45},
{"npc_id": "infected_human", "weight": 35},
{"npc_id": "scavenger", "weight": 20}
],
"office_interior": [
{"npc_id": "infected_human", "weight": 50},
{"npc_id": "raider_scout", "weight": 30},
{"npc_id": "scavenger", "weight": 20}
],
"subway": [
{"npc_id": "infected_human", "weight": 50},
{"npc_id": "raider_scout", "weight": 30},
{"npc_id": "mutant_rat", "weight": 20}
],
"subway_tunnels": [
{"npc_id": "infected_human", "weight": 60},
{"npc_id": "raider_scout", "weight": 25},
{"npc_id": "mutant_rat", "weight": 15}
]
}
# Save updated file
with open(locations_file, 'w') as f:
json.dump(data, f, indent=2)
print("✅ Updated locations.json with:")
print(" - Missing interactables for start_point, subway_tunnels, office_interior")
print(" - Complete danger_config from npcs_old.py")
print(" - Complete spawn_config from npcs_old.py")