X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=ball%2Fgame.c;h=be79fa00a4ed96f2601b24e3420a3ebdb9bac376;hb=afcca7618054cd6c5e900cb32f71466c45edb0cd;hp=af057038c7aa9972da45e826373a2f212a249692;hpb=60e433395bcfb0a3d411dcf7ac86cf1b56358d8a;p=neverball diff --git a/ball/game.c b/ball/game.c index af05703..be79fa0 100644 --- a/ball/game.c +++ b/ball/game.c @@ -81,7 +81,7 @@ static int got_orig = 0; /* Do we know original ball size? */ /*---------------------------------------------------------------------------*/ -static void grow_set(const struct s_file *fp, int size) +static void grow_set(const struct s_file *fp, int type) { if (!got_orig) { @@ -91,7 +91,7 @@ static void grow_set(const struct s_file *fp, int size) got_orig = 1; } - if (size == 50) + if (type == ITEM_SHRINK) { if (grow_goal == grow_orig * GROW_SMALL) return; @@ -106,7 +106,7 @@ static void grow_set(const struct s_file *fp, int size) grow = 1; } } - if (size == 150) + if (type == ITEM_GROW) { if (grow_goal == grow_orig * GROW_BIG) return; @@ -152,12 +152,7 @@ static void grow_ball(const struct s_file *fp, float dt) static void view_init(void) { - /* Get the initial orientation angle */ - if (file.uc > 0) - view_a = file.uv->a - 90.f; /* angle is in the sol */ - else - view_a = 0.f; /* default is north :) */ - + view_a = 0.f; view_ry = 0.f; view_fov = (float) config_get_d(CONFIG_VIEW_FOV); @@ -194,7 +189,8 @@ int game_init(const struct level *level, int t, int g) if (game_state) game_free(); - if (!sol_load_gl(&file, level->file, config_get_d(CONFIG_TEXTURES), + if (!sol_load_gl(&file, config_data(level->file), + config_get_d(CONFIG_TEXTURES), config_get_d(CONFIG_SHADOW))) return (game_state = 0); @@ -290,73 +286,72 @@ 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; + + /* FIXME: Draw items of different types in one pass. */ - coin_push(); - coin_push_text(0); /* Regular coins. */ + 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 && fp->cv[ci].n < 50) + 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(); + item_pull(); - /* FIXME: there has got to be a better way than three seperate loops, once - * for each texture, but someone else is going to have to do it! */ - - coin_push(); - coin_push_text(50); /* Any shrink coins? */ + item_push(); + item_push_text(ITEM_SHRINK); { - for (ci = 0; ci < fp->cc; ci++) + for (hi = 0; hi < fp->hc; hi++) - if (fp->cv[ci].n == 50) + if (fp->hv[hi].t == ITEM_SHRINK) { 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(); + item_pull(); - coin_push(); - coin_push_text(150); /* Any grow coins? */ + item_push(); + item_push_text(ITEM_GROW); { - for (ci = 0; ci < fp->cc; ci++) + for (hi = 0; hi < fp->hc; hi++) - if (fp->cv[ci].n == 150) + if (fp->hv[hi].t == ITEM_GROW) { 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(); + item_pull(); } static void game_draw_goals(const struct s_file *fp, float rx, float ry) @@ -550,7 +545,7 @@ 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); } @@ -766,43 +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; - 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); - /* Add coins if regular, change radius if not. */ + grow_set(fp, hp->t); - if (n <= 10) - coins += n; - else + if (hp->t == ITEM_COIN) { - grow_set(fp, n); - n = 0; - } + coins += hp->n; - /* Check for goal open. */ - if (goal_c > 0) - { - goal_c = goal_c - n; - if (goal_c <= 0) + /* 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); + audio_play(sound, 1.f); + + /* Reset item type. */ + hp->t = ITEM_NONE; } /* Test for a switch. */ @@ -824,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. */