Add more functions to query player state properly (is alive, is vulnerable, is bombing)
There are some minor changes to the logic to keep things consistent.
This commit is contained in:
parent
706a70f5a2
commit
12a9acbc71
7 changed files with 91 additions and 73 deletions
|
@ -140,8 +140,8 @@ static bool item_out_of_bounds(Item *item) {
|
|||
void process_items(void) {
|
||||
Item *item = global.items.first, *del = NULL;
|
||||
float r = player_property(&global.plr, PLR_PROP_COLLECT_RADIUS);
|
||||
bool plr_alive = global.plr.deathtime <= global.frames && global.plr.deathtime == -1;
|
||||
bool plr_bombing = global.frames - global.plr.recovery < 0;;
|
||||
bool plr_alive = player_is_alive(&global.plr);
|
||||
bool plr_bombing = player_is_bomb_active(&global.plr);
|
||||
|
||||
while(item != NULL) {
|
||||
if((item->type == Power && global.plr.power >= PLR_MAX_POWER) ||
|
||||
|
|
139
src/player.c
139
src/player.c
|
@ -142,7 +142,7 @@ static void ent_draw_player(EntityInterface *ent) {
|
|||
|
||||
Color c;
|
||||
|
||||
if(global.frames - abs(plr->recovery) < 0 && (global.frames/8)&1) {
|
||||
if(!player_is_vulnerable(plr) && (global.frames/8)&1) {
|
||||
c = *RGBA_MUL_ALPHA(0.4, 0.4, 1.0, 0.9);
|
||||
} else {
|
||||
c = *RGBA_MUL_ALPHA(1.0, 1.0, 1.0, 1.0);
|
||||
|
@ -223,12 +223,16 @@ static void player_fail_spell(Player *plr) {
|
|||
}
|
||||
|
||||
bool player_should_shoot(Player *plr, bool extra) {
|
||||
return (plr->inputflags & INFLAG_SHOT) && !global.dialog &&
|
||||
(!extra || (global.frames - plr->recovery >= 0 && (plr->deathtime >= -1 && plr->deathtime < global.frames)));
|
||||
return
|
||||
(plr->inputflags & INFLAG_SHOT) &&
|
||||
!global.dialog &&
|
||||
player_is_alive(&global.plr) &&
|
||||
// TODO: maybe get rid of this?
|
||||
(!extra || !player_is_bomb_active(plr));
|
||||
}
|
||||
|
||||
void player_placeholder_bomb_logic(Player *plr) {
|
||||
if(global.frames - plr->recovery >= 0 || plr->bombcanceltime) {
|
||||
if(!player_is_bomb_active(plr)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -287,7 +291,7 @@ void player_logic(Player* plr) {
|
|||
stage_clear_hazards(CLEAR_HAZARDS_ALL | CLEAR_HAZARDS_NOW);
|
||||
}
|
||||
|
||||
if(global.frames - plr->recovery < 0) {
|
||||
if(player_is_bomb_active(plr)) {
|
||||
if(plr->bombcanceltime) {
|
||||
int bctime = plr->bombcanceltime + plr->bombcanceldelay;
|
||||
|
||||
|
@ -313,7 +317,7 @@ bool player_bomb(Player *plr) {
|
|||
return false;
|
||||
}
|
||||
|
||||
if(global.frames - plr->recovery >= 0 && (plr->bombs > 0 || plr->iddqd) && global.frames - plr->respawntime >= 60) {
|
||||
if(!player_is_bomb_active(plr) && (plr->bombs > 0 || plr->iddqd) && global.frames - plr->respawntime >= 60) {
|
||||
player_fail_spell(plr);
|
||||
stage_clear_hazards(CLEAR_HAZARDS_ALL);
|
||||
plr->mode->procs.bomb(plr);
|
||||
|
@ -342,9 +346,20 @@ bool player_bomb(Player *plr) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool player_is_bomb_active(Player *plr) {
|
||||
return global.frames - plr->recovery < 0;
|
||||
}
|
||||
|
||||
bool player_is_vulnerable(Player *plr) {
|
||||
return global.frames - abs(plr->recovery) >= 0 && !plr->iddqd && player_is_alive(plr);
|
||||
}
|
||||
|
||||
bool player_is_alive(Player *plr) {
|
||||
return plr->deathtime >= -1 && plr->deathtime < global.frames;
|
||||
}
|
||||
|
||||
void player_cancel_bomb(Player *plr, int delay) {
|
||||
if(global.frames - plr->recovery >= 0) {
|
||||
// not bombing
|
||||
if(!player_is_bomb_active(plr)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -362,7 +377,7 @@ void player_cancel_bomb(Player *plr, int delay) {
|
|||
}
|
||||
|
||||
double player_get_bomb_progress(Player *plr, double *out_speed) {
|
||||
if(global.frames - plr->recovery >= 0) {
|
||||
if(!player_is_bomb_active(plr)) {
|
||||
if(out_speed != NULL) {
|
||||
*out_speed = 1.0;
|
||||
}
|
||||
|
@ -490,68 +505,66 @@ static int player_death_effect(Projectile *p, int t) {
|
|||
}
|
||||
|
||||
void player_death(Player *plr) {
|
||||
if(plr->iddqd)
|
||||
if(!player_is_vulnerable(plr)) {
|
||||
return;
|
||||
|
||||
if(plr->deathtime == -1 && global.frames - abs(plr->recovery) > 0) {
|
||||
play_sound("death");
|
||||
|
||||
for(int i = 0; i < 60; i++) {
|
||||
tsrand_fill(2);
|
||||
PARTICLE(
|
||||
.sprite = "flare",
|
||||
.pos = plr->pos,
|
||||
.rule = linear,
|
||||
.timeout = 40,
|
||||
.draw_rule = Shrink,
|
||||
.args = { (3+afrand(0)*7)*cexp(I*tsrand_a(1)) },
|
||||
.flags = PFLAG_NOREFLECT,
|
||||
);
|
||||
}
|
||||
|
||||
stage_clear_hazards(CLEAR_HAZARDS_ALL);
|
||||
|
||||
PARTICLE(
|
||||
.sprite = "blast",
|
||||
.pos = plr->pos,
|
||||
.color = RGBA(0.5, 0.15, 0.15, 0),
|
||||
.timeout = 35,
|
||||
.draw_rule = GrowFade,
|
||||
.args = { 0, 2.4 },
|
||||
.flags = PFLAG_NOREFLECT | PFLAG_REQUIREDPARTICLE,
|
||||
);
|
||||
|
||||
PARTICLE(
|
||||
.pos = plr->pos,
|
||||
.size = 1+I,
|
||||
.timeout = 90,
|
||||
.draw_rule = player_death_effect_draw_overlay,
|
||||
.blend = BLEND_NONE,
|
||||
.flags = PFLAG_NOREFLECT | PFLAG_REQUIREDPARTICLE,
|
||||
.layer = LAYER_OVERLAY,
|
||||
.shader = "player_death",
|
||||
);
|
||||
|
||||
PARTICLE(
|
||||
.sprite_ptr = aniplayer_get_frame(&plr->ani),
|
||||
.pos = plr->pos,
|
||||
.timeout = 30,
|
||||
.rule = player_death_effect,
|
||||
.draw_rule = player_death_effect_draw_sprite,
|
||||
.flags = PFLAG_NOREFLECT | PFLAG_REQUIREDPARTICLE,
|
||||
.layer = LAYER_PLAYER_FOCUS, // LAYER_OVERLAY | 1,
|
||||
);
|
||||
|
||||
plr->deathtime = global.frames + floor(player_property(plr, PLR_PROP_DEATHBOMB_WINDOW));
|
||||
}
|
||||
|
||||
play_sound("death");
|
||||
|
||||
for(int i = 0; i < 60; i++) {
|
||||
tsrand_fill(2);
|
||||
PARTICLE(
|
||||
.sprite = "flare",
|
||||
.pos = plr->pos,
|
||||
.rule = linear,
|
||||
.timeout = 40,
|
||||
.draw_rule = Shrink,
|
||||
.args = { (3+afrand(0)*7)*cexp(I*tsrand_a(1)) },
|
||||
.flags = PFLAG_NOREFLECT,
|
||||
);
|
||||
}
|
||||
|
||||
stage_clear_hazards(CLEAR_HAZARDS_ALL);
|
||||
|
||||
PARTICLE(
|
||||
.sprite = "blast",
|
||||
.pos = plr->pos,
|
||||
.color = RGBA(0.5, 0.15, 0.15, 0),
|
||||
.timeout = 35,
|
||||
.draw_rule = GrowFade,
|
||||
.args = { 0, 2.4 },
|
||||
.flags = PFLAG_NOREFLECT | PFLAG_REQUIREDPARTICLE,
|
||||
);
|
||||
|
||||
PARTICLE(
|
||||
.pos = plr->pos,
|
||||
.size = 1+I,
|
||||
.timeout = 90,
|
||||
.draw_rule = player_death_effect_draw_overlay,
|
||||
.blend = BLEND_NONE,
|
||||
.flags = PFLAG_NOREFLECT | PFLAG_REQUIREDPARTICLE,
|
||||
.layer = LAYER_OVERLAY,
|
||||
.shader = "player_death",
|
||||
);
|
||||
|
||||
PARTICLE(
|
||||
.sprite_ptr = aniplayer_get_frame(&plr->ani),
|
||||
.pos = plr->pos,
|
||||
.timeout = 30,
|
||||
.rule = player_death_effect,
|
||||
.draw_rule = player_death_effect_draw_sprite,
|
||||
.flags = PFLAG_NOREFLECT | PFLAG_REQUIREDPARTICLE,
|
||||
.layer = LAYER_PLAYER_FOCUS, // LAYER_OVERLAY | 1,
|
||||
);
|
||||
|
||||
plr->deathtime = global.frames + floor(player_property(plr, PLR_PROP_DEATHBOMB_WINDOW));
|
||||
}
|
||||
|
||||
static DamageResult ent_damage_player(EntityInterface *ent, const DamageInfo *dmg) {
|
||||
Player *plr = ENT_CAST(ent, Player);
|
||||
|
||||
if(
|
||||
(global.frames - abs(plr->recovery) < 0) ||
|
||||
plr->iddqd ||
|
||||
!player_is_vulnerable(plr) ||
|
||||
(dmg->type != DMG_ENEMY_SHOT && dmg->type != DMG_ENEMY_COLLISION)
|
||||
) {
|
||||
return DMG_RESULT_IMMUNE;
|
||||
|
|
|
@ -160,6 +160,10 @@ void player_register_damage(Player *plr, EntityInterface *target, const DamageIn
|
|||
void player_cancel_bomb(Player *plr, int delay);
|
||||
void player_placeholder_bomb_logic(Player *plr);
|
||||
|
||||
bool player_is_bomb_active(Player *plr);
|
||||
bool player_is_vulnerable(Player *plr);
|
||||
bool player_is_alive(Player *plr);
|
||||
|
||||
// Progress is normalized from 0: bomb start to 1: bomb end
|
||||
double player_get_bomb_progress(Player *plr, double *out_speed);
|
||||
|
||||
|
|
|
@ -518,7 +518,7 @@ static int masterspark(Enemy *e, int t2) {
|
|||
);
|
||||
}
|
||||
|
||||
if(t >= 1 || global.frames - global.plr.recovery >= 0) {
|
||||
if(t >= 1 || !player_is_bomb_active(&global.plr)) {
|
||||
return ACTION_DESTROY;
|
||||
}
|
||||
|
||||
|
@ -646,7 +646,7 @@ static double marisa_laser_property(Player *plr, PlrProperty prop) {
|
|||
case PLR_PROP_SPEED: {
|
||||
double s = marisa_common_property(plr, prop);
|
||||
|
||||
if(global.frames - plr->recovery < 0) {
|
||||
if(player_is_bomb_active(plr)) {
|
||||
s /= 5.0;
|
||||
}
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ static int marisa_star_orbit(Enemy *e, int t) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
if(tb >= 1 || global.frames - global.plr.recovery >= 0) {
|
||||
if(tb >= 1 || !player_is_bomb_active(&global.plr)) {
|
||||
return ACTION_DESTROY;
|
||||
}
|
||||
|
||||
|
@ -301,7 +301,7 @@ static double marisa_star_property(Player *plr, PlrProperty prop) {
|
|||
case PLR_PROP_SPEED: {
|
||||
double s = marisa_common_property(plr, prop);
|
||||
|
||||
if(global.frames - plr->recovery < 0) {
|
||||
if(player_is_bomb_active(plr) < 0) {
|
||||
s /= 4.0;
|
||||
}
|
||||
|
||||
|
|
|
@ -254,7 +254,7 @@ static int youmu_mirror_myon(Enemy *e, int t) {
|
|||
|
||||
e->args[1] += (e->args[0] - e->args[1]) * 0.1;
|
||||
|
||||
if(player_should_shoot(&global.plr, true) && global.plr.deathtime >= -1) {
|
||||
if(player_should_shoot(&global.plr, true)) {
|
||||
int v1 = -10;
|
||||
int v2 = -10;
|
||||
|
||||
|
@ -356,9 +356,10 @@ static int youmu_split(Enemy *e, int t) {
|
|||
if(t < 0)
|
||||
return 1;
|
||||
|
||||
if(global.frames - global.plr.recovery > 0) {
|
||||
if(!player_is_bomb_active(&global.plr)) {
|
||||
return ACTION_DESTROY;
|
||||
}
|
||||
|
||||
TIMER(&t);
|
||||
//FROM_TO(0, 220, 1) {
|
||||
tsrand_fill(5);
|
||||
|
|
|
@ -622,7 +622,7 @@ void stage_draw_scene(StageInfo *stage) {
|
|||
r_shader_standard();
|
||||
|
||||
// draw bomb background
|
||||
if(global.frames - global.plr.recovery < 0 && global.plr.mode->procs.bombbg) {
|
||||
if(global.plr.mode->procs.bombbg && player_is_bomb_active(&global.plr)) {
|
||||
global.plr.mode->procs.bombbg(&global.plr);
|
||||
}
|
||||
} else if(!key_nobg) {
|
||||
|
@ -639,7 +639,7 @@ void stage_draw_scene(StageInfo *stage) {
|
|||
apply_shader_rules(global.stage->procs->postprocess_rules, foreground);
|
||||
|
||||
// bomb effects shader if present and player bombing
|
||||
if(global.frames - global.plr.recovery < 0 && global.plr.mode->procs.bomb_shader) {
|
||||
if(global.plr.mode->procs.bomb_shader && player_is_bomb_active(&global.plr)) {
|
||||
ShaderRule rules[] = { global.plr.mode->procs.bomb_shader, NULL };
|
||||
apply_shader_rules(rules, foreground);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue