Push
This commit is contained in:
281
scripts/update_locations.py
Normal file
281
scripts/update_locations.py
Normal file
@@ -0,0 +1,281 @@
|
||||
#!/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")
|
||||
Reference in New Issue
Block a user