various adjustments to player shots

This commit is contained in:
Andrei Alexeyev 2019-04-15 08:37:01 +03:00
parent b760e7bd5f
commit 100e750118
No known key found for this signature in database
GPG key ID: 363707CD4C7FE8A4
9 changed files with 76 additions and 36 deletions

View file

@ -9,6 +9,7 @@ LAYER(LASER_LOW)
LAYER(PARTICLE_MID)
LAYER(ENEMY)
LAYER(BOSS)
LAYER(PLAYER_SHOT_HIGH)
LAYER(PARTICLE_BULLET_CLEAR)
LAYER(BULLET)
LAYER(LASER_HIGH)

View file

@ -98,6 +98,7 @@ static void trace_laser(Enemy *e, complex vel, float damage) {
.draw_rule = Shrink,
.args = { (2+afrand(0)*6)*cexp(I*M_PI*2*afrand(1)) },
.flags = PFLAG_NOREFLECT,
.layer = LAYER_PARTICLE_HIGH,
);
if(col.type == PCOL_ENTITY && col.entity->type == ENT_ENEMY) {
@ -614,7 +615,7 @@ static void marisa_laser_power(Player *plr, short npow) {
static void marisa_laser_init(Player *plr) {
laser_renderer = create_enemy_p(&plr->slaves, 0, ENEMY_IMMUNE, marisa_laser_renderer_visual, marisa_laser_renderer, 0, 0, 0, 0);
laser_renderer->ent.draw_layer = LAYER_PLAYER_SHOT;
laser_renderer->ent.draw_layer = LAYER_PLAYER_SHOT_HIGH;
marisa_laser_respawn_slaves(plr, plr->power);
}

View file

@ -566,7 +566,7 @@ static void reimu_spirit_kill_slaves(EnemyList *slaves) {
static void reimu_spirit_respawn_slaves(Player *plr, short npow, complex param) {
double dmg_homing = 120 - 12 * plr->power / 100; // every 12 frames
double dmg_needle = 90 - 10 * plr->power / 100; // every 3 frames
double dmg_needle = 92 - 10 * plr->power / 100; // every 3 frames
complex dmg = dmg_homing + I * dmg_needle;
EnemyVisualRule visual;

View file

@ -434,7 +434,7 @@ static int reimu_dream_needle(Projectile *p, int t) {
static void reimu_dream_shot(Player *p) {
play_loop("generic_shot");
int dmg = 50;
int dmg = 60;
if(!(global.frames % 6)) {
for(int i = -1; i < 2; i += 2) {
@ -498,7 +498,7 @@ static int reimu_dream_slave(Enemy *e, int t) {
}
if(player_should_shoot(&global.plr, true)) {
if(!(global.frames % 6)) {
if(!((global.frames + 3) % 6)) {
PROJECTILE(
.proto = pp_needle2,
.pos = e->pos,
@ -506,7 +506,7 @@ static int reimu_dream_slave(Enemy *e, int t) {
.rule = reimu_dream_needle,
.args = { 20.0 * shotdir },
.type = PROJ_PLAYER,
.damage = 35,
.damage = 42,
.shader = "sprite_default",
);
}

View file

@ -223,22 +223,37 @@ static int youmu_mirror_myon(Enemy *e, int t) {
Player *plr = &global.plr;
float rad = cabs(e->pos0);
double followfactor = 0.1;
double nfocus = plr->focus / 30.0;
if(!(plr->inputflags & INFLAG_SHOT)) {
if(plr->inputflags & INFLAG_FOCUS) {
e->args[3] = 1;
} else if(e->args[3] == 1) {
nfocus = 0.0;
e->pos0 = -rad * I;
} else if(!(plr->inputflags & INFLAG_FOCUS)) {
if((plr->inputflags & INFLAGS_MOVE)) {
e->pos0 = rad * -plr->lastmovedir;
} else {
e->pos0 = e->pos - plr->pos;
e->pos0 *= rad / cabs(e->pos0);
followfactor *= 3;
if(plr->inputflags & INFLAGS_MOVE) {
e->args[3] = 0;
}
}
if(e->args[3] == 0) {
if(!(plr->inputflags & INFLAG_SHOT)) {
nfocus = 0.0;
e->pos0 = -rad * I;
} else if(!(plr->inputflags & INFLAG_FOCUS)) {
if((plr->inputflags & INFLAGS_MOVE)) {
e->pos0 = rad * -plr->lastmovedir;
} else {
e->pos0 = e->pos - plr->pos;
e->pos0 *= rad / cabs(e->pos0);
}
}
}
complex target = plr->pos + e->pos0;
complex v = cexp(I*carg(target - e->pos)) * min(10, 0.07 * max(0, cabs(target - e->pos) - VIEWPORT_W * 0.5 * nfocus));
complex v = cexp(I*carg(target - e->pos)) * min(10, followfactor * max(0, cabs(target - e->pos) - VIEWPORT_W * 0.5 * nfocus));
float s = sign(creal(e->pos) - creal(global.plr.pos));
if(!s) {
@ -253,7 +268,7 @@ static int youmu_mirror_myon(Enemy *e, int t) {
e->args[0] = plr->pos - e->pos;
}
e->args[1] += (e->args[0] - e->args[1]) * 0.1;
e->args[1] += (e->args[0] - e->args[1]) * 0.5;
if(player_should_shoot(&global.plr, true)) {
int v1 = -10;

View file

@ -84,7 +84,22 @@ static Projectile* youmu_homing_trail(Projectile *p, complex v, int to) {
}
static int youmu_homing(Projectile *p, int t) { // a[0]: velocity, a[1]: aim (r: base, i: gain), a[2]: (r: timeout, i: charge), a[3]: initial target
if(t == EVENT_DEATH || t == EVENT_BIRTH) {
if(t == EVENT_BIRTH) {
return ACTION_ACK;
}
if(t == EVENT_DEATH) {
PARTICLE(
.sprite = "blast",
.color = color_lerp(RGBA(0.5, 0.7, 1.0, 0.5), RGBA(1.0, 0.65, 0.8, 0.5), cimag(p->args[2])),
.pos = p->pos,
.timeout = 20,
.draw_rule = ScaleFade,
.layer = LAYER_PARTICLE_HIGH,
.args = { 0, 0, 0.5 * I },
.flags = PFLAG_NOREFLECT,
.angle = M_PI*nfrand(),
);
return ACTION_ACK;
}
@ -182,7 +197,7 @@ static int youmu_trap(Projectile *p, int t) {
complex aim = p->args[3];
for(int i = 0; i < cnt; ++i) {
int dur = 55 + 20 * nfrand();
int dur = 120; // 55 + 20 * nfrand();
float a = (i / (float)cnt) * M_PI * 2;
complex dir = cexp(I*(a));
@ -378,7 +393,7 @@ static void youmu_haunting_power_shot(Player *plr, int p) {
.draw_rule = youmu_homing_draw_proj,
.args = { speed * dir * (1 - 0.25 * (1 - np)), 3 * (1 - pow(1 - np, 2)), 60, },
.type = PROJ_PLAYER,
.damage = 30,
.damage = 20,
.shader = "sprite_default",
);
}

View file

@ -463,6 +463,7 @@ Projectile* spawn_projectile_collision_effect(Projectile *proj) {
.pos = proj->pos,
.color = &proj->color,
.flags = proj->flags | PFLAG_NOREFLECT | PFLAG_REQUIREDPARTICLE,
.layer = LAYER_PARTICLE_HIGH,
.shader_ptr = proj->shader,
.rule = linear,
.draw_rule = DeathShrink,

View file

@ -639,6 +639,7 @@ static bool powersurge_draw_predicate(EntityInterface *ent) {
switch(layer) {
case LAYER_PLAYER_SLAVE:
case LAYER_PLAYER_SHOT:
case LAYER_PLAYER_SHOT_HIGH:
case LAYER_PLAYER_FOCUS:
case LAYER_PLAYER:
return true;

View file

@ -65,33 +65,39 @@ static bool particle_filter(Projectile *part) {
}
static bool stage1_draw_predicate(EntityInterface *ent) {
if(ent->draw_layer == LAYER_PLAYER_SLAVE || ent->draw_layer == LAYER_PLAYER_FOCUS || ent->draw_layer == LAYER_PLAYER_SHOT) {
return false;
switch(ent->draw_layer & ~LAYER_LOW_MASK) {
case LAYER_PLAYER_SLAVE:
case LAYER_PLAYER_FOCUS:
case LAYER_PLAYER_SHOT:
case LAYER_PLAYER_SHOT_HIGH:
return false;
default: break;
}
if(ent->type == ENT_BOSS) {
return true;
}
switch(ent->type) {
case ENT_BOSS: return true;
case ENT_ENEMY: {
Enemy *e = ENT_CAST(ent, Enemy);
if(ent->type == ENT_ENEMY) {
Enemy *e = ENT_CAST(ent, Enemy);
if(e->hp == ENEMY_BOMB) {
return false;
}
return true;
}
case ENT_PROJECTILE: {
Projectile *p = ENT_CAST(ent, Projectile);
if(p->type == PROJ_PARTICLE) {
return particle_filter(p);
}
if(e->hp == ENEMY_BOMB) {
return false;
}
return true;
default: return false;
}
if(ent->type == ENT_PROJECTILE) {
Projectile *p = ENT_CAST(ent, Projectile);
if(p->type == PROJ_PARTICLE) {
return particle_filter(p);
}
}
return false;
UNREACHABLE;
}
static void stage1_water_draw(vec3 pos) {