2020-08-16 14:36:31 +00:00
|
|
|
// Bosses
|
|
|
|
// ------
|
2020-08-21 18:13:08 +00:00
|
|
|
static const pixel_t BOSS_W = 64;
|
|
|
|
static const pixel_t BOSS_H = 64;
|
2020-08-16 14:03:31 +00:00
|
|
|
|
2020-08-16 14:36:31 +00:00
|
|
|
typedef struct {
|
2021-06-30 14:30:06 +00:00
|
|
|
PlayfieldMotion pos;
|
2020-08-16 14:36:31 +00:00
|
|
|
int hp;
|
|
|
|
unsigned char sprite;
|
|
|
|
unsigned char phase;
|
|
|
|
int phase_frame;
|
|
|
|
unsigned char damage_this_frame;
|
|
|
|
unsigned char mode;
|
|
|
|
// Used for both movement and bullet angles.
|
|
|
|
unsigned char angle;
|
|
|
|
unsigned char mode_change;
|
|
|
|
int phase_end_hp;
|
|
|
|
} boss_stuff_t;
|
|
|
|
|
|
|
|
extern boss_stuff_t boss;
|
|
|
|
extern SPPoint boss_hitbox_radius;
|
|
|
|
|
|
|
|
// Callbacks
|
|
|
|
extern farfunc_t_near boss_update;
|
|
|
|
extern nearfunc_t_near boss_fg_render;
|
2021-06-15 03:51:45 +00:00
|
|
|
|
|
|
|
// Also responsible to set [bg_render_bombing_func] to the
|
|
|
|
// [boss_bg_render_func]!
|
2020-08-16 14:36:31 +00:00
|
|
|
extern farfunc_t_near boss_update_func;
|
2021-06-15 03:51:45 +00:00
|
|
|
|
2020-08-16 14:36:31 +00:00
|
|
|
extern nearfunc_t_near boss_backdrop_colorfill;
|
|
|
|
extern nearfunc_t_near boss_bg_render_func;
|
|
|
|
extern nearfunc_t_near boss_fg_render_func;
|
|
|
|
|
|
|
|
#define BOSS_DEC(name) \
|
|
|
|
void pascal far name##_update(void); \
|
|
|
|
void pascal near name##_bg_render(void); \
|
|
|
|
void pascal near name##_fg_render(void);
|
2021-06-19 13:15:24 +00:00
|
|
|
|
|
|
|
// Renders the boss battle background image at the given screen position,
|
|
|
|
// surrounded by the given background [col].
|
|
|
|
void pascal near boss_backdrop_render(
|
|
|
|
screen_x_t left, vram_y_t top, uint4_t col
|
|
|
|
);
|
2020-08-16 14:36:31 +00:00
|
|
|
// ------
|
|
|
|
|
2020-04-08 17:59:53 +00:00
|
|
|
/// Explosions
|
|
|
|
/// ----------
|
|
|
|
#define EXPLOSION_SMALL_COUNT 2
|
|
|
|
|
|
|
|
struct explosion_t {
|
|
|
|
char flag;
|
|
|
|
unsigned char age;
|
|
|
|
SPPoint center;
|
|
|
|
SPPoint radius_cur;
|
|
|
|
SPPoint radius_delta;
|
|
|
|
int8_t unused;
|
|
|
|
// Offset to add to the angle for the Y coordinate, turning the circle
|
|
|
|
// into a slanted ellipse. See https://www.desmos.com/calculator/faeefi6w1u
|
|
|
|
// for a plot of the effect.
|
|
|
|
unsigned char angle_offset;
|
|
|
|
};
|
|
|
|
|
2022-03-18 19:12:35 +00:00
|
|
|
enum explosion_type_t {
|
2020-04-08 17:59:53 +00:00
|
|
|
ET_NONE = -1,
|
2022-03-18 19:12:35 +00:00
|
|
|
ET_CIRCLE = 0,
|
2020-04-08 17:59:53 +00:00
|
|
|
ET_NW_SE = 1,
|
|
|
|
ET_SW_NE = 2,
|
|
|
|
ET_HORIZONTAL = 3,
|
|
|
|
ET_VERTICAL = 4,
|
2022-03-18 19:12:35 +00:00
|
|
|
|
|
|
|
_explosion_type_t_FORCE_INT16 = 0x7FFF
|
2020-04-08 17:59:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
extern explosion_t explosions_small[EXPLOSION_SMALL_COUNT];
|
|
|
|
extern explosion_t explosions_big;
|
|
|
|
|
2022-03-18 19:12:35 +00:00
|
|
|
void pascal near boss_explode_small(explosion_type_t type);
|
|
|
|
#if (GAME == 5)
|
|
|
|
void near boss_explode_big_circle(void);
|
|
|
|
|
|
|
|
// Wrapper for easy compatibility with TH04 code.
|
|
|
|
inline void boss_explode_big(explosion_type_t type) {
|
|
|
|
boss_explode_big_circle();
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
void pascal near boss_explode_big(explosion_type_t type);
|
2020-04-08 17:59:53 +00:00
|
|
|
#endif
|
|
|
|
|
2022-03-18 19:12:35 +00:00
|
|
|
void near explosions_small_update_and_render(void);
|
|
|
|
void near explosions_big_update_and_render(void);
|
2020-04-08 17:59:53 +00:00
|
|
|
|
2022-03-18 19:12:35 +00:00
|
|
|
void explosions_small_reset(void);
|
2020-04-08 17:59:53 +00:00
|
|
|
/// ----------
|
|
|
|
|
2020-04-06 17:09:36 +00:00
|
|
|
void near boss_items_drop();
|
2020-04-11 14:33:22 +00:00
|
|
|
void pascal near boss_phase_end(
|
2022-03-18 19:12:35 +00:00
|
|
|
explosion_type_t explosion_type, int next_phase_end_hp
|
2020-04-11 14:33:22 +00:00
|
|
|
);
|