""" 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 ' 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