282 lines
12 KiB
Python
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")
|