166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Extract current game data to JSON files
|
|
This script reads the current Python-based game data and exports it to JSON format
|
|
"""
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
|
|
# Add parent directory to path
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from data.world_loader import game_world, export_map_data
|
|
from data.npcs import NPCS, LOCATION_DANGER, LOCATION_SPAWNS
|
|
from data.items import ITEMS
|
|
|
|
def export_to_json():
|
|
"""Export all game data to JSON files"""
|
|
gamedata_dir = Path(__file__).parent / 'gamedata'
|
|
gamedata_dir.mkdir(exist_ok=True)
|
|
|
|
print("🔄 Exporting game data to JSON...")
|
|
|
|
# 1. Export locations and world data
|
|
print(" 📍 Exporting locations...")
|
|
locations_data = {
|
|
"locations": [],
|
|
"connections": []
|
|
}
|
|
|
|
for location in game_world.locations.values():
|
|
loc_data = {
|
|
"id": location.id,
|
|
"name": location.name,
|
|
"description": location.description,
|
|
"x": location.x,
|
|
"y": location.y,
|
|
"image_path": location.image_path,
|
|
"interactables": {}
|
|
}
|
|
|
|
# Add interactables
|
|
for instance_id, interactable in location.interactables.items():
|
|
inter_data = {
|
|
"id": interactable.id,
|
|
"name": interactable.name,
|
|
"image_path": interactable.image_path,
|
|
"actions": {}
|
|
}
|
|
|
|
# Add actions
|
|
for action_id, action in interactable.actions.items():
|
|
action_data = {
|
|
"id": action.id,
|
|
"label": action.label,
|
|
"stamina_cost": action.stamina_cost,
|
|
"outcomes": {}
|
|
}
|
|
|
|
# Add outcomes
|
|
for outcome_name, outcome in action.outcomes.items():
|
|
outcome_data = {
|
|
"text": outcome.text,
|
|
"items_reward": outcome.items_reward,
|
|
"damage_taken": outcome.damage_taken
|
|
}
|
|
action_data["outcomes"][outcome_name] = outcome_data
|
|
|
|
inter_data["actions"][action_id] = action_data
|
|
|
|
loc_data["interactables"][instance_id] = inter_data
|
|
|
|
locations_data["locations"].append(loc_data)
|
|
|
|
# Add connections with distance-based stamina cost
|
|
for direction, dest_id in location.exits.items():
|
|
dest_loc = game_world.get_location(dest_id)
|
|
if dest_loc:
|
|
from data.travel_helpers import calculate_base_stamina_cost
|
|
stamina_cost = calculate_base_stamina_cost(location, dest_loc)
|
|
else:
|
|
stamina_cost = 5 # Fallback
|
|
|
|
locations_data["connections"].append({
|
|
"from": location.id,
|
|
"to": dest_id,
|
|
"direction": direction,
|
|
"stamina_cost": stamina_cost
|
|
})
|
|
|
|
with open(gamedata_dir / 'locations.json', 'w') as f:
|
|
json.dump(locations_data, f, indent=2)
|
|
print(f" ✅ Exported {len(locations_data['locations'])} locations and {len(locations_data['connections'])} connections")
|
|
|
|
# 2. Export NPCs and spawns
|
|
print(" 👹 Exporting NPCs...")
|
|
npcs_data = {
|
|
"npcs": {},
|
|
"danger_levels": {},
|
|
"spawn_tables": {}
|
|
}
|
|
|
|
for npc_id, npc in NPCS.items():
|
|
# Convert loot tables to serializable format
|
|
loot_table = [
|
|
{"item_id": loot.item_id, "quantity_min": loot.quantity_min, "quantity_max": loot.quantity_max, "drop_chance": loot.drop_chance}
|
|
for loot in npc.loot_table
|
|
]
|
|
corpse_loot = [
|
|
{"item_id": loot.item_id, "quantity_min": loot.quantity_min, "quantity_max": loot.quantity_max, "required_tool": loot.required_tool}
|
|
for loot in npc.corpse_loot
|
|
]
|
|
|
|
npcs_data["npcs"][npc_id] = {
|
|
"npc_id": npc.npc_id,
|
|
"name": npc.name,
|
|
"description": npc.description,
|
|
"emoji": npc.emoji,
|
|
"hp_min": npc.hp_min,
|
|
"hp_max": npc.hp_max,
|
|
"damage_min": npc.damage_min,
|
|
"damage_max": npc.damage_max,
|
|
"defense": npc.defense,
|
|
"xp_reward": npc.xp_reward,
|
|
"loot_table": loot_table,
|
|
"corpse_loot": corpse_loot,
|
|
"flee_chance": npc.flee_chance,
|
|
"status_inflict_chance": npc.status_inflict_chance,
|
|
"image_url": npc.image_url,
|
|
"death_message": npc.death_message
|
|
}
|
|
|
|
for location_id, (danger, encounter_rate, wandering_chance) in LOCATION_DANGER.items():
|
|
npcs_data["danger_levels"][location_id] = {
|
|
"danger_level": danger,
|
|
"encounter_rate": encounter_rate,
|
|
"wandering_chance": wandering_chance
|
|
}
|
|
|
|
for location_id, spawns in LOCATION_SPAWNS.items():
|
|
npcs_data["spawn_tables"][location_id] = [
|
|
{"npc_id": npc_id, "weight": weight}
|
|
for npc_id, weight in spawns
|
|
]
|
|
|
|
with open(gamedata_dir / 'npcs.json', 'w') as f:
|
|
json.dump(npcs_data, f, indent=2)
|
|
print(f" ✅ Exported {len(npcs_data['npcs'])} NPCs, {len(npcs_data['danger_levels'])} danger configs, {len(npcs_data['spawn_tables'])} spawn tables")
|
|
|
|
# 3. Export items
|
|
print(" 🎒 Exporting items...")
|
|
items_data = {
|
|
"items": ITEMS # ITEMS is already a dict with the right structure
|
|
}
|
|
|
|
with open(gamedata_dir / 'items.json', 'w') as f:
|
|
json.dump(items_data, f, indent=2)
|
|
print(f" ✅ Exported {len(items_data['items'])} items")
|
|
|
|
print("\n✅ Export complete! JSON files created in gamedata/")
|
|
print(f" 📁 {gamedata_dir.absolute()}")
|
|
|
|
if __name__ == '__main__':
|
|
export_to_json()
|