// // IN_Ticker // // Runs intermission timer, starts music, checks for acceleration // when user presses a key, and runs the level if an intermission // camera is active. Gamemode-specific ticker is called. // void IN_Ticker(void) { // counter for general background animation intertime++; // intermission music if(intertime == 1) S_ChangeMusicNum(GameModeInfo->interMusNum, true); IN_checkForAccelerate(); InterFuncs->Ticker(); // keep the level running when using an intermission camera if(realbackdrop) P_Ticker(); }
/* ==================== G_Ticker ==================== */ void G_Ticker (void) { // // Do things to change the game state // // // get commands // memcpy(&pl.cmd, &ticcmds[0], sizeof(ticcmd_t)); // // do main actions // switch (gamestate) { case GS_INTRO: break; case GS_LEVELBEGIN: break; case GS_PUNISHMENT: case GS_LEVEL: if (G_CheckPause()) break; P_Ticker (); T_Ticker (); G_CheckThinkerEncounters(); G_CheckGameState(); // ST_Ticker (); // // HU_Ticker (); // hud ticker break; case GS_INTERMISSION: // G_IntermissionTicker (); break; case GS_LOSELIFE: G_DeathTicker(); break; case GS_GAMEOVER: if (G_CheckPause()) break; C_WriteLog("\n******************************\n**** Final Score: %7d ****\n******************************\n", P_GetScore()); if (P_GetScore() > ((C_GetScoreListP())[LISTABLE_SCORES-1]).score) { gamestate = GS_HIGHSCORE; return; } gamestate = GS_INTERMISSION; break; case GS_NEWLEVEL: switch (levelstate) { case 1: G_SetPause(3600); // the display code calls G_LoadNextLevel R_SpinBoardOut(1600,2000); gamestate = GS_LEVELEFFECTS; levelstate = 2; break; case 2: G_SetPause(1600); levelstate = 0; gamestate = GS_LEVELEFFECTS; break; case 0: default: gamestate = GS_LEVEL; break; } break; case GS_LEVELEFFECTS: if (G_CheckPause()) break; gamestate = GS_NEWLEVEL; break; } }
/** * This is the main ticker of the engine. We'll call all the other tickers * from here. * * @param time Duration of the tick. This will never be longer than 1.0/TICSPERSEC. */ static void baseTicker(timespan_t time) { if(DD_IsFrameTimeAdvancing()) { #ifdef __CLIENT__ // Demo ticker. Does stuff like smoothing of view angles. Demo_Ticker(time); #endif P_Ticker(time); UI2_Ticker(time); // InFine ticks whenever it's active. FI_Ticker(); // Game logic. if(App_GameLoaded() && gx.Ticker) { gx.Ticker(time); } #ifdef __CLIENT__ // Windowing system ticks. R_Ticker(time); if(isClient) { Cl_Ticker(time); } #elif __SERVER__ Sv_Ticker(time); #endif if(DD_IsSharpTick()) { // Set frametime back by one tick (to stay in the 0..1 range). realFrameTimePos -= 1; // Camera smoothing: now that the world tic has occurred, the next sharp // position can be processed. R_NewSharpWorld(); #ifdef LIBDENG_PLAYER0_MOVEMENT_ANALYSIS if(ddPlayers[0].shared.inGame && ddPlayers[0].shared.mo) { mobj_t* mo = ddPlayers[0].shared.mo; static coord_t prevPos[3] = { 0, 0, 0 }; static coord_t prevSpeed = 0; coord_t speed = V2d_Length(mo->mom); coord_t actualMom[2] = { mo->origin[0] - prevPos[0], mo->origin[1] - prevPos[1] }; coord_t actualSpeed = V2d_Length(actualMom); Con_Message("%i,%f,%f,%f,%f", SECONDS_TO_TICKS(sysTime + time), ddPlayers[0].shared.forwardMove, speed, actualSpeed, speed - prevSpeed); V3d_Copy(prevPos, mo->origin); prevSpeed = speed; } #endif } #ifdef __CLIENT__ // While paused, don't modify frametime so things keep still. if(!clientPaused) #endif { frameTimePos = realFrameTimePos; } } // Console is always ticking. Con_Ticker(time); // User interface ticks. if(tickUI) { UI_Ticker(time); } // Plugins tick always. DD_CallHooks(HOOK_TICKER, 0, &time); // The netcode gets to tick, too. Net_Ticker(time); }
void G_Ticker(void) { int i, buf; ticcmd_t *cmd = NULL; // // do player reborns if needed // for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].playerstate == PST_REBORN) G_DoReborn(i); // // do things to change the game state // while (gameaction != ga_nothing) { switch (gameaction) { case ga_loadlevel: G_DoLoadLevel(); break; case ga_newgame: G_DoNewGame(); break; case ga_loadgame: G_DoLoadGame(); break; case ga_savegame: G_DoSaveGame(); break; case ga_playdemo: G_DoPlayDemo(); break; case ga_screenshot: V_ScreenShot("HTIC%02i.%s"); gameaction = ga_nothing; break; case ga_completed: G_DoCompleted(); break; case ga_worlddone: G_DoWorldDone(); break; case ga_victory: F_StartFinale(); break; default: break; } } // // get commands, check consistancy, and build new consistancy check // //buf = gametic%BACKUPTICS; buf = (gametic / ticdup) % BACKUPTICS; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) { cmd = &players[i].cmd; memcpy(cmd, &netcmds[i], sizeof(ticcmd_t)); if (demoplayback) G_ReadDemoTiccmd(cmd); if (demorecording) G_WriteDemoTiccmd(cmd); if (netgame && !(gametic % ticdup)) { if (gametic > BACKUPTICS && consistancy[i][buf] != cmd->consistancy) { I_Error("consistency failure (%i should be %i)", cmd->consistancy, consistancy[i][buf]); } if (players[i].mo) consistancy[i][buf] = players[i].mo->x; else consistancy[i][buf] = rndindex; } } // // check for special buttons // for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) { if (players[i].cmd.buttons & BT_SPECIAL) { switch (players[i].cmd.buttons & BT_SPECIALMASK) { case BTS_PAUSE: paused ^= 1; if (paused) { S_PauseSound(); } else { S_ResumeSound(); } break; case BTS_SAVEGAME: if (!savedescription[0]) { if (netgame) { M_StringCopy(savedescription, DEH_String("NET GAME"), sizeof(savedescription)); } else { M_StringCopy(savedescription, DEH_String("SAVE GAME"), sizeof(savedescription)); } } savegameslot = (players[i].cmd. buttons & BTS_SAVEMASK) >> BTS_SAVESHIFT; gameaction = ga_savegame; break; } } } // turn inventory off after a certain amount of time if (inventory && !(--inventoryTics)) { players[consoleplayer].readyArtifact = players[consoleplayer].inventory[inv_ptr].type; inventory = false; cmd->arti = 0; } // // do main actions // // // do main actions // switch (gamestate) { case GS_LEVEL: P_Ticker(); SB_Ticker(); AM_Ticker(); CT_Ticker(); break; case GS_INTERMISSION: IN_Ticker(); break; case GS_FINALE: F_Ticker(); break; case GS_DEMOSCREEN: D_PageTicker(); break; } }