mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
Merged Multiplayer UI patch from Zathras:
New Features - Added hits, misses, accuracy to scoreboard - Added in-game chat with history - Added more options from the ini to the host screen, Use NIV and Enable civillians bugfixes - Clients connecting at the same time controlling the wrong client - Team Deathmatch working again - Refreshing the player list after a player changes team / edge - AI is always on for Co-op now - There is now always a scoreboard in Co-op even when you lose. - scores on the Co-op scoreboard have been fixed for all deaths including bleeding - Start Game button now only appears for server - Fixed cleaning up game resources on disconnection - Disabled the 1,2,3,4 keys for connecting / disconnecting - Fixed victory conditions for all game modes - Fixed players names getting copied into TeamTurnString each game resulting in multiple names - Fixed Assertion bug caused by the game sometimes calling SetCurrentWorldSector more than once before placement of mercs - Fixed a bug that was possible when merging items such as M14 and EBR stock on mapscreen. - Fixed bug with game starting while a player was in chat, closes chat window when game is starting - Fixed bug with game starting while a player was in the options screen, if the player leaves the mapscreen while ready, they are set to unready - Team and Spawn direction popups changed to use buttons to open/close them - Disabled players joining after the laptop has been unlocked, as they would be out of state with any hires git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2628 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -0,0 +1,642 @@
|
||||
#ifdef PRECOMPILEDHEADERS
|
||||
#include "JA2 All.h"
|
||||
#include "Intro.h"
|
||||
#else
|
||||
#include "Types.h"
|
||||
#include "MPScoreScreen.h"
|
||||
#include "GameSettings.h"
|
||||
#include "Utilities.h"
|
||||
#include "wCheck.h"
|
||||
#include "Font Control.h"
|
||||
#include "WordWrap.h"
|
||||
#include "Render Dirty.h"
|
||||
#include "Input.h"
|
||||
#include "Options Screen.h"
|
||||
#include "English.h"
|
||||
#include "Sysutil.h"
|
||||
#include "Fade Screen.h"
|
||||
#include "Cursor Control.h"
|
||||
#include "Music Control.h"
|
||||
#include "cursors.h"
|
||||
#include "Intro.h"
|
||||
#include "Text.h"
|
||||
#include "Text Input.h"
|
||||
#include "_Ja25EnglishText.h"
|
||||
#include "Soldier Profile.h"
|
||||
#endif
|
||||
|
||||
#include "gameloop.h"
|
||||
#include "Game Init.h"
|
||||
#include "connect.h"
|
||||
#include "network.h" // for client name
|
||||
#include "saveloadscreen.h"
|
||||
|
||||
|
||||
////////////////////////////////////////////
|
||||
//
|
||||
// Global Defines
|
||||
//
|
||||
///////////////////////////////////////////
|
||||
|
||||
#define MPS_TITLE_FONT FONT14ARIAL//FONT16ARIAL
|
||||
#define MPS_TITLE_COLOR FONT_MCOLOR_WHITE
|
||||
|
||||
#define MPS_LABEL_TEXT_FONT FONT12ARIAL//FONT16ARIAL
|
||||
#define MPS_LABEL_TEXT_COLOR FONT_MCOLOR_WHITE
|
||||
|
||||
//buttons
|
||||
#define MPS_BTN_CONTINUE_X iScreenWidthOffset + 320 + 143
|
||||
#define MPS_BTN_CONTINUE_Y iScreenHeightOffset + 435
|
||||
//#define MPJ_BTN_HOST_X MPJ_BTN_JOIN_X-180
|
||||
//#define MPJ_BTN_HOST_Y iScreenHeightOffset + 435
|
||||
#define MPS_BTN_CANCEL_X iScreenWidthOffset + ((320 - 115) / 2)
|
||||
#define MPS_BTN_CANCEL_Y MPS_BTN_CONTINUE_Y
|
||||
|
||||
//main title
|
||||
#define MPS_MAIN_TITLE_X 0
|
||||
#define MPS_MAIN_TITLE_Y iScreenHeightOffset + 10
|
||||
#define MPS_MAIN_TITLE_WIDTH SCREEN_WIDTH
|
||||
|
||||
//labels
|
||||
#define MPS_LABEL_PLAYER_X iScreenWidthOffset + 80
|
||||
#define MPS_LABEL_PLAYER_Y iScreenHeightOffset + 80
|
||||
#define MPS_LABEL_PLAYER_WIDTH 80
|
||||
#define MPS_LABEL_KILLS_X MPS_LABEL_PLAYER_X + MPS_LABEL_PLAYER_WIDTH + 20
|
||||
#define MPS_LABEL_KILLS_Y MPS_LABEL_PLAYER_Y
|
||||
#define MPS_LABEL_KILLS_WIDTH 50
|
||||
#define MPS_LABEL_DEATHS_X MPS_LABEL_KILLS_X + MPS_LABEL_KILLS_WIDTH + 20
|
||||
#define MPS_LABEL_DEATHS_Y MPS_LABEL_PLAYER_Y
|
||||
#define MPS_LABEL_DEATHS_WIDTH 50
|
||||
#define MPS_LABEL_HITS_X MPS_LABEL_DEATHS_X + MPS_LABEL_DEATHS_WIDTH + 20
|
||||
#define MPS_LABEL_HITS_Y MPS_LABEL_PLAYER_Y
|
||||
#define MPS_LABEL_HITS_WIDTH 50
|
||||
#define MPS_LABEL_MISSES_X MPS_LABEL_HITS_X + MPS_LABEL_HITS_WIDTH + 20
|
||||
#define MPS_LABEL_MISSES_Y MPS_LABEL_PLAYER_Y
|
||||
#define MPS_LABEL_MISSES_WIDTH 50
|
||||
#define MPS_LABEL_ACCURACY_X MPS_LABEL_MISSES_X + MPS_LABEL_MISSES_WIDTH + 20
|
||||
#define MPS_LABEL_ACCURACY_Y MPS_LABEL_PLAYER_Y
|
||||
#define MPS_LABEL_ACCURACY_WIDTH 70
|
||||
|
||||
|
||||
#define MPS_PLAYERLIST_Y MPS_LABEL_PLAYER_Y + 30
|
||||
#define MPS_PLAYER_GAP 17
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
///////////////////////////////////////////
|
||||
|
||||
BOOLEAN gfMPSScreenEntry = TRUE;
|
||||
BOOLEAN gfMPSScreenExit = FALSE;
|
||||
BOOLEAN gfReRenderMPSScreen=TRUE;
|
||||
BOOLEAN gfMPSButtonsAllocated = FALSE;
|
||||
|
||||
//enum for different states of screen
|
||||
enum
|
||||
{
|
||||
MPS_NOTHING,
|
||||
MPS_CANCEL,
|
||||
MPS_CONTINUE,
|
||||
};
|
||||
|
||||
UINT8 gubMPSScreenHandler=MPS_NOTHING; // State changer for HandleMPJScreen()
|
||||
|
||||
UINT32 gubMPSExitScreen = MP_SCORE_SCREEN; // The screen that is in control next iteration of the game_loop
|
||||
|
||||
UINT32 guiMPSMainBackGroundImage;
|
||||
|
||||
////////////////////////////////////////////
|
||||
//
|
||||
// Screen Controls
|
||||
//
|
||||
///////////////////////////////////////////
|
||||
|
||||
// Cancel Button
|
||||
void BtnMPSCancelCallback(GUI_BUTTON *btn,INT32 reason);
|
||||
UINT32 guiMPSCancelButton;
|
||||
INT32 giMPSCancelBtnImage;
|
||||
|
||||
// Continue Button
|
||||
void BtnMPSContinueCallback(GUI_BUTTON *btn,INT32 reason);
|
||||
UINT32 guiMPSContinueButton;
|
||||
INT32 giMPSContinueBtnImage;
|
||||
|
||||
// Message Box handle
|
||||
INT8 giMPSMessageBox = -1;
|
||||
|
||||
|
||||
////////////////////////////////////////////
|
||||
//
|
||||
// Local Function Prototypes
|
||||
//
|
||||
///////////////////////////////////////////
|
||||
|
||||
extern void ClearMainMenu();
|
||||
|
||||
BOOLEAN EnterMPSScreen();
|
||||
BOOLEAN ExitMPSScreen();
|
||||
void HandleMPSScreen();
|
||||
BOOLEAN RenderMPSScreen();
|
||||
|
||||
void GetMPSScreenUserInput();
|
||||
void DoneFadeOutForExitMPSScreen( void );
|
||||
void DoneFadeInForExitMPSScreen( void );
|
||||
|
||||
UINT32 MPScoreScreenInit( void )
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
||||
UINT32 MPScoreScreenHandle( void )
|
||||
{
|
||||
StartFrameBufferRender();
|
||||
|
||||
if( gfMPSScreenEntry )
|
||||
{
|
||||
// PauseGame();
|
||||
|
||||
EnterMPSScreen();
|
||||
gfMPSScreenEntry = FALSE;
|
||||
gfMPSScreenExit = FALSE;
|
||||
InvalidateRegion( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
|
||||
}
|
||||
|
||||
GetMPSScreenUserInput();
|
||||
|
||||
|
||||
HandleMPSScreen();
|
||||
|
||||
// render buttons marked dirty
|
||||
MarkButtonsDirty( );
|
||||
RenderButtons( );
|
||||
|
||||
// render text boxes
|
||||
RenderAllTextFields(); // textbox system call
|
||||
|
||||
// render help
|
||||
// RenderFastHelp( );
|
||||
// RenderButtonsFastHelp( );
|
||||
|
||||
|
||||
ExecuteBaseDirtyRectQueue();
|
||||
EndFrameBufferRender();
|
||||
|
||||
// handle fades in and out
|
||||
if ( HandleFadeOutCallback( ) )
|
||||
{
|
||||
ClearMainMenu();
|
||||
return( gubMPSExitScreen );
|
||||
}
|
||||
|
||||
if ( HandleBeginFadeOut( gubMPSExitScreen ) )
|
||||
{
|
||||
return( gubMPSExitScreen );
|
||||
}
|
||||
|
||||
if ( HandleFadeInCallback( ) )
|
||||
{
|
||||
// Re-render the scene!
|
||||
RenderMPSScreen();
|
||||
}
|
||||
|
||||
if ( HandleBeginFadeIn( gubMPSExitScreen ) )
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
if( gfMPSScreenExit ) // we are exiting this screen
|
||||
{
|
||||
ExitMPSScreen(); // perform destruction
|
||||
}
|
||||
|
||||
return( gubMPSExitScreen );
|
||||
} // end MPScoreScreenHandle()
|
||||
|
||||
UINT32 MPScoreScreenShutdown( void )
|
||||
{
|
||||
return( 1 );
|
||||
}
|
||||
|
||||
BOOLEAN EnterMPSScreen()
|
||||
{
|
||||
VOBJECT_DESC VObjectDesc;
|
||||
UINT16 cnt;
|
||||
UINT16 usPosY;
|
||||
|
||||
if( gfMPSButtonsAllocated )
|
||||
return( TRUE );
|
||||
|
||||
SetCurrentCursorFromDatabase( CURSOR_NORMAL );
|
||||
|
||||
// load the Main trade screen backgroiund image
|
||||
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
|
||||
|
||||
if (iResolution == 0)
|
||||
{
|
||||
FilenameForBPP("INTERFACE\\OptionsScreenBackGround.sti", VObjectDesc.ImageFile);
|
||||
}
|
||||
else if (iResolution == 1)
|
||||
{
|
||||
FilenameForBPP("INTERFACE\\OptionsScreenBackGround_800x600.sti", VObjectDesc.ImageFile);
|
||||
}
|
||||
else if (iResolution == 2)
|
||||
{
|
||||
FilenameForBPP("INTERFACE\\OptionsScreenBackGround_1024x768.sti", VObjectDesc.ImageFile);
|
||||
}
|
||||
|
||||
CHECKF(AddVideoObject(&VObjectDesc, &guiMPSMainBackGroundImage ));
|
||||
|
||||
//Cancel button
|
||||
giMPSCancelBtnImage = LoadButtonImage("INTERFACE\\PreferencesButtons.sti", -1,0,-1,2,-1 );
|
||||
guiMPSCancelButton = CreateIconAndTextButton( giMPSCancelBtnImage, gzMPSScreenText[MPS_CANCEL_TEXT], OPT_BUTTON_FONT,
|
||||
OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
|
||||
OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
|
||||
TEXT_CJUSTIFIED,
|
||||
MPS_BTN_CANCEL_X, MPS_BTN_CANCEL_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
||||
DEFAULT_MOVE_CALLBACK, BtnMPSCancelCallback);
|
||||
|
||||
SpecifyButtonSoundScheme( guiMPSCancelButton, BUTTON_SOUND_SCHEME_BIGSWITCH3 );
|
||||
SpecifyDisabledButtonStyle( guiMPSCancelButton, DISABLED_STYLE_NONE );
|
||||
|
||||
//Continue button
|
||||
giMPSContinueBtnImage = UseLoadedButtonImage( giMPSCancelBtnImage, -1,1,-1,3,-1 );
|
||||
guiMPSContinueButton = CreateIconAndTextButton( giMPSContinueBtnImage, gzMPSScreenText[MPS_CONTINUE_TEXT], OPT_BUTTON_FONT,
|
||||
OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
|
||||
OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
|
||||
TEXT_CJUSTIFIED,
|
||||
MPS_BTN_CONTINUE_X, MPS_BTN_CONTINUE_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
|
||||
DEFAULT_MOVE_CALLBACK, BtnMPSContinueCallback);
|
||||
|
||||
SpecifyButtonSoundScheme( guiMPSContinueButton, BUTTON_SOUND_SCHEME_BIGSWITCH3 );
|
||||
SpecifyDisabledButtonStyle( guiMPSContinueButton, DISABLED_STYLE_NONE );
|
||||
|
||||
//Reset the exit screen - screen the main game loop will call next iteration
|
||||
gubMPSExitScreen = MP_SCORE_SCREEN;
|
||||
|
||||
//REnder the screen once so we can blt ot to ths save buffer
|
||||
RenderMPSScreen();
|
||||
|
||||
BlitBufferToBuffer(guiRENDERBUFFER, guiSAVEBUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
|
||||
|
||||
gfMPSButtonsAllocated = TRUE;
|
||||
|
||||
return( TRUE );
|
||||
|
||||
} // End of EnterMPSScreen()
|
||||
|
||||
|
||||
BOOLEAN ExitMPSScreen()
|
||||
{
|
||||
UINT16 cnt;
|
||||
|
||||
if( !gfMPSButtonsAllocated )
|
||||
return( TRUE );
|
||||
|
||||
//Delete the main options screen background
|
||||
DeleteVideoObjectFromIndex( guiMPSMainBackGroundImage );
|
||||
|
||||
RemoveButton( guiMPSContinueButton );
|
||||
RemoveButton( guiMPSCancelButton );
|
||||
|
||||
|
||||
UnloadButtonImage( giMPSCancelBtnImage );
|
||||
UnloadButtonImage( giMPSContinueBtnImage );
|
||||
|
||||
// exit text input mode in this screen and clean up text boxes
|
||||
//KillAllTextInputModes();
|
||||
SetTextInputCursor( CURSOR_IBEAM );
|
||||
|
||||
gfMPSButtonsAllocated = FALSE;
|
||||
|
||||
//If we are starting the game stop playing the music
|
||||
if( gubMPSScreenHandler == MPS_CONTINUE )
|
||||
SetMusicMode( MUSIC_NONE );
|
||||
|
||||
gfMPSScreenExit = FALSE;
|
||||
gfMPSScreenEntry = TRUE;
|
||||
|
||||
return( TRUE );
|
||||
|
||||
} // End of ExitMPJScreen()
|
||||
|
||||
|
||||
void HandleMPSScreen()
|
||||
{
|
||||
if( gubMPSScreenHandler != MPS_NOTHING )
|
||||
{
|
||||
switch( gubMPSScreenHandler )
|
||||
{
|
||||
case MPS_CANCEL:
|
||||
gubMPSExitScreen = MAINMENU_SCREEN;
|
||||
gfMPSScreenExit = TRUE;
|
||||
break;
|
||||
|
||||
/*case MPJ_HOST:
|
||||
gubMPJExitScreen = MP_HOST_SCREEN;
|
||||
gfMPJScreenExit = TRUE;
|
||||
break;*/
|
||||
|
||||
|
||||
case MPS_CONTINUE:
|
||||
{
|
||||
//if we are already fading out, get out of here
|
||||
if( gFadeOutDoneCallback != DoneFadeOutForExitMPSScreen )
|
||||
{
|
||||
//Disable the ok button
|
||||
DisableButton( guiMPSCancelButton );
|
||||
DisableButton( guiMPSContinueButton );
|
||||
|
||||
gFadeOutDoneCallback = DoneFadeOutForExitMPSScreen;
|
||||
|
||||
FadeOutNextFrame( );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
gubMPSScreenHandler = MPS_NOTHING;
|
||||
}
|
||||
|
||||
|
||||
if( gfReRenderMPSScreen )
|
||||
{
|
||||
RenderMPSScreen();
|
||||
gfReRenderMPSScreen = FALSE;
|
||||
}
|
||||
|
||||
// <TODO> add restore backgrounds in...
|
||||
//RestoreGIOButtonBackGrounds();
|
||||
} // end of HandleMPJScreen
|
||||
|
||||
|
||||
BOOLEAN RenderMPSScreen()
|
||||
{
|
||||
HVOBJECT hPixHandle;
|
||||
UINT16 usPosY;
|
||||
|
||||
//Get the main background screen graphic and blt it
|
||||
GetVideoObject(&hPixHandle, guiMPSMainBackGroundImage );
|
||||
BltVideoObject(FRAME_BUFFER, hPixHandle, 0,0,0, VO_BLT_SRCTRANSPARENCY,NULL);
|
||||
|
||||
//Shade the background
|
||||
ShadowVideoSurfaceRect( FRAME_BUFFER, iScreenWidthOffset, iScreenHeightOffset, iScreenWidthOffset + 640, iScreenHeightOffset + 480 );
|
||||
|
||||
//Display the title
|
||||
DrawTextToScreen( gzMPSScreenText[ MPS_TITLE_TEXT ], MPS_MAIN_TITLE_X, MPS_MAIN_TITLE_Y, MPS_MAIN_TITLE_WIDTH, MPS_TITLE_FONT, MPS_TITLE_COLOR, FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
|
||||
|
||||
// Player Column
|
||||
DisplayWrappedString( MPS_LABEL_PLAYER_X, MPS_LABEL_PLAYER_Y, MPS_LABEL_PLAYER_WIDTH, 2, MPS_TITLE_FONT, MPS_TITLE_COLOR, gzMPSScreenText[ MPS_PLAYER_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
// Kills Column
|
||||
DisplayWrappedString( MPS_LABEL_KILLS_X, MPS_LABEL_KILLS_Y, MPS_LABEL_KILLS_WIDTH, 2, MPS_TITLE_FONT, MPS_TITLE_COLOR, gzMPSScreenText[ MPS_KILLS_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
// Deaths Column
|
||||
DisplayWrappedString( MPS_LABEL_DEATHS_X, MPS_LABEL_DEATHS_Y, MPS_LABEL_DEATHS_WIDTH, 2, MPS_TITLE_FONT, MPS_TITLE_COLOR, gzMPSScreenText[ MPS_DEATHS_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
// Hits Column
|
||||
DisplayWrappedString( MPS_LABEL_HITS_X, MPS_LABEL_HITS_Y, MPS_LABEL_HITS_WIDTH, 2, MPS_TITLE_FONT, MPS_TITLE_COLOR, gzMPSScreenText[ MPS_HITS_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
// Misses Column
|
||||
DisplayWrappedString( MPS_LABEL_MISSES_X, MPS_LABEL_MISSES_Y, MPS_LABEL_MISSES_WIDTH, 2, MPS_TITLE_FONT, MPS_TITLE_COLOR, gzMPSScreenText[ MPS_MISSES_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
// Accuracy Column
|
||||
DisplayWrappedString( MPS_LABEL_ACCURACY_X, MPS_LABEL_ACCURACY_Y, MPS_LABEL_ACCURACY_WIDTH, 2, MPS_TITLE_FONT, MPS_TITLE_COLOR, gzMPSScreenText[ MPS_ACCURACY_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw players
|
||||
wchar_t szPlayerName[30];
|
||||
wchar_t szPlayerKills[3];
|
||||
wchar_t szPlayerDeaths[3];
|
||||
wchar_t szPlayerHits[3];
|
||||
wchar_t szPlayerMisses[3];
|
||||
wchar_t szPlayerAccuracy[8];
|
||||
float flAccuracy = 0;
|
||||
for(int i=0; i < 4; i++)
|
||||
{
|
||||
if (client_names[i] != NULL)
|
||||
{
|
||||
if (strcmp(client_names[i],"")!=0)
|
||||
{
|
||||
// valid player
|
||||
usPosY = MPS_PLAYERLIST_Y + (i * MPS_PLAYER_GAP);
|
||||
|
||||
// Draw Player Name Column
|
||||
memset(szPlayerName,0,30*sizeof(wchar_t));
|
||||
mbstowcs( szPlayerName,client_names[i],30);
|
||||
|
||||
DisplayWrappedString( MPS_LABEL_PLAYER_X, usPosY, MPS_LABEL_PLAYER_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerName, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Kills Column
|
||||
memset(szPlayerKills,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[i].kills,szPlayerKills,10);
|
||||
DisplayWrappedString( MPS_LABEL_KILLS_X, usPosY, MPS_LABEL_KILLS_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerKills, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Deaths Column
|
||||
memset(szPlayerDeaths,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[i].deaths,szPlayerDeaths,10);
|
||||
DisplayWrappedString( MPS_LABEL_DEATHS_X, usPosY, MPS_LABEL_DEATHS_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerDeaths, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Hits Column
|
||||
memset(szPlayerHits,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[i].hits,szPlayerHits,10);
|
||||
DisplayWrappedString( MPS_LABEL_HITS_X, usPosY, MPS_LABEL_HITS_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerHits, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Misses Column
|
||||
memset(szPlayerMisses,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[i].misses,szPlayerMisses,10);
|
||||
DisplayWrappedString( MPS_LABEL_MISSES_X, usPosY, MPS_LABEL_MISSES_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerMisses, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Accuracy Column
|
||||
if ( gMPPlayerStats[i].misses + gMPPlayerStats[i].hits > 0 )
|
||||
flAccuracy = ((float)gMPPlayerStats[i].hits / (float)(gMPPlayerStats[i].misses + gMPPlayerStats[i].hits)) * 100.0f;
|
||||
else
|
||||
flAccuracy = 0;
|
||||
memset(szPlayerAccuracy,0,8*sizeof(wchar_t));
|
||||
swprintf(szPlayerAccuracy,L"%i%%%%%%%%",(int)flAccuracy); // this thing goes through like three printfs before being rendered....
|
||||
DisplayWrappedString( MPS_LABEL_ACCURACY_X, usPosY, MPS_LABEL_ACCURACY_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerAccuracy, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (PLAYER_BSIDE==MP_TYPE_COOP)
|
||||
{
|
||||
// CO-OP Mode, show stats for queens army
|
||||
usPosY = MPS_PLAYERLIST_Y + (5 * MPS_PLAYER_GAP); // leave a space between players and AI
|
||||
|
||||
// Draw AI Team Name
|
||||
DisplayWrappedString( MPS_LABEL_PLAYER_X, usPosY, MPS_LABEL_PLAYER_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, gzMPSScreenText[MPS_AITEAM_TEXT], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Kills Column
|
||||
memset(szPlayerKills,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[4].kills,szPlayerKills,10);
|
||||
DisplayWrappedString( MPS_LABEL_KILLS_X, usPosY, MPS_LABEL_KILLS_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerKills, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Deaths Column
|
||||
memset(szPlayerDeaths,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[4].deaths,szPlayerDeaths,10);
|
||||
DisplayWrappedString( MPS_LABEL_DEATHS_X, usPosY, MPS_LABEL_DEATHS_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerDeaths, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Hits Column
|
||||
memset(szPlayerHits,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[4].hits,szPlayerHits,10);
|
||||
DisplayWrappedString( MPS_LABEL_HITS_X, usPosY, MPS_LABEL_HITS_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerHits, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Misses Column
|
||||
memset(szPlayerMisses,0,3*sizeof(wchar_t));
|
||||
_itow(gMPPlayerStats[4].misses,szPlayerMisses,10);
|
||||
DisplayWrappedString( MPS_LABEL_MISSES_X, usPosY, MPS_LABEL_MISSES_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerMisses, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Draw Accuracy Column
|
||||
if ( gMPPlayerStats[4].misses + gMPPlayerStats[4].hits > 0 )
|
||||
flAccuracy = ((float)gMPPlayerStats[4].hits / (float)(gMPPlayerStats[4].misses + gMPPlayerStats[4].hits)) * 100.0f;
|
||||
else
|
||||
flAccuracy = 0;
|
||||
memset(szPlayerAccuracy,0,8*sizeof(wchar_t));
|
||||
swprintf(szPlayerAccuracy,L"%i%%%%%%%%",(int)flAccuracy);
|
||||
DisplayWrappedString( MPS_LABEL_ACCURACY_X, usPosY, MPS_LABEL_ACCURACY_WIDTH, 2, MPS_LABEL_TEXT_FONT, MPS_LABEL_TEXT_COLOR, szPlayerAccuracy, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
}
|
||||
|
||||
/*
|
||||
// Player name text label
|
||||
DisplayWrappedString( MPJ_LABEL_HANDLE_X, MPJ_LABEL_HANDLE_Y, MPJ_LABEL_HANDLE_WIDTH, 2, MPJ_LABEL_TEXT_FONT, MPJ_LABEL_TEXT_COLOR, gzMPJScreenText[ MPJ_HANDLE_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Server IP text label
|
||||
DisplayWrappedString( MPJ_LABEL_IP_X, MPJ_LABEL_IP_Y, MPJ_LABEL_IP_WIDTH, 2, MPJ_LABEL_TEXT_FONT, MPJ_LABEL_TEXT_COLOR, gzMPJScreenText[ MPJ_SERVERIP_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
|
||||
// Server Port text label
|
||||
DisplayWrappedString( MPJ_LABEL_PORT_X, MPJ_LABEL_PORT_Y, MPJ_LABEL_PORT_WIDTH, 2, MPJ_LABEL_TEXT_FONT, MPJ_LABEL_TEXT_COLOR, gzMPJScreenText[ MPJ_SERVERPORT_TEXT ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
|
||||
*/
|
||||
return( TRUE );
|
||||
} // end of RenderMPSScreen()
|
||||
|
||||
|
||||
|
||||
void GetMPSScreenUserInput()
|
||||
{
|
||||
InputAtom Event;
|
||||
// POINT MousePos;
|
||||
|
||||
// GetCursorPos(&MousePos);
|
||||
|
||||
while( DequeueEvent( &Event ) )
|
||||
{
|
||||
// check if this event is swallowed by text input, otherwise process key
|
||||
if( !HandleTextInput( &Event ) && Event.usEvent == KEY_DOWN )
|
||||
{
|
||||
switch( Event.usParam )
|
||||
{
|
||||
|
||||
case ESC:
|
||||
//Exit out of the screen
|
||||
gubMPSScreenHandler = MPS_CANCEL;
|
||||
break;
|
||||
|
||||
case ENTER:
|
||||
/*if (ValidateJoinSettings(false))
|
||||
{
|
||||
SaveJoinSettings();
|
||||
gubMPSScreenHandler = MPS_JOIN;
|
||||
}*/
|
||||
gubMPSScreenHandler = MPS_CONTINUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} // end of GetMPSScreenUserInput()
|
||||
|
||||
void DoneFadeOutForExitMPSScreen( void )
|
||||
{
|
||||
// As we bypassed the GIO screen, set up some game options for multiplayer here
|
||||
// <TODO> most things i have left as thier defaults here for testing.
|
||||
is_networked = true;
|
||||
|
||||
ReStartingGame();
|
||||
|
||||
if (is_client)
|
||||
{
|
||||
client_disconnect();
|
||||
}
|
||||
|
||||
if(is_server)
|
||||
{
|
||||
server_disconnect();
|
||||
}
|
||||
|
||||
//NetworkAutoStart will handle reconnection in Map Screen
|
||||
// reset client auto_retry for NetworkAutoStart called in MapScreenHandle
|
||||
auto_retry = true;
|
||||
giNumTries = 5;
|
||||
|
||||
if (is_networked)
|
||||
gGameOptions.fTurnTimeLimit = TRUE;
|
||||
else
|
||||
gGameOptions.fTurnTimeLimit = FALSE;
|
||||
|
||||
// Bobby Rays - why would we want anything less than the best
|
||||
gGameOptions.ubBobbyRay = BR_AWESOME;
|
||||
|
||||
|
||||
gubMPSExitScreen = INTRO_SCREEN;
|
||||
|
||||
//set the fact that we should do the intro videos
|
||||
// gbIntroScreenMode = INTRO_BEGINING;
|
||||
#ifdef JA2TESTVERSION
|
||||
if( gfKeyState[ ALT ] )
|
||||
{
|
||||
if( gfKeyState[ CTRL ] )
|
||||
{
|
||||
gMercProfiles[ MIGUEL ].bMercStatus = MERC_IS_DEAD;
|
||||
gMercProfiles[ SKYRIDER ].bMercStatus = MERC_IS_DEAD;
|
||||
}
|
||||
|
||||
SetIntroType( INTRO_ENDING );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
SetIntroType( INTRO_BEGINING );
|
||||
|
||||
ExitMPSScreen(); // cleanup please, if we called a fadeout then we didnt do it above
|
||||
|
||||
SetCurrentCursorFromDatabase( VIDEO_NO_CURSOR );
|
||||
}
|
||||
|
||||
void DoneFadeInForExitMPSScreen( void )
|
||||
{
|
||||
SetCurrentCursorFromDatabase( VIDEO_NO_CURSOR );
|
||||
}
|
||||
|
||||
void BtnMPSCancelCallback(GUI_BUTTON *btn,INT32 reason)
|
||||
{
|
||||
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
||||
{
|
||||
btn->uiFlags |= BUTTON_CLICKED_ON;
|
||||
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
|
||||
}
|
||||
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
||||
{
|
||||
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
||||
|
||||
gubMPSScreenHandler = MPS_CANCEL;
|
||||
|
||||
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void BtnMPSContinueCallback(GUI_BUTTON *btn,INT32 reason)
|
||||
{
|
||||
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
|
||||
{
|
||||
btn->uiFlags |= BUTTON_CLICKED_ON;
|
||||
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
|
||||
}
|
||||
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
|
||||
{
|
||||
btn->uiFlags &= (~BUTTON_CLICKED_ON );
|
||||
|
||||
gubMPSScreenHandler = MPS_CONTINUE;
|
||||
|
||||
|
||||
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user