99 lines
2.7 KiB
Python
99 lines
2.7 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():
|
|
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 sprite {",
|
|
*sprite_names,
|
|
"};",
|
|
"};",
|
|
]
|
|
|
|
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
|