Mirai's Miscellaneous Misadventures

M17 / test / chapter.c

1// copyright 2022 zamfofex
2// license: AGPLv3 or later
3
4#include <mimimi/chapters.h>
5#include <mimimi/senran-kagura/characters.h>
6#include <mimimi/appearances.h>
7#include <mimimi/assets.h>
8#include <mimimi/fonts.h>
9#include <mimimi/font.h>
10
11#include <mimimi/test.h>
12
13#include "ground.c"
14
15struct mimimi_test
16{
17	struct mimimi_game *game;
18	
19	struct mimimi_sprite_appearance *camera_appearance;
20	struct mimimi_sprite_appearance *mirai_appearance;
21	struct mimimi_sprite_appearance *ryoubi_appearance;
22	struct mimimi_sprite_appearance *ryouna_appearance;
23	
24	struct mimimi_behavior *camera_behavior;
25	struct mimimi_behavior *mirai_behavior;
26	struct mimimi_behavior *ryoubi_behavior;
27	struct mimimi_behavior *ryouna_behavior;
28	
29	struct mimimi_sprite *camera;
30	struct mimimi_sprite *mirai;
31	struct mimimi_sprite *ryoubi;
32	struct mimimi_sprite *ryouna;
33	
34	struct mimimi_camera_data camera_data;
35	
36	struct mimimi_behave_data mirai_behave_data;
37	struct mimimi_behave_data ryoubi_behave_data;
38	struct mimimi_behave_data ryouna_behave_data;
39	
40	struct mimimi_behavior mirai_behave_data_behavior;
41	struct mimimi_behavior ryoubi_behave_data_behavior;
42	struct mimimi_behavior ryouna_behave_data_behavior;
43	
44	struct mimimi_image *background;
45	struct mimimi_image *overlay;
46	
47	struct mimimi_image *glyphs;
48};
49
50static void mimimi_test_start(struct mimimi_chapter *chapter, struct mimimi_game *game)
51{
52	struct mimimi_test *data = chapter->data;
53	
54	mimimi_ground(game, mimimi_test_ground, mimimi_test_width, mimimi_test_height);
55	mimimi_background(game, data->background);
56	mimimi_overlay(game, data->overlay);
57	
58	int x = 11776;
59	int y = 5248;
60	
61	mimimi_spawn(game, data->camera, x, y - 512, 0, 0, data->camera_appearance, data->camera_behavior);
62	mimimi_spawn(game, data->mirai, x, y, 80, 250, data->mirai_appearance, data->mirai_behavior);
63	mimimi_spawn(game, data->ryoubi, 10000, 5120, 80, 250, data->ryoubi_appearance, data->ryoubi_behavior);
64	mimimi_spawn(game, data->ryouna, 11000, 5376, 80, 250, data->ryouna_appearance, data->ryouna_behavior);
65	
66	mimimi_camera_sprite(data->camera);
67}
68
69static void mimimi_test_step(struct mimimi_chapter *chapter) { }
70static void mimimi_test_occurrence(struct mimimi_chapter *chapter, enum mimimi_occurrence appearance, void *occurrence) { }
71
72struct mimimi_chapter *mimimi_test(void *(*allocate)(unsigned int count))
73{
74	struct mimimi_test *data = (*allocate)(sizeof *data);
75	
76	data->camera_appearance = (*allocate)(mimimi_sprite_appearance_size);
77	data->mirai_appearance = (*allocate)(mimimi_sprite_appearance_size);
78	data->ryoubi_appearance = (*allocate)(mimimi_sprite_appearance_size);
79	data->ryouna_appearance = (*allocate)(mimimi_sprite_appearance_size);
80	
81	data->camera_behavior = (*allocate)(sizeof *data->camera_behavior);
82	data->mirai_behavior = (*allocate)(sizeof *data->mirai_behavior);
83	data->ryoubi_behavior = (*allocate)(sizeof *data->ryoubi_behavior);
84	data->ryouna_behavior = (*allocate)(sizeof *data->ryouna_behavior);
85	
86	data->camera = (*allocate)(mimimi_sprite_size);
87	data->mirai = (*allocate)(mimimi_sprite_size);
88	data->ryoubi = (*allocate)(mimimi_sprite_size);
89	data->ryouna = (*allocate)(mimimi_sprite_size);
90	
91	data->background = (*allocate)(sizeof *data->background);
92	data->overlay = (*allocate)(sizeof *data->overlay);
93	
94	data->background->colors = (*allocate)(mimimi_test_width * 16 * mimimi_test_height * 16);
95	
96	data->overlay = (*allocate)(sizeof *data->overlay);
97	data->overlay->colors = (*allocate)(mimimi_width * mimimi_height);
98	
99	data->glyphs = (*allocate)(mimimi_font_image_count * sizeof *data->glyphs);
100	
101	for (int i = 0 ; i < mimimi_font_image_count ; i++)
102		data->glyphs[i].colors = (*allocate)(mimimi_font_image_color_count);
103	
104	data->mirai_behave_data = *mimimi_behave_data_default;
105	data->mirai_behave_data.behavior = &data->mirai_behave_data_behavior;
106	data->mirai_behave_data_behavior.behave = &mimimi_controls;
107	data->mirai_behavior->behave = &mimimi_behave;
108	data->mirai_behavior->data = &data->mirai_behave_data;
109	
110	data->ryoubi_behave_data = *mimimi_behave_data_default;
111	data->ryoubi_behave_data.behavior = &data->ryoubi_behave_data_behavior;
112	data->ryoubi_behave_data_behavior.behave = &mimimi_stationary_ai;
113	data->ryoubi_behave_data_behavior.data = data->mirai;
114	data->ryoubi_behavior->behave = &mimimi_behave;
115	data->ryoubi_behavior->data = &data->ryoubi_behave_data;
116	
117	data->ryouna_behave_data = *mimimi_behave_data_default;
118	data->ryouna_behave_data.behavior = &data->ryouna_behave_data_behavior;
119	data->ryouna_behave_data_behavior.behave = &mimimi_stationary_ai;
120	data->ryouna_behave_data_behavior.data = data->mirai;
121	data->ryouna_behavior->behave = &mimimi_behave;
122	data->ryouna_behavior->data = &data->ryouna_behave_data;
123	
124	data->camera_behavior->behave = &mimimi_camera;
125	data->camera_behavior->data = &data->camera_data;
126	
127	data->camera_data.target = data->mirai;
128	
129	mimimi_sprite_appearance(data->mirai_appearance, mimimi_mirai_yang);
130	mimimi_sprite_appearance(data->ryoubi_appearance, mimimi_ryoubi_flash);
131	mimimi_sprite_appearance(data->ryouna_appearance, mimimi_ryouna_flash);
132	data->camera_appearance = mimimi_empty_appearance;
133	
134	struct mimimi_chapter *chapter = (*allocate)(sizeof *chapter);
135	chapter->data = data;
136	chapter->start = &mimimi_test_start;
137	chapter->step = &mimimi_test_step;
138	chapter->occurrence = &mimimi_test_occurrence;
139	
140	static unsigned char ground_colors[] = {0x00, 0x3B, 0x1C, 0x21, 0x82, 0x56, 0x43, 0x25};
141	
142	data->background->width = mimimi_test_width * 16;
143	data->background->height = mimimi_test_height * 16;
144	
145	for (int x = 0 ; x < mimimi_test_width * 16 ; x++)
146	for (int y = 0 ; y < mimimi_test_height * 16 ; y++)
147	{
148		unsigned char color = ground_colors[mimimi_test_ground[x / 16 + y / 16 * mimimi_test_width]];
149		data->background->colors[x + y * mimimi_test_width * 16] = color;
150	}
151	
152	mimimi_glyphs(data->glyphs, mimimi_font, 0x6C);
153	
154	data->overlay->width = mimimi_width;
155	data->overlay->height = mimimi_height;
156	
157	for (int x = 0 ; x < mimimi_width ; x++)
158	for (int y = 0 ; y < mimimi_height ; y++)
159		data->overlay->colors[x + y * mimimi_width] = 0;
160	
161	mimimi_text(data->overlay, data->glyphs, 16, 16, "Mirai's Miscellaneous Misadventures M17");
162	mimimi_text(data->overlay, data->glyphs, 16, 32, "a Senran Kagura fangame by zamfofex");
163	mimimi_text(data->overlay, data->glyphs, 16, 48, "January 27 of 2022");
164	
165	return chapter;
166}
167
168void mimimi_test_end(struct mimimi_chapter *chapter, void (*deallocate)(void *data))
169{
170	struct mimimi_test *data = chapter->data;
171	
172	(*deallocate)(chapter);
173	
174	(*deallocate)(data->camera_appearance);
175	(*deallocate)(data->mirai_appearance);
176	(*deallocate)(data->ryoubi_appearance);
177	(*deallocate)(data->ryouna_appearance);
178	
179	(*deallocate)(data->camera_behavior);
180	(*deallocate)(data->mirai_behavior);
181	(*deallocate)(data->ryoubi_behavior);
182	(*deallocate)(data->ryouna_behavior);
183	
184	(*deallocate)(data->camera);
185	(*deallocate)(data->mirai);
186	(*deallocate)(data->ryoubi);
187	(*deallocate)(data->ryouna);
188	
189	(*deallocate)(data->background);
190	(*deallocate)(data->overlay);
191	
192	for (int i = 0 ; i < mimimi_font_image_count ; i++)
193		(*deallocate)(data->glyphs[i].colors);
194	
195	(*deallocate)(data->glyphs);
196	
197	(*deallocate)(data);
198}