static void play_loop_timer(int id, float dt) { float k = (fast_rotate ? (float) config_get_d(CONFIG_ROTATE_FAST) / 100.0f : (float) config_get_d(CONFIG_ROTATE_SLOW) / 100.0f); float r = 0.0f; gui_timer(id, dt); hud_timer(dt); switch (rot_get(&r)) { case ROT_HOLD: /* * Cam 3 could be anything. But let's assume it's a manual cam * and holding down both rotation buttons freezes the camera * rotation. */ game_set_rot(0.0f); game_set_cam(CAM_3); break; case ROT_ROTATE: case ROT_NONE: game_set_rot(r * k); game_set_cam(config_get_d(CONFIG_CAMERA)); break; } game_step_fade(dt); game_server_step(dt); game_client_sync(demo_fp); game_client_blend(game_server_blend()); switch (curr_status()) { case GAME_GOAL: progress_stat(GAME_GOAL); goto_state(&st_goal); break; case GAME_FALL: progress_stat(GAME_FALL); goto_state(&st_fail); break; case GAME_TIME: progress_stat(GAME_TIME); goto_state(&st_fail); break; default: progress_step(); break; } }
static void goal_timer(int id, float dt) { if (!resume) { static float t = 0.0f; t += dt; if (time_state() < 1.f) { game_server_step(dt); game_client_sync(demo_fp); game_client_blend(game_server_blend()); } else if (t > 0.05f && coins_id) { int coins = gui_value(coins_id); if (coins > 0) { int score = gui_value(score_id); int balls = gui_value(balls_id); gui_set_count(coins_id, coins - 1); gui_pulse(coins_id, 1.1f); gui_set_count(score_id, score + 1); gui_pulse(score_id, 1.1f); if (progress_reward_ball(score + 1)) { gui_set_count(balls_id, balls + 1); gui_pulse(balls_id, 2.0f); audio_play(AUD_BALL, 1.0f); } } t = 0.0f; } } gui_timer(id, dt); }
static void demo_play_timer(int id, float dt) { game_step_fade(dt); gui_timer(id, dt); hud_timer(dt); /* Pause briefly before starting playback. */ if (time_state() < prelude) return; if (!demo_replay_step(dt)) { demo_paused = 0; goto_state(&st_demo_end); } else { progress_step(); game_client_blend(demo_replay_blend()); } }
static void title_timer(int id, float dt) { static const char *demo = NULL; real_time += dt; switch (mode) { case MODE_LEVEL: /* Pan across title level. */ if (real_time <= 20.0f) { game_client_fly(fcosf(V_PI * real_time / 20.0f)); } else { game_fade(+1.0f); real_time = 0.0f; mode = MODE_LEVEL_FADE; } break; case MODE_LEVEL_FADE: /* Fade out. Load demo level. */ if (real_time > 1.0f) { if (!items) items = demo_dir_scan(); if ((demo = pick_demo(items))) { demo_replay_init(demo, NULL, NULL, NULL, NULL, NULL); game_client_fly(0.0f); real_time = 0.0f; mode = MODE_DEMO; } else { game_fade(-1.0f); real_time = 0.0f; mode = MODE_LEVEL; } } break; case MODE_DEMO: /* Run demo. */ if (!demo_replay_step(dt)) { demo_replay_stop(0); game_fade(+1.0f); real_time = 0.0f; mode = MODE_DEMO_FADE; } else game_client_blend(demo_replay_blend()); break; case MODE_DEMO_FADE: /* Fade out. Load title level. */ if (real_time > 1.0f) { init_title_level(); real_time = 0.0f; mode = MODE_LEVEL; } break; } gui_timer(id, dt); game_step_fade(dt); }