pokemon/tools/parse/collision_tile_ids.py
Zack Buhman a921a44b66 parse: move tokenize_line/tokenize_lines to a new module
At times I forget what I have already written. I hope that this might help keep
things more organized.
2023-07-31 16:23:55 -07:00

34 lines
1008 B
Python

from functools import partial
from parse.maps_blocks import tokenize_block
from parse import number
from parse.generic import macro_line
def tokenize_lines(lines):
for line in lines:
if '_Coll:' in line:
yield tokenize_block(line, delim='::')
elif 'coll_tiles' in line:
tokens, = tokenize_block(line, delim='::')
yield macro_line.tokenize_line(tokens)
def flatten(tokens):
stack = []
for t in tokens:
if t[0] == 'coll_tiles':
tile_ids = t[1] if len(t) == 2 else []
for name in stack:
yield name, list(map(number.parse, tile_ids))
stack = []
elif len(t) == 1:
name, = t
stack.append(name)
def parse(prefix):
path = prefix / 'data/tilesets/collision_tile_ids.asm'
with open(path) as f:
tokens = tokenize_lines(f.read().split('\n'))
l = list(flatten(tokens))
d = dict(l)
assert len(l) == len(d)
return d