#!/usr/bin/env python import json import re import struct import typing from collections.abc import Mapping @typing.overload def parse_c_header( filename: str, prefix: str = ..., as_list: typing.Literal[False] = ... ) -> Mapping[int, str]: ... @typing.overload def parse_c_header( filename: str, prefix: str = ..., as_list: typing.Literal[True] = ... ) -> list[tuple[int, str]]: ... def parse_c_header(filename: str, prefix="", as_list=False): with open(filename) as fp: data = fp.read() pat = re.compile(rf"#define\s+({prefix}\w+)\s+(\d+|0x[0-9a-fA-F]+)(\s*//.*)?\n") return (list if as_list else dict)((int(m[2], 0), m[1]) for m in pat.finditer(data)) trainer_classes = parse_c_header("include/constants/trainer_class.h", "TRAINERCLASS_") trainer_ids = parse_c_header("include/constants/trainers.h", "TRAINER_") map_ids = parse_c_header("include/constants/maps.h", "MAP_") phone_contacts = parse_c_header("include/constants/phone_contacts.h", "PHONE_CONTACT_") phone_scripts = parse_c_header("include/constants/phone_scripts.h", "PHONE_SCRIPT_") items = parse_c_header("include/constants/items.h", "ITEM_") weekday = [ "RTC_WEEK_SUNDAY", "RTC_WEEK_MONDAY", "RTC_WEEK_TUESDAY", "RTC_WEEK_WEDNESDAY", "RTC_WEEK_THURSDAY", "RTC_WEEK_FRIDAY", "RTC_WEEK_SATURDAY", "RTC_WEEK_MAX", ] time_of_day = [ "TIMEOFDAY_WILD_MORN", "TIMEOFDAY_WILD_DAY", "TIMEOFDAY_WILD_NITE", "TIMEOFDAY_WILD_MAX", ] PMTelBook = struct.Struct("