71 lines
1.6 KiB
Python
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]
|