From 145b6b8936e4c7481be8ef2eeb2de8fcacd2a072 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Wed, 2 Aug 2023 00:22:44 +0000 Subject: [PATCH] tools/parse: more pokemon and move parsers --- tools/parse/move/__init__.py | 3 +++ tools/parse/move/constants.py | 2 +- tools/parse/move/moves.py | 20 +++++++------- tools/parse/parse.py | 39 +++++++++++++++++++++++----- tools/parse/pokemon/__init__.py | 11 ++++++++ tools/parse/pokemon/base_stats.py | 14 +++++++--- tools/parse/pokemon/dex_constants.py | 4 +++ tools/parse/pokemon/dex_text.py | 5 ---- tools/png_size.py | 15 +++++++++++ tools/png_to_nbpp_sprite.py | 3 ++- 10 files changed, 90 insertions(+), 26 deletions(-) create mode 100644 tools/parse/move/__init__.py create mode 100644 tools/parse/pokemon/__init__.py create mode 100644 tools/parse/pokemon/dex_constants.py create mode 100644 tools/png_size.py diff --git a/tools/parse/move/__init__.py b/tools/parse/move/__init__.py new file mode 100644 index 0000000..953ec13 --- /dev/null +++ b/tools/parse/move/__init__.py @@ -0,0 +1,3 @@ +from parse.move import constants +from parse.move import names +from parse.move import moves diff --git a/tools/parse/move/constants.py b/tools/parse/move/constants.py index dc50ba5..6cae203 100644 --- a/tools/parse/move/constants.py +++ b/tools/parse/move/constants.py @@ -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') diff --git a/tools/parse/move/moves.py b/tools/parse/move/moves.py index 3701773..310c25b 100644 --- a/tools/parse/move/moves.py +++ b/tools/parse/move/moves.py @@ -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): diff --git a/tools/parse/parse.py b/tools/parse/parse.py index 9224498..2755675 100644 --- a/tools/parse/parse.py +++ b/tools/parse/parse.py @@ -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)) diff --git a/tools/parse/pokemon/__init__.py b/tools/parse/pokemon/__init__.py new file mode 100644 index 0000000..38ea6a8 --- /dev/null +++ b/tools/parse/pokemon/__init__.py @@ -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 diff --git a/tools/parse/pokemon/base_stats.py b/tools/parse/pokemon/base_stats.py index 9ee2423..24e4c5d 100644 --- a/tools/parse/pokemon/base_stats.py +++ b/tools/parse/pokemon/base_stats.py @@ -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)), diff --git a/tools/parse/pokemon/dex_constants.py b/tools/parse/pokemon/dex_constants.py new file mode 100644 index 0000000..1b45037 --- /dev/null +++ b/tools/parse/pokemon/dex_constants.py @@ -0,0 +1,4 @@ +from functools import partial +from parse.generic import constants + +parse = partial(constants.parse, path='constants/pokedex_constants.asm') diff --git a/tools/parse/pokemon/dex_text.py b/tools/parse/pokemon/dex_text.py index f6d04bd..5ed7dee 100644 --- a/tools/parse/pokemon/dex_text.py +++ b/tools/parse/pokemon/dex_text.py @@ -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"))) diff --git a/tools/png_size.py b/tools/png_size.py new file mode 100644 index 0000000..eb183fc --- /dev/null +++ b/tools/png_size.py @@ -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") diff --git a/tools/png_to_nbpp_sprite.py b/tools/png_to_nbpp_sprite.py index b9a760b..7c4846f 100644 --- a/tools/png_to_nbpp_sprite.py +++ b/tools/png_to_nbpp_sprite.py @@ -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: