ReC98/th01/main/boss/hit.cpp

92 lines
2.5 KiB
C++

#include "th01/hardware/palette.h"
#include "th01/main/player/bomb.hpp"
#include "th01/main/player/orb.hpp"
#include "th01/main/player/shot.hpp"
void boss_hit_update_and_render(
int &invincibility_frame,
bool16 &is_invincible,
int &hp,
const vc_t invincibility_flash_colors[],
unsigned char invincibility_flash_colors_count,
int hit_score,
farfunc_t_far hit_callback,
bool colliding_with_orb,
screen_x_t shot_hitbox_left,
screen_y_t shot_hitbox_top,
pixel_t shot_hitbox_w,
pixel_t shot_hitbox_h
)
{
int i;
if(test_damage == true) {
hp--;
test_damage = false;
hud_hp_decrement(hp);
}
// Sure, why not? This function didn't have enough parameters already,
// after all!
Shots.hittest_boss(
shot_hitbox_left, shot_hitbox_top, shot_hitbox_w, shot_hitbox_h
);
if(
((colliding_with_orb == true) && (is_invincible == false)) ||
(bomb_deals_damage(frame_rand) == true)
) {
invincibility_frame = 0;
z_palette_flash_colors(
invincibility_flash_colors, invincibility_flash_colors_count, i
);
hp--;
is_invincible = true;
if(orb_is_moving_left()) {
orb_velocity_x = OVX_4_RIGHT;
} else if(orb_is_moving_right()) {
orb_velocity_x = OVX_4_LEFT;
} else if(orb_velocity_x == OVX_0) {
if(orb_cur_left < (PLAYFIELD_CENTER_X - (ORB_W / 2))) {
orb_velocity_x = OVX_4_RIGHT;
} else {
orb_velocity_x = OVX_4_LEFT;
}
}
score += hit_score;
hud_score_and_cardcombo_render();
mdrv2_se_play(3);
hit_callback();
hud_hp_decrement(hp);
}
if(
(is_invincible == true) &&
(invincibility_frame < BOSS_HIT_INVINCIBILITY_FRAMES)
) {
if((invincibility_frame % 4) == 2) {
z_palette_flash_colors(
invincibility_flash_colors, invincibility_flash_colors_count, i
);
} else if((invincibility_frame % 4) == 0) {
boss_palette_show();
}
} else if(invincibility_frame > BOSS_HIT_INVINCIBILITY_FRAMES) {
// ZUN bug: This is done even if [is_invincible] is false. Since all
// callers of this function increment [invincibility_frame] on every
// frame, this palette reset ends up happening periodically, completely
// unrelated to the boss getting hit and defying common sense. At best,
// this call acts as a safety net against wild mutation of the hardware
// palette during boss fights, but you're way more likely to perceive
// *this* as a wild unexpected palette change from out of nowhere.
//
// (For examples, see Mima's pattern_hop_and_fire_chase_pellets(), and
// Konngara's konngara_load_and_entrance().)
boss_palette_show();
invincibility_frame = 0;
is_invincible = false;
}
}