void kmatrix_view (int network) { int i, k, done,choice; fix entryTime = TimerGetApproxSeconds (); int key; int oldstates [MAX_PLAYERS]; int previous_seconds_left=-1; int nReady,nEscaped; int bRedraw = 0; bkg bg; gameStates.menus.nInMenu++; gameStates.app.bGameRunning = 0; memset (&bg, 0, sizeof (bg)); network=gameData.app.nGameMode & GM_NETWORK; for (i=0;i<MAX_NUM_NET_PLAYERS;i++) DigiKillSoundLinkedToObject (gameData.multi.players [i].nObject); SetScreenMode (SCREEN_MENU); WaitingForOthers=0; //@@GrPaletteFadeIn (grPalette,32, 0); GameFlushInputs (); done = 0; for (i = 0; i < gameData.multi.nPlayers; i++) oldstates [i] = gameData.multi.players [i].connected; if (network) NetworkEndLevel (&key); while (!done) { if (!bRedraw || (curDrawBuffer == GL_BACK)) { LoadStars (&bg, bRedraw); kmatrix_redraw (); bRedraw = 1; } kmatrixKills_changed = 0; for (i = 0; i < 4; i++) if (joy_get_button_down_cnt (i)) { if (LAST_OEM_LEVEL) { KMatrixQuit (&bg, 1, network); return; } gameData.multi.players [gameData.multi.nLocalPlayer].connected = 7; if (network) NetworkSendEndLevelPacket (); break; } for (i = 0; i < 3; i++) if (MouseButtonDownCount (i)) { if (LAST_OEM_LEVEL) { KMatrixQuit (&bg, 1, network); return; } gameData.multi.players [gameData.multi.nLocalPlayer].connected=7; if (network) 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) { KMatrixQuit (&bg, 1, network); return; } gameData.multi.players [gameData.multi.nLocalPlayer].connected = 7; if (network) NetworkSendEndLevelPacket (); break; case KEY_ESC: if (gameData.app.nGameMode & GM_NETWORK) { gameData.multi.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) { KMatrixQuit (&bg, 1, network); return; } kmatrixKills_changed=1; break; case KEY_PRINT_SCREEN: SaveScreenShot (NULL, 0); break; case KEY_BACKSP: Int3 (); break; default: break; } if ((TimerGetApproxSeconds () >= entryTime + MAX_VIEW_TIME) && (gameData.multi.players [gameData.multi.nLocalPlayer].connected != 7)) { if (LAST_OEM_LEVEL) { KMatrixQuit (&bg, 1, network); return; } if ((gameData.app.nGameMode & GM_SERIAL) || (gameData.app.nGameMode & GM_MODEM)) { done=1; break; } gameData.multi.players [gameData.multi.nLocalPlayer].connected = 7; if (network) NetworkSendEndLevelPacket (); } if (network && (gameData.app.nGameMode & GM_NETWORK)) { NetworkEndLevelPoll2 (0, NULL, &key, 0); for (nEscaped = 0, nReady = 0, i = 0; i < gameData.multi.nPlayers; i++) { if (gameData.multi.players [i].connected && i!=gameData.multi.nLocalPlayer) { // Check timeout for idle players if (TimerGetApproxSeconds () > networkData.nLastPacketTime [i]+ENDLEVEL_IDLE_TIME) { #if TRACE con_printf (CON_DEBUG, "idle timeout for player %d.\n", i); #endif gameData.multi.players [i].connected = 0; NetworkSendEndLevelSub (i); } } if (gameData.multi.players [i].connected!=oldstates [i]) { if (ConditionLetters [gameData.multi.players [i].connected] != ConditionLetters [oldstates [i]]) kmatrixKills_changed = 1; oldstates [i] = gameData.multi.players [i].connected; NetworkSendEndLevelPacket (); } if (gameData.multi.players [i].connected==0 || gameData.multi.players [i].connected==7) nReady++; if (gameData.multi.players [i].connected!=1) nEscaped++; } if (nReady >= gameData.multi.nPlayers) done = 1; if (nEscaped >= gameData.multi.nPlayers) gameData.reactor.countdown.nSecsLeft = -1; if (previous_seconds_left != gameData.reactor.countdown.nSecsLeft) { previous_seconds_left = gameData.reactor.countdown.nSecsLeft; kmatrixKills_changed=1; } if (kmatrixKills_changed) { kmatrix_redraw (); kmatrixKills_changed = 0; } } } gameData.multi.players [gameData.multi.nLocalPlayer].connected = 7; // Restore background and exit GrPaletteFadeOut (NULL, 32, 0); GameFlushInputs (); KMatrixQuit (&bg, 0, network); }
int kmatrix_handler(window *wind, d_event *event, kmatrix_screen *km) { int i = 0, k = 0, choice = 0; switch (event->type) { case EVENT_KEY_COMMAND: k = event_key_get(event); switch( k ) { case KEY_ESC: if (km->network) { StartAbortMenuTime=timer_query(); choice=nm_messagebox1( NULL,multi_endlevel_poll2, NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME ); } else choice=nm_messagebox( NULL, 2, TXT_YES, TXT_NO, TXT_ABORT_GAME ); if (choice==0) { Players[Player_num].connected=CONNECT_DISCONNECTED; if (km->network) multi_send_endlevel_packet(); multi_leave_game(); window_close(wind); if (Game_wind) window_close(Game_wind); return 1; } return 1; default: break; } break; case EVENT_WINDOW_DRAW: timer_delay2(50); if (km->network) multi_do_protocol_frame(0, 1); km->playing = 0; // Check if all connected players are also looking at this screen ... for (i = 0; i < MAX_PLAYERS; i++) if (Players[i].connected) if (Players[i].connected != CONNECT_END_MENU && Players[i].connected != CONNECT_DIED_IN_MINE) km->playing = 1; // ... and let the reactor blow sky high! if (!km->playing) Countdown_seconds_left = -1; // If Reactor is finished and end_time not inited, set the time when we will exit this loop if (km->end_time == -1 && Countdown_seconds_left < 0 && !km->playing) km->end_time = timer_query() + (KMATRIX_VIEW_SEC * F1_0); // Check if end_time has been reached and exit loop if (timer_query() >= km->end_time && km->end_time != -1) { if (km->network) multi_send_endlevel_packet(); // make sure if (is_D2_OEM) { if (Current_level_num==8) { Players[Player_num].connected=CONNECT_DISCONNECTED; if (km->network) multi_send_endlevel_packet(); multi_leave_game(); window_close(wind); if (Game_wind) window_close(Game_wind); return 0; } } window_close(wind); break; } kmatrix_redraw(km); if (km->playing) kmatrix_status_msg(Countdown_seconds_left, 1); else kmatrix_status_msg(f2i(timer_query()-km->end_time), 0); break; case EVENT_WINDOW_CLOSE: game_flush_inputs(); newmenu_free_background(); break; default: break; } return 0; }