Files
BreakEscape/scripts/check_corrupted_gids.py

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()