2023-08-02 01:50:18 +00:00

111 lines
2.8 KiB
Python

"""
struct move_t {
uint8_t effect; // fixme: constants/move_effect_constants.asm
uint8_t power;
uint8_t type; // fixme: constants/type_constants.asm
uint8_t accuracy;
uint8_t pp;
enum move {
wing_attack,
};
};
const move_t moves[] = {
[move_t::pound] = {
.effect =
.power =
.type =
.accuracy =
.pp =
},
};
"""
from generate.generate import renderer
from parse import parse
# parse.move_constants_list()
# parse.move_names_list()
# parse.move_moves_list()
def includes_header():
yield "#pragma once"
yield ""
def move_constants():
_move_constants = parse.move_constants_list()
_moves = list(parse.move_moves_list())
for constant_ix, constant_name in enumerate(_move_constants):
# move_constants is also used for animation names it will be
# modeled in a separate enum (e.g: there is no such move as
# "shrinking_square_black_anim", so it shouldn't appear in
# this enum). This appears to be a questionable decision in
# the pokered decompilation project, not an original design
# decision in the game.
if constant_ix < len(_moves):
yield constant_name
def struct_move_t():
_move_constants = move_constants()
_move_constants_str = (f"{s.lower()}," for s in _move_constants)
return [
"struct move_t {",
"uint8_t animation;",
"uint8_t effect;",
"uint8_t power;",
"uint8_t type;",
"uint8_t accuracy;",
"uint8_t pp;",
"",
"enum move {",
*_move_constants_str,
"};",
"};",
]
def extern_moves():
yield "extern const move_t moves[];"
def generate_header():
render, out = renderer()
render(includes_header())
render(struct_move_t())
render(extern_moves())
return out
def move(constant_index, constant_name):
_move = parse.move_moves_list()[constant_index]
return [
f"[move_t::{constant_name.lower()}] = {{",
".animation = 0,",
".effect = 0,",
f".power = {_move.power},",
".type = 0,",
f".accuracy = {_move.accuracy},",
f".pp = {_move.pp},",
"},"
]
def moves():
yield "const move_t moves[] = {"
for constant_index, constant_name in enumerate(move_constants()):
if constant_index == 0:
# no_move
yield f"[move_t::{constant_name.lower()}] = {{ 0 }},"
else:
yield from move(constant_index - 1, constant_name)
yield "};"
def includes_source():
yield '#include <cstdint>'
yield ''
yield '#include "moves.hpp"'
yield ''
def generate_source():
render, out = renderer()
render(includes_source())
render(moves())
return out