reduce out-of-bounds lifetime of player bullets

This commit is contained in:
Andrei Alexeyev 2021-02-18 19:03:47 +02:00
parent f25c88942a
commit 929987da41
No known key found for this signature in database
GPG key ID: 72D26128040B9690
5 changed files with 18 additions and 5 deletions

View file

@ -117,6 +117,7 @@ TASK(marisa_star_slave_projectile, {
.type = PROJ_PLAYER,
.damage = ARGS.damage,
.shader_ptr = ARGS.shader,
.max_viewport_dist = 128,
));
real freq = 0.1;

View file

@ -169,7 +169,7 @@ TASK(reimu_spirit_homing, { cmplx pos; cmplx vel; real damage; ShaderProgram *sh
.damage = ARGS.damage,
.shader_ptr = ARGS.shader,
.scale = REIMU_SPIRIT_HOMING_SCALE,
.flags = PFLAG_NOCOLLISIONEFFECT,
.flags = PFLAG_NOCOLLISIONEFFECT | PFLAG_NOAUTOREMOVE,
));
INVOKE_TASK_WHEN(&p->events.killed, reimu_spirit_homing_impact, ENT_BOX(p));
@ -187,6 +187,8 @@ TASK(reimu_spirit_homing, { cmplx pos; cmplx vel; real damage; ShaderProgram *sh
reimu_spirit_spawn_ofuda_particle(p, t, 0.25);
YIELD;
}
p->flags &= ~PFLAG_NOAUTOREMOVE;
}
static Color *reimu_spirit_orb_color(Color *c, int i) {
@ -336,7 +338,7 @@ TASK(reimu_spirit_bomb_orb, { BoxedPlayer plr; int index; real angle; }) {
.damage_type = DMG_PLAYER_BOMB,
.size = 10 * (1+I),
.layer = LAYER_NODRAW,
.flags = PFLAG_NOREFLECT | PFLAG_NOCOLLISION | PFLAG_NOMOVE | PFLAG_MANUALANGLE,
.flags = PFLAG_NOREFLECT | PFLAG_NOCOLLISION | PFLAG_NOMOVE | PFLAG_MANUALANGLE | PFLAG_NOAUTOREMOVE,
));
BoxedProjectile b_orb = ENT_BOX(orb);

View file

@ -87,6 +87,11 @@ static void reimu_dream_gap_bomb_projectile_draw(Projectile *p, int t, ProjDrawR
TASK(reimu_dream_gap_bomb_projectile_impact, { BoxedProjectile p; Sprite *impact_sprite; }) {
Projectile *p = TASK_BIND(ARGS.p);
if(p->collision && p->collision->type == PCOL_VOID) {
// Auto-removed out of bounds; don't explode.
return;
}
real range = BOMB_PROJECTILE_IMPACT_AREA_RADIUS;
real damage = BOMB_PROJECTILE_IMPACT_AREA_DAMAGE;
@ -124,6 +129,7 @@ TASK(reimu_dream_gap_bomb_projectile, {
.size = 32 * (1 + I),
.sprite_ptr = ARGS.sprite,
.type = PROJ_PLAYER,
.max_viewport_dist = BOMB_PROJECTILE_PERIODIC_AREA_RADIUS
));
INVOKE_TASK_WHEN(&p->events.killed, reimu_dream_gap_bomb_projectile_impact,

View file

@ -266,6 +266,7 @@ TASK(youmu_orb_homing_spirit, { YoumuBController *ctrl; cmplx pos; cmplx velocit
.timeout = timeout,
.damage = ARGS.damage,
.shader_ptr = ctrl->shot_shader,
.flags = PFLAG_NOAUTOREMOVE
));
INVOKE_TASK_AFTER(&p->events.killed, youmu_orb_homing_spirit_expire, ENT_BOX(p));
@ -309,7 +310,9 @@ TASK(youmu_orb_homing_spirit, { YoumuBController *ctrl; cmplx pos; cmplx velocit
if(aim_peaked) {
if(!orb) {
approach_p(&aim_strength, 0.00, 0.001);
if(approach_p(&aim_strength, 0.00, 0.001) == 0) {
p->flags &= ~PFLAG_NOAUTOREMOVE;
}
}
} else {
approach_p(&aim_strength, 0.1, 0.02);
@ -420,7 +423,7 @@ TASK(youmu_orb_shot, { YoumuBController *ctrl; int lifetime; real spirit_damage;
.type = PROJ_PLAYER,
.timeout = ARGS.lifetime,
.move = move_asymptotic(-30.0*I, -0.7*I, 0.8),
.flags = PFLAG_MANUALANGLE | PFLAG_NOCOLLISION,
.flags = PFLAG_MANUALANGLE | PFLAG_NOCOLLISION | PFLAG_NOAUTOREMOVE,
));
INVOKE_TASK(youmu_orb_update, ctrl, ENT_BOX(orb));

View file

@ -79,7 +79,8 @@ static void process_projectile_args(ProjArgs *args, ProjArgs *defaults) {
args->color = defaults->color;
}
if(!args->max_viewport_dist && (args->type == PROJ_PARTICLE || args->type == PROJ_PLAYER)) {
if(!args->max_viewport_dist && args->type == PROJ_PARTICLE) {
// TODO consider a saner value?
args->max_viewport_dist = 300;
}