raze-gles/source/sw/src/demo.cpp

623 lines
14 KiB
C++
Raw Normal View History

//-------------------------------------------------------------------------
/*
Copyright (C) 1997, 2005 - 3D Realms Entertainment
This file is part of Shadow Warrior version 1.2
Shadow Warrior is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#include "ns.h"
//#define MAIN
//#define QUIET
#include "build.h"
#include "keys.h"
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "network.h"
#include "mytypes.h"
#include "gamecontrol.h"
#include "demo.h"
#include "player.h"
#include "menus.h"
BEGIN_SW_NS
DFILE DemoFileIn;
FILE *DemoFileOut;
SWBOOL DemoPlaying = FALSE;
SWBOOL DemoRecording = FALSE;
SWBOOL DemoEdit = FALSE;
SWBOOL DemoMode = FALSE;
SWBOOL DemoModeMenuState = FALSE;
SWBOOL DemoOverride = FALSE;
char DemoFileName[16] = "demo.dmo";
char DemoLevelName[16] = "";
extern SWBOOL NewGame;
// Demo sync stuff
FILE *DemoSyncFile;
SWBOOL DemoSyncTest = FALSE, DemoSyncRecord = FALSE;
char DemoTmpName[16] = "";
SW_PACKET DemoBuffer[DEMO_BUFFER_MAX];
int DemoRecCnt = 0; // Can only record 1-player game
SWBOOL DemoDone;
void DemoWriteHeader(void);
void DemoReadHeader(void);
void DemoReadBuffer(void);
//
// DemoDebug Vars
//
// DemoDebugMode will close the file after every write
SWBOOL DemoDebugMode = FALSE;
//SWBOOL DemoDebugMode = TRUE;
SWBOOL DemoInitOnce = FALSE;
short DemoDebugBufferMax = 1;
extern char LevelName[];
extern uint8_t FakeMultiNumPlayers;
extern SWBOOL QuitFlag;
///////////////////////////////////////////
//
// Demo File Manipulation
//
///////////////////////////////////////////
char *DemoSyncFileName(void)
{
static char file_name[32];
char *ptr;
strcpy(file_name, DemoFileName);
if ((ptr = strchr(file_name, '.')) == 0)
strcat(file_name, ".dms");
else
{
*ptr = '\0';
strcat(file_name, ".dms");
}
return file_name;
}
void
DemoSetup(void)
{
if (DemoRecording)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
DemoWriteHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
}
if (DemoPlaying)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
if (DemoSyncTest)
DemoSyncFile = fopen(DemoSyncFileName(),"rb");
DemoReadHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
DemoReadBuffer();
}
}
void
DemoRecordSetup(void)
{
if (DemoRecording)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
DemoWriteHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
}
}
void
DemoPlaySetup(void)
{
if (DemoPlaying)
{
if (DemoSyncRecord)
DemoSyncFile = fopen(DemoSyncFileName(),"wb");
if (DemoSyncTest)
DemoSyncFile = fopen(DemoSyncFileName(),"rb");
DemoReadHeader();
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
DemoReadBuffer();
}
}
void
DemoWriteHeader(void)
{
DEMO_HEADER dh;
DEMO_START_POS dsp;
PLAYERp pp;
DemoFileOut = fopen(DemoFileName, "wb");
if (!DemoFileOut)
return;
strcpy(dh.map_name, LevelName);
strcpy(dh.LevelSong, "");
dh.Level = Level;
if (FakeMultiNumPlayers)
dh.numplayers = FakeMultiNumPlayers;
else
dh.numplayers = numplayers;
fwrite(&dh, sizeof(dh), 1, DemoFileOut);
for (pp = Player; pp < Player + dh.numplayers; pp++)
{
dsp.x = pp->posx;
dsp.y = pp->posy;
dsp.z = pp->posz;
fwrite(&dsp, sizeof(dsp), 1, DemoFileOut);
fwrite(&pp->Flags, sizeof(pp->Flags), 1, DemoFileOut);
Revert "SW: Improve main game loop." This reverts commit e878c5bab8bc15e00e7a999a018f59ba4980505c. Revert "SW: Use Q16.16 for horiz." This reverts commit f07a0ae01ef8340c4b32c2b110bcb1431ae93c4f. Revert "SW: Use Q16.16 for angle." This reverts commit 1ecc74c2ecd8bb310c0099249ce148a28a73e26a. Revert "SW: Minor repairs for Q16.16 implementation." This reverts commit d78d046bad6c1679fff32efaa98bc6b4478d20eb. Revert "SW: Process input at frame rate." This reverts commit c162014dab5433dff2c5c3e5397178c992e1e761. Revert "SW: Amendments to accommodate changes in master." This reverts commit eaa51138add0d83568fafb79bc9afa35fe67a64f. Revert "SW: Fix incorrectly declared function input type." This reverts commit 1cdd5b08d82a88eb57013e78a34e4ef9e0796d34. Revert "SW: Amend scaleAdjustmentToInterval() with correct value for SW." This reverts commit d4dd737cd54e5c30c41a339fba6cefad696f3a42. Revert "SW: Refinements to new input code." This reverts commit 5ebc65a1fb19f86c2add664470108002a0078945. Revert "SW: Adjust look and snap up/down keys and slightly tune PLAYER_TURN_AMOUNT." This reverts commit 2852536dbf50f4cab58a158083b8c6e2de6ac1dd. Revert "SW: Get PLAYER_TURN_SCALE to be just right." This reverts commit 4630c8a0b7a24819e04a14a64efff5d4b36271cf. Revert "SW: Make map follow mode work better." This reverts commit 8e94c48eff599078364a7b0a7b94750cd40daf28. Revert "SW: Remove line accidentally left from 'MoveScrollMode2D()'." This reverts commit 5db8047b413548d3ef02d08d1d581c303a3d5907. Revert "Fix multiplayer desync after the change to q16 angle and horiz." This reverts commit 3bc46078b833e27fab42eaa77a0f5071c35dd584. Revert "SW: Revert commented out horiz->q16horiz renames in DSPRINTF strings" This reverts commit 537313f620dc98a832d862aff86a78e0b3b3cb23. Revert "sw/src/draw.cpp:drawscreen: We can set the pp->si* fields just once," This reverts commit d2e9595980c283d62de28f029b5f6394bf2522ff. Revert "sw/src/game.cpp:LoadLevel: Rename q16ang -> ang" This reverts commit a178961a3eed2522147f60d7265bb2d08f4a0bfe. Revert "SW: Minor tweaks." This reverts commit 377ba68344e34495638c6fa7685ff78c9a0ed6f8. Revert "SW: Further refine turning and optimise horizon adjustment." This reverts commit 039022d9ac476cc784e47633bfbac039a965f217. Revert "SW: Don't process input at frame rate if ScrollMode2D is true." This reverts commit 1aa1e62c4d4dc1fff24201ff8eaebcccef6d7646. Revert "SW: Use a bit more Q16.16 in places." This reverts commit 40ca656f38de5d941cf5deac440eeafa965df3bd. Revert "SW: Use the old interpolation path in drawscreen if player is dead" This reverts commit 2d734664259e47b999fe989b924ecaa0a97bb109. Revert "SW: Smooth out 180 degree turn landing and replace some fix16_min/max with fix16_clamp." This reverts commit 0996e87f7991490d70fba9e5b525e7c7404ce637. Revert "Change Next/Previous Weapon button handling for Shadow Warrior." This reverts commit f6b8ca6a223923b0ec5665aedacd729391ea1d4d. Revert "SW: Make "Center_View" key return smoothly." This reverts commit 23c401fbc28845a7ecb1ad9b29d0e72781b052b5. Revert "SW: Use the old interpolation path in drawscreen if player is dead" This reverts commit 43ec16eb5576124bed3699943bb70b9ea943bd93. Revert "Interpolation fixes for SW:" This reverts commit ac8a7ecfbdfbe9152a8ead605723c1d18eca7798. Revert "SW: Reset the number of interpolations on level load" This reverts commit 04bf8499e72fd48e1e6e7487d743b38a2a206a14. Revert "Another change modifying saved game format in SW:" This reverts commit e80888523ea62df60c69b098236f6af1f994177a. Revert "SW: Interpolate sector objects in non-demo, single player games." This reverts commit 996ab77cf47b5eeb142d6c93e7b307418f3b53a6. Revert "- fixed merge errors in SW." This reverts commit b8cfa94568b85e4ed51c558f09734ede794ad988. Revert "- fix interpolation stutters when opening console for SW." This reverts commit 99fdbfb6cb62bd02d91f4b2d95339cbd918c71fa. Revert "- reset buttonMap button states after returning from pause for SW (stops keys acting stuck down if down prior to pausing)." This reverts commit 693b6955dac84b13fc5de91aee29364c3be6e526. Revert "SW: fix stupid input scaling bug" This reverts commit 1c79e6e17c0028e650f525db6cdbd1b38095708e. Revert "SW: Make vehicle input better." This reverts commit 670a53c402f08ac0aecd721f8c5cf1543f699250. Revert "SW: Change fix16_from_float() to fix16_from_int() that was changed in 4630c8a0b7a24819e04a14a64efff5d4b36271cf but should have been reverted in 377ba68344e34495638c6fa7685ff78c9a0ed6f8." This reverts commit 423c9da071844bdfb716d39e1cd2cf103727a37c. Revert "SW: Remove ScrollMode2D extern boolean and move into PLAYERp struct." This reverts commit 31eb55c1fa69bfe90c09ce9611e0d32445341284.
2020-05-19 11:44:52 +00:00
fwrite(&pp->pang, sizeof(pp->pang), 1, DemoFileOut);
}
fwrite(&Skill, sizeof(Skill), 1, DemoFileOut);
fwrite(&gNet, sizeof(gNet), 1, DemoFileOut);
if (DemoDebugMode)
{
DemoDebugBufferMax = numplayers;
fclose(DemoFileOut);
}
}
void
DemoReadHeader(void)
{
DEMO_HEADER dh;
DEMO_START_POS dsp;
PLAYERp pp;
#if DEMO_FILE_TYPE != DEMO_FILE_GROUP
if (DemoEdit)
{
DemoFileIn = fopen(DemoFileName, "rb+");
}
else
#endif
{
//DemoFileIn = fopen(DemoFileName, "rb");
DemoFileIn = DOPEN_READ(DemoFileName);
}
if (DF_ERR(DemoFileIn))
{
I_Error("File %s is not a valid demo file.",DemoFileName);
}
DREAD(&dh, sizeof(dh), 1, DemoFileIn);
strcpy(DemoLevelName, dh.map_name);
Level = dh.Level;
if (dh.numplayers > 1)
{
FakeMultiNumPlayers = dh.numplayers;
}
else
numplayers = dh.numplayers;
for (pp = Player; pp < Player + dh.numplayers; pp++)
{
DREAD(&dsp, sizeof(dsp), 1, DemoFileIn);
pp->posx = dsp.x;
pp->posy = dsp.y;
pp->posz = dsp.z;
COVERupdatesector(pp->posx, pp->posy, &pp->cursectnum);
//pp->cursectnum = 0;
//updatesectorz(pp->posx, pp->posy, pp->posz, &pp->cursectnum);
DREAD(&pp->Flags, sizeof(pp->Flags), 1, DemoFileIn);
Revert "SW: Improve main game loop." This reverts commit e878c5bab8bc15e00e7a999a018f59ba4980505c. Revert "SW: Use Q16.16 for horiz." This reverts commit f07a0ae01ef8340c4b32c2b110bcb1431ae93c4f. Revert "SW: Use Q16.16 for angle." This reverts commit 1ecc74c2ecd8bb310c0099249ce148a28a73e26a. Revert "SW: Minor repairs for Q16.16 implementation." This reverts commit d78d046bad6c1679fff32efaa98bc6b4478d20eb. Revert "SW: Process input at frame rate." This reverts commit c162014dab5433dff2c5c3e5397178c992e1e761. Revert "SW: Amendments to accommodate changes in master." This reverts commit eaa51138add0d83568fafb79bc9afa35fe67a64f. Revert "SW: Fix incorrectly declared function input type." This reverts commit 1cdd5b08d82a88eb57013e78a34e4ef9e0796d34. Revert "SW: Amend scaleAdjustmentToInterval() with correct value for SW." This reverts commit d4dd737cd54e5c30c41a339fba6cefad696f3a42. Revert "SW: Refinements to new input code." This reverts commit 5ebc65a1fb19f86c2add664470108002a0078945. Revert "SW: Adjust look and snap up/down keys and slightly tune PLAYER_TURN_AMOUNT." This reverts commit 2852536dbf50f4cab58a158083b8c6e2de6ac1dd. Revert "SW: Get PLAYER_TURN_SCALE to be just right." This reverts commit 4630c8a0b7a24819e04a14a64efff5d4b36271cf. Revert "SW: Make map follow mode work better." This reverts commit 8e94c48eff599078364a7b0a7b94750cd40daf28. Revert "SW: Remove line accidentally left from 'MoveScrollMode2D()'." This reverts commit 5db8047b413548d3ef02d08d1d581c303a3d5907. Revert "Fix multiplayer desync after the change to q16 angle and horiz." This reverts commit 3bc46078b833e27fab42eaa77a0f5071c35dd584. Revert "SW: Revert commented out horiz->q16horiz renames in DSPRINTF strings" This reverts commit 537313f620dc98a832d862aff86a78e0b3b3cb23. Revert "sw/src/draw.cpp:drawscreen: We can set the pp->si* fields just once," This reverts commit d2e9595980c283d62de28f029b5f6394bf2522ff. Revert "sw/src/game.cpp:LoadLevel: Rename q16ang -> ang" This reverts commit a178961a3eed2522147f60d7265bb2d08f4a0bfe. Revert "SW: Minor tweaks." This reverts commit 377ba68344e34495638c6fa7685ff78c9a0ed6f8. Revert "SW: Further refine turning and optimise horizon adjustment." This reverts commit 039022d9ac476cc784e47633bfbac039a965f217. Revert "SW: Don't process input at frame rate if ScrollMode2D is true." This reverts commit 1aa1e62c4d4dc1fff24201ff8eaebcccef6d7646. Revert "SW: Use a bit more Q16.16 in places." This reverts commit 40ca656f38de5d941cf5deac440eeafa965df3bd. Revert "SW: Use the old interpolation path in drawscreen if player is dead" This reverts commit 2d734664259e47b999fe989b924ecaa0a97bb109. Revert "SW: Smooth out 180 degree turn landing and replace some fix16_min/max with fix16_clamp." This reverts commit 0996e87f7991490d70fba9e5b525e7c7404ce637. Revert "Change Next/Previous Weapon button handling for Shadow Warrior." This reverts commit f6b8ca6a223923b0ec5665aedacd729391ea1d4d. Revert "SW: Make "Center_View" key return smoothly." This reverts commit 23c401fbc28845a7ecb1ad9b29d0e72781b052b5. Revert "SW: Use the old interpolation path in drawscreen if player is dead" This reverts commit 43ec16eb5576124bed3699943bb70b9ea943bd93. Revert "Interpolation fixes for SW:" This reverts commit ac8a7ecfbdfbe9152a8ead605723c1d18eca7798. Revert "SW: Reset the number of interpolations on level load" This reverts commit 04bf8499e72fd48e1e6e7487d743b38a2a206a14. Revert "Another change modifying saved game format in SW:" This reverts commit e80888523ea62df60c69b098236f6af1f994177a. Revert "SW: Interpolate sector objects in non-demo, single player games." This reverts commit 996ab77cf47b5eeb142d6c93e7b307418f3b53a6. Revert "- fixed merge errors in SW." This reverts commit b8cfa94568b85e4ed51c558f09734ede794ad988. Revert "- fix interpolation stutters when opening console for SW." This reverts commit 99fdbfb6cb62bd02d91f4b2d95339cbd918c71fa. Revert "- reset buttonMap button states after returning from pause for SW (stops keys acting stuck down if down prior to pausing)." This reverts commit 693b6955dac84b13fc5de91aee29364c3be6e526. Revert "SW: fix stupid input scaling bug" This reverts commit 1c79e6e17c0028e650f525db6cdbd1b38095708e. Revert "SW: Make vehicle input better." This reverts commit 670a53c402f08ac0aecd721f8c5cf1543f699250. Revert "SW: Change fix16_from_float() to fix16_from_int() that was changed in 4630c8a0b7a24819e04a14a64efff5d4b36271cf but should have been reverted in 377ba68344e34495638c6fa7685ff78c9a0ed6f8." This reverts commit 423c9da071844bdfb716d39e1cd2cf103727a37c. Revert "SW: Remove ScrollMode2D extern boolean and move into PLAYERp struct." This reverts commit 31eb55c1fa69bfe90c09ce9611e0d32445341284.
2020-05-19 11:44:52 +00:00
DREAD(&pp->pang, sizeof(pp->pang), 1, DemoFileIn);
}
DREAD(&Skill, sizeof(Skill), 1, DemoFileIn);
DREAD(&gNet, sizeof(gNet), 1, DemoFileIn);
}
void
DemoDebugWrite(void)
{
int size;
DemoFileOut = fopen(DemoFileName, "ab");
ASSERT(DemoFileOut);
size = sizeof(SW_PACKET) * DemoDebugBufferMax;
fwrite(&DemoBuffer, size, 1, DemoFileOut);
memset(&DemoBuffer, -1, size);
fclose(DemoFileOut);
}
void
DemoWriteBuffer(void)
{
fwrite(&DemoBuffer, sizeof(DemoBuffer), 1, DemoFileOut);
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
}
void
DemoReadBuffer(void)
{
memset(&DemoBuffer, -1, sizeof(DemoBuffer));
DREAD(&DemoBuffer, sizeof(DemoBuffer), 1, DemoFileIn);
}
void
DemoBackupBuffer(void)
{
#if DEMO_FILE_TYPE != DEMO_FILE_GROUP
FILE *NewDemoFile;
FILE *OldDemoFile = DemoFileIn;
int pos,i;
char copy_buffer;
char NewDemoFileName[16] = "!";
// seek backwards to beginning of last buffer
fseek(OldDemoFile, -sizeof(DemoBuffer), SEEK_CUR);
pos = ftell(OldDemoFile);
// open a new edit file
strcat(NewDemoFileName, DemoFileName);
NewDemoFile = fopen(NewDemoFileName, "wb");
rewind(OldDemoFile);
// copy old demo to new demo
for (i = 0; i < pos; i++)
{
fread(&copy_buffer, sizeof(copy_buffer), 1, OldDemoFile);
fwrite(&copy_buffer,sizeof(copy_buffer), 1, NewDemoFile);
}
DemoFileOut = NewDemoFile;
fclose(OldDemoFile);
#endif
}
void
DemoTerm(void)
{
if (DemoRecording)
{
// if already closed
if (DemoFileOut == NULL)
return;
if (DemoDebugMode)
{
DemoFileOut = fopen(DemoFileName, "ab");
ASSERT(DemoFileOut);
}
else
{
// paste on a -1 record to the current buffer
if (DemoRecCnt < DEMO_BUFFER_MAX)
memset(&DemoBuffer[DemoRecCnt], -1, sizeof(DemoBuffer[DemoRecCnt]));
DemoWriteBuffer();
}
// write at least 1 record at the end filled with -1
// just for good measure
memset(&DemoBuffer[0], -1, sizeof(DemoBuffer[0]));
fwrite(&DemoBuffer[0], sizeof(DemoBuffer[0]), 1, DemoFileOut);
fclose(DemoFileOut);
DemoFileOut = NULL;
}
if (DemoPlaying)
{
if (DF_ERR(DemoFileIn))
return;
DCLOSE(DemoFileIn);
}
if (DemoSyncTest||DemoSyncRecord)
{
if (DemoSyncFile == NULL)
return;
fclose(DemoSyncFile);
DemoSyncFile = NULL;
}
}
///////////////////////////////////////////
//
// Demo Play Back
//
///////////////////////////////////////////
void
DemoPlayBack(void)
{
int pnum, cnt;
static int buf_ndx;
PLAYERp pp;
ControlInfo info;
// Initialize Game part of network code (When ready2send != 0)
InitNetVars();
// IMPORTANT - MUST be right before game loop
InitTimingVars();
// THIS STUFF DEPENDS ON MYCONNECTINDEX BEING SET RIGHT
pp = Player + myconnectindex;
SetRedrawScreen(pp);
if (!DemoInitOnce)
buf_ndx = 0;
// everything has been inited at least once for PLAYBACK
DemoInitOnce = TRUE;
cnt = 0;
ready2send = 0;
DemoDone = FALSE;
while (TRUE)
{
// makes code run at the same rate
while (totalclock > totalsynctics)
{
handleevents();
TRAVERSE_CONNECT(pnum)
{
pp = Player + pnum;
pp->inputfifo[pp->movefifoend & (MOVEFIFOSIZ-1)] = DemoBuffer[buf_ndx];
pp->movefifoend++;
buf_ndx++;
if (pp->inputfifo[(pp->movefifoend - 1) & (MOVEFIFOSIZ-1)].bits == -1)
{
DemoDone = TRUE;
break;
}
if (buf_ndx > DEMO_BUFFER_MAX - 1)
{
DemoReadBuffer();
buf_ndx = 0;
}
}
if (DemoDone)
break;
cnt++;
CONTROL_GetInput(&info);
domovethings();
// fast forward and slow mo
if (DemoEdit)
{
if (inputState.GetKeyStatus(KEYSC_F))
{
if (inputState.GetKeyStatus(KEYSC_LSHIFT) || inputState.GetKeyStatus(KEYSC_RSHIFT))
totalclock += synctics;
else
totalclock += synctics-1;
}
if (inputState.GetKeyStatus(KEYSC_S))
totalclock += 1-synctics;
}
else
{
if (buttonMap.ButtonDown(gamefunc_See_Coop_View))
{
buttonMap.ClearButton(gamefunc_See_Coop_View);
screenpeek = connectpoint2[screenpeek];
if (screenpeek < 0)
screenpeek = connecthead;
}
}
if (DemoSyncRecord)
demosync_record();
if (DemoSyncTest)
demosync_test(cnt);
}
// Put this back in later when keyboard stuff is stable
if (DemoEdit)
{
//CONTROL_GetButtonInput();
CONTROL_GetInput(&info);
// if a key is pressed, start recording from the point the key
// was pressed
if (buttonMap.ButtonDown(gamefunc_Move_Forward) ||
buttonMap.ButtonDown(gamefunc_Move_Backward) ||
buttonMap.ButtonDown(gamefunc_Turn_Left) ||
buttonMap.ButtonDown(gamefunc_Turn_Right) ||
buttonMap.ButtonDown(gamefunc_Fire) ||
buttonMap.ButtonDown(gamefunc_Open) ||
buttonMap.ButtonDown(gamefunc_Jump) ||
buttonMap.ButtonDown(gamefunc_Crouch) ||
buttonMap.ButtonDown(gamefunc_Look_Up) ||
buttonMap.ButtonDown(gamefunc_Look_Down))
{
DemoBackupBuffer();
DemoRecCnt = buf_ndx;
DemoPlaying = FALSE;
DemoRecording = TRUE;
return;
}
}
if (buttonMap.ButtonDown(gamefunc_See_Coop_View))
{
screenpeek += 1;
if (screenpeek > numplayers-1)
screenpeek = 0;
}
// demo is over
if (DemoDone)
break;
if (QuitFlag)
{
DemoMode = FALSE;
break;
}
if (ExitLevel)
{
// Quiting Demo
ExitLevel = FALSE;
if (DemoMode)
{
DemoPlaying = FALSE;
DemoMode = FALSE;
}
break;
}
drawscreen(Player + screenpeek);
}
// only exit if conditions are write
if (DemoDone && !DemoMode && !NewGame)
{
TerminateLevel();
TerminateGame();
}
}
//
// Still using old method of playback - this was for opening demo
//
void
ScenePlayBack(void)
{
int buf_ndx, pnum, cnt;
PLAYERp pp;
if (SW_SHAREWARE)
{
// code here needs to be similar to RunLevel startup code
PlaySong(nullptr, "yokoha03.mid", -1);
}
// IMPORTANT - MUST be right before game loop
InitTimingVars();
buf_ndx = 0;
cnt = 0;
ready2send = 0;
DemoDone = FALSE;
2020-01-01 10:35:47 +00:00
inputState.ClearAllInput();
while (TRUE)
{
// makes code run at the same rate
while ((totalclock > totalsynctics))
{
TRAVERSE_CONNECT(pnum)
{
pp = Player + pnum;
pp->inputfifo[pp->movefifoend & (MOVEFIFOSIZ - 1)] = DemoBuffer[buf_ndx];
pp->movefifoend++;
buf_ndx++;
if (pp->inputfifo[(pp->movefifoend - 1) & (MOVEFIFOSIZ - 1)].bits == -1)
{
DemoDone = TRUE;
break;
}
if (buf_ndx > DEMO_BUFFER_MAX - 1)
{
DemoReadBuffer();
buf_ndx = 0;
}
}
if (inputState.CheckAllInput())
DemoDone = TRUE;
if (DemoDone)
break;
cnt++;
//movethings();
domovethings();
}
// demo is over
if (DemoDone)
break;
drawscreen(Player + screenpeek);
}
}
END_SW_NS