diff --git a/.gitignore b/.gitignore index abb7b18..58cc378 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ .idea/ cmake-build-debug/ +venv/ tiled/PixelDefense.tiled-session diff --git a/scripts/extract_tileset_classes.py b/scripts/extract_tileset_classes.py new file mode 100755 index 0000000..e899144 --- /dev/null +++ b/scripts/extract_tileset_classes.py @@ -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()}}}") + +# ============================