Mirai's Miscellaneous Misadventures

M55 / mimimi.h

1/* license: AGPLv3 or later */
2/* copyright 2024 zamfofex */
3
4#ifndef MIMIMI
5#define MIMIMI
6
7struct mimimi_position {
8	int x, y;
9};
10
11struct mimimi_size {
12	int width, height;
13};
14
15struct mimimi_image {
16	int width, height;
17	unsigned char *colors;
18};
19
20struct mimimi_physics {
21	int dx, dy;
22	unsigned char airborne;
23	int width, height;
24	int gravity;
25	struct mimimi_sprite *sprite;
26};
27
28struct mimimi_walk {
29	int ground_speed;
30	int airborne_speed;
31	int direction;
32};
33
34struct mimimi_ground {
35	int width, height;
36	unsigned int colors[256];
37	unsigned int restitution[256];
38	unsigned char tiles[0x2000];
39};
40
41struct mimimi_sprite {
42	struct mimimi_position position;
43	struct mimimi_physics physics;
44	struct mimimi_walk walk;
45	struct mimimi_ground *ground;
46	struct mimimi_position offset;
47	struct mimimi_model *model;
48	unsigned char animation_time;
49	unsigned char landing_time;
50	int direction;
51	int trailing_y;
52	unsigned char trail;
53};
54
55struct mimimi_positioned_physics {
56	struct mimimi_physics *physics;
57	struct mimimi_physics other;
58	struct mimimi_position transform;
59	struct mimimi_position *position;
60	struct mimimi_position previous;
61	unsigned char was_airborne;
62};
63
64struct mimimi_font {
65	unsigned char glyphs[0x60][0x10];
66};
67
68struct mimimi_pose_layer {
69	int slant;
70	int y_angle;
71	int z_angle;
72	int y;
73};
74
75struct mimimi_pose {
76	int x, y;
77	struct mimimi_pose_layer layers[0x80];
78};
79
80struct mimimi_background {
81	struct mimimi_image image;
82	int x, y, z;
83};
84
85struct mimimi_row {
86	int width;
87	int height;
88	int count;
89	unsigned char colors[0x80];
90};
91
92struct mimimi_layer {
93	int x, y, z;
94	int width;
95	int amplifier;
96	int count;
97	struct mimimi_row rows[0x80];
98};
99
100struct mimimi_model_layer {
101	int parent_index;
102	struct mimimi_layer *layer;
103};
104
105struct mimimi_model {
106	int count;
107	struct mimimi_model_layer layers[0x80];
108};
109
110struct mimimi_history {
111	unsigned char left, right;
112};
113
114struct mimimi_clamped_camera {
115	struct mimimi_position *input;
116	struct mimimi_position output;
117	struct mimimi_position offset;
118	struct mimimi_size size;
119};
120
121struct mimimi_dialogue_paragraph {
122	struct mimimi_model *model;
123	char *name;
124	char *text;
125};
126
127struct mimimi_dialogue {
128	struct mimimi_dialogue_paragraph *paragraphs;
129	int count;
130};
131
132struct mimimi_toast_dialogue {
133	int count;
134	int *delays;
135	int *heights;
136	struct mimimi_image *images;
137	int i, j, k;
138};
139
140struct mimimi_momentum {
141	int x, dx;
142};
143
144struct mimimi_platform {
145	struct mimimi_positioned_physics physics;
146	struct mimimi_ground *ground;
147	struct mimimi_image *image;
148};
149
150struct mimimi_linear_motion {
151	int *value;
152	int origin;
153	int scale;
154};
155
156struct mimimi_angular_motion {
157	struct mimimi_position *value;
158	struct mimimi_position origin;
159	int angle;
160	int scale;
161	int height;
162};
163
164struct mimimi_platform_set {
165	
166	struct mimimi_momentum momentum;
167	int balance;
168	int strength;
169	int linear_weight;
170	int angular_weight;
171	int min, max;
172	
173	int linear_platform_count;
174	struct mimimi_platform *linear_platforms;
175	struct mimimi_linear_motion *linear_motions;
176	
177	int angular_platform_count;
178	struct mimimi_platform *angular_platforms;
179	struct mimimi_angular_motion *angular_motions;
180};
181
182struct mimimi_area {
183	struct mimimi_ground *ground;
184	struct mimimi_position offset;
185	struct mimimi_background *backgrounds;
186	int background_count;
187	struct mimimi_background *foregrounds;
188	int foreground_count;
189};
190
191struct mimimi_note {
192	unsigned char frequency, volume;
193};
194
195struct mimimi_sound {
196	struct mimimi_note notes[10000][16];
197	int count;
198};
199
200struct mimimi_played_sound {
201	struct mimimi_sound sound;
202	int current;
203};
204
205struct mimimi_stage {
206	struct mimimi_sprite *sprites;
207	int sprite_count;
208	struct mimimi_position camera;
209	struct mimimi_clamped_camera clamped_camera;
210	struct mimimi_area *areas;
211	int area_count, area_index;
212	struct mimimi_platform_set *platform_sets;
213	int platform_set_count;
214	struct mimimi_played_sound sounds[16];
215};
216
217struct mimimi_stage_jump {
218	struct mimimi_stage *stage;
219	struct mimimi_sprite *sprite;
220};
221
222struct mimimi_input {
223	struct mimimi_image image;
224	struct mimimi_note notes[256];
225	unsigned char left, right;
226};
227
228extern struct mimimi_font *mimimi_font;
229
230extern struct mimimi_model *mimimi_mango;
231extern struct mimimi_model *mimimi_pepper;
232
233extern struct mimimi_model *mimimi_homura_flash;
234extern struct mimimi_model *mimimi_mirai_flash;
235extern struct mimimi_model *mimimi_haruka_flash;
236
237extern struct mimimi_model *mimimi_ryoubi_flash;
238extern struct mimimi_model *mimimi_ryouna_flash;
239
240extern struct mimimi_model *mimimi_mirai_shinomas;
241
242extern signed char *mimimi_sine;
243extern signed char *mimimi_cosine;
244
245int mimimi_div(int n, int q);
246int mimimi_div_up(int n, int q);
247int mimimi_div_down(int n, int q);
248int mimimi_mod(int n, int q);
249int mimimi_angle(int x, int y);
250
251void mimimi_stamp(struct mimimi_image *target, int x, int y, struct mimimi_image *source);
252
253void mimimi_camera_tick(struct mimimi_position *camera, struct mimimi_position *position, int ox, int oy);
254void mimimi_camera_stamp(struct mimimi_image *target, struct mimimi_position *camera, int x, int y, int z, struct mimimi_image *source);
255void mimimi_clamped_camera_tick(struct mimimi_clamped_camera *camera, int width, int height);
256
257void mimimi_collision_physics_tick(struct mimimi_physics *physics, struct mimimi_position *position, struct mimimi_ground *ground);
258void mimimi_physics_tick(struct mimimi_physics *physics, struct mimimi_position *position, struct mimimi_ground *ground);
259void mimimi_physics(struct mimimi_physics *physics, int width, int height);
260
261void mimimi_sprite(struct mimimi_sprite *sprite, struct mimimi_model *model, struct mimimi_ground *ground, int x, int y, int width, int height);
262void mimimi_sprite_tick(struct mimimi_sprite *sprite);
263
264void mimimi_positioned_physics_tick(struct mimimi_positioned_physics *physics, struct mimimi_ground *ground);
265void mimimi_positioned_physics(struct mimimi_positioned_physics *physics, struct mimimi_physics *other, struct mimimi_position *position);
266
267int mimimi_measure_character(struct mimimi_font *font, char ch);
268int mimimi_draw_character(struct mimimi_font *font, char ch, struct mimimi_image *target, int x, int y, unsigned char color);
269
270int mimimi_measure_segment(struct mimimi_font *font, char *text, int count);
271int mimimi_draw_segment(struct mimimi_font *font, char *text, int count, struct mimimi_image *target, int x, int y, unsigned char color);
272
273char *mimimi_skip_word(char *text);
274int mimimi_count_word(char *text);
275int mimimi_measure_word(struct mimimi_font *font, char *text);
276int mimimi_draw_word(struct mimimi_font *font, char *text, struct mimimi_image *target, int x, int y, unsigned char color);
277
278char *mimimi_skip_paragraph(char *text);
279int mimimi_count_paragraph(char *text);
280int mimimi_measure_paragraph(struct mimimi_font *font, char *text);
281int mimimi_draw_paragraph(struct mimimi_font *font, char *text, struct mimimi_image *target, int x, int y, unsigned char color);
282
283char *mimimi_skip_line(struct mimimi_font *font, char *text, int width);
284int mimimi_count_line(struct mimimi_font *font, char *text, int width);
285int mimimi_measure_line(struct mimimi_font *font, char *text, int width);
286int mimimi_draw_line(struct mimimi_font *font, char *text, int width, struct mimimi_image *target, int x, int y, unsigned char color);
287
288int mimimi_measure_text(struct mimimi_font *font, char *text, int width, int line_height);
289int mimimi_draw_text(struct mimimi_font *font, char *text, int width, int line_height, struct mimimi_image *target, int x, int y, unsigned char color);
290
291void mimimi_pose(struct mimimi_image *image, struct mimimi_model *model, struct mimimi_pose *pose);
292void mimimi_interpolate(struct mimimi_pose *a, struct mimimi_pose *b, int i, int count);
293
294void mimimi_background_tick(struct mimimi_background *background, struct mimimi_image *image, struct mimimi_position *camera, struct mimimi_position *offset);
295void mimimi_display_tick(struct mimimi_image *image, struct mimimi_sprite *sprite, struct mimimi_position *camera);
296
297unsigned char mimimi_ground_tile(struct mimimi_ground *ground, int x, int y);
298
299void mimimi_history_tick(struct mimimi_history *history, unsigned char left, unsigned char right);
300void mimimi_controls_tick(struct mimimi_walk *walk, struct mimimi_history *history, void (*jump)(void *data), void *data);
301void mimimi_jump(void *data);
302
303void mimimi_toast_dialogue(struct mimimi_toast_dialogue *toast_dialogue, struct mimimi_dialogue *dialogue);
304int mimimi_toast_dialogue_tick(struct mimimi_toast_dialogue *dialogue, struct mimimi_image *image);
305
306void mimimi_stage(struct mimimi_stage *stage, struct mimimi_ground **grounds, int count);
307void mimimi_stage_tick(struct mimimi_stage *stage, struct mimimi_input *input);
308struct mimimi_sprite *mimimi_spawn(struct mimimi_stage *stage, struct mimimi_model *model, int x, int y, int width, int height);
309void mimimi_stage_jump(void *data);
310void mimimi_play_sound(struct mimimi_stage *stage, struct mimimi_sound *sound);
311
312void mimimi_linear_propagate(struct mimimi_momentum *momentum, int value, int x0, int scale);
313void mimimi_linear_apply(struct mimimi_momentum *momentum, int *value, int x0, int scale);
314
315void mimimi_angular_propagate(struct mimimi_momentum *momentum, struct mimimi_position *position, int x0, int y0, int a0, int scale);
316void mimimi_angular_apply(struct mimimi_momentum *momentum, struct mimimi_position *position, int x0, int y0, int a0, int scale, int length);
317
318void mimimi_linear_motion_propagate(struct mimimi_linear_motion *motion, struct mimimi_momentum *momentum);
319void mimimi_linear_motion_apply(struct mimimi_linear_motion *motion, struct mimimi_momentum *momentum);
320
321void mimimi_angular_motion_propagate(struct mimimi_angular_motion *motion, struct mimimi_momentum *momentum);
322void mimimi_angular_motion_apply(struct mimimi_angular_motion *motion, struct mimimi_momentum *momentum);
323
324void mimimi_platform_display_tick(struct mimimi_platform *platform, struct mimimi_position *camera, struct mimimi_image *image);
325struct mimimi_platform_set *mimimi_add_platform_set(struct mimimi_stage *stage);
326void mimimi_spawn_linear_platform(struct mimimi_stage *stage, struct mimimi_platform_set *platforms, struct mimimi_ground *ground, struct mimimi_image *image, int x, int y, int scale);
327void mimimi_spawn_angular_platform(struct mimimi_stage *stage, struct mimimi_platform_set *platforms, struct mimimi_ground *ground, struct mimimi_image *image, int x, int y, int a, int scale, int height);
328
329void mimimi_platform_set_tick(struct mimimi_platform_set *platform_set);
330void mimimi_platform_set_display_tick(struct mimimi_platform_set *platforms, struct mimimi_image *image, struct mimimi_position *camera);
331
332void mimimi_unpack_bits(int size, unsigned char *unpacked, unsigned char *packed);
333
334void mimimi_linear_motion(struct mimimi_linear_motion *motion, int *value, int origin, int scale);
335void mimimi_angular_motion(struct mimimi_angular_motion *motion, struct mimimi_position *value, int x0, int y0, int a0, int scale, int height);
336
337void mimimi_background(struct mimimi_image *image, struct mimimi_ground *ground);
338
339void mimimi_boxing(struct mimimi_size *size, struct mimimi_image *image);
340
341void mimimi_scale(struct mimimi_image *target, struct mimimi_image *source);
342
343void mimimi_main(void (*tick)(void *data, struct mimimi_input *input), void *data);
344
345#endif