pokeplatinum/tools/json2bin/convert.py
Eduardo Quezada b157da484e
Use flag defines in map object event JSON files (#475)
* Generate vars and flags

* Convert Event flags map data

* Convert numbers to flags

* Fix type
2025-04-21 08:00:31 -07:00

94 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
import collections
import functools
from generated import (
ai_flags,
bg_event_dirs,
items,
genders,
map_headers,
maps,
moves,
movement_types,
object_events,
species,
trainer_classes,
trainer_types,
vars_flags
)
def pad(len: int) -> bytes:
return (0).to_bytes(len, 'little')
def u8(i: int) -> bytes:
return i.to_bytes(1, 'little')
def u16(i: int) -> bytes:
return i.to_bytes(2, 'little')
def u32(i: int) -> bytes:
return i.to_bytes(4, 'little')
def ascii(i: str) -> bytes:
return str.encode(i, 'ascii')
def from_item(s: str) -> int:
return items.Item[s].value
def from_move(s: str) -> int:
return moves.Move[s].value
def from_species(s: str) -> int:
return species.Species[s].value
def from_trainer_class(s: str) -> int:
return trainer_classes.TrainerClass[s].value
def from_trainer_ai_flag(s: str) -> int:
return ai_flags.AIFlag[s].value
def from_gender(s: str) -> int:
return genders.Gender[s].value
def from_bg_event_dir(s: str) -> int:
return bg_event_dirs.BgEventDir[s].value
def from_object_event_gfx(s: str) -> int:
return object_events.ObjectEventGfx[s].value
def from_movement_type(s: str) -> int:
return movement_types.MovementType[s].value
def from_trainer_type(s: str) -> int:
return trainer_types.TrainerType[s].value
def from_var_flag(s: str) -> int:
if s.isnumeric():
return int(s)
return vars_flags.VarFlag[s].value
def from_map_header(s: str) -> int:
return map_headers.MapHeader[s].value
def from_map(s: str) -> int:
return maps.MapID[s].value
TrainerDataFlags = collections.namedtuple('TrainerDataFlags', ['has_moves', 'has_items'])
def derive_data_flags(party: list[dict]) -> TrainerDataFlags:
has_moves = False
has_items = False
for mon in party:
has_moves |= functools.reduce(
lambda x, y: x or y,
map(
lambda move: move != moves.Move.MOVE_NONE.name,
mon.get('moves', []) or [],
),
False,
)
has_items |= bool(mon.get('item', None))
return TrainerDataFlags(has_moves, has_items)