Add tileset class extractor script

This commit is contained in:
2023-11-09 17:48:56 +01:00
parent f32c19dc3d
commit 04e7943d91
2 changed files with 99 additions and 0 deletions

1
.gitignore vendored
View File

@@ -4,5 +4,6 @@
.idea/ .idea/
cmake-build-debug/ cmake-build-debug/
venv/
tiled/PixelDefense.tiled-session tiled/PixelDefense.tiled-session

View File

@@ -0,0 +1,98 @@
#!/usr/bin/python
"""
Utility script that extracts tiles with the same class and
outputs C enum and functions for them (so there is no string checking).
"""
import json
import sys
import os
from collections import defaultdict
types = defaultdict(list)
path = sys.argv[1]
content = open(path).read()
tiles = json.loads(content)["tiles"]
for tile in tiles:
if "type" not in tile:
continue
id = tile["id"]
type = tile["type"]
types[type].append(id)
enum_name = os.path.basename(path).split(".")[0].capitalize()
indent_level = 0
indent_offset = 4
def indent():
return ' ' * indent_level
def enum_string(name):
return f"{enum_name}_{name.upper()}"
script_name = os.path.basename(__file__)
print(f"// This file was generated by: {script_name}")
print()
# ============================
print(f"{indent()}typedef struct {enum_name} {{")
indent_level += indent_offset
print(f"{indent()}{enum_string('name')}")
for enum in types:
print(f"{indent()}{enum_string(enum)},")
print(f"{indent()}{enum_name}_COUNT")
indent_level -= indent_offset
print(f"{indent()}}} {enum_name};")
print()
print()
# ============================
print(f"{indent()}static bool getTileBuilding(BzTile tile) {{")
indent_level += indent_offset
print(f"{indent()}switch (type) {{")
for enum, ids in types.items():
indent_level += indent_offset
for id in ids:
print(f"{indent()}case {id}:")
indent_level += indent_offset
print(f"{indent()} return {enum_string(enum)};")
indent_level -= indent_offset
indent_level -= indent_offset
indent_level += indent_offset
print(f"{indent()}default:")
indent_level += indent_offset
print(f"{indent()}return {enum_string('none')};")
indent_level -= indent_offset
indent_level -= indent_offset
print(f"{indent()}}}")
indent_level -= indent_offset
print(f"{indent()}}}")
print()
# ============================
print(f"{indent()}static {enum_name} getBuildingFromStr(const char *str) {{")
indent_level += indent_offset
for type in types:
print(f"{indent()}if (strncmp(\"{type}\", str, {len(type)}) return {enum_string(type)};")
print(f"{indent()}else return {enum_string('none')};")
indent_level -= indent_offset
print(f"{indent()}}}")
# ============================