// ---------------------------- init ---------------------------------- void CRacing::Enter (void) { CControl *ctrl = Players.GetCtrl (g_game.player_id); if (param.view_mode < 0 || param.view_mode >= NUM_VIEW_MODES) { param.view_mode = ABOVE; } set_view_mode (ctrl, (TViewMode)param.view_mode); left_turn = right_turn = trick_modifier = false; ctrl->turn_fact = 0.0; ctrl->turn_animation = 0.0; ctrl->is_braking = false; ctrl->is_paddling = false; ctrl->jumping = false; ctrl->jump_charging = false; lastsound = -1; newsound = -1; if (State::manager.PreviousState() != &Paused) ctrl->Init (); g_game.raceaborted = false; SetSoundVolumes (); Music.PlayTheme (g_game.theme_id, MUS_RACING); g_game.finish = false; }
// ---------------------------- init ---------------------------------- void racing_init (void) { CControl *ctrl = Players.GetCtrl (g_game.player_id); if (param.view_mode < 0 || param.view_mode >= NUM_VIEW_MODES) { param.view_mode = ABOVE; } set_view_mode (ctrl, (TViewMode)param.view_mode); left_turn = right_turn = trick_modifier = false; ctrl->turn_fact = 0.0; ctrl->turn_animation = 0.0; ctrl->is_braking = false; ctrl->is_paddling = false; ctrl->jumping = false; ctrl->jump_charging = false; lastsound = -1; newsound = -1; if (g_game.prev_mode != PAUSED) ctrl->Init (); g_game.raceaborted = false; SetSoundVolumes (); Music.PlayTheme (g_game.theme_id, MUS_RACING); g_game.fps = 0; g_game.timesteps = 0; g_game.finish = false; }
void CReset::Loop(double time_step) { CControl *ctrl = Players.GetCtrl (g_game.player_id); double elapsed_time = Winsys.ClockTime () - reset_start_time; static bool tux_visible = true; static int tux_visible_count = 0; check_gl_error(); ClearRenderContext (); Env.SetupFog (); ctrl->UpdatePlayerPos (EPS); update_view (ctrl, EPS); SetupViewFrustum (ctrl); Env.DrawSkybox (ctrl->viewpos); Env.DrawFog (); Env.SetupLight (); // and fog RenderCourse(); DrawTrackmarks (); DrawTrees (); if ((elapsed_time > BLINK_IN_PLACE_TIME) && (!position_reset)) { TObjectType* object_types = &Course.ObjTypes[0]; TItem* item_locs = &Course.NocollArr[0]; size_t num_item_types = Course.ObjTypes.size(); size_t first_reset = 0; size_t last_reset = 0; for (size_t i = 0; i < num_item_types; i++) { if (object_types[i].reset_point == true) { last_reset = first_reset + object_types[i].num_items - 1; break; } else { first_reset += object_types[i].num_items; } } // for if (last_reset == 0) { ctrl->cpos.x = Course.GetDimensions().x/2.0; ctrl->cpos.z = min(ctrl->cpos.z + 10, -1.0); } else { int best_loc = -1; for (size_t i = first_reset; i <= last_reset; i++) { if (item_locs[i].pt.z > ctrl->cpos.z) { if (best_loc == -1 || item_locs[i].pt.z < item_locs[best_loc].pt.z) { best_loc = (int)i; } // if } // if } // for if (best_loc == -1) { ctrl->cpos.x = Course.GetDimensions().x/2.0; ctrl->cpos.z = min (ctrl->cpos.z + 10, -1.0); } else if (item_locs[best_loc].pt.z <= ctrl->cpos.z) { ctrl->cpos.x = Course.GetDimensions().x/2.0; ctrl->cpos.z = min (ctrl->cpos.z + 10, -1.0); } else { ctrl->cpos.x = item_locs[best_loc].pt.x; ctrl->cpos.z = item_locs[best_loc].pt.z; } // if } ctrl->view_init = false; ctrl->Init (); position_reset = true; } // if elapsed time if (tux_visible) Char.Draw (g_game.char_id); if (++tux_visible_count > 3) { tux_visible = (bool) !tux_visible; tux_visible_count = 0; } DrawHud (ctrl); Reshape (Winsys.resolution.width, Winsys.resolution.height); Winsys.SwapBuffers (); g_game.time += time_step; if (elapsed_time > TOTAL_RESET_TIME) { State::manager.RequestEnterState (Racing); } }