All sprites and tilesets can fit at the same time. Load everything all at once to avoid flickering during drawing.
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 spritesheet {",
|
|
*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
|