#!/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_identifier = os.path.basename(path).split(".")[0].capitalize() enum_name = enum_identifier.upper() 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("#include ") print("#include ") print() print() # ============================ enum_none = enum_string("none") enum_count = enum_string("count") print(f"{indent()}typedef enum {enum_name} {{") indent_level += indent_offset print(f"{indent()}{enum_none},") for enum in types: print(f"{indent()}{enum_string(enum)},") print(f"{indent()}{enum_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 (tile) {{") 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 # trie would be much better 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()}}}") # ============================