tools/parse: more pokemon and move parsers

This commit is contained in:
Zack Buhman 2023-08-02 00:22:44 +00:00
parent 096769917a
commit 145b6b8936
10 changed files with 90 additions and 26 deletions

View File

@ -0,0 +1,3 @@
from parse.move import constants
from parse.move import names
from parse.move import moves

View File

@ -1,4 +1,4 @@
from functools import partial
from parse.generic import constants
partial(constants.parse, path='constants/move_constants.asm')
parse = partial(constants.parse, path='constants/move_constants.asm')

View File

@ -1,13 +1,13 @@
from dataclasses import dataclass
from functools import partial
from parse import number
from parse.generic import macro_line
from parse.generic import tokenize
from parse.generic import number
tokenize_lines = partial(macro_line.tokenize_lines, prefix='move ')
tokenize_lines = partial(tokenize.lines, prefix='move ')
@dataclass
class Move:
name: str
constant_name: str
effect: str
power: int
type: str
@ -17,14 +17,14 @@ class Move:
def flatten(tokens):
for t in tokens:
assert t[0] == 'move', t
_, (name, effect, power, type, accuracy, pp) = t
return Move(
name,
_, (constant_name, effect, power, type, accuracy, pp) = t
yield constant_name, Move(
constant_name,
effect,
number(power),
number.parse(power),
type,
number(accuracy),
number(pp)
number.parse(accuracy),
number.parse(pp)
)
def parse(prefix):

View File

@ -17,9 +17,21 @@ from parse import spritesheet # constants
# spritesheets
# gfx
from parse import pokemon # constants
# base_stats
# evos_moves
# names
# dex_entries
# dex_order
# dex_text
from parse import move # constants
# moves
# names
from parse import text
from parse import scripts
from parse import pic
def memoize(f):
value = None
@ -44,8 +56,9 @@ tileset_constants_list = memoize(lambda: tileset.constants.parse(prefix))
tileset_headers_list = memoize(lambda: tileset.headers.parse(prefix))
tileset_gfx_list = memoize(lambda: tileset.gfx.parse(prefix))
tileset_collision_tile_ids_list = memoize(lambda: tileset.collision_tile_ids.parse(prefix))
# need:
#data/tilesets/pair_collision_tile_ids.asm
#cut_tree_blocks.asm
# sprites
spritesheet_gfx_list = memoize(lambda: spritesheet.gfx.parse(prefix))
@ -56,8 +69,22 @@ spritesheet_constants_list = memoize(lambda: spritesheet.constants.parse(pref
scripts_list = memoize(lambda: scripts.parse_all(prefix))
text_list = memoize(lambda: text.parse_all(prefix))
# need:
#data/tilesets/pair_collision_tile_ids.asm
#cut_tree_blocks.asm
# home/vcopy: animations
# pokemon
pokemon_base_stats_list = memoize(lambda: pokemon.base_stats.parse_all(prefix))
pokemon_constants_list = memoize(lambda: pokemon.constants.parse(prefix))
pokemon_dex_constants_list= memoize(lambda: pokemon.dex_constants.parse(prefix))
pokemon_dex_entries_list = memoize(lambda: pokemon.dex_entries.parse(prefix))
pokemon_dex_order_list = memoize(lambda: pokemon.dex_order.parse(prefix))
pokemon_dex_text_list = memoize(lambda: pokemon.dex_text.parse(prefix))
pokemon_evos_moves_list = memoize(lambda: pokemon.evos_moves.parse(prefix))
pokemon_names_list = memoize(lambda: pokemon.names.parse(prefix))
# move
move_constants_list = memoize(lambda: move.constants.parse(prefix))
move_moves_list = memoize(lambda: move.moves.parse(prefix))
move_names_list = memoize(lambda: move.names.parse(prefix))
# pic
pic_list = memoize(lambda: pic.parse(prefix))

View File

@ -0,0 +1,11 @@
from parse.pokemon import constants
from parse.pokemon import base_stats
from parse.pokemon import evos_moves
from parse.pokemon import names
from parse.pokemon import dex_entries
from parse.pokemon import dex_order
from parse.pokemon import dex_text
from parse.pokemon import dex_constants
# missing:
# data/pokemon/palettes.asm
# data/pokemon/menu_icons.asm

View File

@ -32,8 +32,17 @@ class BaseStats:
level_1_learnset: tuple[str, str, str, str]
growth_rate: str
tmhm: list[str]
def maybe_itemget(line):
assert len(line) in {1, 2}
if len(line) == 1:
return []
else:
return line[1]
def parse_base_stat(lines):
lines = list(lines)
pokedex_id, \
stat_values, \
types, \
@ -43,8 +52,7 @@ def parse_base_stat(lines):
level_1_learnset, \
growth_rate, \
tmhm, \
padding = map(itemgetter(1), lines)
print(stat_values)
padding = map(maybe_itemget, lines)
return BaseStats(
*pokedex_id,
StatValues(*map(number.parse, stat_values)),

View File

@ -0,0 +1,4 @@
from functools import partial
from parse.generic import constants
parse = partial(constants.parse, path='constants/pokedex_constants.asm')

View File

@ -68,8 +68,3 @@ def parse(prefix):
path = prefix / "data/pokemon/dex_text.asm"
with open(path) as f:
return list(parse_texts(tokenize.lines(f.read().split('\n'))))
from pathlib import Path
from pprint import pprint
pprint(parse(Path("pokered")))

15
tools/png_size.py Normal file
View File

@ -0,0 +1,15 @@
import sys
from PIL import Image
out_path = sys.argv[1]
in_path = sys.argv[2]
im = Image.open(in_path)
width, height = im.size
assert width % 8 == 0, width
assert width <= 255, width
assert height <= 255, height
with open(out_path, 'w') as f:
f.write(f"static constexpr uint8_t width = {width};\n")
f.write(f"static constexpr uint8_t height = {height};\n")

View File

@ -58,10 +58,11 @@ def debug(buf, bpp):
bpp = int(sys.argv[1])
out_path = sys.argv[2]
in_paths = sys.argv[3:]
assert len(sys.argv) >= 4, sys.argv
with open(out_path, 'wb') as f:
for in_path in sys.argv[3:]:
for in_path in in_paths:
im = Image.open(in_path)
buf = convert(im, bpp)
if 'NBPP_DEBUG' in os.environ: