void SoundQProcess () { fix curtime = TimerGetApproxSeconds (); if (SoundQ_channel > -1) { if (DigiIsChannelPlaying (SoundQ_channel)) return; SoundQEnd (); } if (SoundQ_num > 0) { //mprintf ((0, "SQ:%d ", SoundQ_num)); } while (SoundQ_head != SoundQ_tail) { sound_q * q = SoundQ + SoundQ_head; if (q->time_added+MAX_LIFE > curtime) { SoundQ_channel = DigiStartSound (q->soundnum, F1_0+1, 0xFFFF/2, 0, -1, -1, -1, F1_0, NULL); return; } else { // expired; remove from Queue SoundQEnd (); } } }
//for text itemP, constantly redraw cursor (to achieve flash) void CMenuItem::UpdateCursor (void) { int w, h, aw; fix time = TimerGetApproxSeconds (); int x, y; char* text = m_text; Assert (m_nType == NM_TYPE_INPUT_MENU || m_nType == NM_TYPE_INPUT); while (*text) { fontManager.Current ()->StringSize (text, w, h, aw); if (w > m_w - 10) text++; else break; } if (!*text) w = 0; x = m_x + w; y = m_y; if (time & 0x8000) GrString (x, y, CURSOR_STRING, NULL); else { CCanvas::Current ()->SetColorRGB (0, 0, 0, 255); OglDrawFilledRect (x, y, x + CCanvas::Current ()->Font ()->Width () - 1, y + CCanvas::Current ()->Font ()->Height () - 1); } }
void DigiStartSoundQueued (short soundnum, fix volume) { int i; soundnum = DigiXlatSound (soundnum); if (soundnum < 0) return; i = SoundQ_tail+1; if (i>=MAX_Q) i = 0; // Make sure its loud so it doesn't get cancelled! if (volume < F1_0+1) volume = F1_0 + 1; if (i != SoundQ_head) { SoundQ [SoundQ_tail].time_added = TimerGetApproxSeconds (); SoundQ [SoundQ_tail].soundnum = soundnum; SoundQ_num++; SoundQ_tail = i; } else { //mprintf ((0, "Sound Q full!\n")); } // Try to start it! SoundQProcess (); }
void DigiStartSoundQueued (short nSound, fix volume) { int i; tSoundQueueEntry *q; nSound = DigiXlatSound (nSound); if (nSound < 0) return; i = soundQueue.nTail+1; if (i>=MAX_SOUND_QUEUE) i = 0; // Make sure its loud so it doesn't get cancelled! if (volume < F1_0 + 1) volume = F1_0 + 1; if (i != soundQueue.nHead) { q = soundQueue.queue + soundQueue.nTail; q->time_added = TimerGetApproxSeconds (); q->nSound = nSound; soundQueue.nSounds++; soundQueue.nTail = i; } else { //mprintf ((0, "Sound Q full!\n")); } // Try to start it! SoundQProcess (); }
int NetworkWaitForAllInfo (int choice) { int pick; tMenuItem m [2]; memset (m, 0, sizeof (m)); m [0].nType = NM_TYPE_TEXT; m [0].text = (char *) "Press Escape to cancel"; networkData.bWaitAllChoice = choice; networkData.nStartWaitAllTime=TimerGetApproxSeconds (); networkData.nSecurityCheck = activeNetGames [choice].nSecurity; networkData.nSecurityFlag = 0; networkData.toWaitAllPoll = 0; do { pick = ExecMenu (NULL, TXT_CONNECTING, 1, m, NetworkWaitAllPoll, NULL); } while ((pick > -1) && (networkData.nSecurityCheck != -1)); if (networkData.nSecurityCheck == -1) { networkData.nSecurityCheck = 0; return 1; } networkData.nSecurityCheck = 0; return 0; }
void SoundQProcess () { fix curtime = TimerGetApproxSeconds (); tSoundQueueEntry *q; if (soundQueue.nChannel > -1) { if (DigiIsChannelPlaying (soundQueue.nChannel)) return; SoundQEnd (); } while (soundQueue.nHead != soundQueue.nTail) { q = soundQueue.queue + soundQueue.nHead; if (q->time_added + MAX_LIFE > curtime) { soundQueue.nChannel = DigiStartSound (q->nSound, F1_0+1, 0xFFFF/2, 0, -1, -1, -1, F1_0, NULL, NULL, 0); return; } SoundQEnd (); } }
int AutoDemoMenuCheck (CMenu& m, int& nLastKey, int nCurItem, int nState) { if (nState) return nCurItem; int curtime; PrintVersionInfo (); // Don't allow them to hit ESC in the main menu. if (nLastKey == KEY_ESC) nLastKey = 0; if (gameStates.app.bAutoDemos) { curtime = TimerGetApproxSeconds (); if (((gameStates.input.keys.xLastPressTime + I2X (/*2*/5)) < curtime) #if DBG && !gameData.speedtest.bOn #endif ) { int nDemos = NDCountDemos (); for (;;) { if ((d_rand () % (nDemos+1)) == 0) { gameStates.video.nScreenMode = -1; movieManager.PlayIntro (); songManager.Play (SONG_TITLE, 1); nLastKey = -3; //exit menu to force rebuild even if not going to game mode. -3 tells menu system not to restore SetScreenMode (SCREEN_MENU); break; } else { gameStates.input.keys.xLastPressTime = curtime; // Reset timer so that disk won't thrash if no demos. NDStartPlayback (NULL); // Randomly pick a file if (gameData.demo.nState == ND_STATE_PLAYBACK) { SetFunctionMode (FMODE_GAME); nLastKey = -3; //exit menu to get into game mode. -3 tells menu system not to restore break; } } } } } return nCurItem; }
int NetworkEndLevel (int *secret) { // Do whatever needs to be done between levels int i; fix t = TimerGetApproxSeconds (); *secret=0; //NetworkFlush (); networkData.nStatus = NETSTAT_ENDLEVEL; // We are between levels NetworkListen (); NetworkSendEndLevelPacket (); for (i = 0; i < gameData.multiplayer.nPlayers; i++) ResetPlayerTimeout (i, t); NetworkSendEndLevelPacket (); NetworkSendEndLevelPacket (); networkData.bSyncPackInited = 0; NetworkUpdateNetGame (); return 0; }
static int FindPlayerSlot (tSequencePacket *player) { if (netGame.gameFlags & NETGAME_FLAG_CLOSED) { // Slots are open but game is closed if (gameStates.multi.nGameType >= IPX_GAME) NetworkDumpPlayer ( player->player.network.ipx.server, player->player.network.ipx.node, DUMP_CLOSED); return -1; } if (gameData.multiplayer.nPlayers < gameData.multiplayer.nMaxPlayers) { // Add tPlayer in an open slot, game not full yet networkData.bPlayerAdded = 1; return gameData.multiplayer.nPlayers; } // Slots are full but game is open, see if anyone is // disconnected and replace the oldest tPlayer with this new one int oldestPlayer = -1; fix oldestTime = TimerGetApproxSeconds (); Assert (gameData.multiplayer.nPlayers == gameData.multiplayer.nMaxPlayers); for (int i = 0; i < gameData.multiplayer.nPlayers; i++) { if (!gameData.multiplayer.players [i].connected && (networkData.nLastPacketTime [i] < oldestTime)) { oldestTime = networkData.nLastPacketTime [i]; oldestPlayer = i; } } if (oldestPlayer == -1) { // Everyone is still connected if (gameStates.multi.nGameType >= IPX_GAME) NetworkDumpPlayer ( player->player.network.ipx.server, player->player.network.ipx.node, DUMP_FULL); return -1; } networkData.bPlayerAdded = 1; return oldestPlayer; }
void NetworkDoFrame (int bForce, int bListen) { tFrameInfoShort shortSyncPack; static fix xLastEndlevel = 0; int i; if (!(gameData.app.nGameMode & GM_NETWORK)) return; if ((networkData.nStatus == NETSTAT_PLAYING) && !gameStates.app.bEndLevelSequence) { // Don't send postion during escape sequence... if (nakedData.nLength) { Assert (nakedData.nDestPlayer >- 1); if (gameStates.multi.nGameType >= IPX_GAME) IPXSendPacketData (reinterpret_cast<ubyte*> (nakedData.buf), nakedData.nLength, netPlayers.players [nakedData.nDestPlayer].network.ipx.server, netPlayers.players [nakedData.nDestPlayer].network.ipx.node, gameData.multiplayer.players [nakedData.nDestPlayer].netAddress); nakedData.nLength = 0; nakedData.nDestPlayer = -1; } if (networkData.refuse.bWaitForAnswer && TimerGetApproxSeconds ()> (networkData.refuse.xTimeLimit+ (I2X (12)))) networkData.refuse.bWaitForAnswer=0; networkData.xLastSendTime += gameData.time.xFrame; networkData.xLastTimeoutCheck += gameData.time.xFrame; // Send out packet PacksPerSec times per second maximum... unless they fire, then send more often... if ((networkData.xLastSendTime > I2X (1) / PacketsPerSec ()) || (gameData.multigame.laser.bFired) || bForce || networkData.bPacketUrgent) { if (LOCALPLAYER.connected) { int nObject = LOCALPLAYER.nObject; networkData.bPacketUrgent = 0; if (bListen) { MultiSendRobotFrame (0); MultiSendFire (); // Do firing if needed.. } networkData.xLastSendTime = 0; if (netGame.bShortPackets) { #if defined (WORDS_BIGENDIAN) || defined (__BIG_ENDIAN__) ubyte send_data [MAX_PACKETSIZE]; #endif memset (&shortSyncPack, 0, sizeof (shortSyncPack)); CreateShortPos (&shortSyncPack.objPos, OBJECTS+nObject, 0); shortSyncPack.nType = PID_PDATA; shortSyncPack.nPlayer = gameData.multiplayer.nLocalPlayer; shortSyncPack.objRenderType = OBJECTS [nObject].info.renderType; shortSyncPack.nLevel = gameData.missions.nCurrentLevel; shortSyncPack.dataSize = networkData.syncPack.dataSize; memcpy (shortSyncPack.data, networkData.syncPack.data, networkData.syncPack.dataSize); networkData.syncPack.nPackets = INTEL_INT (gameData.multiplayer.players [0].nPacketsSent++); shortSyncPack.nPackets = networkData.syncPack.nPackets; #if !(defined (WORDS_BIGENDIAN) || defined (__BIG_ENDIAN__)) IpxSendGamePacket ( reinterpret_cast<ubyte*> (&shortSyncPack), sizeof (tFrameInfoShort) - networkData.nMaxXDataSize + networkData.syncPack.dataSize); #else SquishShortFrameInfo (shortSyncPack, send_data); IpxSendGamePacket ( reinterpret_cast<ubyte*> (send_data), IPX_SHORT_INFO_SIZE-networkData.nMaxXDataSize+networkData.syncPack.dataSize); #endif } else {// If long packets int send_dataSize; networkData.syncPack.nType = PID_PDATA; networkData.syncPack.nPlayer = gameData.multiplayer.nLocalPlayer; networkData.syncPack.objRenderType = OBJECTS [nObject].info.renderType; networkData.syncPack.nLevel = gameData.missions.nCurrentLevel; networkData.syncPack.nObjSeg = OBJECTS [nObject].info.nSegment; networkData.syncPack.objPos = OBJECTS [nObject].info.position.vPos; networkData.syncPack.objOrient = OBJECTS [nObject].info.position.mOrient; networkData.syncPack.physVelocity = OBJECTS [nObject].mType.physInfo.velocity; networkData.syncPack.physRotVel = OBJECTS [nObject].mType.physInfo.rotVel; send_dataSize = networkData.syncPack.dataSize; // do this so correct size data is sent #if defined (WORDS_BIGENDIAN) || defined (__BIG_ENDIAN__) // do the swap stuff if (gameStates.multi.nGameType >= IPX_GAME) { networkData.syncPack.nObjSeg = INTEL_SHORT (networkData.syncPack.nObjSeg); INTEL_VECTOR (networkData.syncPack.objPos); INTEL_MATRIX (networkData.syncPack.objOrient); INTEL_VECTOR (networkData.syncPack.physVelocity); INTEL_VECTOR (networkData.syncPack.physRotVel); networkData.syncPack.dataSize = INTEL_SHORT (networkData.syncPack.dataSize); } #endif networkData.syncPack.nPackets = INTEL_INT (gameData.multiplayer.players [0].nPacketsSent++); IpxSendGamePacket ( reinterpret_cast<ubyte*> (&networkData.syncPack), sizeof (tFrameInfo) - networkData.nMaxXDataSize + send_dataSize); } networkData.syncPack.dataSize = 0; // Start data over at 0 length. networkData.bD2XData = 0; if (gameData.reactor.bDestroyed) { if (gameStates.app.bPlayerIsDead) LOCALPLAYER.connected=3; if (TimerGetApproxSeconds () > (xLastEndlevel+ (I2X (1)/2))) { NetworkSendEndLevelPacket (); xLastEndlevel = TimerGetApproxSeconds (); } } } } if (!bListen) return; if ((networkData.xLastTimeoutCheck > I2X (1)) && !gameData.reactor.bDestroyed) { fix t = (fix) SDL_GetTicks (); // Check for CPlayerData timeouts for (i = 0; i < gameData.multiplayer.nPlayers; i++) { if ((i != gameData.multiplayer.nLocalPlayer) && ((gameData.multiplayer.players [i].connected == 1) || downloadManager.Downloading (i))) { if ((networkData.nLastPacketTime [i] == 0) || (networkData.nLastPacketTime [i] + downloadManager.GetTimeoutSecs () * 1000 > t)) { ResetPlayerTimeout (i, t); continue; } #if 1//!DBG if (gameOpts->multi.bTimeoutPlayers && (t - networkData.nLastPacketTime [i] > 15000)) NetworkTimeoutPlayer (i); #endif } } networkData.xLastTimeoutCheck = 0; } } if (!bListen) { networkData.syncPack.dataSize = 0; return; } NetworkListen (); #if 0 if ((networkData.sync.nPlayer != -1) && !(gameData.app.nFrameCount & 63)) ResendSyncDueToPacketLoss (); // This will resend to network_player_rejoining #endif NetworkDoSyncFrame (); if (NetworkIAmMaster ()) tracker.AddServer (); }
void DoRefuseStuff (tSequencePacket *their) { int i, nNewPlayer; static tTextIndex joinMsgIndex; static char szJoinMsg [200]; ClipRank ((char *) &their->player.rank); for (i = 0; i < MAX_PLAYERS; i++) if (!strcmp (their->player.callsign, gameData.multiplayer.players [i].callsign)) { NetworkWelcomePlayer (their); return; } if (FindPlayerInBanList (their->player.callsign)) return; if (!networkData.refuse.bWaitForAnswer) { DigiPlaySample (SOUND_HUD_JOIN_REQUEST, F1_0*2); #if 0 if (IsTeamGame) { if (gameOpts->multi.bNoRankings) HUDInitMessage ("%s joining", their->player.callsign); else HUDInitMessage ("%s %s wants to join", pszRankStrings [their->player.rank], their->player.callsign); HUDInitMessage ("Alt-1 assigns to team %s. Alt-2 to team %s", their->player.callsign, netGame.szTeamName [0], netGame.szTeamName [1]); } else HUDInitMessage (TXT_JOIN_ACCEPT, their->player.callsign); #else if (IsTeamGame) { char szRank [20]; if (gameOpts->multi.bNoRankings) *szRank = '\0'; else sprintf (szRank, "%s ", pszRankStrings [their->player.rank]); sprintf (szJoinMsg, " \n %s%s wants to join. \n Alt-1 assigns to team %s. \n Alt-2 to team %s. \n ", szRank, their->player.callsign, netGame.szTeamName [0], netGame.szTeamName [1]); joinMsgIndex.nLines = 5; } else { sprintf (szJoinMsg, " \n %s wants to join. \n Press F6 to accept. \n ", their->player.callsign); joinMsgIndex.nLines = 4; } joinMsgIndex.pszText = szJoinMsg; joinMsgIndex.nId = 1; gameData.messages [1].nMessages = 1; gameData.messages [1].index = gameData.messages [1].currentMsg = &joinMsgIndex; gameData.messages [1].nStartTime = gameStates.app.nSDLTicks; gameData.messages [1].nEndTime = gameStates.app.nSDLTicks + 5000; gameData.messages [1].textBuffer = NULL; gameData.messages [1].bmP = NULL; #endif strcpy (networkData.refuse.szPlayer, their->player.callsign); networkData.refuse.xTimeLimit = TimerGetApproxSeconds (); networkData.refuse.bThisPlayer = 0; networkData.refuse.bWaitForAnswer = 1; } else { if (strcmp (their->player.callsign, networkData.refuse.szPlayer)) return; if (networkData.refuse.bThisPlayer) { networkData.refuse.xTimeLimit = 0; networkData.refuse.bThisPlayer = 0; networkData.refuse.bWaitForAnswer = 0; if (IsTeamGame) { nNewPlayer = GetNewPlayerNumber (their); Assert (networkData.refuse.bTeam == 1 || networkData.refuse.bTeam == 2); if (networkData.refuse.bTeam == 1) netGame.teamVector &= ~(1 << nNewPlayer); else netGame.teamVector |= (1 << nNewPlayer); NetworkWelcomePlayer (their); NetworkSendNetgameUpdate (); } else NetworkWelcomePlayer (their); return; } if ((TimerGetApproxSeconds ()) > networkData.refuse.xTimeLimit + REFUSE_INTERVAL) { networkData.refuse.xTimeLimit = 0; networkData.refuse.bThisPlayer = 0; networkData.refuse.bWaitForAnswer = 0; if (!strcmp (their->player.callsign, networkData.refuse.szPlayer)) { if (gameStates.multi.nGameType >= IPX_GAME) NetworkDumpPlayer ( their->player.network.ipx.server, their->player.network.ipx.node, DUMP_DORK); } return; } } }
void ScoreTableView (int bNetwork) { int i, k, done, choice, nInMenu; uint entryTime = SDL_GetTicks (); int key; int oldstates [MAX_PLAYERS]; int previousSeconds_left = -1; int nReady,nEscaped; int bRedraw = 0; gameStates.menus.nInMenu++; gameStates.app.bGameRunning = 0; bNetwork = gameData.app.nGameMode & GM_NETWORK; for (i = 0; i < MAX_NUM_NET_PLAYERS; i++) audio.DestroyObjectSound (gameData.multiplayer.players [i].nObject); SetScreenMode (SCREEN_MENU); gameData.score.bWaitingForOthers = 0; //@@GrPaletteFadeIn (grPalette,32, 0); GameFlushInputs (); done = 0; for (i = 0; i < gameData.multiplayer.nPlayers; i++) oldstates [i] = gameData.multiplayer.players [i].connected; if (bNetwork) NetworkEndLevel (&key); backgroundManager.LoadStars (true); while (!done) { if (!bRedraw || (ogl.m_states.nDrawBuffer == GL_BACK)) { backgroundManager.Redraw (); ScoreTableRedraw (); bRedraw = 1; } gameData.score.nKillsChanged = 0; for (i = 0; i < 4; i++) if (JoyGetButtonDownCnt (i)) { if (LAST_OEM_LEVEL) { ScoreTableQuit (1, bNetwork); return; } LOCALPLAYER.connected = 7; if (bNetwork) NetworkSendEndLevelPacket (); break; } for (i = 0; i < 3; i++) if (MouseButtonDownCount (i)) { if (LAST_OEM_LEVEL) { ScoreTableQuit (1, bNetwork); return; } LOCALPLAYER.connected=7; if (bNetwork) NetworkSendEndLevelPacket (); break; } //see if redbook song needs to be restarted redbook.CheckRepeat (); k = KeyInKey (); switch (k) { case KEY_ENTER: case KEY_SPACEBAR: if ((gameData.app.nGameMode & GM_SERIAL) || (gameData.app.nGameMode & GM_MODEM)) { done=1; break; } if (LAST_OEM_LEVEL) { ScoreTableQuit (1, bNetwork); return; } gameData.multiplayer.players [gameData.multiplayer.nLocalPlayer].connected = 7; if (bNetwork) NetworkSendEndLevelPacket (); break; case KEY_ESC: if (gameData.app.nGameMode & GM_NETWORK) { gameData.multiplayer.xStartAbortMenuTime = TimerGetApproxSeconds (); nInMenu = gameStates.menus.nInMenu; gameStates.menus.nInMenu = 0; choice = MsgBox (NULL, NetworkEndLevelPoll3, NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME); gameStates.menus.nInMenu = nInMenu; } else nInMenu = gameStates.menus.nInMenu; gameStates.menus.nInMenu = 0; choice = MsgBox (NULL, NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME); gameStates.menus.nInMenu = nInMenu; if (choice == 0) { ScoreTableQuit (1, bNetwork); return; } gameData.score.nKillsChanged = 1; break; case KEY_PRINT_SCREEN: SaveScreenShot (NULL, 0); break; case KEY_BACKSPACE: Int3 (); break; default: break; } if ((SDL_GetTicks () >= entryTime + MAX_VIEW_TIME) && (LOCALPLAYER.connected != 7)) { if (LAST_OEM_LEVEL) { ScoreTableQuit (1, bNetwork); return; } if ((gameData.app.nGameMode & GM_SERIAL) || (gameData.app.nGameMode & GM_MODEM)) { done = 1; break; } LOCALPLAYER.connected = 7; if (bNetwork) NetworkSendEndLevelPacket (); } if (bNetwork && (gameData.app.nGameMode & GM_NETWORK)) { CMenu m (1); m.AddGauge ("", -1, 1000); //dummy for NetworkEndLevelPoll2() NetworkEndLevelPoll2 (m, key, 0, 0); for (nEscaped = 0, nReady = 0, i = 0; i < gameData.multiplayer.nPlayers; i++) { if (gameData.multiplayer.players [i].connected && (i != gameData.multiplayer.nLocalPlayer)) { // Check timeout for idle players if (SDL_GetTicks () > (uint) networkData.nLastPacketTime [i] + ENDLEVEL_IDLE_TIME) { #if TRACE console.printf (CON_DBG, "idle timeout for CPlayerData %d.\n", i); #endif gameData.multiplayer.players [i].connected = 0; NetworkSendEndLevelSub (i); } } if (gameData.multiplayer.players [i].connected != oldstates [i]) { if (szConditionLetters [gameData.multiplayer.players [i].connected] != szConditionLetters [oldstates [i]]) gameData.score.nKillsChanged = 1; oldstates [i] = gameData.multiplayer.players [i].connected; NetworkSendEndLevelPacket (); } if ((gameData.multiplayer.players [i].connected == 0) || (gameData.multiplayer.players [i].connected == 7)) nReady++; if (gameData.multiplayer.players [i].connected != 1) nEscaped++; } if (nReady >= gameData.multiplayer.nPlayers) done = 1; if (nEscaped >= gameData.multiplayer.nPlayers) gameData.reactor.countdown.nSecsLeft = -1; if (previousSeconds_left != gameData.reactor.countdown.nSecsLeft) { previousSeconds_left = gameData.reactor.countdown.nSecsLeft; gameData.score.nKillsChanged=1; } if (gameData.score.nKillsChanged) { ScoreTableRedraw (); gameData.score.nKillsChanged = 0; } } } LOCALPLAYER.connected = 7; // Restore background and exit paletteManager.DisableEffect (); GameFlushInputs (); ScoreTableQuit (0, bNetwork); }
void ScoreTableView (int bNetwork) { int i, k, done,choice; fix entryTime = TimerGetApproxSeconds (); int key; int oldstates [MAX_PLAYERS]; int previousSeconds_left=-1; int nReady,nEscaped; int bRedraw = 0; bkg bg; gameStates.menus.nInMenu++; gameStates.app.bGameRunning = 0; memset (&bg, 0, sizeof (bg)); bNetwork = gameData.app.nGameMode & GM_NETWORK; for (i = 0; i < MAX_NUM_NET_PLAYERS; i++) DigiKillSoundLinkedToObject (gameData.multiplayer.players [i].nObject); SetScreenMode (SCREEN_MENU); gameData.score.bWaitingForOthers = 0; //@@GrPaletteFadeIn (grPalette,32, 0); GameFlushInputs (); done = 0; for (i = 0; i < gameData.multiplayer.nPlayers; i++) oldstates [i] = gameData.multiplayer.players [i].connected; if (bNetwork) NetworkEndLevel (&key); while (!done) { if (!bRedraw || (curDrawBuffer == GL_BACK)) { LoadStars (&bg, bRedraw); ScoreTableRedraw (); bRedraw = 1; } gameData.score.nKillsChanged = 0; for (i = 0; i < 4; i++) if (JoyGetButtonDownCnt (i)) { if (LAST_OEM_LEVEL) { ScoreTableQuit (&bg, 1, bNetwork); return; } LOCALPLAYER.connected = 7; if (bNetwork) NetworkSendEndLevelPacket (); break; } for (i = 0; i < 3; i++) if (MouseButtonDownCount (i)) { if (LAST_OEM_LEVEL) { ScoreTableQuit (&bg, 1, bNetwork); return; } LOCALPLAYER.connected=7; if (bNetwork) NetworkSendEndLevelPacket (); break; } //see if redbook song needs to be restarted SongsCheckRedbookRepeat (); k = KeyInKey (); switch (k) { case KEY_ENTER: case KEY_SPACEBAR: if ((gameData.app.nGameMode & GM_SERIAL) || (gameData.app.nGameMode & GM_MODEM)) { done=1; break; } if (LAST_OEM_LEVEL) { ScoreTableQuit (&bg, 1, bNetwork); return; } gameData.multiplayer.players [gameData.multiplayer.nLocalPlayer].connected = 7; if (bNetwork) NetworkSendEndLevelPacket (); break; case KEY_ESC: if (gameData.app.nGameMode & GM_NETWORK) { gameData.multiplayer.xStartAbortMenuTime = TimerGetApproxSeconds (); choice=ExecMessageBox1 (NULL, NetworkEndLevelPoll3, NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME); } else choice=ExecMessageBox (NULL, NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME); if (choice == 0) { ScoreTableQuit (&bg, 1, bNetwork); return; } gameData.score.nKillsChanged=1; break; case KEY_PRINT_SCREEN: SaveScreenShot (NULL, 0); break; case KEY_BACKSP: Int3 (); break; default: break; } if ((TimerGetApproxSeconds () >= entryTime + MAX_VIEW_TIME) && (LOCALPLAYER.connected != 7)) { if (LAST_OEM_LEVEL) { ScoreTableQuit (&bg, 1, bNetwork); return; } if ((gameData.app.nGameMode & GM_SERIAL) || (gameData.app.nGameMode & GM_MODEM)) { done=1; break; } LOCALPLAYER.connected = 7; if (bNetwork) NetworkSendEndLevelPacket (); } if (bNetwork && (gameData.app.nGameMode & GM_NETWORK)) { NetworkEndLevelPoll2 (0, NULL, &key, 0); for (nEscaped = 0, nReady = 0, i = 0; i < gameData.multiplayer.nPlayers; i++) { if (gameData.multiplayer.players [i].connected && i!=gameData.multiplayer.nLocalPlayer) { // Check timeout for idle players if (TimerGetApproxSeconds () > networkData.nLastPacketTime [i]+ENDLEVEL_IDLE_TIME) { #if TRACE con_printf (CONDBG, "idle timeout for tPlayer %d.\n", i); #endif gameData.multiplayer.players [i].connected = 0; NetworkSendEndLevelSub (i); } } if (gameData.multiplayer.players [i].connected!=oldstates [i]) { if (szConditionLetters [gameData.multiplayer.players [i].connected] != szConditionLetters [oldstates [i]]) gameData.score.nKillsChanged = 1; oldstates [i] = gameData.multiplayer.players [i].connected; NetworkSendEndLevelPacket (); } if (gameData.multiplayer.players [i].connected==0 || gameData.multiplayer.players [i].connected==7) nReady++; if (gameData.multiplayer.players [i].connected!=1) nEscaped++; } if (nReady >= gameData.multiplayer.nPlayers) done = 1; if (nEscaped >= gameData.multiplayer.nPlayers) gameData.reactor.countdown.nSecsLeft = -1; if (previousSeconds_left != gameData.reactor.countdown.nSecsLeft) { previousSeconds_left = gameData.reactor.countdown.nSecsLeft; gameData.score.nKillsChanged=1; } if (gameData.score.nKillsChanged) { ScoreTableRedraw (); gameData.score.nKillsChanged = 0; } } } LOCALPLAYER.connected = 7; // Restore background and exit GrPaletteFadeOut (NULL, 32, 0); GameFlushInputs (); ScoreTableQuit (&bg, 0, bNetwork); }