add infos in Modes and Secrets tabs
[neverball] / ball / game.c
index 94105a4..be79fa0 100644 (file)
@@ -286,36 +286,32 @@ static void game_draw_balls(const struct s_file *fp)
     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);
@@ -330,17 +326,13 @@ static void game_draw_items(const struct s_file *fp)
                                  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);
     {
@@ -354,7 +346,7 @@ static void game_draw_items(const struct s_file *fp)
                                  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();
             }
@@ -553,7 +545,6 @@ static void game_draw_fore(int pose, float rx, float ry, int d, const float p[3]
             if (pose == 0)
             {
                 part_draw_coin(-rx * d, -ry);
-                game_draw_coins(&file);
                 game_draw_items(&file);
                 if (drawball)
                     game_draw_balls(&file);
@@ -770,46 +761,43 @@ static void game_update_time(float dt, int b)
 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. */
@@ -831,11 +819,11 @@ static int game_update_state(int *state_value)
 
     /* 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. */