示例#1
0
文件: kmatrix.c 项目: paud/d2x-xl
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);
}
示例#2
0
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;
}