various adjustments to player shots
This commit is contained in:
parent
b760e7bd5f
commit
100e750118
9 changed files with 76 additions and 36 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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",
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue