mirror of
https://github.com/cliffe/BreakEscape.git
synced 2026-02-20 13:50:46 +00:00
132 lines
4.2 KiB
Python
Executable File
132 lines
4.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import json
|
|
import os
|
|
|
|
"""
|
|
Script to identify corrupted GID references in Tiled map
|
|
This will help find objects that reference non-existent tileset entries
|
|
"""
|
|
|
|
MAP_FILE = "assets/rooms/room_reception2.json"
|
|
|
|
def get_valid_gid_ranges(map_data):
|
|
"""Get all valid GID ranges from tilesets"""
|
|
valid_ranges = []
|
|
|
|
for tileset in map_data.get('tilesets', []):
|
|
firstgid = tileset.get('firstgid', 0)
|
|
tilecount = tileset.get('tilecount', 0)
|
|
|
|
if tilecount:
|
|
max_gid = firstgid + tilecount
|
|
valid_ranges.append((firstgid, max_gid, tileset.get('name', 'unknown')))
|
|
else:
|
|
# Handle tilesets with undefined tilecount
|
|
valid_ranges.append((firstgid, firstgid + 1, tileset.get('name', 'unknown')))
|
|
|
|
return valid_ranges
|
|
|
|
def is_gid_valid(gid, valid_ranges):
|
|
"""Check if a GID is valid (exists in any tileset)"""
|
|
for start, end, name in valid_ranges:
|
|
if start <= gid < end:
|
|
return True, name
|
|
return False, None
|
|
|
|
def check_layer_objects(layer_name, objects, valid_ranges):
|
|
"""Check objects in a layer for invalid GIDs"""
|
|
corrupted_objects = []
|
|
|
|
for obj in objects:
|
|
gid = obj.get('gid', 0)
|
|
if gid > 0: # Only check objects with GIDs
|
|
is_valid, tileset_name = is_gid_valid(gid, valid_ranges)
|
|
if not is_valid:
|
|
corrupted_objects.append({
|
|
'id': obj.get('id', 'unknown'),
|
|
'gid': gid,
|
|
'x': obj.get('x', 0),
|
|
'y': obj.get('y', 0),
|
|
'name': obj.get('name', ''),
|
|
'layer': layer_name
|
|
})
|
|
|
|
return corrupted_objects
|
|
|
|
def main():
|
|
"""Main function to check for corrupted GIDs"""
|
|
print("🔍 Checking for Corrupted GID References")
|
|
print("=" * 50)
|
|
|
|
if not os.path.exists(MAP_FILE):
|
|
print(f"❌ Map file not found: {MAP_FILE}")
|
|
return
|
|
|
|
try:
|
|
with open(MAP_FILE, 'r') as f:
|
|
map_data = json.load(f)
|
|
except Exception as e:
|
|
print(f"❌ Error reading map file: {e}")
|
|
return
|
|
|
|
# Get valid GID ranges
|
|
valid_ranges = get_valid_gid_ranges(map_data)
|
|
print(f"📊 Found {len(valid_ranges)} tilesets with valid GID ranges:")
|
|
for start, end, name in valid_ranges:
|
|
print(f" {name}: GIDs {start}-{end-1}")
|
|
|
|
print()
|
|
|
|
# Check each layer
|
|
all_corrupted = []
|
|
|
|
for layer in map_data.get('layers', []):
|
|
layer_name = layer.get('name', 'unknown')
|
|
objects = layer.get('objects', [])
|
|
|
|
if objects:
|
|
corrupted = check_layer_objects(layer_name, objects, valid_ranges)
|
|
if corrupted:
|
|
all_corrupted.extend(corrupted)
|
|
print(f"❌ Layer '{layer_name}': {len(corrupted)} corrupted objects")
|
|
for obj in corrupted[:5]: # Show first 5
|
|
print(f" - Object ID {obj['id']}: GID {obj['gid']} at ({obj['x']}, {obj['y']})")
|
|
if len(corrupted) > 5:
|
|
print(f" ... and {len(corrupted) - 5} more")
|
|
else:
|
|
print(f"✅ Layer '{layer_name}': All objects valid")
|
|
|
|
print()
|
|
|
|
if all_corrupted:
|
|
print(f"🚨 Found {len(all_corrupted)} corrupted objects total")
|
|
print()
|
|
print("📋 Summary by GID:")
|
|
|
|
# Group by GID
|
|
gid_counts = {}
|
|
for obj in all_corrupted:
|
|
gid = obj['gid']
|
|
if gid not in gid_counts:
|
|
gid_counts[gid] = []
|
|
gid_counts[gid].append(obj)
|
|
|
|
for gid in sorted(gid_counts.keys()):
|
|
count = len(gid_counts[gid])
|
|
print(f" GID {gid}: {count} objects")
|
|
|
|
print()
|
|
print("🔧 Recommended Actions:")
|
|
print("1. Open the map in Tiled Editor")
|
|
print("2. Look for pink/magenta placeholder tiles")
|
|
print("3. Replace corrupted objects with valid ones from the tileset")
|
|
print("4. Save the map")
|
|
|
|
else:
|
|
print("✅ No corrupted GID references found!")
|
|
print("The map should work correctly in Phaser.")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|