glPopMatrix();
}
-static void game_draw_coins(const struct s_file *fp)
+static void game_draw_items(const struct s_file *fp)
{
float r = 360.f * SDL_GetTicks() / 1000.f;
- int ci;
+ int hi;
- coin_push();
+ /* FIXME: Draw items of different types in one pass. */
+
+ item_push();
+ item_push_text(ITEM_COIN);
{
- for (ci = 0; ci < fp->cc; ci++)
+ for (hi = 0; hi < fp->hc; hi++)
- if (fp->cv[ci].n > 0)
+ if (fp->hv[hi].t == ITEM_COIN && fp->hv[hi].n > 0)
{
glPushMatrix();
{
- glTranslatef(fp->cv[ci].p[0],
- fp->cv[ci].p[1],
- fp->cv[ci].p[2]);
+ glTranslatef(fp->hv[hi].p[0],
+ fp->hv[hi].p[1],
+ fp->hv[hi].p[2]);
glRotatef(r, 0.0f, 1.0f, 0.0f);
- coin_draw(fp->cv[ci].n, r);
+ item_draw(&fp->hv[hi], r);
}
glPopMatrix();
}
}
- coin_pull();
-
-}
-
-static void game_draw_items(const struct s_file *fp)
-{
- float r = 360.f * SDL_GetTicks() / 1000.f;
- int hi;
+ item_pull();
item_push();
item_push_text(ITEM_SHRINK);
fp->hv[hi].p[1],
fp->hv[hi].p[2]);
glRotatef(r, 0.0f, 1.0f, 0.0f);
- item_draw(fp->hv[hi].t, r);
+ item_draw(&fp->hv[hi], r);
}
glPopMatrix();
}
}
item_pull();
- /* FIXME: there has got to be a better way than two seperate loops,
- * once for each texture, but someone else is going to have to do
- * it! */
-
item_push();
item_push_text(ITEM_GROW);
{
fp->hv[hi].p[1],
fp->hv[hi].p[2]);
glRotatef(r, 0.0f, 1.0f, 0.0f);
- item_draw(fp->hv[hi].t, r);
+ item_draw(&fp->hv[hi], r);
}
glPopMatrix();
}
if (pose == 0)
{
part_draw_coin(-rx * d, -ry);
- game_draw_coins(&file);
game_draw_items(&file);
if (drawball)
game_draw_balls(&file);
static int game_update_state(int *state_value)
{
struct s_file *fp = &file;
+ struct s_goal *zp;
+ struct s_item *hp;
+
float p[3];
float c[3];
- int bt = state_value != NULL;
- int n, t;
- struct s_goal *g;
- /* Test for a coin grab. */
+ int bt = state_value != NULL;
- if (bt && (n = sol_coin_test(fp, p, COIN_RADIUS)) > 0)
+ /* Test for an item. */
+ if (bt && (hp = sol_item_test(fp, p, COIN_RADIUS)))
{
- coin_color(c, n);
+ int sound = AUD_COIN;
+
+ item_color(hp, c);
part_burst(p, c);
- coins += n;
+ grow_set(fp, hp->t);
- /* Check for goal open. */
- if (goal_c > 0)
+ if (hp->t == ITEM_COIN)
{
- goal_c = goal_c - n;
- if (goal_c <= 0)
+ coins += hp->n;
+
+ /* Check for goal open. */
+ if (goal_c > 0)
{
- audio_play(AUD_SWITCH, 1.f);
- goal_c = 0;
+ goal_c -= hp->n;
+ if (goal_c <= 0)
+ {
+ sound = AUD_SWITCH;
+ goal_c = 0;
+ }
}
- else
- audio_play(AUD_COIN, 1.f);
}
- else
- audio_play(AUD_COIN, 1.f);
- }
-
- /* Test for an item. */
- if (bt && (t = sol_item_test(fp, p, COIN_RADIUS)) != ITEM_NONE)
- {
- item_color(c, t);
- part_burst(p, c);
-
- grow_set(fp, t);
+ audio_play(sound, 1.f);
- audio_play(AUD_COIN, 1.f);
+ /* Reset item type. */
+ hp->t = ITEM_NONE;
}
/* Test for a switch. */
/* Test for a goal. */
- if (bt && goal_c == 0 && (g = sol_goal_test(fp, p, 0)))
+ if (bt && goal_c == 0 && (zp = sol_goal_test(fp, p, 0)))
{
- *state_value = g->s;
+ *state_value = zp->s;
audio_play(AUD_GOAL, 1.0f);
- return g->c ? GAME_SPEC : GAME_GOAL;
+ return zp->c ? GAME_SPEC : GAME_GOAL;
}
/* Test for time-out. */