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:
Andrei Alexeyev 2018-07-31 10:07:34 +03:00
parent 706a70f5a2
commit 12a9acbc71
No known key found for this signature in database
GPG key ID: 363707CD4C7FE8A4
7 changed files with 91 additions and 73 deletions

View file

@ -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) ||

View file

@ -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;

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);

View file

@ -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);
}