make extraspells accessible in core game; other boss changes
Replaced stage spell arrays with structs containing AttackInfo fields, which can be arranged in a human-friendly way. A pointer to such a struct may be safely cast to an AttackInfo pointer, and treated as an array for iteration purposes. Nothing should refer to spells via magical array indices anymore.
This commit is contained in:
parent
0211594235
commit
e1a40d10dd
28 changed files with 552 additions and 333 deletions
143
src/boss.c
143
src/boss.c
|
@ -111,6 +111,32 @@ static StageProgress* get_spellstage_progress(Attack *a, StageInfo **out_stginfo
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static bool boss_should_skip_attack(Boss *boss, Attack *a) {
|
||||
// if we failed any spells on this boss up to this point, skip any extra spells,
|
||||
// as well as any attacks associated with them.
|
||||
//
|
||||
// (for example, the "Generic move" that might have been automatically added by
|
||||
// boss_add_attack_from_info. this is what the a->info->type check is for.)
|
||||
|
||||
return boss->failed_spells && (a->type == AT_ExtraSpell || (a->info && a->info->type == AT_ExtraSpell));
|
||||
}
|
||||
|
||||
static Attack* boss_get_final_attack(Boss *boss) {
|
||||
Attack *final;
|
||||
for(final = boss->attacks + boss->acount - 1; final >= boss->attacks && boss_should_skip_attack(boss, final); --final);
|
||||
return final >= boss->attacks ? final : NULL;
|
||||
}
|
||||
|
||||
static Attack* boss_get_next_attack(Boss *boss) {
|
||||
Attack *next;
|
||||
for(next = boss->current + 1; next < boss->attacks + boss->acount && boss_should_skip_attack(boss, next); ++next);
|
||||
return next < boss->attacks + boss->acount ? next : NULL;
|
||||
}
|
||||
|
||||
static bool boss_attack_is_final(Boss *boss, Attack *a) {
|
||||
return boss_get_final_attack(boss) == a;
|
||||
}
|
||||
|
||||
void draw_boss(Boss *boss) {
|
||||
draw_animation_p(creal(boss->pos), cimag(boss->pos) + 6*sin(global.frames/25.0), boss->anirow, boss->ani);
|
||||
draw_boss_text(AL_Left, 10, 20, boss->name);
|
||||
|
@ -138,6 +164,15 @@ void draw_boss(Boss *boss) {
|
|||
);
|
||||
}
|
||||
|
||||
// FIXME: i don't understand what the fuck is going on in this code
|
||||
// i'm tired and don't want to deal with it any longer
|
||||
// lao, please make this weird-ass healthbar system behave with skipped attacks (extra spells)
|
||||
//
|
||||
// and there's also this thing where when a spell is finished, it immediately displays the health bar for the next one,
|
||||
// without waiting for the end delay. maybe that only happens without a normal attack inbetween, but i'm not sure.
|
||||
//
|
||||
// -- Akari
|
||||
|
||||
int nextspell, lastspell;
|
||||
for(nextspell = 0; nextspell < boss->acount - 1; nextspell++) {
|
||||
int t = boss->attacks[nextspell].type;
|
||||
|
@ -230,11 +265,11 @@ void boss_rule_extra(Boss *boss, float alpha) {
|
|||
}
|
||||
|
||||
bool boss_is_dying(Boss *boss) {
|
||||
return boss->current && boss->current->endtime && boss->current->type != AT_Move && boss->current - boss->attacks >= boss->acount-1;
|
||||
return boss->current && boss->current->endtime && boss->current->type != AT_Move && boss_attack_is_final(boss, boss->current);
|
||||
}
|
||||
|
||||
bool boss_is_fleeing(Boss *boss) {
|
||||
return boss->current && boss->current->type == AT_Move && boss->current - boss->attacks >= boss->acount-1;
|
||||
return boss->current && boss->current->type == AT_Move && boss_attack_is_final(boss, boss->current);
|
||||
}
|
||||
|
||||
bool boss_is_vulnerable(Boss *boss) {
|
||||
|
@ -242,8 +277,11 @@ bool boss_is_vulnerable(Boss *boss) {
|
|||
}
|
||||
|
||||
static void boss_give_spell_bonus(Boss *boss, Attack *a, Player *plr) {
|
||||
bool fail = a->failtime;
|
||||
const char *title = fail ? "Spell failed..." : "Spell cleared!";
|
||||
bool fail = a->failtime, extra = a->type == AT_ExtraSpell;
|
||||
|
||||
const char *title = extra ?
|
||||
(fail ? "Extra Spell failed..." : "Extra Spell cleared!"):
|
||||
(fail ? "Spell failed..." : "Spell cleared!");
|
||||
|
||||
int time_left = max(0, a->starttime + a->timeout - global.frames);
|
||||
|
||||
|
@ -283,21 +321,34 @@ static void boss_give_spell_bonus(Boss *boss, Attack *a, Player *plr) {
|
|||
stagetext_end_table(&tbl);
|
||||
}
|
||||
|
||||
void boss_finish_current_attack(Boss *boss) {
|
||||
int delay;
|
||||
|
||||
if(boss->current-boss->attacks >= boss->acount-1) {
|
||||
delay = BOSS_DEATH_DELAY;
|
||||
} else switch(boss->current->type) {
|
||||
// FIXME: what should it be for AT_SurvivalSpell?
|
||||
case AT_Spellcard: delay = ATTACK_END_DELAY_SPELL; break;
|
||||
case AT_ExtraSpell: delay = ATTACK_END_DELAY_EXTRA; break;
|
||||
case AT_Move: delay = 0; break;
|
||||
default: delay = ATTACK_END_DELAY; break;
|
||||
static int attack_end_delay(Boss *boss) {
|
||||
if(boss_attack_is_final(boss, boss->current)) {
|
||||
return BOSS_DEATH_DELAY;
|
||||
}
|
||||
|
||||
int delay = 0;
|
||||
|
||||
switch(boss->current->type) {
|
||||
case AT_Spellcard: delay = ATTACK_END_DELAY_SPELL; break;
|
||||
case AT_SurvivalSpell: delay = ATTACK_END_DELAY_SURV; break;
|
||||
case AT_ExtraSpell: delay = ATTACK_END_DELAY_EXTRA; break;
|
||||
case AT_Move: delay = ATTACK_END_DELAY_MOVE; break;
|
||||
default: delay = ATTACK_END_DELAY; break;
|
||||
}
|
||||
|
||||
if(delay) {
|
||||
Attack *next = boss_get_next_attack(boss);
|
||||
|
||||
if(next && next->type == AT_ExtraSpell) {
|
||||
delay += ATTACK_END_DELAY_PRE_EXTRA;
|
||||
}
|
||||
}
|
||||
|
||||
return delay;
|
||||
}
|
||||
|
||||
void boss_finish_current_attack(Boss *boss) {
|
||||
boss->dmg = boss->current->dmglimit + 1;
|
||||
boss->current->endtime = global.frames + delay;
|
||||
boss->current->finished = true;
|
||||
boss->current->rule(boss, EVENT_DEATH);
|
||||
|
||||
|
@ -314,10 +365,11 @@ void boss_finish_current_attack(Boss *boss) {
|
|||
++p->num_cleared;
|
||||
}
|
||||
} else {
|
||||
// see boss_death for explanation
|
||||
boss->extraspell = NULL;
|
||||
boss->failed_spells++;
|
||||
}
|
||||
}
|
||||
|
||||
boss->current->endtime = global.frames + attack_end_delay(boss);
|
||||
}
|
||||
|
||||
void process_boss(Boss **pboss) {
|
||||
|
@ -405,44 +457,34 @@ void process_boss(Boss **pboss) {
|
|||
stage_gameover();
|
||||
}
|
||||
|
||||
if(extra && boss->current->finished && !boss->current->failtime)
|
||||
spawn_items(boss->pos, Life, 1, NULL);
|
||||
if(extra && boss->current->finished && !boss->current->failtime) {
|
||||
spawn_items(boss->pos, Point, 20, NULL);
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
boss->current++;
|
||||
|
||||
if(boss->current - boss->attacks >= boss->acount) {
|
||||
// no more attacks, die
|
||||
boss->current = NULL;
|
||||
boss_death(pboss);
|
||||
break;
|
||||
}
|
||||
|
||||
if(boss_should_skip_attack(boss, boss->current)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
boss->current++;
|
||||
if(boss->current - boss->attacks < boss->acount)
|
||||
start_attack(boss, boss->current);
|
||||
else {
|
||||
boss->current = NULL;
|
||||
boss_death(pboss);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void boss_death(Boss **boss) {
|
||||
if((*boss)->acount && (*boss)->attacks[(*boss)->acount-1].type != AT_Move)
|
||||
if((*boss)->acount && boss_get_final_attack(*boss)->type != AT_Move)
|
||||
petal_explosion(35, (*boss)->pos);
|
||||
|
||||
if((*boss)->extraspell && !global.continues) {
|
||||
// unlock the relevant extra spell in spell practice mode if every spell of this boss has been cleared
|
||||
// this is a temporary mechanic to make extra spells accessible until we integrate them into core game
|
||||
|
||||
StageInfo *i;
|
||||
AttackInfo *spell = (*boss)->extraspell;
|
||||
|
||||
Attack dummy;
|
||||
memset(&dummy, 0, sizeof(dummy));
|
||||
dummy.info = spell;
|
||||
dummy.name = spell->name;
|
||||
dummy.type = AT_ExtraSpell;
|
||||
|
||||
StageProgress *p = get_spellstage_progress(&dummy, &i, true);
|
||||
|
||||
if(p && !p->unlocked) {
|
||||
log_info("Extra Spell unlocked! %s: %s", i->title, i->subtitle);
|
||||
p->unlocked = true;
|
||||
}
|
||||
}
|
||||
|
||||
free_boss(*boss);
|
||||
*boss = NULL;
|
||||
stage_clear_hazards(true);
|
||||
|
@ -518,13 +560,6 @@ Attack* boss_add_attack(Boss *boss, AttackType type, char *name, float timeout,
|
|||
return a;
|
||||
}
|
||||
|
||||
void boss_set_extra_spell(Boss *boss, AttackInfo *spell) {
|
||||
assert(boss != NULL);
|
||||
assert(spell != NULL);
|
||||
assert(spell->type == AT_ExtraSpell);
|
||||
boss->extraspell = spell;
|
||||
}
|
||||
|
||||
void boss_generic_move(Boss *b, int time) {
|
||||
if(b->current->info->pos_dest != BOSS_NOMOVE) {
|
||||
GO_TO(b, b->current->info->pos_dest, 0.1)
|
||||
|
|
16
src/boss.h
16
src/boss.h
|
@ -14,6 +14,18 @@
|
|||
#include "resource/animation.h"
|
||||
#include "color.h"
|
||||
|
||||
enum {
|
||||
ATTACK_START_DELAY = 60,
|
||||
ATTACK_START_DELAY_EXTRA = 150,
|
||||
ATTACK_END_DELAY = 20,
|
||||
ATTACK_END_DELAY_MOVE = 0,
|
||||
ATTACK_END_DELAY_SPELL = 60,
|
||||
ATTACK_END_DELAY_SURV = 20,
|
||||
ATTACK_END_DELAY_EXTRA = 150,
|
||||
ATTACK_END_DELAY_PRE_EXTRA = 60,
|
||||
BOSS_DEATH_DELAY = 150,
|
||||
};
|
||||
|
||||
struct Boss;
|
||||
|
||||
typedef void (*BossRule)(struct Boss*, int time);
|
||||
|
@ -96,7 +108,7 @@ typedef struct Boss {
|
|||
int dmg;
|
||||
Color zoomcolor;
|
||||
|
||||
AttackInfo *extraspell;
|
||||
int failed_spells;
|
||||
} Boss;
|
||||
|
||||
Boss* create_boss(char *name, char *ani, char *dialog, complex pos);
|
||||
|
@ -123,8 +135,6 @@ void boss_kill_projectiles(void);
|
|||
|
||||
void boss_preload(void);
|
||||
|
||||
void boss_set_extra_spell(Boss *boss, AttackInfo *spellstage);
|
||||
|
||||
#define BOSS_DEFAULT_SPAWN_POS (VIEWPORT_W * 0.5 - I * VIEWPORT_H * 0.5)
|
||||
#define BOSS_DEFAULT_GO_POS (VIEWPORT_W * 0.5 + 200.0*I)
|
||||
#define BOSS_NOMOVE (-3142-39942.0*I)
|
||||
|
|
|
@ -61,15 +61,9 @@ enum {
|
|||
VIEWPORT_H = 560,
|
||||
|
||||
POINT_OF_COLLECT = VIEWPORT_H/4,
|
||||
ATTACK_START_DELAY = 60,
|
||||
ATTACK_START_DELAY_EXTRA = 150,
|
||||
ATTACK_END_DELAY = 20,
|
||||
ATTACK_END_DELAY_SPELL = 60,
|
||||
ATTACK_END_DELAY_EXTRA = 150,
|
||||
BOSS_DEATH_DELAY = 150,
|
||||
BOMB_RECOVERY = 300,
|
||||
DEATHBOMB_TIME = 12,
|
||||
DEATH_DELAY = 70,
|
||||
BOMB_RECOVERY = 300,
|
||||
|
||||
MAX_CONTINUES = 3,
|
||||
|
||||
|
|
14
src/stage.c
14
src/stage.c
|
@ -89,13 +89,13 @@ static bool spellfilter_extra(AttackInfo *spell) {
|
|||
void stage_init_array(void) {
|
||||
int spellnum = 0;
|
||||
|
||||
// id procs type title subtitle spells diff titleclr bosstitleclr
|
||||
add_stage(1, &stage1_procs, STAGE_STORY, "Stage 1", "Misty Lake", stage1_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
add_stage(2, &stage2_procs, STAGE_STORY, "Stage 2", "Walk Along the Border", stage2_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
add_stage(3, &stage3_procs, STAGE_STORY, "Stage 3", "Through the Tunnel of Light", stage3_spells, D_Any, rgb(1, 1, 1), rgb(0, 0, 0));
|
||||
add_stage(4, &stage4_procs, STAGE_STORY, "Stage 4", "Forgotten Mansion", stage4_spells, D_Any, rgb(0, 0, 0), rgb(1, 1, 1));
|
||||
add_stage(5, &stage5_procs, STAGE_STORY, "Stage 5", "Climbing the Tower of Babel", stage5_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
add_stage(6, &stage6_procs, STAGE_STORY, "Stage 6", "Roof of the World", stage6_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
// id procs type title subtitle spells diff titleclr bosstitleclr
|
||||
add_stage(1, &stage1_procs, STAGE_STORY, "Stage 1", "Misty Lake", (AttackInfo*)&stage1_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
add_stage(2, &stage2_procs, STAGE_STORY, "Stage 2", "Walk Along the Border", (AttackInfo*)&stage2_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
add_stage(3, &stage3_procs, STAGE_STORY, "Stage 3", "Through the Tunnel of Light", (AttackInfo*)&stage3_spells, D_Any, rgb(1, 1, 1), rgb(0, 0, 0));
|
||||
add_stage(4, &stage4_procs, STAGE_STORY, "Stage 4", "Forgotten Mansion", (AttackInfo*)&stage4_spells, D_Any, rgb(0, 0, 0), rgb(1, 1, 1));
|
||||
add_stage(5, &stage5_procs, STAGE_STORY, "Stage 5", "Climbing the Tower of Babel", (AttackInfo*)&stage5_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
add_stage(6, &stage6_procs, STAGE_STORY, "Stage 6", "Roof of the World", (AttackInfo*)&stage6_spells, D_Any, rgb(1, 1, 1), rgb(1, 1, 1));
|
||||
|
||||
// generate spellpractice stages
|
||||
add_spellpractice_stages(&spellnum, spellfilter_normal, STAGE_SPELL_BIT);
|
||||
|
|
|
@ -437,40 +437,41 @@ void stage_draw_hud(void) {
|
|||
draw_texture(0,0,difficulty_tex(global.diff));
|
||||
glPopMatrix();
|
||||
|
||||
float a = 1, s = 0, fadein = 1, fadeout = 1, fade = 1;
|
||||
|
||||
if(global.boss && global.boss->current && global.boss->current->type == AT_ExtraSpell) {
|
||||
fadein = min(1, -min(0, global.frames - global.boss->current->starttime) / (float)ATTACK_START_DELAY);
|
||||
fadeout = global.boss->current->finished * (1 - (global.boss->current->endtime - global.frames) / (float)ATTACK_END_DELAY_EXTRA) / 0.74;
|
||||
fade = max(fadein, fadeout);
|
||||
|
||||
s = 1 - fade;
|
||||
a = 0.5 + 0.5 * fade;
|
||||
}
|
||||
|
||||
if(global.stage->type == STAGE_SPELL) {
|
||||
glColor4f(1, 1, 1, 0.7);
|
||||
draw_text(AL_Left, -6, 167, "N/A", _fonts.standard);
|
||||
draw_text(AL_Left, -6, 200, "N/A", _fonts.standard);
|
||||
glColor4f(1, 1, 1, 1.0);
|
||||
} else {
|
||||
float a = 1, s = 0, fadein = 1, fadeout = 1, fade = 1;
|
||||
|
||||
if(global.boss && global.boss->current && global.boss->current->type == AT_ExtraSpell) {
|
||||
fadein = min(1, -min(0, global.frames - global.boss->current->starttime) / (float)ATTACK_START_DELAY);
|
||||
fadeout = global.boss->current->finished * (1 - (global.boss->current->endtime - global.frames) / (float)ATTACK_END_DELAY_EXTRA) / 0.74;
|
||||
fade = max(fadein, fadeout);
|
||||
|
||||
s = 1 - fade;
|
||||
a = 0.5 + 0.5 * fade;
|
||||
}
|
||||
|
||||
draw_stars(0, 167, global.plr.lives, global.plr.life_fragments, PLR_MAX_LIVES, PLR_MAX_LIFE_FRAGMENTS, a);
|
||||
draw_stars(0, 200, global.plr.bombs, global.plr.bomb_fragments, PLR_MAX_BOMBS, PLR_MAX_BOMB_FRAGMENTS, a);
|
||||
}
|
||||
|
||||
if(s) {
|
||||
float s2 = max(0, swing(s, 3));
|
||||
glPushMatrix();
|
||||
glTranslatef((SCREEN_W - 615) * 0.25 - 615 * (1 - pow(2*fadein-1, 2)), 400, 0);
|
||||
glColor4f(0.3, 0.6, 0.7, 0.7 * s);
|
||||
glRotatef(-25 + 360 * (1-s2), 0, 0, 1);
|
||||
glScalef(s2, s2, 0);
|
||||
draw_text(AL_Center, 1, 1, "Extra Spell!", _fonts.mainmenu);
|
||||
draw_text(AL_Center, -1, -1, "Extra Spell!", _fonts.mainmenu);
|
||||
glColor4f(1, 1, 1, s);
|
||||
draw_text(AL_Center, 0, 0, "Extra Spell!", _fonts.mainmenu);
|
||||
glColor4f(1, 1, 1, 1);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
if(s) {
|
||||
float s2 = max(0, swing(s, 3));
|
||||
glPushMatrix();
|
||||
glTranslatef((SCREEN_W - 615) * 0.25 - 615 * (1 - pow(2*fadein-1, 2)), 340, 0);
|
||||
glColor4f(0.3, 0.6, 0.7, 0.7 * s);
|
||||
glRotatef(-25 + 360 * (1-s2), 0, 0, 1);
|
||||
glScalef(s2, s2, 0);
|
||||
draw_text(AL_Center, 1, 1, "Extra Spell!", _fonts.mainmenu);
|
||||
draw_text(AL_Center, -1, -1, "Extra Spell!", _fonts.mainmenu);
|
||||
glColor4f(1, 1, 1, s);
|
||||
draw_text(AL_Center, 0, 0, "Extra Spell!", _fonts.mainmenu);
|
||||
glColor4f(1, 1, 1, 1);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
// snprintf(buf, sizeof(buf), "%.2f", global.plr.power / 100.0);
|
||||
|
|
|
@ -7,31 +7,36 @@
|
|||
*/
|
||||
|
||||
#include "stage1.h"
|
||||
#include "stage1_events.h"
|
||||
|
||||
#include "global.h"
|
||||
#include "stage.h"
|
||||
#include "stageutils.h"
|
||||
#include "stage1_events.h"
|
||||
|
||||
static Stage3D bgcontext;
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
* To add, remove, or reorder spells, see this stage's header file.
|
||||
*/
|
||||
|
||||
AttackInfo stage1_spells[] = {
|
||||
{{ 0, 1, 2, 3}, AT_Spellcard, "Freeze Sign ~ Perfect Freeze", 32, 20000,
|
||||
struct stage1_spells_s stage1_spells = {
|
||||
.mid = {
|
||||
.perfect_freeze = {{ 0, 1, 2, 3}, AT_Spellcard, "Freeze Sign ~ Perfect Freeze", 32, 20000,
|
||||
cirno_perfect_freeze, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
|
||||
{{ 4, 5, 6, 7}, AT_Spellcard, "Freeze Sign ~ Crystal Rain", 28, 33000,
|
||||
cirno_crystal_rain, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
|
||||
{{ 8, 9, 10, 11}, AT_Spellcard, "Doom Sign ~ Icicle Fall", 35, 40000,
|
||||
cirno_icicle_fall, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
|
||||
{{ 0, 1, 2, 3}, AT_ExtraSpell, "Frost Sign ~ Crystal Blizzard", 60, 40000,
|
||||
cirno_crystal_blizzard, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
|
||||
},
|
||||
|
||||
{{0}}
|
||||
.boss = {
|
||||
.crystal_rain = {{ 4, 5, 6, 7}, AT_Spellcard, "Freeze Sign ~ Crystal Rain", 28, 33000,
|
||||
cirno_crystal_rain, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
|
||||
.icicle_fall = {{ 8, 9, 10, 11}, AT_Spellcard, "Doom Sign ~ Icicle Fall", 35, 40000,
|
||||
cirno_icicle_fall, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
|
||||
},
|
||||
|
||||
.extra.crystal_blizzard = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Frost Sign ~ Crystal Blizzard", 60, 40000,
|
||||
cirno_crystal_blizzard, cirno_pfreeze_bg, VIEWPORT_W/2.0+100.0*I},
|
||||
};
|
||||
|
||||
static Stage3D bgcontext;
|
||||
|
||||
void stage1_bg_draw(Vector pos) {
|
||||
glPushMatrix();
|
||||
glTranslatef(0,bgcontext.cx[1]+500,0);
|
||||
|
|
|
@ -11,8 +11,28 @@
|
|||
|
||||
#include "stage.h"
|
||||
|
||||
extern struct stage1_spells_s {
|
||||
// this struct must contain only fields of type AttackInfo
|
||||
// order of fields affects the visual spellstage number, but not its real internal ID
|
||||
|
||||
struct {
|
||||
AttackInfo perfect_freeze;
|
||||
} mid;
|
||||
|
||||
struct {
|
||||
AttackInfo crystal_rain;
|
||||
AttackInfo icicle_fall;
|
||||
} boss;
|
||||
|
||||
struct {
|
||||
AttackInfo crystal_blizzard;
|
||||
} extra;
|
||||
|
||||
// required for iteration
|
||||
AttackInfo null;
|
||||
} stage1_spells;
|
||||
|
||||
extern StageProcs stage1_procs;
|
||||
extern StageProcs stage1_spell_procs;
|
||||
extern AttackInfo stage1_spells[];
|
||||
|
||||
#endif
|
||||
|
|
|
@ -163,7 +163,7 @@ 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_from_info(cirno, stage1_spells+0, false);
|
||||
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);
|
||||
|
||||
start_attack(cirno, cirno->attacks);
|
||||
|
@ -387,10 +387,10 @@ 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_from_info(cirno, stage1_spells+1, false);
|
||||
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_from_info(cirno, stage1_spells+2, false);
|
||||
boss_set_extra_spell(cirno, stage1_spells+3);
|
||||
boss_add_attack_from_info(cirno, &stage1_spells.boss.icicle_fall, false);
|
||||
boss_add_attack_from_info(cirno, &stage1_spells.extra.crystal_blizzard, false);
|
||||
|
||||
start_attack(cirno, cirno->attacks);
|
||||
return cirno;
|
||||
|
|
|
@ -7,10 +7,32 @@
|
|||
*/
|
||||
|
||||
#include "stage2.h"
|
||||
#include "stage2_events.h"
|
||||
|
||||
#include "global.h"
|
||||
#include "stage.h"
|
||||
#include "stageutils.h"
|
||||
#include "stage2_events.h"
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
* To add, remove, or reorder spells, see this stage's header file.
|
||||
*/
|
||||
|
||||
struct stage2_spells_s stage2_spells = {
|
||||
.boss = {
|
||||
.amulet_of_harm = {{ 0, 1, 2, 3}, AT_Spellcard, "Shard ~ Amulet of Harm", 26, 36000,
|
||||
hina_amulet, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
.bad_pick = {{ 4, 5, 6, 7}, AT_Spellcard, "Lottery Sign ~ Bad Pick", 30, 36000,
|
||||
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},
|
||||
.wheel_of_fortune_hard = {{-1, -1, 10, 11}, AT_Spellcard, "Lottery Sign ~ Wheel of Fortune", 25, 36000,
|
||||
hina_wheel, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
},
|
||||
|
||||
.extra.monty_hall_danmaku = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Lottery Sign ~ Monty Hall Danmaku", 60, 60000,
|
||||
hina_monty, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
};
|
||||
|
||||
static Stage3D bgcontext;
|
||||
|
||||
|
|
|
@ -11,8 +11,26 @@
|
|||
|
||||
#include "stage.h"
|
||||
|
||||
extern struct stage2_spells_s {
|
||||
// this struct must contain only fields of type AttackInfo
|
||||
// order of fields affects the visual spellstage number, but not its real internal ID
|
||||
|
||||
struct {
|
||||
AttackInfo amulet_of_harm;
|
||||
AttackInfo bad_pick;
|
||||
AttackInfo wheel_of_fortune_easy;
|
||||
AttackInfo wheel_of_fortune_hard;
|
||||
} boss;
|
||||
|
||||
struct {
|
||||
AttackInfo monty_hall_danmaku;
|
||||
} extra;
|
||||
|
||||
// required for iteration
|
||||
AttackInfo null;
|
||||
} stage2_spells;
|
||||
|
||||
extern StageProcs stage2_procs;
|
||||
extern StageProcs stage2_spell_procs;
|
||||
extern AttackInfo stage2_spells[];
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,31 +11,6 @@
|
|||
#include "stage.h"
|
||||
#include "enemy.h"
|
||||
|
||||
void hina_spell_bg(Boss*, int);
|
||||
void hina_amulet(Boss*, int);
|
||||
void hina_bad_pick(Boss*, int);
|
||||
void hina_wheel(Boss*, int);
|
||||
void hina_monty(Boss*, int);
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
*/
|
||||
|
||||
AttackInfo stage2_spells[] = {
|
||||
{{ 0, 1, 2, 3}, AT_Spellcard, "Shard ~ Amulet of Harm", 26, 36000,
|
||||
hina_amulet, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 4, 5, 6, 7}, AT_Spellcard, "Lottery Sign ~ Bad Pick", 30, 36000,
|
||||
hina_bad_pick, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 8, 9, -1, -1}, AT_Spellcard, "Lottery Sign ~ Wheel of Fortune", 20, 36000,
|
||||
hina_wheel, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{-1, -1, 10, 11}, AT_Spellcard, "Lottery Sign ~ Wheel of Fortune", 25, 36000,
|
||||
hina_wheel, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 0, 1, 2, 3}, AT_ExtraSpell, "Lottery Sign ~ Monty Hall Danmaku", 60, 60000,
|
||||
hina_monty, hina_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
|
||||
{{0}}
|
||||
};
|
||||
|
||||
Dialog *stage2_dialog(void) {
|
||||
Dialog *d = create_dialog(global.plr.cha == Marisa ? "dialog/marisa" : "dialog/youmu", "dialog/hina");
|
||||
|
||||
|
@ -649,11 +624,17 @@ 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_from_info(hina, stage2_spells+0, false);
|
||||
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_from_info(hina, stage2_spells+1, false);
|
||||
boss_add_attack_from_info(hina, stage2_spells+2 + (global.diff > D_Normal), false);
|
||||
boss_set_extra_spell(hina, stage2_spells+4);
|
||||
boss_add_attack_from_info(hina, &stage2_spells.boss.bad_pick, false);
|
||||
|
||||
if(global.diff < D_Hard) {
|
||||
boss_add_attack_from_info(hina, &stage2_spells.boss.wheel_of_fortune_easy, false);
|
||||
} else {
|
||||
boss_add_attack_from_info(hina, &stage2_spells.boss.wheel_of_fortune_hard, false);
|
||||
}
|
||||
|
||||
boss_add_attack_from_info(hina, &stage2_spells.extra.monty_hall_danmaku, false);
|
||||
|
||||
start_attack(hina, hina->attacks);
|
||||
return hina;
|
||||
|
|
|
@ -9,6 +9,14 @@
|
|||
#ifndef STAGE2_EVENTS_H
|
||||
#define STAGE2_EVENTS_H
|
||||
|
||||
#include "boss.h"
|
||||
|
||||
void hina_spell_bg(Boss*, int);
|
||||
void hina_amulet(Boss*, int);
|
||||
void hina_bad_pick(Boss*, int);
|
||||
void hina_wheel(Boss*, int);
|
||||
void hina_monty(Boss*, int);
|
||||
|
||||
void stage2_events(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -7,12 +7,40 @@
|
|||
*/
|
||||
|
||||
#include "stage3.h"
|
||||
#include "stage3_events.h"
|
||||
|
||||
#include "global.h"
|
||||
#include "stage.h"
|
||||
#include "stageutils.h"
|
||||
#include "stage3_events.h"
|
||||
|
||||
typedef struct Stage3State {
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
* To add, remove, or reorder spells, see this stage's header file.
|
||||
*/
|
||||
|
||||
struct stage3_spells_s stage3_spells = {
|
||||
.mid = {
|
||||
.deadly_dance = {{ 0, 1, 2, 3}, AT_Spellcard, "Venom Sign ~ Deadly Dance", 25, 40000,
|
||||
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,
|
||||
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,
|
||||
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},
|
||||
},
|
||||
|
||||
.extra.moonlight_wraith = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Firefly Sign ~ Moonlight Wraith", 60, 150000,
|
||||
stage3_boss_extra, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},
|
||||
};
|
||||
|
||||
static Stage3D bgcontext;
|
||||
static struct {
|
||||
float clr_r;
|
||||
float clr_g;
|
||||
float clr_b;
|
||||
|
@ -23,10 +51,7 @@ typedef struct Stage3State {
|
|||
float tunnel_avel;
|
||||
float tunnel_updn;
|
||||
float tunnel_side;
|
||||
} Stage3State;
|
||||
|
||||
static Stage3D bgcontext;
|
||||
static Stage3State stgstate;
|
||||
} stgstate;
|
||||
|
||||
Vector **stage3_bg_pos(Vector pos, float maxrange) {
|
||||
//Vector p = {100 * cos(global.frames / 52.0), 100, 50 * sin(global.frames / 50.0)};
|
||||
|
@ -106,7 +131,7 @@ void stage3_start(void) {
|
|||
|
||||
add_model(&bgcontext, stage3_bg_tunnel_draw, stage3_bg_pos);
|
||||
|
||||
memset(&stgstate, 0, sizeof(Stage3State));
|
||||
memset(&stgstate, 0, sizeof(stgstate));
|
||||
stgstate.clr_r = 1.0;
|
||||
stgstate.clr_g = 0.0;
|
||||
stgstate.clr_b = 0.5;
|
||||
|
|
|
@ -11,8 +11,30 @@
|
|||
|
||||
#include "stage.h"
|
||||
|
||||
extern struct stage3_spells_s {
|
||||
// this struct must contain only fields of type AttackInfo
|
||||
// order of fields affects the visual spellstage number, but not its real internal ID
|
||||
|
||||
struct {
|
||||
AttackInfo deadly_dance;
|
||||
AttackInfo acid_rain;
|
||||
} mid;
|
||||
|
||||
struct {
|
||||
AttackInfo moonlight_rocket;
|
||||
AttackInfo wriggle_night_ignite;
|
||||
AttackInfo unspellable_spell_name;
|
||||
} boss;
|
||||
|
||||
struct {
|
||||
AttackInfo moonlight_wraith;
|
||||
} extra;
|
||||
|
||||
// required for iteration
|
||||
AttackInfo null;
|
||||
} stage3_spells;
|
||||
|
||||
extern StageProcs stage3_procs;
|
||||
extern StageProcs stage3_spell_procs;
|
||||
extern AttackInfo stage3_spells[];
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,36 +11,6 @@
|
|||
#include "stage.h"
|
||||
#include "enemy.h"
|
||||
|
||||
void stage3_mid_spellbg(Boss*, int t);
|
||||
void stage3_boss_spellbg(Boss*, int t);
|
||||
void stage3_mid_a1(Boss*, int t);
|
||||
void stage3_mid_a2(Boss*, int t);
|
||||
void stage3_boss_a1(Boss*, int t);
|
||||
void stage3_boss_a2(Boss*, int t);
|
||||
void stage3_boss_a3(Boss*, int t);
|
||||
void stage3_boss_extra(Boss*, int t);
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
*/
|
||||
|
||||
AttackInfo stage3_spells[] = {
|
||||
{{ 0, 1, 2, 3}, AT_Spellcard, "Venom Sign ~ Deadly Dance", 25, 40000,
|
||||
stage3_mid_a1, stage3_mid_spellbg, BOSS_DEFAULT_GO_POS},
|
||||
{{-1, -1, 4, 5}, AT_Spellcard, "Venom Sign ~ Acid Rain", 30, 50000,
|
||||
stage3_mid_a2, stage3_mid_spellbg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 6, 7, 8, 9}, AT_Spellcard, "Firefly Sign ~ Moonlight Rocket", 30, 35000,
|
||||
stage3_boss_a1, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},
|
||||
{{10, 11, 12, 13}, AT_Spellcard, "Light Source ~ Wriggle Night Ignite", 25, 40000,
|
||||
stage3_boss_a2, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},
|
||||
{{14, 15, 16, 17}, AT_Spellcard, "Bug Sign ~ Phosphaenus Hemipterus", 35, 40000,
|
||||
stage3_boss_a3, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 0, 1, 2, 3}, AT_ExtraSpell, "Firefly Sign ~ Moonlight Wraith", 60, 150000,
|
||||
stage3_boss_extra, stage3_boss_spellbg, BOSS_DEFAULT_GO_POS},
|
||||
|
||||
{{0}}
|
||||
};
|
||||
|
||||
Dialog *stage3_dialog(void) {
|
||||
Dialog *d = create_dialog(global.plr.cha == Marisa ? "dialog/marisa" : "dialog/youmu", "dialog/wriggle");
|
||||
|
||||
|
@ -513,9 +483,9 @@ Boss* stage3_create_midboss(void) {
|
|||
Boss *scuttle = create_boss("Scuttle", "scuttle", 0, VIEWPORT_W/2 - 200.0*I);
|
||||
boss_add_attack(scuttle, AT_Move, "Introduction", 2, 0, stage3_mid_intro, NULL);
|
||||
boss_add_attack(scuttle, AT_Normal, "Lethal Bite", 30, 25000, stage3_mid_a0, NULL);
|
||||
boss_add_attack_from_info(scuttle, stage3_spells+0, false);
|
||||
boss_add_attack_from_info(scuttle, &stage3_spells.mid.deadly_dance, false);
|
||||
if(global.diff > D_Normal)
|
||||
boss_add_attack_from_info(scuttle, stage3_spells+1, false);
|
||||
boss_add_attack_from_info(scuttle, &stage3_spells.mid.acid_rain, false);
|
||||
boss_add_attack(scuttle, AT_Move, "Runaway", 2, 1, stage3_mid_outro, NULL);
|
||||
scuttle->zoomcolor = rgb(0.4, 0.1, 0.4);
|
||||
|
||||
|
@ -953,12 +923,12 @@ 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_from_info(wriggle, stage3_spells+2, false);
|
||||
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_from_info(wriggle, stage3_spells+3, false);
|
||||
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_from_info(wriggle, stage3_spells+4, false);
|
||||
boss_set_extra_spell(wriggle, stage3_spells+5);
|
||||
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);
|
||||
|
||||
start_attack(wriggle, wriggle->attacks);
|
||||
return wriggle;
|
||||
|
|
|
@ -9,6 +9,17 @@
|
|||
#ifndef STAGE3_EVENTS_H
|
||||
#define STAGE3_EVENTS_H
|
||||
|
||||
#include "boss.h"
|
||||
|
||||
void stage3_mid_spellbg(Boss*, int t);
|
||||
void stage3_boss_spellbg(Boss*, int t);
|
||||
void stage3_mid_a1(Boss*, int t);
|
||||
void stage3_mid_a2(Boss*, int t);
|
||||
void stage3_boss_a1(Boss*, int t);
|
||||
void stage3_boss_a2(Boss*, int t);
|
||||
void stage3_boss_a3(Boss*, int t);
|
||||
void stage3_boss_extra(Boss*, int t);
|
||||
|
||||
void stage3_events(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -7,10 +7,41 @@
|
|||
*/
|
||||
|
||||
#include "stage4.h"
|
||||
#include "stage4_events.h"
|
||||
|
||||
#include "global.h"
|
||||
#include "stage.h"
|
||||
#include "stageutils.h"
|
||||
#include "stage4_events.h"
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
* To add, remove, or reorder spells, see this stage's header file.
|
||||
*/
|
||||
|
||||
struct stage4_spells_s stage4_spells = {
|
||||
.mid = {
|
||||
.gate_of_walachia = {{ 0, 1, 2, 3}, AT_Spellcard, "Bloodless ~ Gate of Walachia", 25, 40000,
|
||||
kurumi_slaveburst, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
.dry_fountain = {{ 4, 5, -1, -1}, AT_Spellcard, "Bloodless ~ Dry Fountain", 30, 40000,
|
||||
kurumi_redspike, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
.red_spike = {{-1, -1, 6, 7}, AT_Spellcard, "Bloodless ~ Red Spike", 30, 44000,
|
||||
kurumi_redspike, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
},
|
||||
|
||||
.boss = {
|
||||
.animate_wall = {{ 8, 9, -1, -1}, AT_Spellcard, "Limit ~ Animate Wall", 30, 45000,
|
||||
kurumi_aniwall, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
.demon_wall = {{-1, -1, 10, 11}, AT_Spellcard, "Summoning ~ Demon Wall", 30, 50000,
|
||||
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,
|
||||
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},
|
||||
},
|
||||
|
||||
.extra.vlads_army = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Blood Magic ~ Vlad’s Army", 60, 50000,
|
||||
kurumi_extra, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
};
|
||||
|
||||
static Stage3D bgcontext;
|
||||
|
||||
|
|
|
@ -11,8 +11,32 @@
|
|||
|
||||
#include "stage.h"
|
||||
|
||||
extern struct stage4_spells_s {
|
||||
// this struct must contain only fields of type AttackInfo
|
||||
// order of fields affects the visual spellstage number, but not its real internal ID
|
||||
|
||||
struct {
|
||||
AttackInfo gate_of_walachia;
|
||||
AttackInfo dry_fountain;
|
||||
AttackInfo red_spike;
|
||||
} mid;
|
||||
|
||||
struct {
|
||||
AttackInfo animate_wall;
|
||||
AttackInfo demon_wall;
|
||||
AttackInfo blow_the_walls;
|
||||
AttackInfo bloody_danmaku;
|
||||
} boss;
|
||||
|
||||
struct {
|
||||
AttackInfo vlads_army;
|
||||
} extra;
|
||||
|
||||
// required for iteration
|
||||
AttackInfo null;
|
||||
} stage4_spells;
|
||||
|
||||
extern StageProcs stage4_procs;
|
||||
extern StageProcs stage4_spell_procs;
|
||||
extern AttackInfo stage4_spells[];
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,31 +20,6 @@ void kurumi_blowwall(Boss*, int);
|
|||
void kurumi_danmaku(Boss*, int);
|
||||
void kurumi_extra(Boss*, int);
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
*/
|
||||
|
||||
AttackInfo stage4_spells[] = {
|
||||
{{ 0, 1, 2, 3}, AT_Spellcard, "Bloodless ~ Gate of Walachia", 25, 40000,
|
||||
kurumi_slaveburst, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 4, 5, -1, -1}, AT_Spellcard, "Bloodless ~ Dry Fountain", 30, 40000,
|
||||
kurumi_redspike, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{-1, -1, 6, 7}, AT_Spellcard, "Bloodless ~ Red Spike", 30, 44000,
|
||||
kurumi_redspike, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 8, 9, -1, -1}, AT_Spellcard, "Limit ~ Animate Wall", 30, 45000,
|
||||
kurumi_aniwall, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{-1, -1, 10, 11}, AT_Spellcard, "Summoning ~ Demon Wall", 30, 50000,
|
||||
kurumi_aniwall, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{12, 13, 14, 15}, AT_Spellcard, "Power Sign ~ Blow the Walls", 30, 52000,
|
||||
kurumi_blowwall, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{-1, -1, 16, 17}, AT_Spellcard, "Fear Sign ~ Bloody Danmaku", 30, 55000,
|
||||
kurumi_danmaku, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 0, 1, 2, 3}, AT_ExtraSpell, "Blood Magic ~ Vlad’s Army", 60, 50000,
|
||||
kurumi_extra, kurumi_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
|
||||
{{0}}
|
||||
};
|
||||
|
||||
Dialog *stage4_dialog(void) {
|
||||
Dialog *d = create_dialog(global.plr.cha == Marisa ? "dialog/marisa" : "dialog/youmu", "dialog/kurumi");
|
||||
|
||||
|
@ -401,11 +376,11 @@ void kurumi_outro(Boss *b, int time) {
|
|||
Boss *create_kurumi_mid(void) {
|
||||
Boss* b = create_boss("Kurumi", "kurumi", "dialog/kurumi", VIEWPORT_W/2-400.0*I);
|
||||
boss_add_attack(b, AT_Move, "Introduction", 4, 0, kurumi_intro, NULL);
|
||||
boss_add_attack_from_info(b, stage4_spells+0, false);
|
||||
boss_add_attack_from_info(b, &stage4_spells.mid.gate_of_walachia, false);
|
||||
if(global.diff < D_Hard) {
|
||||
boss_add_attack_from_info(b, stage4_spells+1, false);
|
||||
boss_add_attack_from_info(b, &stage4_spells.mid.dry_fountain, false);
|
||||
} else {
|
||||
boss_add_attack_from_info(b, stage4_spells+2, false);
|
||||
boss_add_attack_from_info(b, &stage4_spells.mid.red_spike, false);
|
||||
}
|
||||
boss_add_attack(b, AT_Move, "Outro", 2, 1, kurumi_outro, NULL);
|
||||
start_attack(b, b->attacks);
|
||||
|
@ -1084,17 +1059,17 @@ Boss *create_kurumi(void) {
|
|||
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);
|
||||
if(global.diff < D_Hard) {
|
||||
boss_add_attack_from_info(b, stage4_spells+3, false);
|
||||
boss_add_attack_from_info(b, &stage4_spells.boss.animate_wall, false);
|
||||
} else {
|
||||
boss_add_attack_from_info(b, stage4_spells+4, false);
|
||||
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_from_info(b, stage4_spells+5, false);
|
||||
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+6, false);
|
||||
boss_add_attack_from_info(b, &stage4_spells.boss.bloody_danmaku, false);
|
||||
}
|
||||
|
||||
boss_set_extra_spell(b, stage4_spells+7);
|
||||
boss_add_attack_from_info(b, &stage4_spells.extra.vlads_army, false);
|
||||
start_attack(b, b->attacks);
|
||||
|
||||
return b;
|
||||
|
|
|
@ -9,6 +9,16 @@
|
|||
#ifndef STAGE4_EVENTS_H
|
||||
#define STAGE4_EVENTS_H
|
||||
|
||||
#include "boss.h"
|
||||
|
||||
void kurumi_spell_bg(Boss*, int);
|
||||
void kurumi_slaveburst(Boss*, int);
|
||||
void kurumi_redspike(Boss*, int);
|
||||
void kurumi_aniwall(Boss*, int);
|
||||
void kurumi_blowwall(Boss*, int);
|
||||
void kurumi_danmaku(Boss*, int);
|
||||
void kurumi_extra(Boss*, int);
|
||||
|
||||
void stage4_events(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,9 +11,31 @@
|
|||
|
||||
#include "stage.h"
|
||||
#include "stageutils.h"
|
||||
|
||||
#include "global.h"
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
* To add, remove, or reorder spells, see this stage's header file.
|
||||
*/
|
||||
|
||||
struct stage5_spells_s stage5_spells = {
|
||||
.boss = {
|
||||
.atmospheric_discharge = {{ 0, 1, 2, 3}, AT_Spellcard, "High Voltage ~ Atmospheric Discharge", 30, 40000,
|
||||
iku_atmospheric, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
.artificial_lightning = {{ 4, 5, 6, 7}, AT_Spellcard, "Charge Sign ~ Artificial Lightning", 30, 42000,
|
||||
iku_lightning, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
.natural_cathode = {{ 8, 9, 10, 11}, AT_Spellcard, "Spark Sign ~ Natural Cathode", 30, 50000,
|
||||
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},
|
||||
.inductive_resonance = {{-1, -1, 14, 15}, AT_Spellcard, "Current Sign ~ Inductive Resonance", 30, 50000,
|
||||
iku_induction, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
},
|
||||
|
||||
.extra.overload = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Circuit Sign ~ Overload", 60, 40000,
|
||||
iku_extra, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
};
|
||||
|
||||
static Stage3D bgcontext;
|
||||
|
||||
struct {
|
||||
|
|
|
@ -11,8 +11,27 @@
|
|||
|
||||
#include "stage.h"
|
||||
|
||||
extern struct stage5_spells_s {
|
||||
// this struct must contain only fields of type AttackInfo
|
||||
// order of fields affects the visual spellstage number, but not its real internal ID
|
||||
|
||||
struct {
|
||||
AttackInfo atmospheric_discharge;
|
||||
AttackInfo artificial_lightning;
|
||||
AttackInfo natural_cathode;
|
||||
AttackInfo induction_field;
|
||||
AttackInfo inductive_resonance;
|
||||
} boss;
|
||||
|
||||
struct {
|
||||
AttackInfo overload;
|
||||
} extra;
|
||||
|
||||
// required for iteration
|
||||
AttackInfo null;
|
||||
} stage5_spells;
|
||||
|
||||
extern StageProcs stage5_procs;
|
||||
extern StageProcs stage5_spell_procs;
|
||||
extern AttackInfo stage5_spells[];
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,34 +11,6 @@
|
|||
#include <global.h>
|
||||
#include <float.h>
|
||||
|
||||
void iku_spell_bg(Boss*, int);
|
||||
void iku_atmospheric(Boss*, int);
|
||||
void iku_lightning(Boss*, int);
|
||||
void iku_cathode(Boss*, int);
|
||||
void iku_induction(Boss*, int);
|
||||
void iku_extra(Boss*, int);
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
*/
|
||||
|
||||
AttackInfo stage5_spells[] = {
|
||||
{{ 0, 1, 2, 3}, AT_Spellcard, "High Voltage ~ Atmospheric Discharge", 30, 40000,
|
||||
iku_atmospheric, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 4, 5, 6, 7}, AT_Spellcard, "Charge Sign ~ Artificial Lightning", 30, 42000,
|
||||
iku_lightning, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 8, 9, 10, 11}, AT_Spellcard, "Spark Sign ~ Natural Cathode", 30, 50000,
|
||||
iku_cathode, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{12, 13, -1, -1}, AT_Spellcard, "Current Sign ~ Induction Field", 30, 50000,
|
||||
iku_induction, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{-1, -1, 14, 15}, AT_Spellcard, "Current Sign ~ Inductive Resonance", 30, 50000,
|
||||
iku_induction, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
{{ 0, 1, 2, 3}, AT_ExtraSpell, "Circuit Sign ~ Overload", 60, 40000,
|
||||
iku_extra, iku_spell_bg, BOSS_DEFAULT_GO_POS},
|
||||
|
||||
{{0}}
|
||||
};
|
||||
|
||||
Dialog *stage5_post_mid_dialog(void) {
|
||||
Dialog *d = create_dialog(global.plr.cha == Marisa ? "dialog/marisa" : "dialog/youmu", NULL);
|
||||
|
||||
|
@ -790,13 +762,19 @@ Boss *create_iku(void) {
|
|||
|
||||
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_from_info(b, stage5_spells+0, false);
|
||||
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_from_info(b, stage5_spells+1, false);
|
||||
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_from_info(b, stage5_spells+2, false);
|
||||
boss_add_attack_from_info(b, stage5_spells+(3 + (global.diff > D_Normal)), false);
|
||||
boss_set_extra_spell(b, stage5_spells+5);
|
||||
boss_add_attack_from_info(b, &stage5_spells.boss.natural_cathode, false);
|
||||
|
||||
if(global.diff < D_Hard) {
|
||||
boss_add_attack_from_info(b, &stage5_spells.boss.induction_field, false);
|
||||
} else {
|
||||
boss_add_attack_from_info(b, &stage5_spells.boss.inductive_resonance, false);
|
||||
}
|
||||
|
||||
boss_add_attack_from_info(b, &stage5_spells.extra.overload, false);
|
||||
|
||||
return b;
|
||||
}
|
||||
|
|
|
@ -9,6 +9,15 @@
|
|||
#ifndef STAGE5_EVENTS_H
|
||||
#define STAGE5_EVENTS_H
|
||||
|
||||
#include "boss.h"
|
||||
|
||||
void iku_spell_bg(Boss*, int);
|
||||
void iku_atmospheric(Boss*, int);
|
||||
void iku_lightning(Boss*, int);
|
||||
void iku_cathode(Boss*, int);
|
||||
void iku_induction(Boss*, int);
|
||||
void iku_extra(Boss*, int);
|
||||
|
||||
void stage5_events(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -11,9 +11,43 @@
|
|||
|
||||
#include "stage.h"
|
||||
#include "stageutils.h"
|
||||
|
||||
#include "global.h"
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
* To add, remove, or reorder spells, see this stage's header file.
|
||||
*/
|
||||
|
||||
struct stage6_spells_s stage6_spells = {
|
||||
.scythe = {
|
||||
.occams_razor = {{ 0, 1, 2, 3}, AT_Spellcard, "Newton Sign ~ Occam’s razor", 60, 40000,
|
||||
elly_newton, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
|
||||
.orbital_clockwork = {{24, 25, 26, 27}, AT_Spellcard, "Kepler Sign ~ Orbital Clockwork", 60, 40000,
|
||||
elly_kepler, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
|
||||
.wave_theory = {{ 4, 5, 6, 7}, AT_Spellcard, "Maxwell Sign ~ Wave Theory", 25, 26000,
|
||||
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,
|
||||
elly_eigenstate, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
|
||||
.spacetime_curvature = {{12, 13, 14, 15}, AT_Spellcard, "Ricci Sign ~ Spacetime Curvature", 50, 100000,
|
||||
elly_ricci, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
|
||||
.higgs_boson_uncovered = {{16, 17, 18, 19}, AT_Spellcard, "LHC ~ Higgs Boson Uncovered", 60, 50000,
|
||||
elly_lhc, elly_spellbg_modern, BOSS_DEFAULT_GO_POS}
|
||||
},
|
||||
|
||||
.extra = {
|
||||
.curvature_domination = {{ 0, 1, 2, 3}, AT_ExtraSpell, "Forgotten Universe ~ Curvature Domination", 40, 40000,
|
||||
elly_curvature, elly_spellbg_modern, BOSS_DEFAULT_GO_POS}
|
||||
},
|
||||
|
||||
.final = {
|
||||
.theory_of_everything = {{20, 21, 22, 23}, AT_SurvivalSpell, "Tower of Truth ~ Theory of Everything", 70, 40000,
|
||||
elly_theory, elly_spellbg_modern, BOSS_DEFAULT_GO_POS}
|
||||
},
|
||||
};
|
||||
|
||||
static Stage3D bgcontext;
|
||||
static int fall_over;
|
||||
|
||||
|
@ -244,37 +278,18 @@ void stage6_spellpractice_events(void) {
|
|||
skip_background_anim(&bgcontext, stage6_draw, 3800, &global.timer, &global.frames);
|
||||
global.boss = create_boss("Elly", "elly", "dialog/elly", BOSS_DEFAULT_SPAWN_POS);
|
||||
|
||||
// Here be dragons
|
||||
|
||||
ptrdiff_t spellnum = global.stage->spell - stage6_spells;
|
||||
AttackInfo *s = global.stage->spell;
|
||||
char go = true;
|
||||
|
||||
switch(spellnum) {
|
||||
case 0: // Newton Sign ~ Occam’s Razor
|
||||
case 1: // Kepler Sign ~ Orbital Clockwork
|
||||
// Scythe required - this creates it
|
||||
boss_add_attack(global.boss, AT_Move, "Catch the Scythe", 2, 0, elly_intro, NULL);
|
||||
go = false;
|
||||
break;
|
||||
|
||||
case 2: // Maxwell Sign ~ Wave Theory
|
||||
// Works fine on its own
|
||||
break;
|
||||
|
||||
case 3: // Eigenstate ~ Many-World Interpretation
|
||||
case 4: // Ricci Sign ~ Space Time Curvature
|
||||
case 5: // LHC ~ Higgs Boson Uncovered
|
||||
// Baryon required - this creates it
|
||||
boss_add_attack(global.boss, AT_Move, "Unbound", 3, 0, elly_unbound, NULL);
|
||||
go = false;
|
||||
break;
|
||||
|
||||
case 6: // Tower of Truth ~ Theory of Everything
|
||||
// Works fine on its own
|
||||
// Just needs a little extra to make us fall from the tower
|
||||
start_fall_over();
|
||||
skip_background_anim(&bgcontext, stage6_draw, 300, &global.timer, &global.frames);
|
||||
break;
|
||||
if(STG6_SPELL_NEEDS_SCYTHE(s)) {
|
||||
boss_add_attack(global.boss, AT_Move, "Catch the Scythe", 2, 0, elly_intro, NULL);
|
||||
go = false;
|
||||
} else if(STG6_SPELL_NEEDS_BARYON(s)) {
|
||||
boss_add_attack(global.boss, AT_Move, "Unbound", 3, 0, elly_unbound, NULL);
|
||||
go = false;
|
||||
} else if(s == &stage6_spells.final.theory_of_everything) {
|
||||
start_fall_over();
|
||||
skip_background_anim(&bgcontext, stage6_draw, 300, &global.timer, &global.frames);
|
||||
}
|
||||
|
||||
boss_add_attack_from_info(global.boss, global.stage->spell, go);
|
||||
|
|
|
@ -11,9 +11,46 @@
|
|||
|
||||
#include "stage.h"
|
||||
|
||||
extern struct stage6_spells_s {
|
||||
// this struct must contain only fields of type AttackInfo
|
||||
// order of fields affects the visual spellstage number, but not its real internal ID
|
||||
|
||||
union {
|
||||
AttackInfo scythe_first;
|
||||
struct {
|
||||
AttackInfo occams_razor;
|
||||
AttackInfo orbital_clockwork;
|
||||
AttackInfo wave_theory;
|
||||
} scythe;
|
||||
};
|
||||
|
||||
union {
|
||||
AttackInfo baryon_first;
|
||||
struct {
|
||||
AttackInfo many_world_interpretation;
|
||||
AttackInfo spacetime_curvature;
|
||||
AttackInfo higgs_boson_uncovered;
|
||||
} baryon;
|
||||
};
|
||||
|
||||
struct {
|
||||
AttackInfo curvature_domination;
|
||||
} extra;
|
||||
|
||||
struct {
|
||||
AttackInfo theory_of_everything;
|
||||
} final;
|
||||
|
||||
// required for iteration
|
||||
AttackInfo null;
|
||||
} stage6_spells;
|
||||
|
||||
// this hackery is needed for spell practice
|
||||
#define STG6_SPELL_NEEDS_SCYTHE(s) ((s) >= &stage6_spells.scythe_first && ((s) - &stage6_spells.scythe_first) < sizeof(stage6_spells.scythe)/sizeof(AttackInfo))
|
||||
#define STG6_SPELL_NEEDS_BARYON(s) ((s) >= &stage6_spells.baryon_first && ((s) - &stage6_spells.baryon_first) < sizeof(stage6_spells.baryon)/sizeof(AttackInfo))
|
||||
|
||||
extern StageProcs stage6_procs;
|
||||
extern StageProcs stage6_spell_procs;
|
||||
extern AttackInfo stage6_spells[];
|
||||
|
||||
void start_fall_over(void);
|
||||
|
||||
|
|
|
@ -10,42 +10,6 @@
|
|||
#include "stage6.h"
|
||||
#include <global.h>
|
||||
|
||||
void elly_spellbg_classic(Boss*, int);
|
||||
void elly_spellbg_modern(Boss*, int);
|
||||
void elly_kepler(Boss*, int);
|
||||
void elly_newton(Boss*, int);
|
||||
void elly_maxwell(Boss*, int);
|
||||
void elly_eigenstate(Boss*, int);
|
||||
void elly_ricci(Boss*, int);
|
||||
void elly_lhc(Boss*, int);
|
||||
void elly_theory(Boss*, int);
|
||||
void elly_curvature(Boss*, int);
|
||||
|
||||
/*
|
||||
* See the definition of AttackInfo in boss.h for information on how to set up the idmaps.
|
||||
*/
|
||||
|
||||
AttackInfo stage6_spells[] = {
|
||||
{{ 0, 1, 2, 3}, AT_Spellcard, "Newton Sign ~ Occam’s razor", 60, 40000,
|
||||
elly_newton, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
|
||||
{{24, 25, 26, 27}, AT_Spellcard, "Kepler Sign ~ Orbital Clockwork", 60, 40000,
|
||||
elly_kepler, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
|
||||
{{ 4, 5, 6, 7}, AT_Spellcard, "Maxwell Sign ~ Wave Theory", 25, 26000,
|
||||
elly_maxwell, elly_spellbg_classic, BOSS_DEFAULT_GO_POS},
|
||||
{{ 8, 9, 10, 11}, AT_Spellcard, "Eigenstate ~ Many-World Interpretation", 60, 30000,
|
||||
elly_eigenstate, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
|
||||
{{12, 13, 14, 15}, AT_Spellcard, "Ricci Sign ~ Spacetime Curvature", 50, 100000,
|
||||
elly_ricci, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
|
||||
{{16, 17, 18, 19}, AT_Spellcard, "LHC ~ Higgs Boson Uncovered", 60, 50000,
|
||||
elly_lhc, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
|
||||
{{20, 21, 22, 23}, AT_SurvivalSpell, "Tower of Truth ~ Theory of Everything", 70, 40000,
|
||||
elly_theory, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
|
||||
{{0, 1, 2, 3}, AT_ExtraSpell, "Forgotten Universe ~ Curvature Domination", 40, 40000,
|
||||
elly_curvature, elly_spellbg_modern, BOSS_DEFAULT_GO_POS},
|
||||
|
||||
{{0}}
|
||||
};
|
||||
|
||||
Dialog *stage6_dialog(void) {
|
||||
Dialog *d = create_dialog(global.plr.cha == Marisa ? "dialog/marisa" : "dialog/youmu", "dialog/elly");
|
||||
|
||||
|
@ -1319,19 +1283,19 @@ Boss *create_elly(void) {
|
|||
|
||||
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_from_info(b, stage6_spells+0, false);
|
||||
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_from_info(b, stage6_spells+1, false);
|
||||
boss_add_attack_from_info(b, stage6_spells+2, false);
|
||||
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+3, false);
|
||||
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_from_info(b, stage6_spells+4, false);
|
||||
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_from_info(b, stage6_spells+5, false);
|
||||
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+6, false);
|
||||
boss_set_extra_spell(b, stage6_spells+7);
|
||||
boss_add_attack_from_info(b, &stage6_spells.extra.curvature_domination, false);
|
||||
boss_add_attack_from_info(b, &stage6_spells.final.theory_of_everything, false);
|
||||
start_attack(b, b->attacks);
|
||||
|
||||
return b;
|
||||
|
|
|
@ -9,6 +9,19 @@
|
|||
#ifndef STAGE6_EVENTS_H
|
||||
#define STAGE6_EVENTS_H
|
||||
|
||||
#include "boss.h"
|
||||
|
||||
void elly_spellbg_classic(Boss*, int);
|
||||
void elly_spellbg_modern(Boss*, int);
|
||||
void elly_kepler(Boss*, int);
|
||||
void elly_newton(Boss*, int);
|
||||
void elly_maxwell(Boss*, int);
|
||||
void elly_eigenstate(Boss*, int);
|
||||
void elly_ricci(Boss*, int);
|
||||
void elly_lhc(Boss*, int);
|
||||
void elly_theory(Boss*, int);
|
||||
void elly_curvature(Boss*, int);
|
||||
|
||||
void stage6_events(void);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue