redesigned spawn_items for extensibility and clarity

so that we don't have to change it every time we add a new item or
remember the order of arguments.
This commit is contained in:
Andrei "Akari" Alexeyev 2017-03-24 22:07:19 +02:00
parent 748043c8ca
commit 02afd3117c
8 changed files with 60 additions and 56 deletions

View file

@ -158,19 +158,23 @@ void spawn_item(complex pos, ItemType type) {
create_item(pos, 5*cexp(I*tsrand_a(0)/afrand(1)*M_PI*2), type);
}
void spawn_items(complex pos, int point, int power, int bomb, int life) {
int i;
for(i = 0; i < point; i++)
spawn_item(pos, Point);
void spawn_items(complex pos, ItemType first_type, int first_num, ...) {
for(int i = 0; i < first_num; ++i) {
spawn_item(pos, first_type);
}
for(i = 0; i < power; i++)
spawn_item(pos, Power);
va_list args;
va_start(args, first_num);
for(i = 0; i < bomb; i++)
spawn_item(pos, Bomb);
ItemType type;
while(type = va_arg(args, ItemType)) {
int num = va_arg(args, int);
for(int i = 0; i < num; ++i) {
spawn_item(pos, type);
}
}
for(i = 0; i < life; i++)
spawn_item(pos, Life);
va_end(args);
}
void items_preload(void) {

View file

@ -48,7 +48,7 @@ int collision_item(Item *p);
void process_items(void);
void spawn_item(complex pos, ItemType type);
void spawn_items(complex pos, int point, int power, int bomb, int life);
void spawn_items(complex pos, ItemType first_type, int first_num, ...) __attribute__((sentinel));
void items_preload(void);

View file

@ -301,7 +301,7 @@ Boss *create_cirno(void) {
int stage1_burst(Enemy *e, int time) {
TIMER(&time);
AT(EVENT_DEATH) {
spawn_items(e->pos, 3,0,0,0);
spawn_items(e->pos, Point, 3, NULL);
return 1;
}
@ -332,7 +332,7 @@ int stage1_burst(Enemy *e, int time) {
int stage1_circletoss(Enemy *e, int time) {
TIMER(&time);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,2,0,0);
spawn_items(e->pos, Point, 2, Power, 2, NULL);
return 1;
}
@ -361,7 +361,7 @@ int stage1_sinepass(Enemy *e, int time) {
TIMER(&time);
AT(EVENT_DEATH) {
tsrand_fill(2);
spawn_items(e->pos, afrand(0)>0.5, afrand(1)>0.2,0,0);
spawn_items(e->pos, Point, afrand(0)>0.5, Power, afrand(1)>0.2, NULL);
return 1;
}
@ -377,7 +377,7 @@ int stage1_sinepass(Enemy *e, int time) {
int stage1_drop(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,1,0,0);
spawn_items(e->pos, Point, 2, Power, 1, NULL);
return 1;
}
if(t < 0)
@ -395,7 +395,7 @@ int stage1_drop(Enemy *e, int t) {
int stage1_circle(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 3,4,0,0);
spawn_items(e->pos, Point, 3, Power, 4, NULL);
return 1;
}
@ -414,7 +414,7 @@ int stage1_circle(Enemy *e, int t) {
int stage1_multiburst(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 3,4,0,0);
spawn_items(e->pos, Point, 3, Power, 4, NULL);
return 1;
}
@ -439,7 +439,7 @@ int stage1_multiburst(Enemy *e, int t) {
int stage1_instantcircle(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,4,0,0);
spawn_items(e->pos, Point, 2, Power, 4, NULL);
return 1;
}
@ -468,7 +468,7 @@ int stage1_instantcircle(Enemy *e, int t) {
int stage1_tritoss(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 5,5,0,0);
spawn_items(e->pos, Point, 5, Power, 5, NULL);
return 1;
}

View file

@ -65,7 +65,7 @@ Dialog *stage2_post_dialog(void) {
int stage2_great_circle(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 5,4,0,0);
spawn_items(e->pos, Point, 5, Power, 4, NULL);
return 1;
}
@ -107,7 +107,7 @@ int spin_circle(Projectile *p, int t) { // a[0]: angular velocity, a[1]: center,
int stage2_small_spin_circle(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,0,0,0);
spawn_items(e->pos, Point, 2, NULL);
return 1;
}
@ -133,7 +133,7 @@ int stage2_small_spin_circle(Enemy *e, int t) {
int stage2_aim(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 0,2,0,0);
spawn_items(e->pos, Power, 2, NULL);
return 1;
}
@ -155,7 +155,7 @@ int stage2_aim(Enemy *e, int t) {
int stage2_sidebox_trail(Enemy *e, int t) { // creal(a[0]): velocity, cimag(a[0]): angle, a[1]: d angle/dt, a[2]: time of acceleration
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 1,1,0,0);
spawn_items(e->pos, Point, 1, Power, 1, NULL);
return 1;
}
@ -179,7 +179,7 @@ int stage2_sidebox_trail(Enemy *e, int t) { // creal(a[0]): velocity, cimag(a[0]
int stage2_flea(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,0,0,0);
spawn_items(e->pos, Point, 2, NULL);
return 1;
}
@ -202,7 +202,7 @@ int stage2_flea(Enemy *e, int t) {
int stage2_accel_circle(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 1,3,0,0);
spawn_items(e->pos, Point, 1, Power, 3, NULL);
return 1;
}

View file

@ -53,7 +53,7 @@ int stage3_enterswirl(Enemy *e, int t) {
TIMER(&t)
AT(EVENT_DEATH) {
spawn_items(e->pos, 1, 1, 0, 0);
spawn_items(e->pos, Point, 1, Power, 1, NULL);
float r, g;
if(frand() > 0.5) {
@ -94,7 +94,7 @@ int stage3_slavefairy(Enemy *e, int t) {
TIMER(&t)
AT(EVENT_DEATH) {
spawn_items(e->pos, 1, 3, 0, 0);
spawn_items(e->pos, Point, 1, Power, 3, NULL);
return 1;
}
@ -132,9 +132,9 @@ int stage3_bigfairy(Enemy *e, int t) {
TIMER(&t)
AT(EVENT_DEATH) {
spawn_items(e->pos, 5, 5, 0, 0);
spawn_items(e->pos, Point, 5, Power, 5, NULL);
if(e->args[0] && global.timer > 2800)
spawn_items(e->pos, 0, 0, 1, 0);
spawn_items(e->pos, Bomb, 1, NULL);
return 1;
}
@ -168,7 +168,7 @@ int stage3_bitchswirl(Enemy *e, int t) {
}
AT(EVENT_DEATH) {
spawn_items(e->pos, 1, 1, 0, 0);
spawn_items(e->pos, Point, 1, Power, 1, NULL);
return -1;
}
@ -188,7 +188,7 @@ int stage3_cornerfairy(Enemy *e, int t) {
TIMER(&t)
AT(EVENT_DEATH) {
spawn_items(e->pos, 5, 5, 0, 0);
spawn_items(e->pos, Point, 5, Power, 5, NULL);
return -1;
}
@ -239,7 +239,7 @@ void stage3_mid_intro(Boss *boss, int time) {
void stage3_mid_outro(Boss *boss, int time) {
if(time == 0) {
spawn_items(boss->pos, 10, 10, 0, 1);
spawn_items(boss->pos, Point, 10, Power, 10, Life, 1, NULL);
Projectile *p;
for(p = global.projs; p; p = p->next)
p->type = DeadProj;
@ -411,13 +411,13 @@ void stage3_mid_spellbg(Boss *h, int time) {
glColor4f(.1, .1, .1, a);
draw_texture(VIEWPORT_W/2, VIEWPORT_H/2, "stage3/spellbg2");
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
fill_screen(-time/200.0 + 0.5, time/400.0+0.5, s, "stage3/spellbg1");
glColor4f(1, 1, 1, 0.1);
fill_screen(time/300.0 + 0.5, -time/340.0+0.5, s*0.5, "stage3/spellbg1");
fill_screen(time/220.0 + 0.5, -time/400.0+0.5, s*0.5, "stage3/spellbg1");
glColor4f(1, 1, 1, 1);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@ -523,7 +523,7 @@ int stage3_boss_a1_slave(Enemy *e, int time) {
AT(EVENT_DEATH) {
free_ref(e->args[0]);
spawn_items(e->pos, 1, 1, 0, 0);
spawn_items(e->pos, Point, 1, Power, 1, NULL);
return 1;
}
@ -717,7 +717,7 @@ int stage3_boss_prea1_slave(Enemy *e, int time) {
AT(EVENT_DEATH) {
free_ref(e->args[0]);
spawn_items(e->pos, 1, 1, 0, 0);
spawn_items(e->pos, Point, 1, Power, 1, NULL);
return 1;
}

View file

@ -78,7 +78,7 @@ Dialog *stage4_dialog_end(void) {
int stage4_splasher(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 1,3,1,0);
spawn_items(e->pos, Point, 1, Power, 3, Bomb, 1, NULL);
return 1;
}
@ -102,7 +102,7 @@ int stage4_splasher(Enemy *e, int t) {
int stage4_fodder(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 0,1,0,0);
spawn_items(e->pos, Power, 1, NULL);
return 1;
}
@ -124,7 +124,7 @@ int stage4_fodder(Enemy *e, int t) {
int stage4_partcircle(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,1,0,0);
spawn_items(e->pos, Point, 2, Power, 1, NULL);
return 1;
}
@ -151,7 +151,7 @@ int stage4_partcircle(Enemy *e, int t) {
int stage4_cardbuster(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 1,2,0,0);
spawn_items(e->pos, Point, 1, Power, 2, NULL);
return 1;
}
@ -178,7 +178,7 @@ int stage4_cardbuster(Enemy *e, int t) {
int stage4_backfire(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 3,2,0,0);
spawn_items(e->pos, Point, 3, Power, 2, NULL);
return 1;
}
@ -207,7 +207,7 @@ int stage4_backfire(Enemy *e, int t) {
int stage4_bigcircle(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 1,3,0,0);
spawn_items(e->pos, Point, 1, Power, 3, NULL);
return 1;
}
@ -232,7 +232,7 @@ int stage4_explosive(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
int i;
spawn_items(e->pos, 0,1,0,0);
spawn_items(e->pos, Power, 1, NULL);
int n = 5*global.diff;
for(i = 0; i < n; i++) {
@ -418,7 +418,7 @@ int stage4_supercard(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,3,0,0);
spawn_items(e->pos, Point, 2, Power, 3, NULL);
return 1;
}

View file

@ -67,7 +67,7 @@ Dialog *stage5_post_boss_dialog(void) {
int stage5_greeter(Enemy *e, int t) {
TIMER(&t)
AT(EVENT_DEATH) {
spawn_items(e->pos, 2,2,0,0);
spawn_items(e->pos, Point, 2, Power, 2, NULL);
return 1;
}
@ -91,7 +91,7 @@ int stage5_greeter(Enemy *e, int t) {
int stage5_lightburst(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 4, 1, 0, 0);
spawn_items(e->pos, Point, 4, Power, 1, NULL);
return 1;
}
@ -113,7 +113,7 @@ int stage5_lightburst(Enemy *e, int t) {
int stage5_swirl(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 1, 0, 0, 0);
spawn_items(e->pos, Point, 1, NULL);
return 1;
}
@ -133,7 +133,7 @@ int stage5_swirl(Enemy *e, int t) {
int stage5_limiter(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 4, 2, 0, 0);
spawn_items(e->pos, Point, 4, Power, 2, NULL);
return 1;
}
@ -151,7 +151,7 @@ int stage5_limiter(Enemy *e, int t) {
int stage5_laserfairy(Enemy *e, int t) {
TIMER(&t)
AT(EVENT_DEATH) {
spawn_items(e->pos, 5, 5, 0, 0);
spawn_items(e->pos, Point, 5, Power, 5, NULL);
return 1;
}
@ -173,7 +173,7 @@ int stage5_laserfairy(Enemy *e, int t) {
int stage5_miner(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 2, 0, 0, 0);
spawn_items(e->pos, Point, 2, NULL);
return 1;
}
@ -190,7 +190,7 @@ int stage5_miner(Enemy *e, int t) {
int stage5_explosion(Enemy *e, int t) {
TIMER(&t)
AT(EVENT_DEATH) {
spawn_items(e->pos, 5, 5, 0, creal(e->args[1]));
spawn_items(e->pos, Point, 5, Power, 5, Life, creal(e->args[1]), NULL);
return 1;
}
@ -236,7 +236,7 @@ Boss *create_iku_mid(void) {
int stage5_lightburst2(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 4, 3, 0, 0);
spawn_items(e->pos, Point, 4, Power, 3, NULL);
return 1;
}
@ -259,7 +259,7 @@ int stage5_lightburst2(Enemy *e, int t) {
int stage5_superbullet(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 4, 3, 0, 0);
spawn_items(e->pos, Point, 4, Power, 3, NULL);
return 1;
}

View file

@ -69,7 +69,7 @@ Dialog *stage6_dialog(void) {
int stage6_hacker(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 3, 4, 0, 0);
spawn_items(e->pos, Point, 4, Power, 3, NULL);
return 1;
}
@ -92,7 +92,7 @@ int stage6_hacker(Enemy *e, int t) {
int stage6_side(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 3, 4, 0, 0);
spawn_items(e->pos, Point, 4, Power, 3, NULL);
return 1;
}
@ -122,7 +122,7 @@ int wait_proj(Projectile *p, int t) {
int stage6_flowermine(Enemy *e, int t) {
TIMER(&t);
AT(EVENT_DEATH) {
spawn_items(e->pos, 4, 3, 0, 0);
spawn_items(e->pos, Point, 4, Power, 3, NULL);
return 1;
}