X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=ball%2Fgame.c;h=be79fa00a4ed96f2601b24e3420a3ebdb9bac376;hb=afcca7618054cd6c5e900cb32f71466c45edb0cd;hp=94105a417f03c22427c54ad5909028efb0298249;hpb=d650099f89646bb82c748276f3ddf2f1f60a35d9;p=neverball diff --git a/ball/game.c b/ball/game.c index 94105a4..be79fa0 100644 --- a/ball/game.c +++ b/ball/game.c @@ -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. */