Mirai's Miscellaneous Misadventures

M18 / test / chapter.c

// copyright 2022 zamfofex
// license: AGPLv3 or later

#include <mimimi/chapters.h>
#include <mimimi/senran-kagura/characters.h>
#include <mimimi/appearances.h>
#include <mimimi/allocators.h>
#include <mimimi/ground.h>
#include <mimimi/compound-behaviors.h>
#include <mimimi/geometry.h>
#include <mimimi/assets.h>
#include <mimimi/engines.h>
#include <mimimi/controls.h>
#include <mimimi/sprites.h>
#include <mimimi/cameras.h>
#include <mimimi/behaviors.h>
#include <mimimi/font.h>
#include <mimimi/fonts.h>

#include <mimimi/test.h>

#include "ground.c"

struct mimimi_chapter *mimimi_test(struct mimimi_allocator *allocator)
{
	struct mimimi_behavior *compound = mimimi_compound_behavior(allocator);
	
	struct mimimi_engine *engine = (*allocator->allocate)(sizeof *engine);
	mimimi_compound(compound, mimimi_finalizer(engine, allocator->deallocate, allocator));
	
	struct mimimi_chapter *chapter = (*allocator->allocate)(sizeof *chapter);
	mimimi_compound(compound, mimimi_finalizer(chapter, allocator->deallocate, allocator));
	chapter->behavior = compound;
	chapter->engine = engine;
	
	struct mimimi_position *camera = (*allocator->allocate)(sizeof *camera);
	mimimi_compound(compound, mimimi_finalizer(camera, allocator->deallocate, allocator));
	
	struct mimimi_image *background = (*allocator->allocate)(sizeof *background);
	mimimi_compound(compound, mimimi_finalizer(background, allocator->deallocate, allocator));
	
	background->colors = (*allocator->allocate)(mimimi_test_ground.width * 16 * mimimi_test_ground.height * 16);
	mimimi_compound(compound, mimimi_finalizer(background->colors, allocator->deallocate, allocator));
	
	static unsigned char ground_colors[] = {0x00, 0x3B, 0x1C, 0x21, 0x82, 0x56, 0x43, 0x25};
	
	background->width = mimimi_test_ground.width * 16;
	background->height = mimimi_test_ground.height * 16;
	
	for (int x = 0 ; x < mimimi_test_ground.width * 16 ; x++)
	for (int y = 0 ; y < mimimi_test_ground.height * 16 ; y++)
	{
		unsigned char color = ground_colors[mimimi_test_ground.tiles[x / 16 + y / 16 * mimimi_test_ground.width]];
		background->colors[x + y * mimimi_test_ground.width * 16] = color;
	}
	
	struct mimimi_history *history = (*allocator->allocate)(sizeof *history);
	mimimi_compound(compound, mimimi_finalizer(history, allocator->deallocate, allocator));
	mimimi_compound(compound, mimimi_history(history, chapter, allocator));
	
	struct mimimi_sprite *mirai = mimimi_sprite(&mimimi_test_ground, 11776, 5248, 80, 250, allocator);
	// struct mimimi_sprite *ryoubi = mimimi_sprite(&mimimi_test_ground, 10000, 5120, 80, 250, allocator);
	// struct mimimi_sprite *ryouna = mimimi_sprite(&mimimi_test_ground, 11000, 5376, 80, 250, allocator);
	
	struct mimimi_appearance *mirai_appearance = mimimi_appearance(mimimi_mirai_yang, allocator);
	// struct mimimi_appearance *ryoubi_appearance = mimimi_appearance(mimimi_ryoubi_flash, allocator);
	// struct mimimi_appearance *ryouna_appearance = mimimi_appearance(mimimi_ryouna_flash, allocator);
	
	mimimi_compound(compound, mirai->behavior);
	// mimimi_compound(compound, ryoubi->behavior);
	// mimimi_compound(compound, ryouna->behavior);
	
	struct mimimi_jump *mirai_jump = (*allocator->allocate)(sizeof *mirai_jump);
	mimimi_compound(compound, mimimi_finalizer(mirai_jump, allocator->deallocate, allocator));
	struct mimimi_behavior *mirai_jump_behavior = mimimi_jump(mirai_jump, mirai->physics, allocator);
	mimimi_compound(compound, mimimi_finalizer(mirai_jump_behavior->data, mirai_jump_behavior->finish, allocator));
	
	struct mimimi_controls *mirai_controls = (*allocator->allocate)(sizeof *mirai_controls);
	mimimi_compound(compound, mimimi_finalizer(mirai_controls, allocator->deallocate, allocator));
	mirai->awake_behavior = mimimi_controls(mirai_controls, mirai->walk, history, allocator);
	mimimi_compound(compound, mimimi_finalizer(mirai->awake_behavior->data, mirai->awake_behavior->finish, allocator));
	mirai_controls->jump = mirai_jump_behavior;
	
	mimimi_compound(compound, mimimi_camera(camera, mirai->position, 0, -512, allocator));
	
	mimimi_compound(compound, mimimi_background(engine, camera, background, 0, allocator));
	
	mimimi_compound(compound, mimimi_display(engine, camera, mirai, mirai_appearance, allocator));
	// mimimi_compound(compound, mimimi_display(engine, camera, ryoubi, ryoubi_appearance, allocator));
	// mimimi_compound(compound, mimimi_display(engine, camera, ryouna, ryouna_appearance, allocator));
	
	struct mimimi_image *overlay = (*allocator->allocate)(sizeof *overlay);
	mimimi_compound(compound, mimimi_finalizer(overlay, allocator->deallocate, allocator));
	
	overlay->colors = (*allocator->allocate)(256 * 64);
	mimimi_compound(compound, mimimi_finalizer(overlay->colors, allocator->deallocate, allocator));
	
	overlay->width = 256;
	overlay->height = 64;
	
	for (int i = 0 ; i < overlay->width * overlay->height ; i++)
		overlay->colors[i] = 0;
	
	struct mimimi_image *glyphs = (*allocator->allocate)(mimimi_font_image_count * sizeof *glyphs);
	unsigned char *colors = (*allocator->allocate)(mimimi_font_color_count);
	
	for (int i = 0 ; i < mimimi_font_image_count ; i++)
		glyphs[i].colors = colors + i * mimimi_font_image_color_count;
	
	mimimi_glyphs(glyphs, mimimi_font, 0x6C);
	
	mimimi_text(overlay, glyphs, 16, 16, "Mirai's Miscellaneous Misadventures");
	mimimi_text(overlay, glyphs, 16, 32, "Milestone 18, March 3 of 2022");
	
	(*allocator->deallocate)(colors);
	(*allocator->deallocate)(glyphs);
	
	mimimi_compound(compound, mimimi_overlay(engine, overlay, 0, 0, allocator));
	
	return chapter;
}