pokemon/tools/generate/sprites.py
Zack Buhman da49dbeb2b Makefile: improve build rules slightly
I'm still not satisfied with the Makefile, but this at least makes it
converge in a single make invocation again.

This also removes the enum value arrays.
2023-07-26 18:17:45 +00:00

102 lines
2.9 KiB
Python

"""
spritesheets_list[0] == Spritesheet('RedSprite', 3)
sprite_constants_list[0] == 'SPRITE_NONE'
gfx_sprites_list['RedSprite'] == 'gfx/sprites/red.2bpp'
"""
# insert a empty sprite for SPRITE_NONE
# remove SPRITE_ prefix
from parse import parse
from generate.sort import default_sort
from generate.binary import binary_res, start_size_value
from generate.generate import renderer
def sorted_sprite_constants_list():
return sorted(parse.sprite_constants_list.items(), key=default_sort)
def includes_header():
yield '#pragma once'
yield ''
yield '#include "../start_size.hpp"'
yield ''
for name, index in sorted_sprite_constants_list():
if name == 'SPRITE_NONE':
continue
assert index != 0, index
spritesheet = parse.spritesheets_list[index - 1]
sprite_path = parse.gfx_sprites_list[spritesheet.name]
yield f'#include "../res/{sprite_path}.h"'
def includes_source():
yield '#include <cstdint>'
yield ''
yield '#include "sprites.hpp"'
yield ''
def sprite_name(name):
assert name.startswith('SPRITE_'), name
return name.removeprefix('SPRITE_').lower()
def struct_spritesheet_t():
_sorted_sprite_constants_list = list(sorted_sprite_constants_list())
sprite_names = (
f"{sprite_name(name)},"
for name, _ in _sorted_sprite_constants_list
)
return [
"struct spritesheet_t {",
"start_size_t spritesheet;",
"uint8_t sprite_count;",
"",
"enum spritesheet {",
*sprite_names,
"};",
"",
f"static constexpr int32_t count = {len(_sorted_sprite_constants_list)};",
"};",
]
def sprites_header():
yield "extern const spritesheet_t spritesheets[];"
def generate_sprites_header():
render, out = renderer()
render(includes_header())
render(struct_spritesheet_t())
render(sprites_header())
return out
def sprite(name, index):
if name == 'SPRITE_NONE':
# special null sprite
sprite_path = None
sprite_count = 0
else:
# spritesheets_list does not include SPRITE_NULL at index 0
assert index != 0, index
spritesheet = parse.spritesheets_list[index - 1]
sprite_path = parse.gfx_sprites_list[spritesheet.name]
sprite_count = spritesheet.sprite_count
return [
f"[spritesheet_t::{sprite_name(name)}] = {{",
".spritesheet = {",
*start_size_value(sprite_path),
"},",
f".sprite_count = {sprite_count}",
"},",
]
def sprites():
yield "const spritesheet_t spritesheets[] = {"
for name, index in sorted_sprite_constants_list():
yield from sprite(name, index)
yield "};"
def generate_sprites_source():
render, out = renderer()
render(includes_source());
render(sprites())
return out