113 lines
2.6 KiB
C
113 lines
2.6 KiB
C
/*
|
|
* This software is licensed under the terms of the MIT License.
|
|
* See COPYING for further information.
|
|
* ---
|
|
* Copyright (c) 2011-2024, Lukas Weber <laochailan@web.de>.
|
|
* Copyright (c) 2012-2024, Andrei Alexeyev <akari@taisei-project.org>.
|
|
*/
|
|
|
|
#include "nonspells.h"
|
|
|
|
TASK(bite_bullet, { cmplx pos; cmplx vel; }) {
|
|
Color phase_colors[] = {
|
|
{ 2.0, 0.0, 0.1, 1.0 },
|
|
{ 1.2, 0.3, 0.1, 1.0 },
|
|
{ 0.3, 0.7, 0.1, 1.0 },
|
|
};
|
|
|
|
Projectile *p = TASK_BIND(PROJECTILE(
|
|
.proto = pp_wave,
|
|
.pos = ARGS.pos,
|
|
.color = phase_colors,
|
|
.max_viewport_dist = 50,
|
|
));
|
|
|
|
int aimed_speed = difficulty_value(3.0, 3.5, 4.5, 5.0);
|
|
int aimed_boost = difficulty_value(2, 2, 3, 3);
|
|
|
|
p->move = move_asymptotic_simple(ARGS.vel, 2.0);
|
|
WAIT(120);
|
|
|
|
for(int phase = 1; phase < ARRAY_SIZE(phase_colors); ++phase) {
|
|
p->move.acceleration = 0;
|
|
p->flags |= PFLAG_MANUALANGLE;
|
|
|
|
for(int i = 0; i < 20; ++i, YIELD) {
|
|
fapproach_asymptotic_p(&p->angle, carg(global.plr.pos - p->pos), 0.2, 1e-3);
|
|
}
|
|
|
|
play_sfx("redirect");
|
|
play_sfx("shot1");
|
|
|
|
cmplx aim = cnormalize(global.plr.pos - p->pos);
|
|
p->angle = carg(aim);
|
|
p->color = phase_colors[phase];
|
|
spawn_projectile_highlight_effect(p);
|
|
p->move = move_asymptotic_simple(aimed_speed * cnormalize(aim), aimed_boost);
|
|
|
|
PROJECTILE(
|
|
.proto = pp_thickrice,
|
|
.pos = p->pos,
|
|
.color = RGB(0.4, 0.3, 1.0),
|
|
.move = move_linear(-aim * 0.5),
|
|
);
|
|
|
|
for(int i = 0; i < 3; ++i) {
|
|
cmplx v = rng_dir();
|
|
v *= rng_range(1, 1.5);
|
|
v += aim * aimed_speed;
|
|
|
|
PARTICLE(
|
|
.pos = p->pos,
|
|
.sprite = "smoothdot",
|
|
.color = RGBA(0.8, 0.6, 0.6, 0),
|
|
.draw_rule = pdraw_timeout_scale(1, 0.01),
|
|
.timeout = rng_irange(20, 40),
|
|
.move = move_asymptotic_simple(v, 2),
|
|
);
|
|
}
|
|
|
|
if(global.diff < D_Normal) {
|
|
break;
|
|
}
|
|
|
|
WAIT(60);
|
|
}
|
|
}
|
|
|
|
DEFINE_EXTERN_TASK(stage3_midboss_nonspell_1) {
|
|
STAGE_BOOKMARK(non1);
|
|
|
|
Boss *boss = INIT_BOSS_ATTACK(&ARGS);
|
|
boss->move = move_from_towards(boss->pos, VIEWPORT_W/2 + 100.0*I, 0.03);
|
|
BEGIN_BOSS_ATTACK(&ARGS);
|
|
|
|
Rect bounds = viewport_bounds(80);
|
|
bounds.bottom = 210;
|
|
|
|
int time = 0;
|
|
int cnt = difficulty_value(18, 19, 20, 21);
|
|
int shape = difficulty_value(3, 3, 4, 5);
|
|
int delay = 120;
|
|
|
|
cmplx origin;
|
|
Color charge_color = *RGBA(1, 0, 0, 0);
|
|
|
|
for(;;) {
|
|
origin = boss->pos;
|
|
boss->move.attraction_point = common_wander(boss->pos, 200, bounds);
|
|
time += common_charge_static(delay, origin, &charge_color);
|
|
|
|
for(int i = 0; i < cnt; ++i) {
|
|
play_sfx("shot_special1");
|
|
|
|
cmplx v = (2 - psin((shape*M_TAU*i/(real)cnt) + time)) * cdir(M_TAU/cnt*i);
|
|
INVOKE_TASK(bite_bullet,
|
|
.pos = origin - v * 25,
|
|
.vel = v,
|
|
);
|
|
}
|
|
|
|
delay = max(60, delay - 10);
|
|
}
|
|
}
|