X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=ball%2Fgame.c;h=be79fa00a4ed96f2601b24e3420a3ebdb9bac376;hb=afcca7618054cd6c5e900cb32f71466c45edb0cd;hp=20267f20810bdcdd036c34b556ac244f00685abd;hpb=0a4a471cbdc821a74009987c67c274ea4b48e84f;p=neverball diff --git a/ball/game.c b/ball/game.c index 20267f2..be79fa0 100644 --- a/ball/game.c +++ b/ball/game.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2003 Robert Kooima * * NEVERBALL is free software; you can redistribute it and/or modify @@ -68,16 +68,91 @@ static float fade_d = 0.0; /* Fade in/out direction */ static int drawball = 1; /* Should the ball be drawn? */ static int ball_b = 0; /* Is the ball a bonus ball? */ +static int grow = 0; /* Should the ball be changing size? */ +static float grow_orig = 0; /* the original ball size */ +static float grow_goal = 0; /* how big or small to get! */ +static float grow_t = 0.0; /* timer for the ball to grow... */ +static float grow_strt = 0; /* starting value for growth */ +static int got_orig = 0; /* Do we know original ball size? */ + +#define GROW_TIME 0.5f /* sec for the ball to get to size. */ +#define GROW_BIG 1.5f /* large factor */ +#define GROW_SMALL 0.5f /* small factor */ + /*---------------------------------------------------------------------------*/ -static void view_init(void) +static void grow_set(const struct s_file *fp, int type) +{ + if (!got_orig) + { + grow_orig = fp->uv->r; + grow_goal = grow_orig; + grow_strt = grow_orig; + got_orig = 1; + } + + if (type == ITEM_SHRINK) + { + if (grow_goal == grow_orig * GROW_SMALL) + return; + else if (grow_goal == grow_orig * GROW_BIG) + { + grow = 1; + grow_goal = grow_orig; + } + else + { + grow_goal = grow_orig * GROW_SMALL; + grow = 1; + } + } + if (type == ITEM_GROW) + { + if (grow_goal == grow_orig * GROW_BIG) + return; + else if (grow_goal == grow_orig * GROW_SMALL) + { + grow = 1; + grow_goal = grow_orig; + } + else + { + grow_goal = grow_orig * GROW_BIG; + grow = 1; + } + } + + if (grow) + { + grow_t = 0.0; + grow_strt = fp->uv->r; + } +} + +static void grow_ball(const struct s_file *fp, float dt) { - /* 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 :) */ + float dr; + + /* Calculate new size based on how long since you touched the coin... */ + grow_t += dt; + + if (grow_t >= GROW_TIME) + { + grow = 0; + grow_t = GROW_TIME; + } + + dr = grow_strt + ((grow_goal-grow_strt) * (1.0f / (GROW_TIME / grow_t))); + + /* No sinking through the floor! Keeps ball's bottom constant. */ + fp->uv->p[1] += (dr - fp->uv->r); + fp->uv->r = dr; +} + +static void view_init(void) +{ + view_a = 0.f; view_ry = 0.f; view_fov = (float) config_get_d(CONFIG_VIEW_FOV); @@ -114,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); @@ -149,6 +225,10 @@ int game_init(const struct level *level, int t, int g) sol_load_gl(&back, config_data(level->back), config_get_d(CONFIG_TEXTURES), 0); + /* Initialize ball size tracking... */ + + got_orig = 0; + return game_state; } @@ -206,28 +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; - coin_push(); + /* FIXME: Draw items of different types in one pass. */ + + item_push(); + item_push_text(ITEM_COIN); + { + for (hi = 0; hi < fp->hc; hi++) + + if (fp->hv[hi].t == ITEM_COIN && fp->hv[hi].n > 0) + { + glPushMatrix(); + { + glTranslatef(fp->hv[hi].p[0], + fp->hv[hi].p[1], + fp->hv[hi].p[2]); + glRotatef(r, 0.0f, 1.0f, 0.0f); + item_draw(&fp->hv[hi], r); + } + glPopMatrix(); + } + } + item_pull(); + + item_push(); + item_push_text(ITEM_SHRINK); + { + for (hi = 0; hi < fp->hc; hi++) + + if (fp->hv[hi].t == ITEM_SHRINK) + { + glPushMatrix(); + { + glTranslatef(fp->hv[hi].p[0], + fp->hv[hi].p[1], + fp->hv[hi].p[2]); + glRotatef(r, 0.0f, 1.0f, 0.0f); + item_draw(&fp->hv[hi], r); + } + glPopMatrix(); + } + } + item_pull(); + + item_push(); + item_push_text(ITEM_GROW); { - for (ci = 0; ci < fp->cc; ci++) - if (fp->cv[ci].n > 0) + for (hi = 0; hi < fp->hc; hi++) + + 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) @@ -377,7 +501,7 @@ static void game_draw_fore(int pose, float rx, float ry, int d, const float p[3] { const float *ball_p = file.uv->p; const float ball_r = file.uv->r; - + glPushAttrib(GL_LIGHTING_BIT | GL_COLOR_BUFFER_BIT); { glPushMatrix(); @@ -421,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); } @@ -637,34 +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. */ - - 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; - /* Check for goal open. */ - if (goal_c > 0) + grow_set(fp, hp->t); + + 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); + } + audio_play(sound, 1.f); + + /* Reset item type. */ + hp->t = ITEM_NONE; } /* Test for a switch. */ @@ -678,7 +811,7 @@ static int game_update_state(int *state_value) jump_b = 1; jump_e = 0; jump_dt = 0.f; - + audio_play(AUD_JUMP, 1.f); } if (jump_e == 0 && jump_b == 0 && sol_jump_test(fp, jump_p, 0) == 0) @@ -686,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. */ @@ -763,6 +896,9 @@ int game_step(const float g[3], float dt, int *state_value) game_rz = game_iz; } + if (grow) + grow_ball(fp, dt); + game_update_grav(h, g); part_step(h, t); @@ -845,7 +981,7 @@ void game_set_pos(int x, int y) { game_ix += 40.f * y / config_get_d(CONFIG_MOUSE_SENSE); game_iz += 40.f * x / config_get_d(CONFIG_MOUSE_SENSE); - + #if NO_AA game_no_aa(); #else