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:
parent
748043c8ca
commit
02afd3117c
8 changed files with 60 additions and 56 deletions
24
src/item.c
24
src/item.c
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue