various gameplay/balance adjustments and fixes

mostly it's boss HP buffs. very roughly playtested, so may be far from
ideal.

improved spread of item drops

fixed extraspell deaths affecting lives, power, bombs, etc.

increased the value of spell bonuses very substantially

made some tweaks to Elly's non-spells
This commit is contained in:
Andrei "Akari" Alexeyev 2017-09-13 16:41:28 +03:00
parent fdc303016e
commit 7fc2839fcb
No known key found for this signature in database
GPG key ID: 048C3D2A5648B785
16 changed files with 115 additions and 77 deletions

View file

@ -368,6 +368,24 @@ void boss_finish_current_attack(Boss *boss) {
} else {
boss->failed_spells++;
}
if(t != AT_SurvivalSpell) {
double i_base = 6.0, i_pwr = 1.0, i_pts = 1.0;
if(t == AT_ExtraSpell) {
i_pwr *= 1.25;
i_pts *= 2.0;
}
if(!boss->current->failtime) {
i_base *= 2.0;
}
spawn_items(boss->pos,
Power, (int)(i_base * i_pwr),
Point, (int)(i_base * i_pts),
NULL);
}
}
boss->current->endtime = global.frames + attack_end_delay(boss);
@ -458,10 +476,6 @@ void process_boss(Boss **pboss) {
stage_gameover();
}
if(extra && boss->current->finished && !boss->current->failtime) {
spawn_items(boss->pos, Point, 20, NULL);
}
for(;;) {
boss->current++;
@ -554,7 +568,11 @@ Attack* boss_add_attack(Boss *boss, AttackType type, char *name, float timeout,
a->starttime = global.frames;
// FIXME: figure out a better value/formula, i pulled this out of my ass
a->scorevalue = 500.0 + hp * 0.2;
a->scorevalue = 2000.0 + hp * 0.6;
if(a->type == AT_ExtraSpell) {
a->scorevalue *= 1.25;
}
return a;
}

View file

@ -156,7 +156,7 @@ int collision_item(Item *i) {
void spawn_item(complex pos, ItemType type) {
tsrand_fill(2);
create_item(pos, 5*cexp(I*tsrand_a(0)/afrand(1)*M_PI*2), type);
create_item(pos, (12 + 6 * afrand(0)) * (cexp(I*(3*M_PI/2 + anfrand(1)*M_PI/11))), type);
}
void spawn_items(complex pos, ...) {

View file

@ -93,6 +93,7 @@ void player_move(Player *plr, complex delta) {
}
void player_draw(Player* plr) {
// FIXME: death animation?
if(plr->deathtime > global.frames)
return;
@ -239,27 +240,31 @@ void player_realdeath(Player *plr) {
plr->respawntime = global.frames;
plr->inputflags &= ~INFLAGS_MOVE;
const double arc = 0.3 * M_PI;
int drop = max(2, (plr->power * 0.15) / POWER_VALUE);
for(int i = 0; i < drop; ++i) {
double ofs = arc * (i/((double)drop - 1));
create_item(plr->pos, (12+3*frand()) * (cexp(I*(1.5*M_PI - 0.5*arc + ofs)) - 1.0*I), Power);
}
complex death_origin = plr->pos;
plr->pos = VIEWPORT_W/2 + VIEWPORT_H*I+30.0*I;
plr->recovery = -(global.frames + DEATH_DELAY + 150);
plr->bombs = PLR_START_BOMBS;
plr->bomb_fragments = 0;
if(plr->iddqd)
return;
player_fail_spell(plr);
player_set_power(plr, plr->power * 0.7);
if(plr->lives-- == 0 && global.replaymode != REPLAY_PLAY)
if(global.stage->type != STAGE_SPELL && global.boss && global.boss->current && global.boss->current->type == AT_ExtraSpell) {
// deaths in extra spells "don't count"
return;
}
int drop = max(2, (plr->power * 0.15) / POWER_VALUE);
spawn_items(death_origin, Power, drop, NULL);
player_set_power(plr, plr->power * 0.7);
plr->bombs = PLR_START_BOMBS;
plr->bomb_fragments = 0;
if(plr->lives-- == 0 && global.replaymode != REPLAY_PLAY) {
stage_gameover();
}
}
void player_death(Player *plr) {

View file

@ -29,8 +29,8 @@ enum {
PLR_START_LIVES = 2,
PLR_START_BOMBS = 3,
PLR_SCORE_PER_LIFE_FRAG = 50000,
PLR_SCORE_PER_BOMB_FRAG = 20000,
PLR_SCORE_PER_LIFE_FRAG = 55000,
PLR_SCORE_PER_BOMB_FRAG = 22000,
PLR_SPELLPRACTICE_POWER = 200,

View file

@ -20,7 +20,7 @@
struct stage1_spells_s stage1_spells = {
.mid = {
.perfect_freeze = {{ 0, 1, 2, 3}, AT_Spellcard, "Freeze Sign ~ Perfect Freeze", 32, 20000,
.perfect_freeze = {{ 0, 1, 2, 3}, AT_Spellcard, "Freeze Sign ~ Perfect Freeze", 32, 24000,
cirno_perfect_freeze, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
},

View file

@ -162,7 +162,7 @@ void cirno_mid_flee(Boss *c, int time) {
Boss *create_cirno_mid(void) {
Boss* cirno = create_boss("Cirno", "cirno", "dialog/cirno", VIEWPORT_W + 220 + 30.0*I);
boss_add_attack(cirno, AT_Move, "Introduction", 2, 0, cirno_intro, NULL);
boss_add_attack(cirno, AT_Normal, "Icy Storm", 20, 20000, cirno_icy, NULL);
boss_add_attack(cirno, AT_Normal, "Icy Storm", 20, 22000, cirno_icy, NULL);
boss_add_attack_from_info(cirno, &stage1_spells.mid.perfect_freeze, false);
boss_add_attack(cirno, AT_Move, "Flee", 5, 0, cirno_mid_flee, NULL);
@ -386,9 +386,9 @@ void cirno_superhardspellcard(Boss *c, int t) {
Boss *create_cirno(void) {
Boss* cirno = create_boss("Cirno", "cirno", "dialog/cirno", -230 + 100.0*I);
boss_add_attack(cirno, AT_Move, "Introduction", 2, 0, cirno_intro_boss, NULL);
boss_add_attack(cirno, AT_Normal, "Iceplosion 0", 20, 20000, cirno_iceplosion0, NULL);
boss_add_attack(cirno, AT_Normal, "Iceplosion 0", 20, 22000, cirno_iceplosion0, NULL);
boss_add_attack_from_info(cirno, &stage1_spells.boss.crystal_rain, false);
boss_add_attack(cirno, AT_Normal, "Iceplosion 1", 20, 20000, cirno_iceplosion1, NULL);
boss_add_attack(cirno, AT_Normal, "Iceplosion 1", 20, 22000, cirno_iceplosion1, NULL);
boss_add_attack_from_info(cirno, &stage1_spells.boss.icicle_fall, false);
boss_add_attack_from_info(cirno, &stage1_spells.extra.crystal_blizzard, false);

View file

@ -20,9 +20,9 @@
struct stage2_spells_s stage2_spells = {
.boss = {
.amulet_of_harm = {{ 0, 1, 2, 3}, AT_Spellcard, "Shard ~ Amulet of Harm", 26, 36000,
.amulet_of_harm = {{ 0, 1, 2, 3}, AT_Spellcard, "Shard ~ Amulet of Harm", 26, 50000,
hina_amulet, hina_spell_bg, BOSS_DEFAULT_GO_POS},
.bad_pick = {{ 4, 5, 6, 7}, AT_Spellcard, "Lottery Sign ~ Bad Pick", 30, 36000,
.bad_pick = {{ 4, 5, 6, 7}, AT_Spellcard, "Lottery Sign ~ Bad Pick", 30, 43200,
hina_bad_pick, hina_spell_bg, BOSS_DEFAULT_GO_POS},
.wheel_of_fortune_easy = {{ 8, 9, -1, -1}, AT_Spellcard, "Lottery Sign ~ Wheel of Fortune", 20, 36000,
hina_wheel, hina_spell_bg, BOSS_DEFAULT_GO_POS},

View file

@ -252,7 +252,7 @@ void wiggle_mid_flee(Boss *w, int t) {
Boss *create_wriggle_mid(void) {
Boss* wriggle = create_boss("Wriggle", "wriggle", "dialog/wriggle", VIEWPORT_W + 150 - 30.0*I);
boss_add_attack(wriggle, AT_Move, "Introduction", 4, 0, wriggle_intro, NULL);
boss_add_attack(wriggle, AT_Normal, "Small Bug Storm", 20, 20000, wriggle_small_storm, NULL);
boss_add_attack(wriggle, AT_Normal, "Small Bug Storm", 20, 26000, wriggle_small_storm, NULL);
boss_add_attack(wriggle, AT_Move, "Flee", 5, 0, wiggle_mid_flee, NULL);;
start_attack(wriggle, wriggle->attacks);
@ -623,9 +623,9 @@ void hina_spell_bg(Boss *h, int time) {
Boss *create_hina(void) {
Boss* hina = create_boss("Kagiyama Hina", "hina", "dialog/hina", VIEWPORT_W + 150 + 100.0*I);
boss_add_attack(hina, AT_Move, "Introduction", 2, 0, hina_intro, NULL);
boss_add_attack(hina, AT_Normal, "Cards1", 20, 15000, hina_cards1, NULL);
boss_add_attack(hina, AT_Normal, "Cards1", 20, 25000, hina_cards1, NULL);
boss_add_attack_from_info(hina, &stage2_spells.boss.amulet_of_harm, false);
boss_add_attack(hina, AT_Normal, "Cards2", 17, 15000, hina_cards2, NULL);
boss_add_attack(hina, AT_Normal, "Cards2", 17, 30000, hina_cards2, NULL);
boss_add_attack_from_info(hina, &stage2_spells.boss.bad_pick, false);
if(global.diff < D_Hard) {

View file

@ -20,16 +20,16 @@
struct stage3_spells_s stage3_spells = {
.mid = {
.deadly_dance = {{ 0, 1, 2, 3}, AT_Spellcard, "Venom Sign ~ Deadly Dance", 25, 40000,
.deadly_dance = {{ 0, 1, 2, 3}, AT_Spellcard, "Venom Sign ~ Deadly Dance", 25, 50000,
stage3_mid_a1, stage3_mid_spellbg, BOSS_DEFAULT_GO_POS},
.acid_rain = {{-1, -1, 4, 5}, AT_Spellcard, "Venom Sign ~ Acid Rain", 30, 50000,
stage3_mid_a2, stage3_mid_spellbg, BOSS_DEFAULT_GO_POS},
},
.boss = {
.moonlight_rocket = {{ 6, 7, 8, 9}, AT_Spellcard, "Firefly Sign ~ Moonlight Rocket", 30, 35000,
.moonlight_rocket = {{ 6, 7, 8, 9}, AT_Spellcard, "Firefly Sign ~ Moonlight Rocket", 30, 40000,
stage3_boss_a1, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},
.wriggle_night_ignite = {{10, 11, 12, 13}, AT_Spellcard, "Light Source ~ Wriggle Night Ignite", 25, 40000,
.wriggle_night_ignite = {{10, 11, 12, 13}, AT_Spellcard, "Light Source ~ Wriggle Night Ignite", 30, 46000,
stage3_boss_a2, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},
.unspellable_spell_name = {{14, 15, 16, 17}, AT_Spellcard, "Bug Sign ~ Phosphaenus Hemipterus", 35, 40000,
stage3_boss_a3, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},

View file

@ -922,11 +922,11 @@ void stage3_boss_extra(Boss *boss, int time) {
Boss* stage3_create_boss(void) {
Boss *wriggle = create_boss("Wriggle EX", "wriggleex", "dialog/wriggle", VIEWPORT_W/2 - 200.0*I);
boss_add_attack(wriggle, AT_Move, "Introduction", 2, 0, stage3_boss_intro, NULL);
boss_add_attack(wriggle, AT_Normal, "", 20, 20000, stage3_boss_prea1, NULL);
boss_add_attack(wriggle, AT_Normal, "", 20, 30000, stage3_boss_prea1, NULL);
boss_add_attack_from_info(wriggle, &stage3_spells.boss.moonlight_rocket, false);
boss_add_attack(wriggle, AT_Normal, "", 20, 20000, stage3_boss_prea2, NULL);
boss_add_attack(wriggle, AT_Normal, "", 20, 32000, stage3_boss_prea2, NULL);
boss_add_attack_from_info(wriggle, &stage3_spells.boss.wriggle_night_ignite, false);
boss_add_attack(wriggle, AT_Normal, "", 20, 20000, stage3_boss_prea3, NULL);
boss_add_attack(wriggle, AT_Normal, "", 20, 34000, stage3_boss_prea3, NULL);
boss_add_attack_from_info(wriggle, &stage3_spells.boss.unspellable_spell_name, false);
boss_add_attack_from_info(wriggle, &stage3_spells.extra.moonlight_wraith, false);

View file

@ -20,20 +20,20 @@
struct stage4_spells_s stage4_spells = {
.mid = {
.gate_of_walachia = {{ 0, 1, 2, 3}, AT_Spellcard, "Bloodless ~ Gate of Walachia", 25, 40000,
.gate_of_walachia = {{ 0, 1, 2, 3}, AT_Spellcard, "Bloodless ~ Gate of Walachia", 25, 44000,
kurumi_slaveburst, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
.dry_fountain = {{ 4, 5, -1, -1}, AT_Spellcard, "Bloodless ~ Dry Fountain", 30, 40000,
.dry_fountain = {{ 4, 5, -1, -1}, AT_Spellcard, "Bloodless ~ Dry Fountain", 30, 44000,
kurumi_redspike, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
.red_spike = {{-1, -1, 6, 7}, AT_Spellcard, "Bloodless ~ Red Spike", 30, 44000,
.red_spike = {{-1, -1, 6, 7}, AT_Spellcard, "Bloodless ~ Red Spike", 30, 46000,
kurumi_redspike, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
},
.boss = {
.animate_wall = {{ 8, 9, -1, -1}, AT_Spellcard, "Limit ~ Animate Wall", 30, 45000,
.animate_wall = {{ 8, 9, -1, -1}, AT_Spellcard, "Limit ~ Animate Wall", 30, 50000,
kurumi_aniwall, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
.demon_wall = {{-1, -1, 10, 11}, AT_Spellcard, "Summoning ~ Demon Wall", 30, 50000,
.demon_wall = {{-1, -1, 10, 11}, AT_Spellcard, "Summoning ~ Demon Wall", 30, 55000,
kurumi_aniwall, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
.blow_the_walls = {{12, 13, 14, 15}, AT_Spellcard, "Power Sign ~ Blow the Walls", 30, 52000,
.blow_the_walls = {{12, 13, 14, 15}, AT_Spellcard, "Power Sign ~ Blow the Walls", 30, 55000,
kurumi_blowwall, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
.bloody_danmaku = {{-1, -1, 16, 17}, AT_Spellcard, "Fear Sign ~ Bloody Danmaku", 30, 55000,
kurumi_danmaku, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},

View file

@ -1057,13 +1057,13 @@ void kurumi_extra(Boss *b, int time) {
Boss *create_kurumi(void) {
Boss* b = create_boss("Kurumi", "kurumi", "dialog/kurumi", -400.0*I);
boss_add_attack(b, AT_Move, "Introduction", 4, 0, kurumi_boss_intro, NULL);
boss_add_attack(b, AT_Normal, "Sin Breaker", 20, 30000, kurumi_sbreaker, NULL);
boss_add_attack(b, AT_Normal, "Sin Breaker", 20, 33000, kurumi_sbreaker, NULL);
if(global.diff < D_Hard) {
boss_add_attack_from_info(b, &stage4_spells.boss.animate_wall, false);
} else {
boss_add_attack_from_info(b, &stage4_spells.boss.demon_wall, false);
}
boss_add_attack(b, AT_Normal, "Cold Breaker", 20, 30000, kurumi_breaker, NULL);
boss_add_attack(b, AT_Normal, "Cold Breaker", 20, 36000, kurumi_breaker, NULL);
boss_add_attack_from_info(b, &stage4_spells.boss.blow_the_walls, false);
if(global.diff > D_Normal) {
boss_add_attack_from_info(b, &stage4_spells.boss.bloody_danmaku, false);

View file

@ -20,11 +20,11 @@
struct stage5_spells_s stage5_spells = {
.boss = {
.atmospheric_discharge = {{ 0, 1, 2, 3}, AT_Spellcard, "High Voltage ~ Atmospheric Discharge", 30, 40000,
.atmospheric_discharge = {{ 0, 1, 2, 3}, AT_Spellcard, "High Voltage ~ Atmospheric Discharge", 30, 44000,
iku_atmospheric, iku_spell_bg, BOSS_DEFAULT_GO_POS},
.artificial_lightning = {{ 4, 5, 6, 7}, AT_Spellcard, "Charge Sign ~ Artificial Lightning", 30, 42000,
.artificial_lightning = {{ 4, 5, 6, 7}, AT_Spellcard, "Charge Sign ~ Artificial Lightning", 45, 60000,
iku_lightning, iku_spell_bg, BOSS_DEFAULT_GO_POS},
.natural_cathode = {{ 8, 9, 10, 11}, AT_Spellcard, "Spark Sign ~ Natural Cathode", 30, 50000,
.natural_cathode = {{ 8, 9, 10, 11}, AT_Spellcard, "Spark Sign ~ Natural Cathode", 30, 44000,
iku_cathode, iku_spell_bg, BOSS_DEFAULT_GO_POS},
.induction_field = {{12, 13, -1, -1}, AT_Spellcard, "Current Sign ~ Induction Field", 30, 50000,
iku_induction, iku_spell_bg, BOSS_DEFAULT_GO_POS},
@ -32,7 +32,7 @@ struct stage5_spells_s stage5_spells = {
iku_induction, iku_spell_bg, BOSS_DEFAULT_GO_POS},
},
.extra.overload = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Circuit Sign ~ Overload", 60, 40000,
.extra.overload = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Circuit Sign ~ Overload", 60, 44000,
iku_extra, iku_spell_bg, BOSS_DEFAULT_GO_POS},
};

View file

@ -761,11 +761,11 @@ Boss *create_iku(void) {
Boss *b = create_boss("Nagae Iku", "iku", "dialog/iku", VIEWPORT_W/2-200.0*I);
boss_add_attack(b, AT_Move, "Introduction", 3, 0, iku_intro, NULL);
boss_add_attack(b, AT_Normal, "Bolts1", 20, 20000, iku_bolts, NULL);
boss_add_attack(b, AT_Normal, "Bolts1", 20, 24000, iku_bolts, NULL);
boss_add_attack_from_info(b, &stage5_spells.boss.atmospheric_discharge, false);
boss_add_attack(b, AT_Normal, "Bolts2", 25, 20000, iku_bolts2, NULL);
boss_add_attack(b, AT_Normal, "Bolts2", 25, 27000, iku_bolts2, NULL);
boss_add_attack_from_info(b, &stage5_spells.boss.artificial_lightning, false);
boss_add_attack(b, AT_Normal, "Bolts3", 20, 20000, iku_bolts3, NULL);
boss_add_attack(b, AT_Normal, "Bolts3", 20, 30000, iku_bolts3, NULL);
boss_add_attack_from_info(b, &stage5_spells.boss.natural_cathode, false);
if(global.diff < D_Hard) {

View file

@ -20,25 +20,25 @@
struct stage6_spells_s stage6_spells = {
.scythe = {
.occams_razor = {{ 0, 1, 2, 3}, AT_Spellcard, "Newton Sign ~ Occams razor", 60, 40000,
.occams_razor = {{ 0, 1, 2, 3}, AT_Spellcard, "Newton Sign ~ Occams razor", 50, 60000,
elly_newton, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
.orbital_clockwork = {{24, 25, 26, 27}, AT_Spellcard, "Kepler Sign ~ Orbital Clockwork", 60, 40000,
.orbital_clockwork = {{24, 25, 26, 27}, AT_Spellcard, "Kepler Sign ~ Orbital Clockwork", 45, 60000,
elly_kepler, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
.wave_theory = {{ 4, 5, 6, 7}, AT_Spellcard, "Maxwell Sign ~ Wave Theory", 25, 26000,
.wave_theory = {{ 4, 5, 6, 7}, AT_Spellcard, "Maxwell Sign ~ Wave Theory", 25, 30000,
elly_maxwell, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
},
.baryon = {
.many_world_interpretation = {{ 8, 9, 10, 11}, AT_Spellcard, "Eigenstate ~ Many-World Interpretation", 60, 30000,
.many_world_interpretation = {{ 8, 9, 10, 11}, AT_Spellcard, "Eigenstate ~ Many-World Interpretation", 40, 60000,
elly_eigenstate, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
.spacetime_curvature = {{12, 13, 14, 15}, AT_Spellcard, "Ricci Sign ~ Spacetime Curvature", 50, 100000,
.spacetime_curvature = {{12, 13, 14, 15}, AT_Spellcard, "Ricci Sign ~ Spacetime Curvature", 50, 90000,
elly_ricci, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
.higgs_boson_uncovered = {{16, 17, 18, 19}, AT_Spellcard, "LHC ~ Higgs Boson Uncovered", 60, 50000,
.higgs_boson_uncovered = {{16, 17, 18, 19}, AT_Spellcard, "LHC ~ Higgs Boson Uncovered", 50, 60000,
elly_lhc, elly_spellbg_modern, BOSS_DEFAULT_GO_POS}
},
.extra = {
.curvature_domination = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Forgotten Universe ~ Curvature Domination", 40, 40000,
.curvature_domination = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Forgotten Universe ~ Curvature Domination", 60, 60000,
elly_curvature, elly_spellbg_modern, BOSS_DEFAULT_GO_POS}
},

View file

@ -221,7 +221,7 @@ int scythe_infinity(Enemy *e, int t) {
float w = min(0.15, 0.0001*(t-40));
e->pos = VIEWPORT_W/2 + 200.0*I + 200*cos(w*(t-40)+M_PI/2.0) + I*80*sin(creal(e->args[0])*w*(t-40));
create_projectile2c("ball", e->pos+80*cexp(I*creal(e->args[1])), rgb(cos(creal(e->args[1])), sin(creal(e->args[1])), cos(creal(e->args[1])+2.1)), asymptotic, (1+0.2*global.diff)*cexp(I*creal(e->args[1])), 3);
create_projectile2c("ball", e->pos+80*cexp(I*creal(e->args[1])), rgb(cos(creal(e->args[1])), sin(creal(e->args[1])), cos(creal(e->args[1])+2.1)), asymptotic, (1+0.4*global.diff)*cexp(I*creal(e->args[1])), 3 + 0.2 * global.diff);
}
scythe_common(e, t);
@ -706,22 +706,15 @@ int baryon_nattack(Enemy *e, int t) {
e->pos = global.boss->pos + (e->pos-global.boss->pos)*cexp(0.006*I);
FROM_TO(30, 10000, 7-global.diff) {
FROM_TO(30, 10000, (7 - global.diff)) {
float a = 0.2*_i + creal(e->args[2]) + 0.006*t;
create_projectile2c("ball", e->pos+40*cexp(I*a), rgb(cos(a), sin(a), cos(a+2.1)), asymptotic, (1+0.2*global.diff)*cexp(I*a), 3);
float ca = a + t/60.0f;
create_projectile2c("ball", e->pos+40*cexp(I*a), rgb(cos(ca), sin(ca), cos(ca+2.1)), asymptotic, (1+0.2*global.diff)*cexp(I*a), 3);
}
return 1;
}
void elly_baryonattack(Boss *b, int t) {
TIMER(&t);
AT(0)
set_baryon_rule(baryon_nattack);
AT(EVENT_DEATH)
set_baryon_rule(baryon_reset);
}
#define SAFE_RADIUS_DELAY 300
#define SAFE_RADIUS_BASE 100
#define SAFE_RADIUS_STRETCH 100
@ -918,6 +911,14 @@ void elly_ricci(Boss *b, int t) {
#undef SAFE_RADIUS_PHASE_NORMALIZED
#undef SAFE_RADIUS_PHASE_NUM
void elly_baryonattack(Boss *b, int t) {
TIMER(&t);
AT(0)
set_baryon_rule(baryon_nattack);
AT(EVENT_DEATH)
set_baryon_rule(baryon_reset);
}
void elly_baryonattack2(Boss *b, int t) {
TIMER(&t);
AT(0)
@ -926,13 +927,27 @@ void elly_baryonattack2(Boss *b, int t) {
set_baryon_rule(baryon_reset);
FROM_TO(100, 100000, 200-5*global.diff) {
int x, y;
int w = 1+(global.diff > D_Normal);
complex n = cexp(I*carg(global.plr.pos-b->pos));
for(x = -w; x <= w; x++)
for(y = -w; y <= w; y++)
create_projectile2c("bigball", b->pos+30*(x+I*y)*n, rgb(0,0.2,0.9), asymptotic, n, 3);
if(_i % 2) {
int cnt = 5;
for(int i = 0; i < cnt; ++i) {
float a = M_PI/4;
a = a * (i/(float)cnt) - a/2;
complex n = cexp(I*(a+carg(global.plr.pos-b->pos)));
for(int j = 0; j < 3; ++j) {
create_projectile2c("bigball", b->pos, rgb(0,0.2,0.9), asymptotic, n, 2 * j)->draw = ProjDrawAdd;
}
}
} else {
int x, y;
int w = 1+(global.diff > D_Normal);
complex n = cexp(I*carg(global.plr.pos-b->pos));
for(x = -w; x <= w; x++)
for(y = -w; y <= w; y++)
create_projectile2c("bigball", b->pos+25*(x+I*y)*n, rgb(0,0.2,0.9), asymptotic, n, 3)->draw = ProjDrawAdd;
}
}
}
@ -1282,16 +1297,16 @@ Boss *create_elly(void) {
Boss *b = create_boss("Elly", "elly", "dialog/elly", -200.0*I);
boss_add_attack(b, AT_Move, "Catch the Scythe", 6, 0, elly_intro, NULL);
boss_add_attack(b, AT_Normal, "Frequency", 30, 26000, elly_frequency, NULL);
boss_add_attack(b, AT_Normal, "Frequency", 40, 50000, elly_frequency, NULL);
boss_add_attack_from_info(b, &stage6_spells.scythe.occams_razor, false);
boss_add_attack(b, AT_Normal, "Frequency2", 40, 23000, elly_frequency2, NULL);
boss_add_attack(b, AT_Normal, "Frequency2", 40, 50000, elly_frequency2, NULL);
boss_add_attack_from_info(b, &stage6_spells.scythe.orbital_clockwork, false);
boss_add_attack_from_info(b, &stage6_spells.scythe.wave_theory, false);
boss_add_attack(b, AT_Move, "Unbound", 3, 10, elly_unbound, NULL);
boss_add_attack_from_info(b, &stage6_spells.baryon.many_world_interpretation, false);
boss_add_attack(b, AT_Normal, "Baryon", 40, 23000, elly_baryonattack, NULL);
boss_add_attack(b, AT_Normal, "Baryon", 40, 50000, elly_baryonattack, NULL);
boss_add_attack_from_info(b, &stage6_spells.baryon.spacetime_curvature, false);
boss_add_attack(b, AT_Normal, "Baryon", 25, 23000, elly_baryonattack2, NULL);
boss_add_attack(b, AT_Normal, "Baryon", 40, 50000, elly_baryonattack2, NULL);
boss_add_attack_from_info(b, &stage6_spells.baryon.higgs_boson_uncovered, false);
boss_add_attack(b, AT_Move, "Explode", 6, 10, elly_baryon_explode, NULL);
boss_add_attack_from_info(b, &stage6_spells.extra.curvature_domination, false);