#!/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()}}}") # ============================