Add tileset class extractor script
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,5 +4,6 @@
|
||||
.idea/
|
||||
|
||||
cmake-build-debug/
|
||||
venv/
|
||||
|
||||
tiled/PixelDefense.tiled-session
|
||||
|
||||
98
scripts/extract_tileset_classes.py
Executable file
98
scripts/extract_tileset_classes.py
Executable 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()}}}")
|
||||
|
||||
# ============================
|
||||
Reference in New Issue
Block a user