mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-25 11:45:53 +01:00
dbe524f0b2
except for EntitiesMP/Fish.es which I'm not sure about, and in Computer.cpp the weird "if (_iActiveMessage < _acmMessages.Count()==0)" construct whichs intention I didn't fully grasp, either.
266 lines
7.6 KiB
C++
266 lines
7.6 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
the Free Software Foundation
|
|
|
|
|
|
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. */
|
|
|
|
#include "StdAfx.h"
|
|
|
|
extern CGame *_pGame;
|
|
|
|
extern INDEX gam_iQuickStartDifficulty;
|
|
extern INDEX gam_iQuickStartMode;
|
|
extern INDEX gam_iStartDifficulty;
|
|
extern INDEX gam_iStartMode;
|
|
|
|
// initialize game and load settings
|
|
void CGame::Initialize(const CTFileName &fnGameSettings)
|
|
{
|
|
gm_fnSaveFileName = fnGameSettings;
|
|
InitInternal();
|
|
}
|
|
|
|
// save settings and cleanup
|
|
void CGame::End(void)
|
|
{
|
|
EndInternal();
|
|
}
|
|
|
|
// automaticaly manage input enable/disable toggling
|
|
static BOOL _bInputEnabled = FALSE;
|
|
void UpdateInputEnabledState(CViewPort *pvp)
|
|
{
|
|
// input should be enabled if application is active
|
|
// and no menu is active and no console is active
|
|
BOOL bShouldBeEnabled = _pGame->gm_csConsoleState==CS_OFF && _pGame->gm_csComputerState==CS_OFF;
|
|
|
|
// if should be turned off
|
|
if (!bShouldBeEnabled && _bInputEnabled) {
|
|
// disable it
|
|
_pInput->DisableInput();
|
|
|
|
// remember new state
|
|
_bInputEnabled = FALSE;
|
|
}
|
|
|
|
// if should be turned on
|
|
if (bShouldBeEnabled && !_bInputEnabled) {
|
|
// enable it
|
|
_pInput->EnableInput(pvp);
|
|
|
|
// remember new state
|
|
_bInputEnabled = TRUE;
|
|
}
|
|
}
|
|
|
|
// automaticaly manage pause toggling
|
|
static void UpdatePauseState(void)
|
|
{
|
|
BOOL bShouldPause =
|
|
_pGame->gm_csConsoleState ==CS_ON || _pGame->gm_csConsoleState ==CS_TURNINGON || _pGame->gm_csConsoleState ==CS_TURNINGOFF ||
|
|
_pGame->gm_csComputerState==CS_ON || _pGame->gm_csComputerState==CS_TURNINGON || _pGame->gm_csComputerState==CS_TURNINGOFF;
|
|
|
|
_pNetwork->SetLocalPause(bShouldPause);
|
|
}
|
|
|
|
// run a quicktest game from within editor
|
|
void CGame::QuickTest(const CTFileName &fnMapName,
|
|
CDrawPort *pdp, CViewPort *pvp)
|
|
{
|
|
#ifdef PLATFORM_WIN32
|
|
UINT uiMessengerMsg = RegisterWindowMessage("Croteam Messenger: Incoming Message");
|
|
#else
|
|
UINT uiMessengerMsg = 0x7337d00d;
|
|
#endif
|
|
|
|
EnableLoadingHook(pdp);
|
|
|
|
// quick start game with the world
|
|
gm_strNetworkProvider = "Local";
|
|
gm_aiStartLocalPlayers[0] = gm_iWEDSinglePlayer;
|
|
gm_aiStartLocalPlayers[1] = -1;
|
|
gm_aiStartLocalPlayers[2] = -1;
|
|
gm_aiStartLocalPlayers[3] = -1;
|
|
gm_CurrentSplitScreenCfg = CGame::SSC_PLAY1;
|
|
|
|
// set properties for a quick start session
|
|
CSessionProperties sp;
|
|
SetQuickStartSession(sp);
|
|
|
|
// start the game
|
|
if( !NewGame( fnMapName, fnMapName, sp)) {
|
|
DisableLoadingHook();
|
|
return;
|
|
}
|
|
|
|
// enable input
|
|
_pInput->EnableInput(pvp);
|
|
|
|
// initialy, game is running
|
|
BOOL bRunning = TRUE;
|
|
// while it is still running
|
|
while( bRunning)
|
|
{
|
|
// while there are any messages in the message queue
|
|
MSG msg;
|
|
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) {
|
|
// if it is not a mouse message
|
|
if( !(msg.message>=WM_MOUSEFIRST && msg.message<=WM_MOUSELAST)) {
|
|
// if not system key messages
|
|
if( !((msg.message==WM_KEYDOWN && msg.wParam==VK_F10)
|
|
||msg.message==WM_SYSKEYDOWN)) {
|
|
// dispatch it
|
|
TranslateMessage(&msg);
|
|
}
|
|
// if paint message
|
|
if( msg.message==WM_PAINT) {
|
|
// dispatch it
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
// if should stop
|
|
if ((msg.message==WM_QUIT)
|
|
||(msg.message==WM_CLOSE)
|
|
||(msg.message==WM_KEYDOWN && msg.wParam==VK_ESCAPE)
|
|
||(msg.message==WM_ACTIVATE)
|
|
||(msg.message==WM_CANCELMODE)
|
|
||(msg.message==WM_KILLFOCUS)
|
|
||(msg.message==WM_ACTIVATEAPP)) {
|
|
// stop running
|
|
bRunning = FALSE;
|
|
break;
|
|
}
|
|
|
|
if (msg.message==uiMessengerMsg)
|
|
{
|
|
if(!_pNetwork->IsPaused())
|
|
{
|
|
// pause it
|
|
_pNetwork->TogglePause();
|
|
}
|
|
char *pachrTemp=getenv("TEMP");
|
|
if( pachrTemp!=NULL)
|
|
{
|
|
FILE *pfileMessage=fopen(CTString(pachrTemp)+"Messenger.msg","r");
|
|
if( pfileMessage!=NULL)
|
|
{
|
|
char achrMessage[1024];
|
|
char *pachrMessage=fgets( achrMessage, 1024-1, pfileMessage);
|
|
if( pachrMessage!=NULL)
|
|
{
|
|
CPrintF("%s",pachrMessage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// if pause pressed
|
|
if (msg.message==WM_KEYDOWN && msg.wParam==VK_PAUSE &&
|
|
_pGame->gm_csConsoleState==CS_OFF && _pGame->gm_csComputerState==CS_OFF) {
|
|
// toggle pause
|
|
_pNetwork->TogglePause();
|
|
}
|
|
if(msg.message==WM_KEYDOWN &&
|
|
// !!! FIXME: rcg11162001 This sucks.
|
|
#ifdef PLATFORM_UNIX
|
|
(msg.unicode == '~'
|
|
#else
|
|
(MapVirtualKey(msg.wParam, 0)==41 // scan code for '~'
|
|
#endif
|
|
||msg.wParam==VK_F1)) {
|
|
if (_pGame->gm_csConsoleState==CS_OFF || _pGame->gm_csConsoleState==CS_TURNINGOFF) {
|
|
_pGame->gm_csConsoleState = CS_TURNINGON;
|
|
} else {
|
|
_pGame->gm_csConsoleState = CS_TURNINGOFF;
|
|
}
|
|
}
|
|
extern INDEX con_bTalk;
|
|
if (con_bTalk && _pGame->gm_csConsoleState==CS_OFF) {
|
|
con_bTalk = FALSE;
|
|
_pGame->gm_csConsoleState = CS_TALK;
|
|
}
|
|
if (msg.message==WM_KEYDOWN) {
|
|
ConsoleKeyDown(msg);
|
|
if (_pGame->gm_csConsoleState!=CS_ON) {
|
|
ComputerKeyDown(msg);
|
|
}
|
|
} else if (msg.message==WM_KEYUP) {
|
|
// special handler for talk (not to invoke return key bind)
|
|
if( msg.wParam==VK_RETURN && _pGame->gm_csConsoleState==CS_TALK) _pGame->gm_csConsoleState = CS_OFF;
|
|
} else if (msg.message==WM_CHAR) {
|
|
ConsoleChar(msg);
|
|
}
|
|
if (msg.message==WM_LBUTTONDOWN
|
|
||msg.message==WM_RBUTTONDOWN
|
|
||msg.message==WM_LBUTTONDBLCLK
|
|
||msg.message==WM_RBUTTONDBLCLK
|
|
||msg.message==WM_LBUTTONUP
|
|
||msg.message==WM_RBUTTONUP) {
|
|
if (_pGame->gm_csConsoleState!=CS_ON) {
|
|
ComputerKeyDown(msg);
|
|
}
|
|
}
|
|
}
|
|
|
|
// get real cursor position
|
|
if (_pGame->gm_csComputerState != CS_OFF) {
|
|
POINT pt;
|
|
::GetCursorPos(&pt);
|
|
::ScreenToClient(pvp->vp_hWnd, &pt);
|
|
ComputerMouseMove(pt.x, pt.y);
|
|
}
|
|
UpdatePauseState();
|
|
UpdateInputEnabledState(pvp);
|
|
|
|
// if playing a demo and it is finished
|
|
if (_pNetwork->IsDemoPlayFinished()) {
|
|
// stop running
|
|
bRunning = FALSE;
|
|
}
|
|
|
|
// do the main game loop
|
|
GameMainLoop();
|
|
|
|
// redraw the view
|
|
if (pdp->Lock()) {
|
|
// if current view preferences will not clear the background, clear it here
|
|
if( _wrpWorldRenderPrefs.GetPolygonsFillType() == CWorldRenderPrefs::FT_NONE) {
|
|
// clear background
|
|
pdp->Fill(C_BLACK| CT_OPAQUE);
|
|
pdp->FillZBuffer(ZBUF_BACK);
|
|
}
|
|
// redraw view
|
|
if (_pGame->gm_csComputerState != CS_ON) {
|
|
GameRedrawView(pdp, (_pGame->gm_csConsoleState==CS_ON)?0:GRV_SHOWEXTRAS);
|
|
}
|
|
ComputerRender(pdp);
|
|
ConsoleRender(pdp);
|
|
pdp->Unlock();
|
|
// show it
|
|
pvp->SwapBuffers();
|
|
}
|
|
}
|
|
|
|
if (_pGame->gm_csConsoleState != CS_OFF) {
|
|
_pGame->gm_csConsoleState = CS_TURNINGOFF;
|
|
}
|
|
if (_pGame->gm_csComputerState != CS_OFF) {
|
|
_pGame->gm_csComputerState = CS_TURNINGOFF;
|
|
cmp_ppenPlayer = NULL;
|
|
}
|
|
|
|
_pInput->DisableInput();
|
|
StopGame();
|
|
DisableLoadingHook();
|
|
}
|