Mirai's Miscellaneous Misadventures

M17 / include / mimimi / chapters.h

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

#ifndef MIMIMI_CHAPTERS_H
#define MIMIMI_CHAPTERS_H

// types

struct mimimi_game;
struct mimimi_sprite;
struct mimimi_sprite_appearance;
struct mimimi_image;

enum mimimi_occurrence
{
	mimimi_sprite_spawned,
};

struct mimimi_chapter
{
	void *data;
	void (*start)(struct mimimi_chapter *chapter, struct mimimi_game *game);
	void (*step)(struct mimimi_chapter *chapter);
	void (*occurrence)(struct mimimi_chapter *chapter, enum mimimi_occurrence type, void *occurrence);
};

struct mimimi_physical_attributes
{
	int x, y;
	int width, height;
	int dx, dy;
	
	char airborne;
	
	char direction;
};

struct mimimi_living_attributes
{
	int knocked_time;
	int immunity_time;
	int pristinity;
};

struct mimimi_behavior
{
	void (*behave)(struct mimimi_sprite *sprite, void *data);
	void *data;
};

struct mimimi_physics_data
{
	int gravity;
};

struct mimimi_fall_data
{
	int max_speed;
	int knocked_time;
};

struct mimimi_live_data
{
	int recovery_immunity_time;
	int max_pristinity;
};

struct mimimi_walk_data
{
	int ground_speed;
	int airborne_speed;
};

struct mimimi_camera_data
{
	struct mimimi_sprite *target;
};

struct mimimi_behave_data
{
	struct mimimi_behavior *behavior;
	struct mimimi_physics_data *physics_data;
	struct mimimi_fall_data *fall_data;
	struct mimimi_live_data *live_data;
	struct mimimi_walk_data *walk_data;
};

// constants

extern struct mimimi_physics_data *mimimi_physics_data_default;
extern struct mimimi_fall_data *mimimi_fall_data_default;
extern struct mimimi_live_data *mimimi_live_data_default;
extern struct mimimi_walk_data *mimimi_walk_data_default;
extern struct mimimi_behave_data *mimimi_behave_data_default;

extern int mimimi_sprite_size;

extern int mimimi_width;
extern int mimimi_height;

// functions

void mimimi_jump(struct mimimi_sprite *sprite);
void mimimi_damage(struct mimimi_sprite *sprite, int damage, int attack_y, int attack_width, int attack_height);

void mimimi_spawn(struct mimimi_game *game, struct mimimi_sprite *sprite, int x, int y, int width, int height, struct mimimi_sprite_appearance *appearance, struct mimimi_behavior *behavior);

void mimimi_physics(struct mimimi_sprite *sprite, void *data);
void mimimi_controls(struct mimimi_sprite *sprite, void *data);
void mimimi_enemy_ai(struct mimimi_sprite *sprite, void *data);
void mimimi_stationary_ai(struct mimimi_sprite *sprite, void *data);
void mimimi_fall(struct mimimi_sprite *sprite, void *data);
void mimimi_live(struct mimimi_sprite *sprite, void *data);
void mimimi_walk(struct mimimi_sprite *sprite, void *data);
void mimimi_camera(struct mimimi_sprite *sprite, void *data);
void mimimi_behave(struct mimimi_sprite *sprite, void *data);

void mimimi_physical_attributes(struct mimimi_sprite *sprite, struct mimimi_physical_attributes *attributes);
void mimimi_living_attributes(struct mimimi_sprite *sprite, struct mimimi_living_attributes *attributes);

void mimimi_camera_sprite(struct mimimi_sprite *sprite);

void mimimi_ground(struct mimimi_game *game, unsigned char *ground, int width, int height);
void mimimi_background(struct mimimi_game *game, struct mimimi_image *background);
void mimimi_overlay(struct mimimi_game *game, struct mimimi_image *overlay);

int mimimi_text(struct mimimi_image *image, struct mimimi_image *glyphs, int x, int y, char *text);

#endif