void G_WriteDemoTiccmd(ticcmd_t* cmd) { char buf[8]; signed short angleturn; signed short pitch; char *p = buf; angleturn = cmd->angleturn; pitch = cmd->pitch; *p++ = cmd->forwardmove; *p++ = cmd->sidemove; *p++ = angleturn & 0xff; *p++ = (angleturn >> 8) & 0xff; *p++ = pitch & 0xff; *p++ = (pitch >> 8) & 0xff; *p++ = cmd->buttons; *p++ = cmd->buttons2; if(fwrite(buf, p-buf, 1, demofp) != 1) { I_Error("G_WriteDemoTiccmd: error writing demo"); } // alias demo_p to it so we can read it back demo_p = buf; G_ReadDemoTiccmd(cmd); // make SURE it is exactly the same }
void G_Ticker (void) { int buf; gamestate_t oldgamestate; size_t i; // Run client tics; CL_RunTics (); // do player reborns if needed if(serverside) for (i = 0; i < players.size(); i++) if (players[i].ingame() && players[i].playerstate == PST_REBORN) G_DoReborn (players[i]); // do things to change the game state oldgamestate = gamestate; while (gameaction != ga_nothing) { switch (gameaction) { case ga_loadlevel: G_DoLoadLevel (-1); break; case ga_newgame: G_DoNewGame (); break; case ga_loadgame: gameaction = ga_nothing; break; case ga_savegame: gameaction = ga_nothing; break; case ga_playdemo: G_DoPlayDemo (); break; case ga_completed: G_DoCompleted (); break; case ga_victory: gameaction = ga_nothing; break; case ga_worlddone: G_DoWorldDone (); break; case ga_screenshot: I_ScreenShot(shotfile.c_str()); gameaction = ga_nothing; break; case ga_fullconsole: C_FullConsole (); gameaction = ga_nothing; break; case ga_nothing: break; } C_AdjustBottom (); } // get commands buf = gametic%BACKUPTICS; memcpy (&consoleplayer().cmd, &consoleplayer().netcmds[buf], sizeof(ticcmd_t)); static int realrate = 0; int packet_size; if (demoplayback) G_ReadDemoTiccmd(); // play all player commands if (demorecording) G_WriteDemoTiccmd(); // read in all player commands if (connected) { while ((packet_size = NET_GetPacket()) ) { // denis - don't accept candy from strangers if(!NET_CompareAdr(serveraddr, net_from)) break; realrate += packet_size; last_received = gametic; noservermsgs = false; CL_ReadPacketHeader(); CL_ParseCommands(); if (gameaction == ga_fullconsole) // Host_EndGame was called return; } if (!(gametic%TICRATE)) { netin = realrate; realrate = 0; } if (!noservermsgs) CL_SendCmd(); // send console commands to the server CL_SaveCmd(); // save console commands if (!(gametic%TICRATE)) { netout = outrate; outrate = 0; } if (gametic - last_received > 65) noservermsgs = true; } else if (NET_GetPacket() ) { // denis - don't accept candy from strangers if((gamestate == GS_DOWNLOAD || gamestate == GS_CONNECTING) && NET_CompareAdr(serveraddr, net_from)) { int type = MSG_ReadLong(); if(type == CHALLENGE) { CL_PrepareConnect(); } else if(type == 0) { if (!CL_Connect()) memset (&serveraddr, 0, sizeof(serveraddr)); connecttimeout = 0; } else { // we are already connected to this server, quit first MSG_WriteMarker(&net_buffer, clc_disconnect); NET_SendPacket(net_buffer, serveraddr); } } } // check for special buttons if(serverside && consoleplayer().ingame()) { player_t &player = consoleplayer(); if (player.cmd.ucmd.buttons & BT_SPECIAL) { switch (player.cmd.ucmd.buttons & BT_SPECIALMASK) { case BTS_PAUSE: paused ^= 1; if (paused) S_PauseSound (); else S_ResumeSound (); break; case BTS_SAVEGAME: if (!savedescription[0]) strcpy (savedescription, "NET GAME"); savegameslot = (player.cmd.ucmd.buttons & BTS_SAVEMASK)>>BTS_SAVESHIFT; gameaction = ga_savegame; break; } } }
void G_Ticker(void) { int i; int buf; ticcmd_t* cmd; G_ActionTicker(); CON_Ticker(); if(savenow) { G_DoSaveGame(); savenow = false; } if(gameaction == ga_screenshot) { M_ScreenShot(); gameaction = ga_nothing; } if(paused & 2 || (!demoplayback && menuactive && !netgame)) { basetic++; // For tracers and RNG -- we must maintain sync } else { // get commands, check consistency, // and build new consistency check buf = (gametic / ticdup) % BACKUPTICS; for(i = 0; i < MAXPLAYERS; i++) { if(playeringame[i]) { cmd = &players[i].cmd; dmemcpy(cmd, &netcmds[i][buf], sizeof(ticcmd_t)); // // 20120404 villsa - make sure gameaction isn't set to anything before // reading a demo lump // if(demoplayback && gameaction == ga_nothing) { G_ReadDemoTiccmd(cmd); } if(demorecording) { G_WriteDemoTiccmd(cmd); if(endDemo == true) { G_CheckDemoStatus(); } } if(netgame && !netdemo && !(gametic % ticdup)) { if(gametic > BACKUPTICS && consistency[i][buf] != cmd->consistency) { I_Error("consistency failure (%i should be %i)", cmd->consistency, consistency[i][buf], consoleplayer); } if(players[i].mo) { consistency[i][buf] = players[i].mo->x; } else { consistency[i][buf] = 0; } } } } } // check for special buttons for(i = 0; i < MAXPLAYERS; i++) { if(playeringame[i]) { if(players[i].cmd.buttons & BT_SPECIAL) { /*villsa - fixed crash when player restarts level after dying Changed switch statments to if statments*/ if((players[i].cmd.buttons & BT_SPECIALMASK) == BTS_PAUSE) { paused ^= 1; if(paused) { S_PauseSound(); } else { S_ResumeSound(); } } if((players[i].cmd.buttons & BT_SPECIALMASK) == BTS_SAVEGAME) { if(!savedescription[0]) { dstrcpy(savedescription, "NET GAME"); } savegameslot = (players[i].cmd.buttons & BTS_SAVEMASK)>>BTS_SAVESHIFT; savenow = true; } } } } }
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; } }
// // P_Ticker // void P_Ticker(boolean run) { INT32 i; //Increment jointime even if paused. for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i]) ++players[i].jointime; if (objectplacing) { if (OP_FreezeObjectplace()) { P_MapStart(); OP_ObjectplaceMovement(&players[0]); P_MoveChaseCamera(&players[0], &camera, false); P_MapEnd(); return; } } // Check for pause or menu up in single player if (paused || P_MenuActivePause()) return; postimgtype = postimgtype2 = postimg_none; P_MapStart(); if (run) { if (demorecording) G_WriteDemoTiccmd(&players[consoleplayer].cmd, 0); if (demoplayback) G_ReadDemoTiccmd(&players[consoleplayer].cmd, 0); for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) P_PlayerThink(&players[i]); } // Keep track of how long they've been playing! totalplaytime++; if (!useNightsSS && G_IsSpecialStage(gamemap)) P_DoSpecialStageStuff(); if (runemeraldmanager) P_EmeraldManager(); // Power stone mode if (run) { P_RunThinkers(); // Run any "after all the other thinkers" stuff for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) P_PlayerAfterThink(&players[i]); #ifdef HAVE_BLUA LUAh_ThinkFrame(); #endif } // Run shield positioning P_RunShields(); P_UpdateSpecials(); P_RespawnSpecials(); // Lightning, rain sounds, etc. P_PrecipitationEffects(); if (run) leveltime++; timeinmap++; if (G_TagGametype()) P_DoTagStuff(); if (G_GametypeHasTeams()) P_DoCTFStuff(); if (run) { if (countdowntimer && --countdowntimer <= 0) { countdowntimer = 0; countdowntimeup = true; for (i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i] || players[i].spectator) continue; if (!players[i].mo) continue; P_DamageMobj(players[i].mo, NULL, NULL, 10000); } } if (countdown > 1) countdown--; if (countdown2) countdown2--; if (quake.time) { fixed_t ir = quake.intensity>>1; /// \todo Calculate distance from epicenter if set and modulate the intensity accordingly based on radius. quake.x = M_RandomRange(-ir,ir); quake.y = M_RandomRange(-ir,ir); quake.z = M_RandomRange(-ir,ir); --quake.time; } else