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

122 lines
4.8 KiB
Python

#!/usr/bin/env python3
"""
Convert locations.json to use template-based interactables format.
This script converts the new format (full instance data) to old format (template_id + outcomes).
"""
import json
import sys
def convert_interactables_to_template_format(interactables_dict):
"""Convert interactables from full format to template format."""
if not interactables_dict:
return {}
converted = {}
for instance_id, instance_data in interactables_dict.items():
# Check if already in template format
if 'template_id' in instance_data:
# Already in template format, keep as is
converted[instance_id] = instance_data
continue
# Check if in new format with 'id' and 'actions'
if 'id' in instance_data and 'actions' in instance_data:
# Convert to template format
template_id = instance_data['id']
# Build outcomes from actions
outcomes = {}
for action_id, action_data in instance_data['actions'].items():
outcome = {
'success_rate': 0.5, # Default success rate
'stamina_cost': action_data.get('stamina_cost', 2),
'crit_success_chance': 0.1,
'crit_failure_chance': 0.1,
'text': {
'success': '',
'failure': '',
'crit_success': '',
'crit_failure': ''
},
'rewards': {
'items': [],
'damage': 0,
'crit_items': [],
'crit_damage': 0
}
}
# Extract text from outcomes if available
if 'outcomes' in action_data:
if 'success' in action_data['outcomes']:
outcome['text']['success'] = action_data['outcomes']['success'].get('text', '')
# Convert items_reward to items list
items_reward = action_data['outcomes']['success'].get('items_reward', {})
for item_id, quantity in items_reward.items():
outcome['rewards']['items'].append({
'item_id': item_id,
'quantity': quantity,
'chance': 1.0
})
outcome['rewards']['damage'] = action_data['outcomes']['success'].get('damage_taken', 0)
if 'failure' in action_data['outcomes']:
outcome['text']['failure'] = action_data['outcomes']['failure'].get('text', '')
if 'critical_failure' in action_data['outcomes']:
outcome['text']['crit_failure'] = action_data['outcomes']['critical_failure'].get('text', '')
outcome['rewards']['crit_damage'] = action_data['outcomes']['critical_failure'].get('damage_taken', 0)
outcomes[action_id] = outcome
converted[instance_id] = {
'template_id': template_id,
'outcomes': outcomes
}
else:
# Unknown format, keep as is
converted[instance_id] = instance_data
return converted
def main():
# Load locations.json
locations_file = 'gamedata/locations.json'
try:
with open(locations_file, 'r', encoding='utf-8') as f:
data = json.load(f)
except Exception as e:
print(f"Error loading {locations_file}: {e}")
sys.exit(1)
# Convert all location interactables
locations_converted = 0
interactables_converted = 0
for location in data.get('locations', []):
if 'interactables' in location and location['interactables']:
original_count = len(location['interactables'])
location['interactables'] = convert_interactables_to_template_format(location['interactables'])
if original_count > 0:
locations_converted += 1
interactables_converted += original_count
# Save back to file
try:
with open(locations_file, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
print(f"✅ Conversion complete!")
print(f" Processed {locations_converted} locations")
print(f" Converted {interactables_converted} interactables to template format")
except Exception as e:
print(f"❌ Error saving {locations_file}: {e}")
sys.exit(1)
if __name__ == '__main__':
main()