pokemon/tools/parse/pokemon/base_stats.py

71 lines
1.6 KiB
Python

from dataclasses import dataclass
from operator import itemgetter
from functools import partial
from parse.generic import tokenize
from parse.generic import string
from parse.generic import number
lines = partial(tokenize.lines)
def filter_lines(lines):
for line in lines:
if line[0] in {"db", "dw", "tmhm"}:
yield line
@dataclass
class StatValues:
hit_points: int
attack: int
defense: int
speed: int
special: int
@dataclass
class BaseStats:
pokedex_id: str
stat_values: StatValues
types: tuple[str, str]
catch_rate: int
base_exp: int
pic_font_back: tuple[str, str]
level_1_learnset: tuple[str, str, str, str]
growth_rate: str
tmhm: list[str]
def parse_base_stat(lines):
pokedex_id, \
stat_values, \
types, \
catch_rate, \
base_exp, \
pic_front_back, \
level_1_learnset, \
growth_rate, \
tmhm, \
padding = map(itemgetter(1), lines)
print(stat_values)
return BaseStats(
*pokedex_id,
StatValues(*map(number.parse, stat_values)),
types,
number.parse(*catch_rate),
number.parse(*base_exp),
tuple(pic_front_back),
tuple(level_1_learnset),
*growth_rate,
tmhm,
)
def parse(path):
with open(path) as f:
token_lines = filter_lines(lines(f.read().split('\n')))
return parse_base_stat(token_lines)
def parse_all(prefix):
base_path = prefix / 'data/pokemon/base_stats'
paths = [p for p in base_path.iterdir() if p.is_file()]
# order is pokedex order, not constant order
return [parse(path) for path in paths]