taisei/src/stages/stage3/nonspells/midboss_nonspell_1.c
2024-05-17 14:11:48 +02:00

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