Mirai's Miscellaneous Misadventures

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