Resolve conflicts

This commit is contained in:
zcaliptium 2016-04-01 01:00:14 +03:00
commit ecac2063ff
111 changed files with 11853 additions and 8754 deletions

View File

@ -273,7 +273,7 @@ BEGIN
EDITTEXT IDC_CONSOLE_OUTPUT,7,7,429,169,ES_MULTILINE |
ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY |
WS_VSCROLL | WS_HSCROLL
LTEXT "Available symols:",IDC_STATIC,7,181,69,8
LTEXT "Available symbols:",IDC_STATIC,7,181,69,8
COMBOBOX IDC_CONSOLE_SYMBOLS,76,179,360,108,CBS_DROPDOWNLIST |
CBS_SORT | WS_VSCROLL | WS_TABSTOP
END

View File

@ -0,0 +1,30 @@
/* 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. */
#ifndef SE_INCL_ARROWDIR_H
#define SE_INCL_ARROWDIR_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
enum ArrowDir {
AD_NONE,
AD_UP,
AD_DOWN,
AD_LEFT,
AD_RIGHT,
};
#endif /* include-once check. */

View File

@ -1,9 +1,16 @@
<<<<<<< HEAD
/* Copyright (c) 2002-2012 Croteam Ltd.
=======
/* Copyright (c) 2002-2012 Croteam Ltd.
>>>>>>> refs/remotes/origin/working
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
<<<<<<< HEAD
=======
>>>>>>> refs/remotes/origin/working
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
@ -113,12 +120,6 @@ void ParseCommandLine(CTString strCmd)
cmd_bQuickJoin = TRUE;
} else if (strWord=="+game") {
CTString strMod = GetNextParam();
#if _SE_DEMO
if (strMod!="SeriousSam" && strMod!="Warped") {
FatalError(TRANS("This MOD is not allowed in demo version!"));
return;
}
#endif
if (strMod!="SeriousSam") { // (we ignore default mod - always use base dir in that case)
_fnmMod = "Mods\\"+strMod+"\\";
}

View File

@ -0,0 +1,30 @@
/* 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. */
#ifndef SE_INCL_FILEINFO_H
#define SE_INCL_FILEINFO_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
class CFileInfo {
public:
CListNode fi_lnNode;
CTFileName fi_fnFile;
CTString fi_strName;
};
#endif /* include-once check. */

View File

@ -0,0 +1,53 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGArrow.h"
void CMGArrow::Render(CDrawPort *pdp)
{
SetFontMedium(pdp);
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
COLOR col = GetCurrentColor();
CTString str;
if (mg_adDirection == AD_NONE) {
str = "???";
} else if (mg_adDirection == AD_UP) {
str = TRANS("Page Up");
} else if (mg_adDirection == AD_DOWN) {
str = TRANS("Page Down");
} else {
ASSERT(FALSE);
}
PIX pixI = box.Min()(1);
PIX pixJ = box.Min()(2);
pdp->PutText(str, pixI, pixJ, col);
}
void CMGArrow::OnActivate(void)
{
if (mg_adDirection == AD_UP) {
pgmCurrentMenu->ScrollList(-3);
}
else if (mg_adDirection == AD_DOWN) {
pgmCurrentMenu->ScrollList(+3);
}
}

View File

@ -0,0 +1,32 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_ARROW_H
#define SE_INCL_MENU_GADGET_ARROW_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "ArrowDir.h"
#include "MGButton.h"
class CMGArrow : public CMGButton {
public:
enum ArrowDir mg_adDirection;
void Render(CDrawPort *pdp);
void OnActivate(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,181 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "LevelInfo.h"
#include "VarList.h"
#include "MGButton.h"
extern CSoundData *_psdPress;
extern CMenuGadget *_pmgLastActivatedGadget;
CMGButton::CMGButton(void)
{
mg_pActivatedFunction = NULL;
mg_iIndex = 0;
mg_iCenterI = 0;
mg_iTextMode = 1;
mg_bfsFontSize = BFS_MEDIUM;
mg_iCursorPos = -1;
mg_bRectangle = FALSE;
mg_bMental = FALSE;
mg_bEditing = FALSE;
mg_bHighlighted = FALSE;
}
void CMGButton::SetText(CTString strNew)
{
mg_strText = strNew;
}
void CMGButton::OnActivate(void)
{
if (mg_pActivatedFunction != NULL && mg_bEnabled)
{
PlayMenuSound(_psdPress);
IFeel_PlayEffect("Menu_press");
_pmgLastActivatedGadget = this;
(*mg_pActivatedFunction)();
}
}
void CMGButton::Render(CDrawPort *pdp)
{
if (mg_bfsFontSize == BFS_LARGE) {
SetFontBig(pdp);
} else if (mg_bfsFontSize == BFS_MEDIUM) {
SetFontMedium(pdp);
} else {
ASSERT(mg_bfsFontSize == BFS_SMALL);
SetFontSmall(pdp);
}
pdp->SetTextMode(mg_iTextMode);
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
COLOR col = GetCurrentColor();
if (mg_bEditing) {
col = LCDGetColor(C_GREEN | 0xFF, "editing");
}
COLOR colRectangle = col;
if (mg_bHighlighted) {
col = LCDGetColor(C_WHITE | 0xFF, "hilited");
if (!mg_bFocused) {
colRectangle = LCDGetColor(C_WHITE | 0xFF, "hilited rectangle");
}
}
if (mg_bMental) {
FLOAT tmIn = 0.2f;
FLOAT tmOut = 1.0f;
FLOAT tmFade = 0.1f;
FLOAT tmExist = tmFade + tmIn + tmFade;
FLOAT tmTotal = tmFade + tmIn + tmFade + tmOut;
FLOAT tmTime = _pTimer->GetHighPrecisionTimer().GetSeconds();
FLOAT fFactor = 1;
if (tmTime>0.1f) {
tmTime = fmod(tmTime, tmTotal);
fFactor = CalculateRatio(tmTime, 0, tmExist, tmFade / tmExist, tmFade / tmExist);
}
col = (col&~0xFF) | INDEX(0xFF * fFactor);
}
if (mg_bRectangle) {
// put border
const PIX pixLeft = box.Min()(1);
const PIX pixUp = box.Min()(2) - 3;
const PIX pixWidth = box.Size()(1) + 1;
const PIX pixHeight = box.Size()(2);
pdp->DrawBorder(pixLeft, pixUp, pixWidth, pixHeight, colRectangle);
}
if (mg_bEditing) {
// put border
PIX pixLeft = box.Min()(1);
PIX pixUp = box.Min()(2) - 3;
PIX pixWidth = box.Size()(1) + 1;
PIX pixHeight = box.Size()(2);
if (mg_strLabel != "") {
pixLeft = box.Min()(1) + box.Size()(1)*0.55f;
pixWidth = box.Size()(1)*0.45f + 1;
}
pdp->Fill(pixLeft, pixUp, pixWidth, pixHeight, LCDGetColor(C_dGREEN | 0x40, "edit fill"));
}
INDEX iCursor = mg_iCursorPos;
// print text
if (mg_strLabel != "") {
PIX pixIL = box.Min()(1) + box.Size()(1)*0.45f;
PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f;
PIX pixJ = box.Min()(2);
pdp->PutTextR(mg_strLabel, pixIL, pixJ, col);
pdp->PutText(mg_strText, pixIR, pixJ, col);
} else {
CTString str = mg_strText;
if (pdp->dp_FontData->fd_bFixedWidth) {
str = str.Undecorated();
INDEX iLen = str.Length();
INDEX iMaxLen = ClampDn(box.Size()(1) / (pdp->dp_pixTextCharSpacing + pdp->dp_FontData->fd_pixCharWidth), 1L);
if (iCursor >= iMaxLen) {
str.TrimRight(iCursor);
str.TrimLeft(iMaxLen);
iCursor = iMaxLen;
} else {
str.TrimRight(iMaxLen);
}
}
if (mg_iCenterI == -1) pdp->PutText(str, box.Min()(1), box.Min()(2), col);
else if (mg_iCenterI == +1) pdp->PutTextR(str, box.Max()(1), box.Min()(2), col);
else pdp->PutTextC(str, box.Center()(1), box.Min()(2), col);
}
// put cursor if editing
if (mg_bEditing && (((ULONG)(_pTimer->GetRealTimeTick() * 2)) & 1)) {
PIX pixX = box.Min()(1) + GetCharOffset(pdp, iCursor);
if (mg_strLabel != "") {
pixX += box.Size()(1)*0.55f;
}
PIX pixY = box.Min()(2);
if (!pdp->dp_FontData->fd_bFixedWidth) {
pixY -= pdp->dp_fTextScaling * 2;
}
pdp->PutText("|", pixX, pixY, LCDGetColor(C_WHITE | 0xFF, "editing cursor"));
}
}
PIX CMGButton::GetCharOffset(CDrawPort *pdp, INDEX iCharNo)
{
if (pdp->dp_FontData->fd_bFixedWidth) {
return (pdp->dp_FontData->fd_pixCharWidth + pdp->dp_pixTextCharSpacing)*(iCharNo - 0.5f);
}
CTString strCut(mg_strText);
strCut.TrimLeft(strlen(mg_strText) - iCharNo);
PIX pixFullWidth = pdp->GetTextWidth(mg_strText);
PIX pixCutWidth = pdp->GetTextWidth(strCut);
// !!!! not implemented for different centering
return pixFullWidth - pixCutWidth;
}

View File

@ -0,0 +1,47 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_BUTTON_H
#define SE_INCL_MENU_GADGET_BUTTON_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MenuGadget.h"
class CMGButton : public CMenuGadget {
public:
CTString mg_strLabel; // for those that have labels separately from main text
CTString mg_strText;
INDEX mg_iCenterI;
enum ButtonFontSize mg_bfsFontSize;
BOOL mg_bEditing;
BOOL mg_bHighlighted;
BOOL mg_bRectangle;
BOOL mg_bMental;
INDEX mg_iTextMode;
INDEX mg_iCursorPos;
INDEX mg_iIndex;
void(*mg_pActivatedFunction)(void);
CMGButton(void);
void SetText(CTString strNew);
void OnActivate(void);
void Render(CDrawPort *pdp);
PIX GetCharOffset(CDrawPort *pdp, INDEX iCharNo);
};
#endif /* include-once check. */

View File

@ -0,0 +1,52 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGChangePlayer.h"
#include "GUI/Menus/MenuManager.h"
extern CSoundData *_psdPress;
void CMGChangePlayer::OnActivate(void)
{
PlayMenuSound(_psdPress);
IFeel_PlayEffect("Menu_press");
_iLocalPlayer = mg_iLocalPlayer;
if (_pGame->gm_aiMenuLocalPlayers[mg_iLocalPlayer] < 0)
_pGame->gm_aiMenuLocalPlayers[mg_iLocalPlayer] = 0;
_pGUIM->gmPlayerProfile.gm_piCurrentPlayer = &_pGame->gm_aiMenuLocalPlayers[mg_iLocalPlayer];
_pGUIM->gmPlayerProfile.gm_pgmParentMenu = &_pGUIM->gmSelectPlayersMenu;
extern BOOL _bPlayerMenuFromSinglePlayer;
_bPlayerMenuFromSinglePlayer = FALSE;
ChangeToMenu(&_pGUIM->gmPlayerProfile);
}
void CMGChangePlayer::SetPlayerText(void)
{
INDEX iPlayer = _pGame->gm_aiMenuLocalPlayers[mg_iLocalPlayer];
CPlayerCharacter &pc = _pGame->gm_apcPlayers[iPlayer];
if (iPlayer<0 || iPlayer>7) {
mg_strText = "????";
} else {
mg_strText.PrintF(TRANS("Player %d: %s\n"), mg_iLocalPlayer + 1, pc.GetNameForPrinting());
}
}

View File

@ -0,0 +1,32 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_CHANGEPLAYER_H
#define SE_INCL_MENU_GADGET_CHANGEPLAYER_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGButton.h"
class CMGChangePlayer : public CMGButton {
public:
INDEX mg_iLocalPlayer;
void SetPlayerText(void);
void OnActivate(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,173 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGEdit.h"
extern CSoundData *_psdPress;
extern BOOL _bEditingString;
CMGEdit::CMGEdit(void)
{
mg_pstrToChange = NULL;
mg_ctMaxStringLen = 70;
Clear();
}
void CMGEdit::Clear(void)
{
mg_iCursorPos = 0;
mg_bEditing = FALSE;
_bEditingString = FALSE;
}
void CMGEdit::OnActivate(void)
{
if (!mg_bEnabled) {
return;
}
ASSERT(mg_pstrToChange != NULL);
PlayMenuSound(_psdPress);
IFeel_PlayEffect("Menu_press");
SetText(mg_strText);
mg_iCursorPos = strlen(mg_strText);
mg_bEditing = TRUE;
_bEditingString = TRUE;
}
// focus lost
void CMGEdit::OnKillFocus(void)
{
// go out of editing mode
if (mg_bEditing) {
OnKeyDown(VK_RETURN);
Clear();
}
// proceed
CMenuGadget::OnKillFocus();
}
// helper function for deleting char(s) from string
static void Key_BackDel(CTString &str, INDEX &iPos, BOOL bShift, BOOL bRight)
{
// do nothing if string is empty
INDEX ctChars = strlen(str);
if (ctChars == 0) return;
if (bRight && iPos<ctChars) { // DELETE key
if (bShift) {
// delete to end of line
str.TrimRight(iPos);
} else {
// delete only one char
str.DeleteChar(iPos);
}
}
if (!bRight && iPos>0) { // BACKSPACE key
if (bShift) {
// delete to start of line
str.TrimLeft(ctChars - iPos);
iPos = 0;
} else {
// delete only one char
str.DeleteChar(iPos - 1);
iPos--;
}
}
}
// key/mouse button pressed
BOOL CMGEdit::OnKeyDown(int iVKey)
{
// if not in edit mode
if (!mg_bEditing) {
// behave like normal gadget
return CMenuGadget::OnKeyDown(iVKey);
}
// finish editing?
BOOL bShift = GetKeyState(VK_SHIFT) & 0x8000;
switch (iVKey) {
case VK_UP: case VK_DOWN:
case VK_RETURN: case VK_LBUTTON: *mg_pstrToChange = mg_strText; Clear(); OnStringChanged(); break;
case VK_ESCAPE: case VK_RBUTTON: mg_strText = *mg_pstrToChange; Clear(); OnStringCanceled(); break;
case VK_LEFT: if (mg_iCursorPos > 0) mg_iCursorPos--; break;
case VK_RIGHT: if (mg_iCursorPos < strlen(mg_strText)) mg_iCursorPos++; break;
case VK_HOME: mg_iCursorPos = 0; break;
case VK_END: mg_iCursorPos = strlen(mg_strText); break;
case VK_BACK: Key_BackDel(mg_strText, mg_iCursorPos, bShift, FALSE); break;
case VK_DELETE: Key_BackDel(mg_strText, mg_iCursorPos, bShift, TRUE); break;
default: break; // ignore all other special keys
}
// key is handled
return TRUE;
}
// char typed
BOOL CMGEdit::OnChar(MSG msg)
{
// if not in edit mode
if (!mg_bEditing) {
// behave like normal gadget
return CMenuGadget::OnChar(msg);
}
// only chars are allowed
const INDEX ctFullLen = mg_strText.Length();
const INDEX ctNakedLen = mg_strText.LengthNaked();
mg_iCursorPos = Clamp(mg_iCursorPos, 0L, ctFullLen);
int iVKey = msg.wParam;
if (isprint(iVKey) && ctNakedLen <= mg_ctMaxStringLen) {
mg_strText.InsertChar(mg_iCursorPos, (char)iVKey);
mg_iCursorPos++;
}
// key is handled
return TRUE;
}
void CMGEdit::Render(CDrawPort *pdp)
{
if (mg_bEditing) {
mg_iTextMode = -1;
} else if (mg_bFocused) {
mg_iTextMode = 0;
} else {
mg_iTextMode = 1;
}
if (mg_strText == "" && !mg_bEditing) {
if (mg_bfsFontSize == BFS_SMALL) {
mg_strText = "*";
} else {
mg_strText = TRANS("<none>");
}
CMGButton::Render(pdp);
mg_strText = "";
} else {
CMGButton::Render(pdp);
}
}
void CMGEdit::OnStringChanged(void)
{
}
void CMGEdit::OnStringCanceled(void)
{
}

View File

@ -0,0 +1,42 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_EDIT_H
#define SE_INCL_MENU_GADGET_EDIT_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGButton.h"
class CMGEdit : public CMGButton {
public:
INDEX mg_ctMaxStringLen;
CTString *mg_pstrToChange;
CMGEdit(void);
// return TRUE if handled
BOOL OnKeyDown(int iVKey);
BOOL OnChar(MSG msg);
void Clear(void);
void OnActivate(void);
void OnKillFocus(void);
void Render(CDrawPort *pdp);
virtual void OnStringChanged(void);
virtual void OnStringCanceled(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,242 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGFileButton.h"
#include "GUI/Menus/MenuManager.h"
extern CSoundData *_psdPress;
CMGFileButton::CMGFileButton(void)
{
mg_iState = FBS_NORMAL;
}
// refresh current text from description
void CMGFileButton::RefreshText(void)
{
mg_strText = mg_strDes;
mg_strText.OnlyFirstLine();
mg_strInfo = mg_strDes;
mg_strInfo.RemovePrefix(mg_strText);
mg_strInfo.DeleteChar(0);
}
void CMGFileButton::SaveDescription(void)
{
CTFileName fnFileNameDescription = mg_fnm.NoExt() + ".des";
try {
mg_strDes.Save_t(fnFileNameDescription);
} catch (char *strError) {
CPrintF("%s\n", strError);
}
}
CMGFileButton *_pmgFileToSave = NULL;
void OnFileSaveOK(void)
{
if (_pmgFileToSave != NULL) {
_pmgFileToSave->SaveYes();
}
}
void CMGFileButton::DoSave(void)
{
if (FileExistsForWriting(mg_fnm)) {
_pmgFileToSave = this;
extern void SaveConfirm(void);
SaveConfirm();
} else {
SaveYes();
}
}
void CMGFileButton::SaveYes(void)
{
ASSERT(_pGUIM->gmLoadSaveMenu.gm_bSave);
// call saving function
BOOL bSucceeded = _pGUIM->gmLoadSaveMenu.gm_pAfterFileChosen(mg_fnm);
// if saved
if (bSucceeded) {
// save the description too
SaveDescription();
}
}
void CMGFileButton::DoLoad(void)
{
ASSERT(!_pGUIM->gmLoadSaveMenu.gm_bSave);
// if no file
if (!FileExists(mg_fnm)) {
// do nothing
return;
}
if (_pGUIM->gmLoadSaveMenu.gm_pgmNextMenu != NULL) {
_pGUIM->gmLoadSaveMenu.gm_pgmParentMenu = _pGUIM->gmLoadSaveMenu.gm_pgmNextMenu;
}
// call loading function
BOOL bSucceeded = _pGUIM->gmLoadSaveMenu.gm_pAfterFileChosen(mg_fnm);
ASSERT(bSucceeded);
}
static CTString _strTmpDescription;
static CTString _strOrgDescription;
void CMGFileButton::StartEdit(void)
{
CMGEdit::OnActivate();
}
void CMGFileButton::OnActivate(void)
{
if (mg_fnm == "") {
return;
}
PlayMenuSound(_psdPress);
IFeel_PlayEffect("Menu_press");
// if loading
if (!_pGUIM->gmLoadSaveMenu.gm_bSave) {
// load now
DoLoad();
// if saving
} else {
// switch to editing mode
BOOL bWasEmpty = mg_strText == EMPTYSLOTSTRING;
mg_strDes = _pGUIM->gmLoadSaveMenu.gm_strSaveDes;
RefreshText();
_strOrgDescription = _strTmpDescription = mg_strText;
if (bWasEmpty) {
_strOrgDescription = EMPTYSLOTSTRING;
}
mg_pstrToChange = &_strTmpDescription;
StartEdit();
mg_iState = FBS_SAVENAME;
}
}
BOOL CMGFileButton::OnKeyDown(int iVKey)
{
if (mg_iState == FBS_NORMAL) {
if (_pGUIM->gmLoadSaveMenu.gm_bSave || _pGUIM->gmLoadSaveMenu.gm_bManage) {
if (iVKey == VK_F2) {
if (FileExistsForWriting(mg_fnm)) {
// switch to renaming mode
_strOrgDescription = mg_strText;
_strTmpDescription = mg_strText;
mg_pstrToChange = &_strTmpDescription;
StartEdit();
mg_iState = FBS_RENAME;
}
return TRUE;
} else if (iVKey == VK_DELETE) {
if (FileExistsForWriting(mg_fnm)) {
// delete the file, its description and thumbnail
RemoveFile(mg_fnm);
RemoveFile(mg_fnm.NoExt() + ".des");
RemoveFile(mg_fnm.NoExt() + "Tbn.tex");
// refresh menu
_pGUIM->gmLoadSaveMenu.EndMenu();
_pGUIM->gmLoadSaveMenu.StartMenu();
OnSetFocus();
}
return TRUE;
}
}
return CMenuGadget::OnKeyDown(iVKey);
} else {
// go out of editing mode
if (mg_bEditing) {
if (iVKey == VK_UP || iVKey == VK_DOWN) {
CMGEdit::OnKeyDown(VK_ESCAPE);
}
}
return CMGEdit::OnKeyDown(iVKey);
}
}
void CMGFileButton::OnSetFocus(void)
{
mg_iState = FBS_NORMAL;
if (_pGUIM->gmLoadSaveMenu.gm_bAllowThumbnails && mg_bEnabled) {
SetThumbnail(mg_fnm);
} else {
ClearThumbnail();
}
pgmCurrentMenu->KillAllFocuses();
CMGButton::OnSetFocus();
}
void CMGFileButton::OnKillFocus(void)
{
// go out of editing mode
if (mg_bEditing) {
OnKeyDown(VK_ESCAPE);
}
CMGEdit::OnKillFocus();
}
// override from edit gadget
void CMGFileButton::OnStringChanged(void)
{
// if saving
if (mg_iState == FBS_SAVENAME) {
// do the save
mg_strDes = _strTmpDescription + "\n" + mg_strInfo;
DoSave();
// if renaming
} else if (mg_iState == FBS_RENAME) {
// do the rename
mg_strDes = _strTmpDescription + "\n" + mg_strInfo;
SaveDescription();
// refresh menu
_pGUIM->gmLoadSaveMenu.EndMenu();
_pGUIM->gmLoadSaveMenu.StartMenu();
OnSetFocus();
}
}
void CMGFileButton::OnStringCanceled(void)
{
mg_strText = _strOrgDescription;
}
void CMGFileButton::Render(CDrawPort *pdp)
{
// render original gadget first
CMGEdit::Render(pdp);
// if currently selected
if (mg_bFocused && mg_bEnabled) {
// add info at the bottom if screen
SetFontMedium(pdp);
PIXaabbox2D box = FloatBoxToPixBox(pdp, BoxSaveLoad(15.0));
PIX pixI = box.Min()(1);
PIX pixJ = box.Min()(2);
COLOR col = LCDGetColor(C_mlGREEN | 255, "file info");
pdp->PutText(mg_strInfo, pixI, pixJ, col);
}
}

View File

@ -0,0 +1,56 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_FILEBUTTON_H
#define SE_INCL_MENU_GADGET_FILEBUTTON_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGEdit.h"
// file button states
#define FBS_NORMAL 0 // normal active state
#define FBS_SAVENAME 1 // typing in the save name
#define FBS_RENAME 2 // renaming existing file
class CMGFileButton : public CMGEdit {
public:
CMGFileButton(void);
CTFileName mg_fnm;
CTString mg_strDes; // entire description goes here
CTString mg_strInfo; // info part of text to print above the gadget tip
INDEX mg_iState;
// refresh current text from description
void RefreshText(void);
// save description to disk
void SaveDescription(void);
void SaveYes(void);
void DoSave(void);
void DoLoad(void);
void StartEdit(void);
// return TRUE if handled
BOOL OnKeyDown(int iVKey);
void OnActivate(void);
void OnSetFocus(void);
void OnKillFocus(void);
// overrides from edit gadget
void OnStringChanged(void);
void OnStringCanceled(void);
void Render(CDrawPort *pdp);
};
#endif /* include-once check. */

View File

@ -0,0 +1,101 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGHighScore.h"
#define HSCOLUMNS 6
CTString strHighScores[HIGHSCORE_COUNT + 1][HSCOLUMNS];
FLOAT afI[HSCOLUMNS] = {
0.12f, 0.15f, 0.6f, 0.7f, 0.78f, 0.9f
};
void CMGHighScore::Render(CDrawPort *pdp)
{
SetFontMedium(pdp);
COLOR colHeader = LCDGetColor(C_GREEN | 255, "hiscore header");
COLOR colData = LCDGetColor(C_mdGREEN | 255, "hiscore data");
COLOR colLastSet = LCDGetColor(C_mlGREEN | 255, "hiscore last set");
INDEX iLastSet = _pGame->gm_iLastSetHighScore;
CTString strText;
strHighScores[0][0] = TRANS("No.");
strHighScores[0][1] = TRANS("Player Name");
strHighScores[0][2] = TRANS("Difficulty");
strHighScores[0][3] = TRANS("Time");
strHighScores[0][4] = TRANS("Kills");
strHighScores[0][5] = TRANS("Score");
{for (INDEX i = 0; i<HIGHSCORE_COUNT; i++) {
switch (_pGame->gm_ahseHighScores[i].hse_gdDifficulty) {
default:
ASSERT(FALSE);
case (CSessionProperties::GameDifficulty) - 100:
strHighScores[i + 1][1] = "---";
continue;
break;
case CSessionProperties::GD_TOURIST:
strHighScores[i + 1][2] = TRANS("Tourist");
break;
case CSessionProperties::GD_EASY:
strHighScores[i + 1][2] = TRANS("Easy");
break;
case CSessionProperties::GD_NORMAL:
strHighScores[i + 1][2] = TRANS("Normal");
break;
case CSessionProperties::GD_HARD:
strHighScores[i + 1][2] = TRANS("Hard");
break;
case CSessionProperties::GD_EXTREME:
strHighScores[i + 1][2] = TRANS("Serious");
break;
case CSessionProperties::GD_EXTREME + 1:
strHighScores[i + 1][2] = TRANS("Mental");
break;
}
strHighScores[i + 1][0].PrintF("%d", i + 1);
strHighScores[i + 1][1] = _pGame->gm_ahseHighScores[i].hse_strPlayer;
strHighScores[i + 1][3] = TimeToString(_pGame->gm_ahseHighScores[i].hse_tmTime);
strHighScores[i + 1][4].PrintF("%03d", _pGame->gm_ahseHighScores[i].hse_ctKills);
strHighScores[i + 1][5].PrintF("%9d", _pGame->gm_ahseHighScores[i].hse_ctScore);
}}
PIX pixJ = pdp->GetHeight()*0.25f;
{for (INDEX iRow = 0; iRow<HIGHSCORE_COUNT + 1; iRow++) {
COLOR col = (iRow == 0) ? colHeader : colData;
if (iLastSet != -1 && iRow - 1 == iLastSet) {
col = colLastSet;
}
{for (INDEX iColumn = 0; iColumn<HSCOLUMNS; iColumn++) {
PIX pixI = pdp->GetWidth()*afI[iColumn];
if (iColumn == 1) {
pdp->PutText(strHighScores[iRow][iColumn], pixI, pixJ, col);
}
else {
pdp->PutTextR(strHighScores[iRow][iColumn], pixI, pixJ, col);
}
}}
if (iRow == 0) {
pixJ += pdp->GetHeight()*0.06f;
} else {
pixJ += pdp->GetHeight()*0.04f;
}
}}
}

View File

@ -0,0 +1,29 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_HIGHSCORE_H
#define SE_INCL_MENU_GADGET_HIGHSCORE_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MenuGadget.h"
class CMGHighScore : public CMenuGadget {
public:
void Render(CDrawPort *pdp);
};
#endif /* include-once check. */

View File

@ -0,0 +1,222 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGKeyDefinition.h"
extern CSoundData *_psdSelect;
extern CSoundData *_psdPress;
extern BOOL _bDefiningKey;
CMGKeyDefinition::CMGKeyDefinition(void)
{
mg_iState = DOING_NOTHING;
}
void CMGKeyDefinition::OnActivate(void)
{
PlayMenuSound(_psdPress);
IFeel_PlayEffect("Menu_press");
SetBindingNames(/*bDefining=*/TRUE);
mg_iState = RELEASE_RETURN_WAITING;
}
BOOL CMGKeyDefinition::OnKeyDown(int iVKey)
{
// if waiting for a key definition
if (mg_iState == PRESS_KEY_WAITING) {
// do nothing
return TRUE;
}
// if backspace pressed
if (iVKey == VK_BACK) {
// clear both keys
DefineKey(KID_NONE);
// message is processed
return TRUE;
}
return CMenuGadget::OnKeyDown(iVKey);
}
// set names for both key bindings
void CMGKeyDefinition::SetBindingNames(BOOL bDefining)
{
// find the button
INDEX ict = 0;
INDEX iDik = 0;
FOREACHINLIST(CButtonAction, ba_lnNode, _pGame->gm_ctrlControlsExtra.ctrl_lhButtonActions, itba) {
if (ict == mg_iControlNumber) {
CButtonAction &ba = *itba;
// get the current bindings and names
INDEX iKey1 = ba.ba_iFirstKey;
INDEX iKey2 = ba.ba_iSecondKey;
BOOL bKey1Bound = iKey1 != KID_NONE;
BOOL bKey2Bound = iKey2 != KID_NONE;
CTString strKey1 = _pInput->GetButtonTransName(iKey1);
CTString strKey2 = _pInput->GetButtonTransName(iKey2);
// if defining
if (bDefining) {
// if only first key is defined
if (bKey1Bound && !bKey2Bound) {
// put question mark for second key
mg_strBinding = strKey1 + TRANS(" or ") + "?";
// otherwise
} else {
// put question mark only
mg_strBinding = "?";
}
// if not defining
}
else {
// if second key is defined
if (bKey2Bound) {
// add both
mg_strBinding = strKey1 + TRANS(" or ") + strKey2;
// if second key is undefined
} else {
// display only first one
mg_strBinding = strKey1;
}
}
return;
}
ict++;
}
// if not found, put errorneous string
mg_strBinding = "???";
}
void CMGKeyDefinition::Appear(void)
{
SetBindingNames(/*bDefining=*/FALSE);
CMenuGadget::Appear();
}
void CMGKeyDefinition::Disappear(void)
{
CMenuGadget::Disappear();
}
void CMGKeyDefinition::DefineKey(INDEX iDik)
{
// for each button in controls
INDEX ict = 0;
FOREACHINLIST(CButtonAction, ba_lnNode, _pGame->gm_ctrlControlsExtra.ctrl_lhButtonActions, itba) {
CButtonAction &ba = *itba;
// if it is this one
if (ict == mg_iControlNumber) {
// if should clear
if (iDik == KID_NONE) {
// unbind both
ba.ba_iFirstKey = KID_NONE;
ba.ba_iSecondKey = KID_NONE;
}
// if first key is unbound, or both keys are bound
if (ba.ba_iFirstKey == KID_NONE || ba.ba_iSecondKey != KID_NONE) {
// bind first key
ba.ba_iFirstKey = iDik;
// clear second key
ba.ba_iSecondKey = KID_NONE;
// if only first key bound
} else {
// bind second key
ba.ba_iSecondKey = iDik;
}
// if it is not this one
} else {
// clear bindings that contain this key
if (ba.ba_iFirstKey == iDik) {
ba.ba_iFirstKey = KID_NONE;
}
if (ba.ba_iSecondKey == iDik) {
ba.ba_iSecondKey = KID_NONE;
}
}
ict++;
}
SetBindingNames(/*bDefining=*/FALSE);
}
void CMGKeyDefinition::Think(void)
{
if (mg_iState == RELEASE_RETURN_WAITING)
{
_bDefiningKey = TRUE;
extern BOOL _bMouseUsedLast;
_bMouseUsedLast = FALSE;
_pInput->SetJoyPolling(TRUE);
_pInput->GetInput(FALSE);
if (_pInput->IsInputEnabled() &&
!_pInput->GetButtonState(KID_ENTER) &&
!_pInput->GetButtonState(KID_MOUSE1))
{
mg_iState = PRESS_KEY_WAITING;
}
}
else if (mg_iState == PRESS_KEY_WAITING)
{
_pInput->SetJoyPolling(TRUE);
_pInput->GetInput(FALSE);
for (INDEX iDik = 0; iDik<MAX_OVERALL_BUTTONS; iDik++)
{
if (_pInput->GetButtonState(iDik))
{
// skip keys that cannot be defined
if (iDik == KID_TILDE) {
continue;
}
// if escape not pressed
if (iDik != KID_ESCAPE) {
// define the new key
DefineKey(iDik);
// if escape pressed
} else {
// undefine the key
DefineKey(KID_NONE);
}
// end defining loop
mg_iState = DOING_NOTHING;
_bDefiningKey = FALSE;
// refresh all buttons
pgmCurrentMenu->FillListItems();
break;
}
}
}
}
void CMGKeyDefinition::Render(CDrawPort *pdp)
{
SetFontMedium(pdp);
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
PIX pixIL = box.Min()(1) + box.Size()(1)*0.45f;
PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f;
PIX pixJ = box.Min()(2);
COLOR col = GetCurrentColor();
pdp->PutTextR(mg_strLabel, pixIL, pixJ, col);
pdp->PutText(mg_strBinding, pixIR, pixJ, col);
}

View File

@ -0,0 +1,45 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_KEYDEFINITION_H
#define SE_INCL_MENU_GADGET_KEYDEFINITION_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MenuGadget.h"
class CMGKeyDefinition : public CMenuGadget {
public:
INDEX mg_iState;
INDEX mg_iControlNumber;
CTString mg_strLabel;
CTString mg_strBinding;
CMGKeyDefinition(void);
void Appear(void);
void Disappear(void);
void OnActivate(void);
// return TRUE if handled
BOOL OnKeyDown(int iVKey);
void Think(void);
// set names for both key bindings
void SetBindingNames(BOOL bDefining);
void DefineKey(INDEX iDik);
void Render(CDrawPort *pdp);
};
#endif /* include-once check. */

View File

@ -0,0 +1,37 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGLevelButton.h"
extern CSoundData *_psdPress;
void CMGLevelButton::OnActivate(void)
{
PlayMenuSound(_psdPress);
IFeel_PlayEffect("Menu_press");
_pGame->gam_strCustomLevel = mg_fnmLevel;
extern void(*_pAfterLevelChosen)(void);
_pAfterLevelChosen();
}
void CMGLevelButton::OnSetFocus(void)
{
SetThumbnail(mg_fnmLevel);
CMGButton::OnSetFocus();
}

View File

@ -0,0 +1,32 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_LEVELBUTTON_H
#define SE_INCL_MENU_GADGET_LEVELBUTTON_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGButton.h"
class CMGLevelButton : public CMGButton {
public:
CTFileName mg_fnmLevel;
void OnActivate(void);
void OnSetFocus(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,125 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGModel.h"
extern INDEX sam_bWideScreen;
CMGModel::CMGModel(void)
{
mg_fFloorY = 0;
}
void CMGModel::Render(CDrawPort *pdp)
{
// if no model
if (mg_moModel.GetData() == NULL) {
// just render text
mg_strText = TRANS("No model");
CMGButton::Render(pdp);
return;
}
// get position on screen
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
CDrawPort dpModel(pdp, box);
dpModel.Lock();
dpModel.FillZBuffer(1.0f);
LCDSetDrawport(&dpModel);
// clear menu here
dpModel.Fill(C_BLACK | 255);
LCDRenderClouds1();
LCDRenderClouds2();
// prepare projection
CRenderModel rmRenderModel;
CPerspectiveProjection3D pr;
pr.FOVL() = sam_bWideScreen ? AngleDeg(45.0f) : AngleDeg(30.0f);
pr.ScreenBBoxL() = FLOATaabbox2D(
FLOAT2D(0.0f, 0.0f),
FLOAT2D((float)dpModel.GetWidth(), (float)dpModel.GetHeight())
);
pr.AspectRatioL() = 1.0f;
pr.FrontClipDistanceL() = 0.3f;
pr.ViewerPlacementL() = CPlacement3D(FLOAT3D(0, 0, 0), ANGLE3D(0, 0, 0));
// initialize remdering
CAnyProjection3D apr;
apr = pr;
BeginModelRenderingView(apr, &dpModel);
rmRenderModel.rm_vLightDirection = FLOAT3D(0.2f, -0.2f, -0.2f);
// if model needs floor
if (mg_moFloor.GetData() != NULL) {
// set floor's position
CPlacement3D pl = mg_plModel;
pl.pl_OrientationAngle = ANGLE3D(0, 0, 0);
pl.pl_PositionVector = mg_plModel.pl_PositionVector;
pl.pl_PositionVector(2) += mg_fFloorY;
rmRenderModel.SetObjectPlacement(pl);
// render the floor
rmRenderModel.rm_colLight = C_WHITE;
rmRenderModel.rm_colAmbient = C_WHITE;
mg_moFloor.SetupModelRendering(rmRenderModel);
mg_moFloor.RenderModel(rmRenderModel);
}
// set model's position
CPlacement3D pl;
pl.pl_OrientationAngle = mg_plModel.pl_OrientationAngle;
pl.pl_PositionVector = mg_plModel.pl_PositionVector;
extern FLOAT sam_fPlayerOffset;
pl.pl_PositionVector(3) += sam_fPlayerOffset;
rmRenderModel.SetObjectPlacement(pl);
// render the model
rmRenderModel.rm_colLight = LerpColor(C_BLACK, C_WHITE, 0.4f) | CT_OPAQUE;
rmRenderModel.rm_colAmbient = LerpColor(C_BLACK, C_WHITE, 0.2f) | CT_OPAQUE;
mg_moModel.SetupModelRendering(rmRenderModel);
FLOATplane3D plFloorPlane = FLOATplane3D(FLOAT3D(0.0f, 1.0f, 0.0f),
mg_plModel.pl_PositionVector(2) + mg_fFloorY);
FLOAT3D vShadowLightDir = FLOAT3D(-0.2f, -0.4f, -0.6f);
CPlacement3D plLightPlacement = CPlacement3D(
mg_plModel.pl_PositionVector +
vShadowLightDir*mg_plModel.pl_PositionVector(3) * 5,
ANGLE3D(0, 0, 0));
mg_moModel.RenderShadow(rmRenderModel, plLightPlacement, 200.0f, 200.0f, 1.0f, plFloorPlane);
mg_moModel.RenderModel(rmRenderModel);
EndModelRenderingView();
LCDScreenBox(LCDGetColor(C_GREEN, "model box") | GetCurrentColor());
dpModel.Unlock();
pdp->Unlock();
pdp->Lock();
LCDSetDrawport(pdp);
// print the model name
{
PIXaabbox2D box = FloatBoxToPixBox(pdp, BoxPlayerModelName());
COLOR col = GetCurrentColor();
PIX pixI = box.Min()(1);
PIX pixJ = box.Max()(2);
pdp->PutText(mg_strText, pixI, pixJ, col);
}
}

View File

@ -0,0 +1,35 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_MODEL_H
#define SE_INCL_MENU_GADGET_MODEL_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGButton.h"
class CMGModel : public CMGButton {
public:
CModelObject mg_moModel;
CModelObject mg_moFloor;
CPlacement3D mg_plModel;
BOOL mg_fFloorY;
CMGModel(void);
void Render(CDrawPort *pdp);
};
#endif /* include-once check. */

View File

@ -0,0 +1,453 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGServerList.h"
#include "MGEdit.h"
extern CSoundData *_psdSelect;
extern CSoundData *_psdPress;
FLOATaabbox2D GetBoxPartHoriz(const FLOATaabbox2D &box, FLOAT fMin, FLOAT fMax)
{
FLOAT fBoxMin = box.Min()(1);
FLOAT fBoxSize = box.Size()(1);
return FLOATaabbox2D(
FLOAT2D(fBoxMin + fBoxSize*fMin, box.Min()(2)),
FLOAT2D(fBoxMin + fBoxSize*fMax, box.Max()(2)));
}
void PrintInBox(CDrawPort *pdp, PIX pixI, PIX pixJ, PIX pixSizeI, CTString str, COLOR col)
{
str = str.Undecorated();
PIX pixCharSize = pdp->dp_pixTextCharSpacing + pdp->dp_FontData->fd_pixCharWidth;
str.TrimRight(pixSizeI / pixCharSize);
// print text
pdp->PutText(str, pixI, pixJ, col);
}
CMGServerList::CMGServerList()
{
mg_iSelected = 0;
mg_iFirstOnScreen = 0;
mg_ctOnScreen = 10;
mg_pixMinI = 0;
mg_pixMaxI = 0;
mg_pixListMinJ = 0;
mg_pixListStepJ = 0;
mg_pixDragJ = -1;
mg_iDragLine = -1;
mg_pixMouseDrag = -1;
// by default, sort by ping, best on top
mg_iSort = 2;
mg_bSortDown = FALSE;
}
void CMGServerList::AdjustFirstOnScreen(void)
{
INDEX ctSessions = _lhServers.Count();
mg_iSelected = Clamp(mg_iSelected, 0L, ClampDn(ctSessions - 1L, 0L));
mg_iFirstOnScreen = Clamp(mg_iFirstOnScreen, 0L, ClampDn(ctSessions - mg_ctOnScreen, 0L));
if (mg_iSelected<mg_iFirstOnScreen) {
mg_iFirstOnScreen = ClampUp(mg_iSelected, ClampDn(ctSessions - mg_ctOnScreen - 1L, 0L));
} else if (mg_iSelected >= mg_iFirstOnScreen + mg_ctOnScreen) {
mg_iFirstOnScreen = ClampDn(mg_iSelected - mg_ctOnScreen + 1L, 0L);
}
}
BOOL _iSort = 0;
BOOL _bSortDown = FALSE;
int CompareSessions(const void *pv0, const void *pv1)
{
const CNetworkSession &ns0 = **(const CNetworkSession **)pv0;
const CNetworkSession &ns1 = **(const CNetworkSession **)pv1;
int iResult = 0;
switch (_iSort) {
case 0: iResult = stricmp(ns0.ns_strSession, ns1.ns_strSession); break;
case 1: iResult = stricmp(ns0.ns_strWorld, ns1.ns_strWorld); break;
case 2: iResult = Sgn(ns0.ns_tmPing - ns1.ns_tmPing); break;
case 3: iResult = Sgn(ns0.ns_ctPlayers - ns1.ns_ctPlayers); break;
case 4: iResult = stricmp(ns0.ns_strGameType, ns1.ns_strGameType); break;
case 5: iResult = stricmp(ns0.ns_strMod, ns1.ns_strMod); break;
case 6: iResult = stricmp(ns0.ns_strVer, ns1.ns_strVer); break;
}
if (iResult == 0) { // make sure we always have unique order when resorting
return stricmp(ns0.ns_strAddress, ns1.ns_strAddress);;
}
return _bSortDown ? -iResult : iResult;
}
extern CMGButton mgServerColumn[7];
extern CMGEdit mgServerFilter[7];
void SortAndFilterServers(void)
{
{FORDELETELIST(CNetworkSession, ns_lnNode, _lhServers, itns) {
delete &*itns;
}}
{FOREACHINLIST(CNetworkSession, ns_lnNode, _pNetwork->ga_lhEnumeratedSessions, itns) {
CNetworkSession &ns = *itns;
extern CTString _strServerFilter[7];
if (_strServerFilter[0] != "" && !ns.ns_strSession.Matches("*" + _strServerFilter[0] + "*")) continue;
if (_strServerFilter[1] != "" && !ns.ns_strWorld.Matches("*" + _strServerFilter[1] + "*")) continue;
if (_strServerFilter[2] != "") {
char strCompare[3] = { 0, 0, 0 };
int iPing = 0;
_strServerFilter[2].ScanF("%2[<>=]%d", strCompare, &iPing);
if (strcmp(strCompare, "<") == 0 && !(int(ns.ns_tmPing * 1000)< iPing)) continue;
if (strcmp(strCompare, "<=") == 0 && !(int(ns.ns_tmPing * 1000) <= iPing)) continue;
if (strcmp(strCompare, ">") == 0 && !(int(ns.ns_tmPing * 1000)> iPing)) continue;
if (strcmp(strCompare, ">=") == 0 && !(int(ns.ns_tmPing * 1000) >= iPing)) continue;
if (strcmp(strCompare, "=") == 0 && !(int(ns.ns_tmPing * 1000) == iPing)) continue;
}
if (_strServerFilter[3] != "") {
char strCompare[3] = { 0, 0, 0 };
int iPlayers = 0;
_strServerFilter[3].ScanF("%2[<>=]%d", strCompare, &iPlayers);
if (strcmp(strCompare, "<") == 0 && !(ns.ns_ctPlayers< iPlayers)) continue;
if (strcmp(strCompare, "<=") == 0 && !(ns.ns_ctPlayers <= iPlayers)) continue;
if (strcmp(strCompare, ">") == 0 && !(ns.ns_ctPlayers> iPlayers)) continue;
if (strcmp(strCompare, ">=") == 0 && !(ns.ns_ctPlayers >= iPlayers)) continue;
if (strcmp(strCompare, "=") == 0 && !(ns.ns_ctPlayers == iPlayers)) continue;
}
if (_strServerFilter[4] != "" && !ns.ns_strGameType.Matches("*" + _strServerFilter[4] + "*")) continue;
if (_strServerFilter[5] != "" && !ns.ns_strMod.Matches("*" + _strServerFilter[5] + "*")) continue;
if (_strServerFilter[6] != "" && !ns.ns_strVer.Matches("*" + _strServerFilter[6] + "*")) continue;
CNetworkSession *pnsNew = new CNetworkSession;
pnsNew->Copy(*itns);
_lhServers.AddTail(pnsNew->ns_lnNode);
}
}
_lhServers.Sort(CompareSessions, offsetof(CNetworkSession, ns_lnNode));
}
void CMGServerList::Render(CDrawPort *pdp)
{
_iSort = mg_iSort;
_bSortDown = mg_bSortDown;
SortAndFilterServers();
SetFontSmall(pdp);
BOOL bFocusedBefore = mg_bFocused;
mg_bFocused = FALSE;
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
COLOR col = GetCurrentColor();
PIX pixDPSizeI = pdp->GetWidth();
PIX pixDPSizeJ = pdp->GetHeight();
PIX pixCharSizeI = pdp->dp_pixTextCharSpacing + pdp->dp_FontData->fd_pixCharWidth;
PIX pixCharSizeJ = pdp->dp_pixTextLineSpacing + pdp->dp_FontData->fd_pixCharHeight + 1;
PIX pixLineSize = 1;
PIX pixSliderSizeI = 10;
PIX pixOuterMargin = 20;
INDEX ctSessions = _lhServers.Count();
INDEX iSession = 0;
INDEX ctColumns[7];
{for (INDEX i = 0; i<ARRAYCOUNT(ctColumns); i++) {
ctColumns[i] = mgServerColumn[i].mg_strText.Length() + 1;
}}
PIX pixSizePing = Max(PIX(pixCharSizeI * 5), pixCharSizeI*ctColumns[2]) + pixLineSize * 2;
PIX pixSizePlayerCt = Max(PIX(pixCharSizeI * 5), pixCharSizeI*ctColumns[3]) + pixLineSize * 2;
PIX pixSizeGameType = Max(Min(PIX(pixCharSizeI * 20), PIX(pixDPSizeI*0.2f)), pixCharSizeI*ctColumns[4]) + pixLineSize * 2;
PIX pixSizeMapName = Max(PIX(pixDPSizeI*0.25f), pixCharSizeI*ctColumns[1]) + pixLineSize * 2;
PIX pixSizeMod = Max(Min(PIX(pixCharSizeI * 11), PIX(pixDPSizeI*0.2f)), pixCharSizeI*ctColumns[5]) + pixLineSize * 2;
PIX pixSizeVer = Max(PIX(pixCharSizeI * 7), pixCharSizeI*ctColumns[6]) + pixLineSize * 2;
PIX apixSeparatorI[9];
apixSeparatorI[0] = pixOuterMargin;
apixSeparatorI[8] = pixDPSizeI - pixOuterMargin - pixLineSize;
apixSeparatorI[7] = apixSeparatorI[8] - pixSliderSizeI - pixLineSize;
apixSeparatorI[6] = apixSeparatorI[7] - pixSizeVer - pixLineSize;
apixSeparatorI[5] = apixSeparatorI[6] - pixSizeMod - pixLineSize;
apixSeparatorI[4] = apixSeparatorI[5] - pixSizeGameType - pixLineSize;
apixSeparatorI[3] = apixSeparatorI[4] - pixSizePlayerCt - pixLineSize;
apixSeparatorI[2] = apixSeparatorI[3] - pixSizePing - pixLineSize;
apixSeparatorI[1] = apixSeparatorI[2] - pixSizeMapName - pixLineSize;
apixSeparatorI[1] = apixSeparatorI[2] - pixSizeMapName - pixLineSize;
PIX pixSizeServerName = apixSeparatorI[1] - apixSeparatorI[0] - pixLineSize;
PIX pixTopJ = pixDPSizeJ*0.15f;
PIX pixBottomJ = pixDPSizeJ*0.82f;
PIX pixFilterTopJ = pixTopJ + pixLineSize * 3 + pixCharSizeJ + pixLineSize * 3;
PIX pixListTopJ = pixFilterTopJ + pixLineSize + pixCharSizeJ + pixLineSize;
INDEX ctSessionsOnScreen = (pixBottomJ - pixListTopJ) / pixCharSizeJ;
pixBottomJ = pixListTopJ + pixCharSizeJ*ctSessionsOnScreen + pixLineSize * 2;
mg_pixMinI = apixSeparatorI[0];
mg_pixMaxI = apixSeparatorI[5];
mg_pixListMinJ = pixListTopJ;
mg_pixListStepJ = pixCharSizeJ;
mg_pixSBMinI = apixSeparatorI[7];
mg_pixSBMaxI = apixSeparatorI[8];
mg_pixSBMinJ = pixListTopJ;
mg_pixSBMaxJ = pixBottomJ;
mg_pixHeaderMinJ = pixTopJ;
mg_pixHeaderMidJ = pixTopJ + pixLineSize + pixCharSizeJ;
mg_pixHeaderMaxJ = pixTopJ + (pixLineSize + pixCharSizeJ) * 2;
memcpy(mg_pixHeaderI, apixSeparatorI, sizeof(mg_pixHeaderI));
{for (INDEX i = 0; i<ARRAYCOUNT(mgServerFilter); i++) {
mgServerColumn[i].mg_boxOnScreen = PixBoxToFloatBox(pdp,
PIXaabbox2D(PIX2D(apixSeparatorI[i] + pixCharSizeI / 2, pixTopJ + pixLineSize * 4), PIX2D(apixSeparatorI[i + 1] - pixCharSizeI / 2, pixTopJ + pixLineSize * 4 + pixCharSizeJ)));
mgServerFilter[i].mg_boxOnScreen = PixBoxToFloatBox(pdp,
PIXaabbox2D(PIX2D(apixSeparatorI[i] + pixCharSizeI / 2, pixFilterTopJ), PIX2D(apixSeparatorI[i + 1] - pixCharSizeI / 2, pixFilterTopJ + pixCharSizeJ)));
}}
for (INDEX i = 0; i<ARRAYCOUNT(apixSeparatorI); i++) {
pdp->DrawLine(apixSeparatorI[i], pixTopJ, apixSeparatorI[i], pixBottomJ, col | CT_OPAQUE);
}
pdp->DrawLine(apixSeparatorI[0], pixTopJ, apixSeparatorI[8], pixTopJ, col | CT_OPAQUE);
pdp->DrawLine(apixSeparatorI[0], pixListTopJ - pixLineSize, apixSeparatorI[8], pixListTopJ - pixLineSize, col | CT_OPAQUE);
pdp->DrawLine(apixSeparatorI[0], pixBottomJ, apixSeparatorI[8], pixBottomJ, col | CT_OPAQUE);
PIXaabbox2D boxHandle = GetScrollBarHandleBox();
pdp->Fill(boxHandle.Min()(1) + 2, boxHandle.Min()(2) + 2, boxHandle.Size()(1) - 3, boxHandle.Size()(2) - 3, col | CT_OPAQUE);
PIX pixJ = pixTopJ + pixLineSize * 2 + 1;
mg_ctOnScreen = ctSessionsOnScreen;
AdjustFirstOnScreen();
if (_lhServers.Count() == 0) {
if (_pNetwork->ga_strEnumerationStatus != "") {
mg_bFocused = TRUE;
COLOR colItem = GetCurrentColor();
PrintInBox(pdp, apixSeparatorI[0] + pixCharSizeI, pixListTopJ + pixCharSizeJ + pixLineSize + 1, apixSeparatorI[1] - apixSeparatorI[0],
TRANS("searching..."), colItem);
}
} else {
FOREACHINLIST(CNetworkSession, ns_lnNode, _lhServers, itns) {
CNetworkSession &ns = *itns;
if (iSession<mg_iFirstOnScreen || iSession >= mg_iFirstOnScreen + ctSessionsOnScreen) {
iSession++;
continue;
}
PIX pixJ = pixListTopJ + (iSession - mg_iFirstOnScreen)*pixCharSizeJ + pixLineSize + 1;
mg_bFocused = bFocusedBefore&&iSession == mg_iSelected;
COLOR colItem = GetCurrentColor();
if (ns.ns_strVer != _SE_VER_STRING) {
colItem = MulColors(colItem, 0xA0A0A0FF);
}
CTString strPing(0, "%4d", INDEX(ns.ns_tmPing * 1000));
CTString strPlayersCt(0, "%2d/%2d", ns.ns_ctPlayers, ns.ns_ctMaxPlayers);
CTString strMod = ns.ns_strMod;
if (strMod == "") {
strMod = "SeriousSam";
}
PrintInBox(pdp, apixSeparatorI[0] + pixCharSizeI / 2, pixJ, apixSeparatorI[1] - apixSeparatorI[0] - pixCharSizeI, ns.ns_strSession, colItem);
PrintInBox(pdp, apixSeparatorI[1] + pixCharSizeI / 2, pixJ, apixSeparatorI[2] - apixSeparatorI[1] - pixCharSizeI, TranslateConst(ns.ns_strWorld), colItem);
PrintInBox(pdp, apixSeparatorI[2] + pixCharSizeI / 2, pixJ, apixSeparatorI[3] - apixSeparatorI[2] - pixCharSizeI, strPing, colItem);
PrintInBox(pdp, apixSeparatorI[3] + pixCharSizeI / 2, pixJ, apixSeparatorI[4] - apixSeparatorI[3] - pixCharSizeI, strPlayersCt, colItem);
PrintInBox(pdp, apixSeparatorI[4] + pixCharSizeI / 2, pixJ, apixSeparatorI[5] - apixSeparatorI[4] - pixCharSizeI, TranslateConst(ns.ns_strGameType), colItem);
PrintInBox(pdp, apixSeparatorI[5] + pixCharSizeI / 2, pixJ, apixSeparatorI[6] - apixSeparatorI[5] - pixCharSizeI, TranslateConst(strMod), colItem);
PrintInBox(pdp, apixSeparatorI[6] + pixCharSizeI / 2, pixJ, apixSeparatorI[7] - apixSeparatorI[6] - pixCharSizeI, ns.ns_strVer, colItem);
iSession++;
}
}
mg_bFocused = bFocusedBefore;
}
static INDEX SliderPixToIndex(PIX pixOffset, INDEX iVisible, INDEX iTotal, PIXaabbox2D boxFull)
{
FLOAT fSize = ClampUp(FLOAT(iVisible) / iTotal, 1.0f);
PIX pixFull = boxFull.Size()(2);
PIX pixSize = PIX(pixFull*fSize);
if (pixSize >= boxFull.Size()(2)) {
return 0;
}
return (iTotal*pixOffset) / pixFull;
}
static PIXaabbox2D GetSliderBox(INDEX iFirst, INDEX iVisible, INDEX iTotal,
PIXaabbox2D boxFull)
{
if (iTotal <= 0) {
return boxFull;
}
FLOAT fSize = ClampUp(FLOAT(iVisible) / iTotal, 1.0f);
PIX pixFull = boxFull.Size()(2);
PIX pixSize = PIX(pixFull*fSize);
pixSize = ClampDn(pixSize, boxFull.Size()(1));
PIX pixTop = pixFull*(FLOAT(iFirst) / iTotal) + boxFull.Min()(2);
PIX pixI0 = boxFull.Min()(1);
PIX pixI1 = boxFull.Max()(1);
return PIXaabbox2D(PIX2D(pixI0, pixTop), PIX2D(pixI1, pixTop + pixSize));
}
PIXaabbox2D CMGServerList::GetScrollBarFullBox(void)
{
return PIXaabbox2D(PIX2D(mg_pixSBMinI, mg_pixSBMinJ), PIX2D(mg_pixSBMaxI, mg_pixSBMaxJ));
}
PIXaabbox2D CMGServerList::GetScrollBarHandleBox(void)
{
return GetSliderBox(mg_iFirstOnScreen, mg_ctOnScreen, _lhServers.Count(), GetScrollBarFullBox());
}
void CMGServerList::OnMouseOver(PIX pixI, PIX pixJ)
{
mg_pixMouseI = pixI;
mg_pixMouseJ = pixJ;
if (!(GetKeyState(VK_LBUTTON) & 0x8000)) {
mg_pixDragJ = -1;
}
BOOL bInSlider = (pixI >= mg_pixSBMinI && pixI <= mg_pixSBMaxI && pixJ >= mg_pixSBMinJ && pixJ <= mg_pixSBMaxJ);
if (mg_pixDragJ >= 0 && bInSlider) {
PIX pixDelta = pixJ - mg_pixDragJ;
INDEX ctSessions = _lhServers.Count();
INDEX iWantedLine = mg_iDragLine +
SliderPixToIndex(pixDelta, mg_ctOnScreen, ctSessions, GetScrollBarFullBox());
mg_iFirstOnScreen = Clamp(iWantedLine, 0L, ClampDn(ctSessions - mg_ctOnScreen, 0L));
mg_iSelected = Clamp(mg_iSelected, mg_iFirstOnScreen, mg_iFirstOnScreen + mg_ctOnScreen - 1L);
// AdjustFirstOnScreen();
return;
}
// if some server is selected
if (pixI >= mg_pixMinI && pixI <= mg_pixMaxI) {
INDEX iOnScreen = (pixJ - mg_pixListMinJ) / mg_pixListStepJ;
if (iOnScreen >= 0 && iOnScreen<mg_ctOnScreen) {
// put focus on it
mg_iSelected = mg_iFirstOnScreen + iOnScreen;
AdjustFirstOnScreen();
mg_pixMouseDrag = -1;
}
} else if (bInSlider) {
mg_pixMouseDrag = pixJ;
}
}
BOOL CMGServerList::OnKeyDown(int iVKey)
{
switch (iVKey) {
case VK_UP:
mg_iSelected -= 1;
AdjustFirstOnScreen();
break;
case VK_DOWN:
mg_iSelected += 1;
AdjustFirstOnScreen();
break;
case VK_PRIOR:
mg_iSelected -= mg_ctOnScreen - 1;
mg_iFirstOnScreen -= mg_ctOnScreen - 1;
AdjustFirstOnScreen();
break;
case VK_NEXT:
mg_iSelected += mg_ctOnScreen - 1;
mg_iFirstOnScreen += mg_ctOnScreen - 1;
AdjustFirstOnScreen();
break;
case 11:
mg_iSelected -= 3;
mg_iFirstOnScreen -= 3;
AdjustFirstOnScreen();
break;
case 10:
mg_iSelected += 3;
mg_iFirstOnScreen += 3;
AdjustFirstOnScreen();
break;
case VK_LBUTTON:
/* if (mg_pixMouseJ>=mg_pixHeaderMinJ && mg_pixMouseJ<=mg_pixHeaderMidJ
&& mg_pixMouseI>=mg_pixHeaderI[0] && mg_pixMouseI<=mg_pixHeaderI[7]) {
INDEX iNewSort = mg_iSort;
if (mg_pixMouseI<=mg_pixHeaderI[1]) {
iNewSort = 0;
} else if (mg_pixMouseI<=mg_pixHeaderI[2]) {
iNewSort = 1;
} else if (mg_pixMouseI<=mg_pixHeaderI[3]) {
iNewSort = 2;
} else if (mg_pixMouseI<=mg_pixHeaderI[4]) {
iNewSort = 3;
} else if (mg_pixMouseI<=mg_pixHeaderI[5]) {
iNewSort = 4;
} else if (mg_pixMouseI<=mg_pixHeaderI[6]) {
iNewSort = 5;
} else if (mg_pixMouseI<=mg_pixHeaderI[7]) {
iNewSort = 6;
}
if (iNewSort==mg_iSort) {
mg_bSortDown = !mg_bSortDown;
} else {
mg_bSortDown = FALSE;
}
mg_iSort = iNewSort;
break;
} else */if (mg_pixMouseDrag >= 0) {
mg_pixDragJ = mg_pixMouseDrag;
mg_iDragLine = mg_iFirstOnScreen;
break;
}
case VK_RETURN:
PlayMenuSound(_psdPress);
IFeel_PlayEffect("Menu_press");
{INDEX i = 0;
FOREACHINLIST(CNetworkSession, ns_lnNode, _lhServers, itns) {
if (i == mg_iSelected) {
char strAddress[256];
int iPort;
itns->ns_strAddress.ScanF("%200[^:]:%d", &strAddress, &iPort);
_pGame->gam_strJoinAddress = strAddress;
_pShell->SetINDEX("net_iPort", iPort);
extern void StartSelectPlayersMenuFromServers(void);
StartSelectPlayersMenuFromServers();
return TRUE;
}
i++;
}}
break;
default:
return FALSE;
}
return TRUE;
}
void CMGServerList::OnSetFocus(void)
{
mg_bFocused = TRUE;
}
void CMGServerList::OnKillFocus(void)
{
mg_bFocused = FALSE;
}

View File

@ -0,0 +1,66 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_SERVERLIST_H
#define SE_INCL_MENU_GADGET_SERVERLIST_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGButton.h"
class CMGServerList : public CMGButton {
public:
INDEX mg_iSelected;
INDEX mg_iFirstOnScreen;
INDEX mg_ctOnScreen;
// server list dimensions
PIX mg_pixMinI;
PIX mg_pixMaxI;
PIX mg_pixListMinJ;
PIX mg_pixListStepJ;
// header dimensions
PIX mg_pixHeaderMinJ;
PIX mg_pixHeaderMidJ;
PIX mg_pixHeaderMaxJ;
PIX mg_pixHeaderI[8];
// scrollbar dimensions
PIX mg_pixSBMinI;
PIX mg_pixSBMaxI;
PIX mg_pixSBMinJ;
PIX mg_pixSBMaxJ;
// scrollbar dragging params
PIX mg_pixDragJ;
PIX mg_iDragLine;
PIX mg_pixMouseDrag;
// current mouse pos
PIX mg_pixMouseI;
PIX mg_pixMouseJ;
INDEX mg_iSort; // column to sort by
BOOL mg_bSortDown; // sort in reverse order
CMGServerList();
BOOL OnKeyDown(int iVKey);
PIXaabbox2D GetScrollBarFullBox(void);
PIXaabbox2D GetScrollBarHandleBox(void);
void OnSetFocus(void);
void OnKillFocus(void);
void Render(CDrawPort *pdp);
void AdjustFirstOnScreen(void);
void OnMouseOver(PIX pixI, PIX pixJ);
};
#endif /* include-once check. */

View File

@ -0,0 +1,125 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGSlider.h"
extern PIX _pixCursorPosI;
extern PIX _pixCursorPosJ;
extern INDEX sam_bWideScreen;
CMGSlider::CMGSlider()
{
mg_iMinPos = 0;
mg_iMaxPos = 16;
mg_iCurPos = 8;
mg_pOnSliderChange = NULL;
mg_fFactor = 1.0f;
}
void CMGSlider::ApplyCurrentPosition(void)
{
mg_iCurPos = Clamp(mg_iCurPos, mg_iMinPos, mg_iMaxPos);
FLOAT fStretch = FLOAT(mg_iCurPos) / (mg_iMaxPos - mg_iMinPos);
mg_fFactor = fStretch;
if (mg_pOnSliderChange != NULL) {
mg_pOnSliderChange(mg_iCurPos);
}
}
void CMGSlider::ApplyGivenPosition(INDEX iMin, INDEX iMax, INDEX iCur)
{
mg_iMinPos = iMin;
mg_iMaxPos = iMax;
mg_iCurPos = iCur;
ApplyCurrentPosition();
}
BOOL CMGSlider::OnKeyDown(int iVKey)
{
// if scrolling left
if ((iVKey == VK_BACK || iVKey == VK_LEFT) && mg_iCurPos>mg_iMinPos) {
mg_iCurPos--;
ApplyCurrentPosition();
return TRUE;
// if scrolling right
} else if ((iVKey == VK_RETURN || iVKey == VK_RIGHT) && mg_iCurPos<mg_iMaxPos) {
mg_iCurPos++;
ApplyCurrentPosition();
return TRUE;
// if lmb pressed
} else if (iVKey == VK_LBUTTON) {
// get position of slider box on screen
PIXaabbox2D boxSlider = GetSliderBox();
// if mouse is within
if (boxSlider >= PIX2D(_pixCursorPosI, _pixCursorPosJ)) {
// set new position exactly where mouse pointer is
FLOAT fRatio = FLOAT(_pixCursorPosI - boxSlider.Min()(1)) / boxSlider.Size()(1);
fRatio = (fRatio - 0.01f) / (0.99f - 0.01f);
fRatio = Clamp(fRatio, 0.0f, 1.0f);
mg_iCurPos = fRatio*(mg_iMaxPos - mg_iMinPos) + mg_iMinPos;
ApplyCurrentPosition();
return TRUE;
}
}
return CMenuGadget::OnKeyDown(iVKey);
}
PIXaabbox2D CMGSlider::GetSliderBox(void)
{
extern CDrawPort *pdp;
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f;
PIX pixJ = box.Min()(2);
PIX pixJSize = box.Size()(2)*0.95f;
PIX pixISizeR = box.Size()(1)*0.45f;
if (sam_bWideScreen) pixJSize++;
return PIXaabbox2D(PIX2D(pixIR + 1, pixJ + 1), PIX2D(pixIR + pixISizeR - 2, pixJ + pixJSize - 2));
}
void CMGSlider::Render(CDrawPort *pdp)
{
SetFontMedium(pdp);
// get geometry
COLOR col = GetCurrentColor();
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
PIX pixIL = box.Min()(1) + box.Size()(1)*0.45f;
PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f;
PIX pixJ = box.Min()(2);
PIX pixJSize = box.Size()(2)*0.95f;
PIX pixISizeR = box.Size()(1)*0.45f;
if (sam_bWideScreen) pixJSize++;
// print text left of slider
pdp->PutTextR(mg_strText, pixIL, pixJ, col);
// draw box around slider
LCDDrawBox(0, -1, PIXaabbox2D(PIX2D(pixIR + 1, pixJ), PIX2D(pixIR + pixISizeR - 2, pixJ + pixJSize - 2)),
LCDGetColor(C_GREEN | 255, "slider box"));
// draw filled part of slider
pdp->Fill(pixIR + 2, pixJ + 1, (pixISizeR - 5)*mg_fFactor, (pixJSize - 4), col);
// print percentage text
CTString strPercentage;
strPercentage.PrintF("%d%%", (int)floor(mg_fFactor * 100 + 0.5f));
pdp->PutTextC(strPercentage, pixIR + pixISizeR / 2, pixJ + 1, col);
}

View File

@ -0,0 +1,41 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_SLIDER_H
#define SE_INCL_MENU_GADGET_SLIDER_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGButton.h"
class CMGSlider : public CMGButton {
public:
FLOAT mg_fFactor;
INDEX mg_iMinPos;
INDEX mg_iMaxPos;
INDEX mg_iCurPos;
CMGSlider();
void ApplyCurrentPosition(void);
void ApplyGivenPosition(INDEX iMin, INDEX iMax, INDEX iCur);
// return TRUE if handled
virtual BOOL OnKeyDown(int iVKey);
void(*mg_pOnSliderChange)(INDEX iCurPos);
PIXaabbox2D GetSliderBox(void);
void Render(CDrawPort *pdp);
};
#endif /* include-once check. */

View File

@ -0,0 +1,31 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGTitle.h"
void CMGTitle::Render(CDrawPort *pdp)
{
SetFontTitle(pdp);
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
PIX pixI = box.Center()(1);
PIX pixJ = box.Min()(2);
pdp->PutTextC(mg_strText, pixI, pixJ, LCDGetColor(C_WHITE | CT_OPAQUE, "title"));
}

View File

@ -0,0 +1,30 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_TITLE_H
#define SE_INCL_MENU_GADGET_TITLE_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MenuGadget.h"
class CMGTitle : public CMenuGadget {
public:
CTString mg_strText;
void Render(CDrawPort *pdp);
};
#endif /* include-once check. */

View File

@ -0,0 +1,121 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "MGTrigger.h"
INDEX GetNewLoopValue(int iVKey, INDEX iCurrent, INDEX ctMembers)
{
INDEX iPrev = (iCurrent + ctMembers - 1) % ctMembers;
INDEX iNext = (iCurrent + 1) % ctMembers;
// return and right arrow set new text
if (iVKey == VK_RETURN || iVKey == VK_LBUTTON || iVKey == VK_RIGHT)
{
return iNext;
// left arrow and backspace sets prev text
} else if ((iVKey == VK_BACK || iVKey == VK_RBUTTON) || (iVKey == VK_LEFT)) {
return iPrev;
}
return iCurrent;
}
CMGTrigger::CMGTrigger(void)
{
mg_pPreTriggerChange = NULL;
mg_pOnTriggerChange = NULL;
mg_iCenterI = 0;
mg_bVisual = FALSE;
}
void CMGTrigger::ApplyCurrentSelection(void)
{
mg_iSelected = Clamp(mg_iSelected, 0L, mg_ctTexts - 1L);
mg_strValue = mg_astrTexts[mg_iSelected];
}
void CMGTrigger::OnSetNextInList(int iVKey)
{
if (mg_pPreTriggerChange != NULL) {
mg_pPreTriggerChange(mg_iSelected);
}
mg_iSelected = GetNewLoopValue(iVKey, mg_iSelected, mg_ctTexts);
mg_strValue = mg_astrTexts[mg_iSelected];
if (mg_pOnTriggerChange != NULL) {
(*mg_pOnTriggerChange)(mg_iSelected);
}
}
BOOL CMGTrigger::OnKeyDown(int iVKey)
{
if ((iVKey == VK_RETURN || iVKey == VK_LBUTTON) ||
(iVKey == VK_LEFT) ||
(iVKey == VK_BACK || iVKey == VK_RBUTTON) ||
(iVKey == VK_RIGHT))
{
// key is handled
if (mg_bEnabled) OnSetNextInList(iVKey);
return TRUE;
}
// key is not handled
return FALSE;
}
void CMGTrigger::Render(CDrawPort *pdp)
{
SetFontMedium(pdp);
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
PIX pixIL = box.Min()(1) + box.Size()(1)*0.45f;
PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f;
PIX pixJ = box.Min()(2);
COLOR col = GetCurrentColor();
if (!mg_bVisual || mg_strValue == "") {
CTString strValue = mg_strValue;
if (mg_bVisual) {
strValue = TRANS("none");
}
if (mg_iCenterI == -1) {
pdp->PutText(mg_strLabel, box.Min()(1), pixJ, col);
pdp->PutTextR(strValue, box.Max()(1), pixJ, col);
} else {
pdp->PutTextR(mg_strLabel, pixIL, pixJ, col);
pdp->PutText(strValue, pixIR, pixJ, col);
}
} else {
CTString strLabel = mg_strLabel + ": ";
pdp->PutText(strLabel, box.Min()(1), pixJ, col);
CTextureObject to;
try {
to.SetData_t(mg_strValue);
CTextureData *ptd = (CTextureData *)to.GetData();
PIX pixSize = box.Size()(2);
PIX pixCX = box.Max()(1) - pixSize / 2;
PIX pixCY = box.Center()(2);
pdp->PutTexture(&to, PIXaabbox2D(
PIX2D(pixCX - pixSize / 2, pixCY - pixSize / 2),
PIX2D(pixCX - pixSize / 2 + pixSize, pixCY - pixSize / 2 + pixSize)), C_WHITE | 255);
} catch (char *strError) {
CPrintF("%s\n", strError);
}
to.SetData(NULL);
}
}

View File

@ -0,0 +1,46 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_TRIGGER_H
#define SE_INCL_MENU_GADGET_TRIGGER_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MenuGadget.h"
class CMGTrigger : public CMenuGadget {
public:
CTString mg_strLabel;
CTString mg_strValue;
CTString *mg_astrTexts;
INDEX mg_ctTexts;
INDEX mg_iSelected;
INDEX mg_iCenterI;
BOOL mg_bVisual;
CMGTrigger(void);
void ApplyCurrentSelection(void);
void OnSetNextInList(int iVKey);
void(*mg_pPreTriggerChange)(INDEX iCurrentlySelected);
void(*mg_pOnTriggerChange)(INDEX iCurrentlySelected);
// return TRUE if handled
BOOL OnKeyDown(int iVKey);
void Render(CDrawPort *pdp);
};
#endif /* include-once check. */

View File

@ -0,0 +1,180 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "VarList.h"
#include "MGVarButton.h"
extern PIX _pixCursorPosI;
extern PIX _pixCursorPosJ;
BOOL CMGVarButton::IsSeparator(void)
{
if (mg_pvsVar == NULL) return FALSE;
return mg_pvsVar->vs_bSeparator;
}
BOOL CMGVarButton::IsEnabled(void)
{
return(_gmRunningGameMode == GM_NONE
|| mg_pvsVar == NULL
|| mg_pvsVar->vs_bCanChangeInGame);
}
// return slider position on scren
PIXaabbox2D CMGVarButton::GetSliderBox(void)
{
extern CDrawPort *pdp;
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f;
PIX pixJ = box.Min()(2);
PIX pixISize = box.Size()(1)*0.13f;
PIX pixJSize = box.Size()(2);
return PIXaabbox2D(PIX2D(pixIR, pixJ + 1), PIX2D(pixIR + pixISize - 4, pixJ + pixJSize - 6));
}
extern BOOL _bVarChanged;
BOOL CMGVarButton::OnKeyDown(int iVKey)
{
if (mg_pvsVar == NULL || mg_pvsVar->vs_bSeparator || !mg_pvsVar->Validate() || !mg_bEnabled) {
return CMenuGadget::OnKeyDown(iVKey);
}
// handle slider
if (mg_pvsVar->vs_iSlider && !mg_pvsVar->vs_bCustom) {
// ignore RMB
if (iVKey == VK_RBUTTON) return TRUE;
// handle LMB
if (iVKey == VK_LBUTTON) {
// get position of slider box on screen
PIXaabbox2D boxSlider = GetSliderBox();
// if mouse is within
if (boxSlider >= PIX2D(_pixCursorPosI, _pixCursorPosJ)) {
// set new position exactly where mouse pointer is
mg_pvsVar->vs_iValue = (FLOAT)(_pixCursorPosI - boxSlider.Min()(1)) / boxSlider.Size()(1) * (mg_pvsVar->vs_ctValues);
_bVarChanged = TRUE;
}
// handled
return TRUE;
}
}
if (iVKey == VK_RETURN) {
FlushVarSettings(TRUE);
void MenuGoToParent(void);
MenuGoToParent();
return TRUE;
}
if (iVKey == VK_LBUTTON || iVKey == VK_RIGHT) {
if (mg_pvsVar != NULL) {
INDEX iOldValue = mg_pvsVar->vs_iValue;
mg_pvsVar->vs_iValue++;
if (mg_pvsVar->vs_iValue >= mg_pvsVar->vs_ctValues) {
// wrap non-sliders, clamp sliders
if (mg_pvsVar->vs_iSlider) mg_pvsVar->vs_iValue = mg_pvsVar->vs_ctValues - 1L;
else mg_pvsVar->vs_iValue = 0;
}
if (iOldValue != mg_pvsVar->vs_iValue) {
_bVarChanged = TRUE;
mg_pvsVar->vs_bCustom = FALSE;
mg_pvsVar->Validate();
}
}
return TRUE;
}
if (iVKey == VK_LEFT || iVKey == VK_RBUTTON) {
if (mg_pvsVar != NULL) {
INDEX iOldValue = mg_pvsVar->vs_iValue;
mg_pvsVar->vs_iValue--;
if (mg_pvsVar->vs_iValue<0) {
// wrap non-sliders, clamp sliders
if (mg_pvsVar->vs_iSlider) mg_pvsVar->vs_iValue = 0;
else mg_pvsVar->vs_iValue = mg_pvsVar->vs_ctValues - 1L;
}
if (iOldValue != mg_pvsVar->vs_iValue) {
_bVarChanged = TRUE;
mg_pvsVar->vs_bCustom = FALSE;
mg_pvsVar->Validate();
}
}
return TRUE;
}
// not handled
return CMenuGadget::OnKeyDown(iVKey);
}
void CMGVarButton::Render(CDrawPort *pdp)
{
if (mg_pvsVar == NULL) {
return;
}
SetFontMedium(pdp);
PIXaabbox2D box = FloatBoxToPixBox(pdp, mg_boxOnScreen);
PIX pixIL = box.Min()(1) + box.Size()(1)*0.45f;
PIX pixIR = box.Min()(1) + box.Size()(1)*0.55f;
PIX pixIC = box.Center()(1);
PIX pixJ = box.Min()(2);
if (mg_pvsVar->vs_bSeparator)
{
mg_bEnabled = FALSE;
COLOR col = LCDGetColor(C_WHITE | 255, "separator");
CTString strText = mg_pvsVar->vs_strName;
pdp->PutTextC(strText, pixIC, pixJ, col);
} else if (mg_pvsVar->Validate()) {
// check whether the variable is disabled
if (mg_pvsVar->vs_strFilter != "") mg_bEnabled = _pShell->GetINDEX(mg_pvsVar->vs_strFilter);
COLOR col = GetCurrentColor();
pdp->PutTextR(mg_pvsVar->vs_strName, pixIL, pixJ, col);
// custom is by default
CTString strText = TRANS("Custom");
if (!mg_pvsVar->vs_bCustom)
{ // not custom!
strText = mg_pvsVar->vs_astrTexts[mg_pvsVar->vs_iValue];
// need slider?
if (mg_pvsVar->vs_iSlider>0) {
// draw box around slider
PIX pixISize = box.Size()(1)*0.13f;
PIX pixJSize = box.Size()(2);
LCDDrawBox(0, -1, PIXaabbox2D(PIX2D(pixIR, pixJ + 1), PIX2D(pixIR + pixISize - 4, pixJ + pixJSize - 6)),
LCDGetColor(C_GREEN | 255, "slider box"));
// draw filled part of slider
if (mg_pvsVar->vs_iSlider == 1) {
// fill slider
FLOAT fFactor = (FLOAT)(mg_pvsVar->vs_iValue + 1) / mg_pvsVar->vs_ctValues;
pdp->Fill(pixIR + 1, pixJ + 2, (pixISize - 6)*fFactor, pixJSize - 9, col);
} else {
// ratio slider
ASSERT(mg_pvsVar->vs_iSlider == 2);
FLOAT fUnitWidth = (FLOAT)(pixISize - 5) / mg_pvsVar->vs_ctValues;
pdp->Fill(pixIR + 1 + (mg_pvsVar->vs_iValue*fUnitWidth), pixJ + 2, fUnitWidth, pixJSize - 9, col);
}
// move text printout to the right of slider
pixIR += box.Size()(1)*0.15f;
}
}
// write right text
pdp->PutText(strText, pixIR, pixJ, col);
}
}

View File

@ -0,0 +1,34 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_VARBUTTON_H
#define SE_INCL_MENU_GADGET_VARBUTTON_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MGButton.h"
class CMGVarButton : public CMGButton {
public:
class CVarSetting *mg_pvsVar;
PIXaabbox2D GetSliderBox(void);
BOOL OnKeyDown(int iVKey);
void Render(CDrawPort *pdp);
BOOL IsSeparator(void);
BOOL IsEnabled(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,136 @@
/* 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 "StdH.h"
#include <Engine/Base/KeyNames.h>
#include <Engine/CurrentVersion.h>
#include <GameMP/LCDDrawing.h>
#include "LevelInfo.h"
#include "VarList.h"
#include "MenuGadget.h"
extern CSoundData *_psdSelect;
extern BOOL _bDefiningKey = FALSE;
extern BOOL _bEditingString = FALSE;
extern CMenuGadget *_pmgLastActivatedGadget = NULL;
CMenuGadget::CMenuGadget(void)
{
mg_pmgLeft = NULL;
mg_pmgRight = NULL;
mg_pmgUp = NULL;
mg_pmgDown = NULL;
mg_bVisible = TRUE;
mg_bEnabled = TRUE;
mg_bLabel = FALSE;
mg_bFocused = FALSE;
mg_iInList = -1; // not in list
}
void CMenuGadget::OnActivate(void)
{
NOTHING;
}
// return TRUE if handled
BOOL CMenuGadget::OnKeyDown(int iVKey)
{
// if return pressed
if (iVKey == VK_RETURN || iVKey == VK_LBUTTON) {
// activate
OnActivate();
// key is handled
return TRUE;
}
// key is not handled
return FALSE;
}
BOOL CMenuGadget::OnChar(MSG msg)
{
// key is not handled
return FALSE;
}
void CMenuGadget::OnSetFocus(void)
{
mg_bFocused = TRUE;
if (!IsSeparator())
{
PlayMenuSound(_psdSelect);
IFeel_PlayEffect("Menu_select");
}
}
void CMenuGadget::OnKillFocus(void)
{
mg_bFocused = FALSE;
}
void CMenuGadget::Appear(void)
{
mg_bVisible = TRUE;
}
void CMenuGadget::Disappear(void)
{
mg_bVisible = FALSE;
mg_bFocused = FALSE;
}
void CMenuGadget::Think(void)
{
}
void CMenuGadget::OnMouseOver(PIX pixI, PIX pixJ)
{
}
// get current color for the gadget
COLOR CMenuGadget::GetCurrentColor(void)
{
// use normal colors
COLOR colUnselected = LCDGetColor(C_GREEN, "unselected");
COLOR colSelected = LCDGetColor(C_WHITE, "selected");
// if disabled
if (!mg_bEnabled) {
// use a bit darker colors
colUnselected = LCDGetColor(C_dGREEN, "disabled unselected");
colSelected = LCDGetColor(C_GRAY, "disabled selected");
// if label
if (mg_bLabel) {
// use white
colUnselected = colSelected = LCDGetColor(C_WHITE, "label");
}
}
// use unselected color
COLOR colRet = colUnselected;
// if selected
if (mg_bFocused) {
// oscilate towards selected color
FLOAT tmNow = _pTimer->GetHighPrecisionTimer().GetSeconds();
colRet = LerpColor((colUnselected >> 1) & 0x7F7F7F7F, colSelected, sin(tmNow*10.0f)*0.5f + 0.5f);
}
return colRet | CT_OPAQUE;
}
void CMenuGadget::Render(CDrawPort *pdp)
{
}

View File

@ -0,0 +1,69 @@
/* 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. */
#ifndef SE_INCL_MENU_GADGET_H
#define SE_INCL_MENU_GADGET_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MenuPrinting.h"
#define DOING_NOTHING 0
#define PRESS_KEY_WAITING 1
#define RELEASE_RETURN_WAITING 2
#define EMPTYSLOTSTRING TRANS("<save a new one>")
class CMenuGadget {
public:
CListNode mg_lnNode;
FLOATaabbox2D mg_boxOnScreen;
BOOL mg_bVisible;
BOOL mg_bEnabled;
BOOL mg_bLabel;
BOOL mg_bFocused;
INDEX mg_iInList; // for scrollable gadget lists
CTString mg_strTip;
CMenuGadget *mg_pmgLeft;
CMenuGadget *mg_pmgRight;
CMenuGadget *mg_pmgUp;
CMenuGadget *mg_pmgDown;
CMenuGadget(void);
// return TRUE if handled
virtual BOOL OnKeyDown(int iVKey);
virtual BOOL OnChar(MSG msg);
virtual void OnActivate(void);
virtual void OnSetFocus(void);
virtual void OnKillFocus(void);
virtual void Appear(void);
virtual void Disappear(void);
virtual void Think(void);
virtual void OnMouseOver(PIX pixI, PIX pixJ);
virtual COLOR GetCurrentColor(void);
virtual void Render(CDrawPort *pdp);
virtual BOOL IsSeparator(void) { return FALSE; };
};
enum ButtonFontSize {
BFS_SMALL = 0,
BFS_MEDIUM = 1,
BFS_LARGE = 2,
};
#endif /* include-once check. */

View File

@ -0,0 +1,350 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "GameMenu.h"
CGameMenu::CGameMenu(void)
{
gm_pgmParentMenu = NULL;
gm_pmgSelectedByDefault = NULL;
gm_pmgArrowUp = NULL;
gm_pmgArrowDn = NULL;
gm_pmgListTop = NULL;
gm_pmgListBottom = NULL;
gm_iListOffset = 0;
gm_ctListVisible = 0;
gm_ctListTotal = 0;
gm_bPopup = FALSE;
}
void CGameMenu::Initialize_t(void)
{
}
void CGameMenu::Destroy(void)
{
}
void CGameMenu::FillListItems(void)
{
ASSERT(FALSE); // must be implemented to scroll up/down
}
void CGameMenu::KillAllFocuses(void)
{
// for each menu gadget in menu
FOREACHINLIST(CMenuGadget, mg_lnNode, gm_lhGadgets, itmg) {
itmg->mg_bFocused = FALSE;
}
}
void CGameMenu::Think(void)
{
}
// +-1 -> hit top/bottom when pressing up/down on keyboard
// +-2 -> pressed pageup/pagedown on keyboard
// +-3 -> pressed arrow up/down button in menu
// +-4 -> scrolling with mouse wheel
void CGameMenu::ScrollList(INDEX iDir)
{
// if not valid for scrolling
if (gm_ctListTotal <= 0
|| gm_pmgArrowUp == NULL || gm_pmgArrowDn == NULL
|| gm_pmgListTop == NULL || gm_pmgListBottom == NULL) {
// do nothing
return;
}
INDEX iOldTopKey = gm_iListOffset;
// change offset
switch (iDir) {
case -1:
gm_iListOffset -= 1;
break;
case -4:
gm_iListOffset -= 3;
break;
case -2:
case -3:
gm_iListOffset -= gm_ctListVisible;
break;
case +1:
gm_iListOffset += 1;
break;
case +4:
gm_iListOffset += 3;
break;
case +2:
case +3:
gm_iListOffset += gm_ctListVisible;
break;
default:
ASSERT(FALSE);
return;
}
if (gm_ctListTotal <= gm_ctListVisible) {
gm_iListOffset = 0;
}
else {
gm_iListOffset = Clamp(gm_iListOffset, INDEX(0), INDEX(gm_ctListTotal - gm_ctListVisible));
}
// set new names
FillListItems();
// if scroling with wheel
if (iDir == +4 || iDir == -4) {
// no focus changing
return;
}
// delete all focuses
FOREACHINLIST(CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
itmg->OnKillFocus();
}
// set new focus
const INDEX iFirst = 0;
const INDEX iLast = gm_ctListVisible - 1;
switch (iDir) {
case +1:
gm_pmgListBottom->OnSetFocus();
break;
case +2:
if (gm_iListOffset != iOldTopKey) {
gm_pmgListTop->OnSetFocus();
}
else {
gm_pmgListBottom->OnSetFocus();
}
break;
case +3:
gm_pmgArrowDn->OnSetFocus();
break;
case -1:
gm_pmgListTop->OnSetFocus();
break;
case -2:
gm_pmgListTop->OnSetFocus();
break;
case -3:
gm_pmgArrowUp->OnSetFocus();
break;
}
}
BOOL CGameMenu::OnChar(MSG msg)
{
// find curently active gadget
CMenuGadget *pmgActive = NULL;
// for each menu gadget in menu
FOREACHINLIST(CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
// if focused
if (itmg->mg_bFocused) {
// remember as active
pmgActive = &itmg.Current();
}
}
// if none focused
if (pmgActive == NULL) {
// do nothing
return FALSE;
}
// if active gadget handles it
if (pmgActive->OnChar(msg)) {
// key is handled
return TRUE;
}
// key is not handled
return FALSE;
}
// return TRUE if handled
BOOL CGameMenu::OnKeyDown(int iVKey)
{
// find curently active gadget
CMenuGadget *pmgActive = NULL;
// for each menu gadget in menu
FOREACHINLIST(CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
// if focused
if (itmg->mg_bFocused) {
// remember as active
pmgActive = &itmg.Current();
}
}
// if none focused
if (pmgActive == NULL) {
// do nothing
return FALSE;
}
// if active gadget handles it
if (pmgActive->OnKeyDown(iVKey)) {
// key is handled
return TRUE;
}
// process normal in menu movement
switch (iVKey) {
case VK_PRIOR:
ScrollList(-2);
return TRUE;
case VK_NEXT:
ScrollList(+2);
return TRUE;
case 11:
ScrollList(-4);
return TRUE;
case 10:
ScrollList(+4);
return TRUE;
case VK_UP:
// if this is top button in list
if (pmgActive == gm_pmgListTop) {
// scroll list up
ScrollList(-1);
// key is handled
return TRUE;
}
// if we can go up
if (pmgActive->mg_pmgUp != NULL && pmgActive->mg_pmgUp->mg_bVisible) {
// call lose focus to still active gadget and
pmgActive->OnKillFocus();
// set focus to new one
pmgActive = pmgActive->mg_pmgUp;
pmgActive->OnSetFocus();
// key is handled
return TRUE;
}
break;
case VK_DOWN:
// if this is bottom button in list
if (pmgActive == gm_pmgListBottom) {
// scroll list down
ScrollList(+1);
// key is handled
return TRUE;
}
// if we can go down
if (pmgActive->mg_pmgDown != NULL && pmgActive->mg_pmgDown->mg_bVisible) {
// call lose focus to still active gadget and
pmgActive->OnKillFocus();
// set focus to new one
pmgActive = pmgActive->mg_pmgDown;
pmgActive->OnSetFocus();
// key is handled
return TRUE;
}
break;
case VK_LEFT:
// if we can go left
if (pmgActive->mg_pmgLeft != NULL) {
// call lose focus to still active gadget and
pmgActive->OnKillFocus();
// set focus to new one
if (!pmgActive->mg_pmgLeft->mg_bVisible && gm_pmgSelectedByDefault != NULL) {
pmgActive = gm_pmgSelectedByDefault;
}
else {
pmgActive = pmgActive->mg_pmgLeft;
}
pmgActive->OnSetFocus();
// key is handled
return TRUE;
}
break;
case VK_RIGHT:
// if we can go right
if (pmgActive->mg_pmgRight != NULL) {
// call lose focus to still active gadget and
pmgActive->OnKillFocus();
// set focus to new one
if (!pmgActive->mg_pmgRight->mg_bVisible && gm_pmgSelectedByDefault != NULL) {
pmgActive = gm_pmgSelectedByDefault;
}
else {
pmgActive = pmgActive->mg_pmgRight;
}
pmgActive->OnSetFocus();
// key is handled
return TRUE;
}
break;
}
// key is not handled
return FALSE;
}
void CGameMenu::StartMenu(void)
{
// for each menu gadget in menu
FOREACHINLIST(CMenuGadget, mg_lnNode, gm_lhGadgets, itmg)
{
itmg->mg_bFocused = FALSE;
// call appear
itmg->Appear();
}
// if there is a list
if (gm_pmgListTop != NULL) {
// scroll it so that the wanted tem is centered
gm_iListOffset = gm_iListWantedItem - gm_ctListVisible / 2;
// clamp the scrolling
gm_iListOffset = Clamp(gm_iListOffset, 0L, Max(0L, gm_ctListTotal - gm_ctListVisible));
// fill the list
FillListItems();
// for each menu gadget in menu
FOREACHINLIST(CMenuGadget, mg_lnNode, gm_lhGadgets, itmg) {
// if in list, but disabled
if (itmg->mg_iInList == -2) {
// hide it
itmg->mg_bVisible = FALSE;
// if in list
} else if (itmg->mg_iInList >= 0) {
// show it
itmg->mg_bVisible = TRUE;
}
// if wanted
if (itmg->mg_iInList == gm_iListWantedItem) {
// focus it
itmg->OnSetFocus();
gm_pmgSelectedByDefault = itmg;
}
}
}
}
void CGameMenu::EndMenu(void)
{
// for each menu gadget in menu
FOREACHINLIST(CMenuGadget, mg_lnNode, gm_lhGadgets, itmg)
{
// call disappear
itmg->Disappear();
}
}

View File

@ -0,0 +1,51 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_H
#define SE_INCL_GAME_MENU_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
class CGameMenu {
public:
CListHead gm_lhGadgets;
CGameMenu *gm_pgmParentMenu;
BOOL gm_bPopup;
const char *gm_strName; // menu name (for mod interface only)
class CMenuGadget *gm_pmgSelectedByDefault;
class CMenuGadget *gm_pmgArrowUp;
class CMenuGadget *gm_pmgArrowDn;
class CMenuGadget *gm_pmgListTop;
class CMenuGadget *gm_pmgListBottom;
INDEX gm_iListOffset;
INDEX gm_iListWantedItem; // item you want to focus initially
INDEX gm_ctListVisible;
INDEX gm_ctListTotal;
CGameMenu(void);
void ScrollList(INDEX iDir);
void KillAllFocuses(void);
virtual void Initialize_t(void);
virtual void Destroy(void);
virtual void StartMenu(void);
virtual void FillListItems(void);
virtual void EndMenu(void);
// return TRUE if handled
virtual BOOL OnKeyDown(int iVKey);
virtual BOOL OnChar(MSG msg);
virtual void Think(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,77 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MAudioOptions.h"
extern void RefreshSoundFormat(void);
void CAudioOptionsMenu::Initialize_t(void)
{
// intialize Audio options menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("AUDIO");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
TRIGGER_MG(gm_mgAudioAutoTrigger, 0,
gm_mgApply, gm_mgFrequencyTrigger, TRANS("AUTO-ADJUST"), astrNoYes);
gm_mgAudioAutoTrigger.mg_strTip = TRANS("adjust quality to fit your system");
TRIGGER_MG(gm_mgFrequencyTrigger, 1,
gm_mgAudioAutoTrigger, gm_mgAudioAPITrigger, TRANS("FREQUENCY"), astrFrequencyRadioTexts);
gm_mgFrequencyTrigger.mg_strTip = TRANS("select sound quality or turn sound off");
gm_mgFrequencyTrigger.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgAudioAPITrigger, 2,
gm_mgFrequencyTrigger, gm_mgWaveVolume, TRANS("SOUND SYSTEM"), astrSoundAPIRadioTexts);
gm_mgAudioAPITrigger.mg_strTip = TRANS("choose sound system (API) to use");
gm_mgAudioAPITrigger.mg_pOnTriggerChange = NULL;
gm_mgWaveVolume.mg_boxOnScreen = BoxMediumRow(3);
gm_mgWaveVolume.mg_strText = TRANS("SOUND EFFECTS VOLUME");
gm_mgWaveVolume.mg_strTip = TRANS("adjust volume of in-game sound effects");
gm_mgWaveVolume.mg_pmgUp = &gm_mgAudioAPITrigger;
gm_mgWaveVolume.mg_pmgDown = &gm_mgMPEGVolume;
gm_mgWaveVolume.mg_pOnSliderChange = NULL;
gm_mgWaveVolume.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgWaveVolume.mg_lnNode);
gm_mgMPEGVolume.mg_boxOnScreen = BoxMediumRow(4);
gm_mgMPEGVolume.mg_strText = TRANS("MUSIC VOLUME");
gm_mgMPEGVolume.mg_strTip = TRANS("adjust volume of in-game music");
gm_mgMPEGVolume.mg_pmgUp = &gm_mgWaveVolume;
gm_mgMPEGVolume.mg_pmgDown = &gm_mgApply;
gm_mgMPEGVolume.mg_pOnSliderChange = NULL;
gm_mgMPEGVolume.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgMPEGVolume.mg_lnNode);
gm_mgApply.mg_bfsFontSize = BFS_LARGE;
gm_mgApply.mg_boxOnScreen = BoxBigRow(4);
gm_mgApply.mg_strText = TRANS("APPLY");
gm_mgApply.mg_strTip = TRANS("activate selected options");
gm_lhGadgets.AddTail(gm_mgApply.mg_lnNode);
gm_mgApply.mg_pmgUp = &gm_mgMPEGVolume;
gm_mgApply.mg_pmgDown = &gm_mgAudioAutoTrigger;
gm_mgApply.mg_pActivatedFunction = NULL;
}
void CAudioOptionsMenu::StartMenu(void)
{
RefreshSoundFormat();
CGameMenu::StartMenu();
}

View File

@ -0,0 +1,42 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_AUDIOOPTIONS_H
#define SE_INCL_GAME_MENU_AUDIOOPTIONS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGSlider.h"
#include "GUI/Components/MGTrigger.h"
#include "GUI/Components/MGTitle.h"
class CAudioOptionsMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGTrigger gm_mgAudioAutoTrigger;
CMGTrigger gm_mgAudioAPITrigger;
CMGTrigger gm_mgFrequencyTrigger;
CMGSlider gm_mgWaveVolume;
CMGSlider gm_mgMPEGVolume;
CMGButton gm_mgApply;
void StartMenu(void);
void Initialize_t(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,82 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MConfirm.h"
void CConfirmMenu::Initialize_t(void)
{
gm_bPopup = TRUE;
gm_mgConfirmLabel.mg_strText = "";
gm_lhGadgets.AddTail(gm_mgConfirmLabel.mg_lnNode);
gm_mgConfirmLabel.mg_boxOnScreen = BoxPopupLabel();
gm_mgConfirmLabel.mg_iCenterI = 0;
gm_mgConfirmLabel.mg_bfsFontSize = BFS_LARGE;
gm_mgConfirmYes.mg_strText = TRANS("YES");
gm_lhGadgets.AddTail(gm_mgConfirmYes.mg_lnNode);
gm_mgConfirmYes.mg_boxOnScreen = BoxPopupYesLarge();
gm_mgConfirmYes.mg_pActivatedFunction = NULL;
gm_mgConfirmYes.mg_pmgLeft =
gm_mgConfirmYes.mg_pmgRight = &gm_mgConfirmNo;
gm_mgConfirmYes.mg_iCenterI = 1;
gm_mgConfirmYes.mg_bfsFontSize = BFS_LARGE;
gm_mgConfirmNo.mg_strText = TRANS("NO");
gm_lhGadgets.AddTail(gm_mgConfirmNo.mg_lnNode);
gm_mgConfirmNo.mg_boxOnScreen = BoxPopupNoLarge();
gm_mgConfirmNo.mg_pActivatedFunction = NULL;
gm_mgConfirmNo.mg_pmgLeft =
gm_mgConfirmNo.mg_pmgRight = &gm_mgConfirmYes;
gm_mgConfirmNo.mg_iCenterI = -1;
gm_mgConfirmNo.mg_bfsFontSize = BFS_LARGE;
_pConfimedYes = NULL;
_pConfimedNo = NULL;
}
void CConfirmMenu::BeLarge(void)
{
gm_mgConfirmLabel.mg_bfsFontSize = BFS_LARGE;
gm_mgConfirmYes.mg_bfsFontSize = BFS_LARGE;
gm_mgConfirmNo.mg_bfsFontSize = BFS_LARGE;
gm_mgConfirmLabel.mg_iCenterI = 0;
gm_mgConfirmYes.mg_boxOnScreen = BoxPopupYesLarge();
gm_mgConfirmNo.mg_boxOnScreen = BoxPopupNoLarge();
}
void CConfirmMenu::BeSmall(void)
{
gm_mgConfirmLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgConfirmYes.mg_bfsFontSize = BFS_MEDIUM;
gm_mgConfirmNo.mg_bfsFontSize = BFS_MEDIUM;
gm_mgConfirmLabel.mg_iCenterI = -1;
gm_mgConfirmYes.mg_boxOnScreen = BoxPopupYesSmall();
gm_mgConfirmNo.mg_boxOnScreen = BoxPopupNoSmall();
}
// return TRUE if handled
BOOL CConfirmMenu::OnKeyDown(int iVKey)
{
if ((iVKey == VK_ESCAPE || iVKey == VK_RBUTTON) && gm_mgConfirmNo.mg_pActivatedFunction != NULL) {
gm_mgConfirmNo.OnActivate();
return TRUE;
}
return CGameMenu::OnKeyDown(iVKey);
}

View File

@ -0,0 +1,42 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_CONFIRM_H
#define SE_INCL_GAME_MENU_CONFIRM_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
class CConfirmMenu : public CGameMenu {
public:
CMGButton gm_mgConfirmLabel;
CMGButton gm_mgConfirmYes;
CMGButton gm_mgConfirmNo;
void(*_pConfimedYes)(void) = NULL;
void(*_pConfimedNo)(void) = NULL;
void Initialize_t(void);
// return TRUE if handled
BOOL OnKeyDown(int iVKey);
void BeLarge(void);
void BeSmall(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,158 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MControls.h"
extern CTFileName _fnmControlsToCustomize;
void CControlsMenu::Initialize_t(void)
{
// intialize player and controls menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("CONTROLS");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgNameLabel.mg_strText = "";
gm_mgNameLabel.mg_boxOnScreen = BoxMediumRow(0.0);
gm_mgNameLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgNameLabel.mg_iCenterI = -1;
gm_mgNameLabel.mg_bEnabled = FALSE;
gm_mgNameLabel.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgNameLabel.mg_lnNode);
gm_mgButtons.mg_strText = TRANS("CUSTOMIZE BUTTONS");
gm_mgButtons.mg_boxOnScreen = BoxMediumRow(2.0);
gm_mgButtons.mg_bfsFontSize = BFS_MEDIUM;
gm_mgButtons.mg_iCenterI = 0;
gm_lhGadgets.AddTail(gm_mgButtons.mg_lnNode);
gm_mgButtons.mg_pmgUp = &gm_mgPredefined;
gm_mgButtons.mg_pmgDown = &gm_mgAdvanced;
gm_mgButtons.mg_pActivatedFunction = NULL;
gm_mgButtons.mg_strTip = TRANS("customize buttons in current controls");
gm_mgAdvanced.mg_strText = TRANS("ADVANCED JOYSTICK SETUP");
gm_mgAdvanced.mg_iCenterI = 0;
gm_mgAdvanced.mg_boxOnScreen = BoxMediumRow(3);
gm_mgAdvanced.mg_bfsFontSize = BFS_MEDIUM;
gm_lhGadgets.AddTail(gm_mgAdvanced.mg_lnNode);
gm_mgAdvanced.mg_pmgUp = &gm_mgButtons;
gm_mgAdvanced.mg_pmgDown = &gm_mgSensitivity;
gm_mgAdvanced.mg_pActivatedFunction = NULL;
gm_mgAdvanced.mg_strTip = TRANS("adjust advanced settings for joystick axis");
gm_mgSensitivity.mg_boxOnScreen = BoxMediumRow(4.5);
gm_mgSensitivity.mg_strText = TRANS("SENSITIVITY");
gm_mgSensitivity.mg_pmgUp = &gm_mgAdvanced;
gm_mgSensitivity.mg_pmgDown = &gm_mgInvertTrigger;
gm_mgSensitivity.mg_strTip = TRANS("sensitivity for all axis in this control set");
gm_lhGadgets.AddTail(gm_mgSensitivity.mg_lnNode);
TRIGGER_MG(gm_mgInvertTrigger, 5.5, gm_mgSensitivity, gm_mgSmoothTrigger,
TRANS("INVERT LOOK"), astrNoYes);
gm_mgInvertTrigger.mg_strTip = TRANS("invert up/down looking");
TRIGGER_MG(gm_mgSmoothTrigger, 6.5, gm_mgInvertTrigger, gm_mgAccelTrigger,
TRANS("SMOOTH AXIS"), astrNoYes);
gm_mgSmoothTrigger.mg_strTip = TRANS("smooth mouse/joystick movements");
TRIGGER_MG(gm_mgAccelTrigger, 7.5, gm_mgSmoothTrigger, gm_mgIFeelTrigger,
TRANS("MOUSE ACCELERATION"), astrNoYes);
gm_mgAccelTrigger.mg_strTip = TRANS("allow mouse acceleration");
TRIGGER_MG(gm_mgIFeelTrigger, 8.5, gm_mgAccelTrigger, gm_mgPredefined,
TRANS("ENABLE IFEEL"), astrNoYes);
gm_mgIFeelTrigger.mg_strTip = TRANS("enable support for iFeel tactile feedback mouse");
gm_mgPredefined.mg_strText = TRANS("LOAD PREDEFINED SETTINGS");
gm_mgPredefined.mg_iCenterI = 0;
gm_mgPredefined.mg_boxOnScreen = BoxMediumRow(10);
gm_mgPredefined.mg_bfsFontSize = BFS_MEDIUM;
gm_lhGadgets.AddTail(gm_mgPredefined.mg_lnNode);
gm_mgPredefined.mg_pmgUp = &gm_mgIFeelTrigger;
gm_mgPredefined.mg_pmgDown = &gm_mgButtons;
gm_mgPredefined.mg_pActivatedFunction = NULL;
gm_mgPredefined.mg_strTip = TRANS("load one of several predefined control settings");
}
void CControlsMenu::StartMenu(void)
{
gm_pmgSelectedByDefault = &gm_mgButtons;
INDEX iPlayer = _pGame->gm_iSinglePlayer;
if (_iLocalPlayer >= 0 && _iLocalPlayer<4) {
iPlayer = _pGame->gm_aiMenuLocalPlayers[_iLocalPlayer];
}
_fnmControlsToCustomize.PrintF("Controls\\Controls%d.ctl", iPlayer);
ControlsMenuOn();
gm_mgNameLabel.mg_strText.PrintF(TRANS("CONTROLS FOR: %s"), _pGame->gm_apcPlayers[iPlayer].GetNameForPrinting());
ObtainActionSettings();
CGameMenu::StartMenu();
}
void CControlsMenu::EndMenu(void)
{
ApplyActionSettings();
ControlsMenuOff();
CGameMenu::EndMenu();
}
void CControlsMenu::ObtainActionSettings(void)
{
CControls &ctrls = _pGame->gm_ctrlControlsExtra;
gm_mgSensitivity.mg_iMinPos = 0;
gm_mgSensitivity.mg_iMaxPos = 50;
gm_mgSensitivity.mg_iCurPos = ctrls.ctrl_fSensitivity / 2;
gm_mgSensitivity.ApplyCurrentPosition();
gm_mgInvertTrigger.mg_iSelected = ctrls.ctrl_bInvertLook ? 1 : 0;
gm_mgSmoothTrigger.mg_iSelected = ctrls.ctrl_bSmoothAxes ? 1 : 0;
gm_mgAccelTrigger.mg_iSelected = _pShell->GetINDEX("inp_bAllowMouseAcceleration") ? 1 : 0;
gm_mgIFeelTrigger.mg_bEnabled = _pShell->GetINDEX("sys_bIFeelEnabled") ? 1 : 0;
gm_mgIFeelTrigger.mg_iSelected = _pShell->GetFLOAT("inp_fIFeelGain")>0 ? 1 : 0;
gm_mgInvertTrigger.ApplyCurrentSelection();
gm_mgSmoothTrigger.ApplyCurrentSelection();
gm_mgAccelTrigger.ApplyCurrentSelection();
gm_mgIFeelTrigger.ApplyCurrentSelection();
}
void CControlsMenu::ApplyActionSettings(void)
{
CControls &ctrls = _pGame->gm_ctrlControlsExtra;
FLOAT fSensitivity =
FLOAT(gm_mgSensitivity.mg_iCurPos - gm_mgSensitivity.mg_iMinPos) /
FLOAT(gm_mgSensitivity.mg_iMaxPos - gm_mgSensitivity.mg_iMinPos)*100.0f;
BOOL bInvert = gm_mgInvertTrigger.mg_iSelected != 0;
BOOL bSmooth = gm_mgSmoothTrigger.mg_iSelected != 0;
BOOL bAccel = gm_mgAccelTrigger.mg_iSelected != 0;
BOOL bIFeel = gm_mgIFeelTrigger.mg_iSelected != 0;
if (INDEX(ctrls.ctrl_fSensitivity) != INDEX(fSensitivity)) {
ctrls.ctrl_fSensitivity = fSensitivity;
}
ctrls.ctrl_bInvertLook = bInvert;
ctrls.ctrl_bSmoothAxes = bSmooth;
_pShell->SetINDEX("inp_bAllowMouseAcceleration", bAccel);
_pShell->SetFLOAT("inp_fIFeelGain", bIFeel ? 1.0f : 0.0f);
ctrls.CalculateInfluencesForAllAxis();
}

View File

@ -0,0 +1,48 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_CONTROLS_H
#define SE_INCL_GAME_MENU_CONTROLS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGSlider.h"
#include "GUI/Components/MGTitle.h"
#include "GUI/Components/MGTrigger.h"
class CControlsMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgNameLabel;
CMGButton gm_mgButtons;
CMGSlider gm_mgSensitivity;
CMGTrigger gm_mgInvertTrigger;
CMGTrigger gm_mgSmoothTrigger;
CMGTrigger gm_mgAccelTrigger;
CMGTrigger gm_mgIFeelTrigger;
CMGButton gm_mgPredefined;
CMGButton gm_mgAdvanced;
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
void ObtainActionSettings(void);
void ApplyActionSettings(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,29 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_CREDITS_H
#define SE_INCL_GAME_MENU_CREDITS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
class CCreditsMenu : public CGameMenu {
public:
void Initialize_t(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,155 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MCustomizeAxis.h"
void CCustomizeAxisMenu::Initialize_t(void)
{
// intialize axis menu
gm_mgTitle.mg_strText = TRANS("CUSTOMIZE AXIS");
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
TRIGGER_MG(gm_mgActionTrigger, 0, gm_mgSmoothTrigger, gm_mgMountedTrigger, TRANS("ACTION"), astrNoYes);
gm_mgActionTrigger.mg_strTip = TRANS("choose action to customize");
TRIGGER_MG(gm_mgMountedTrigger, 2, gm_mgActionTrigger, gm_mgSensitivity, TRANS("MOUNTED TO"), astrNoYes);
gm_mgMountedTrigger.mg_strTip = TRANS("choose controller axis that will perform the action");
gm_mgActionTrigger.mg_astrTexts = new CTString[AXIS_ACTIONS_CT];
gm_mgActionTrigger.mg_ctTexts = AXIS_ACTIONS_CT;
gm_mgActionTrigger.mg_pPreTriggerChange = NULL;
gm_mgActionTrigger.mg_pOnTriggerChange = NULL;
// for all available axis type controlers
for (INDEX iControler = 0; iControler<AXIS_ACTIONS_CT; iControler++) {
gm_mgActionTrigger.mg_astrTexts[iControler] = TranslateConst(CTString(_pGame->gm_astrAxisNames[iControler]), 0);
}
gm_mgActionTrigger.mg_iSelected = 3;
INDEX ctAxis = _pInput->GetAvailableAxisCount();
gm_mgMountedTrigger.mg_astrTexts = new CTString[ctAxis];
gm_mgMountedTrigger.mg_ctTexts = ctAxis;
// for all axis actions that can be mounted
for (INDEX iAxis = 0; iAxis<ctAxis; iAxis++) {
gm_mgMountedTrigger.mg_astrTexts[iAxis] = _pInput->GetAxisTransName(iAxis);
}
gm_mgSensitivity.mg_boxOnScreen = BoxMediumRow(3);
gm_mgSensitivity.mg_strText = TRANS("SENSITIVITY");
gm_mgSensitivity.mg_pmgUp = &gm_mgMountedTrigger;
gm_mgSensitivity.mg_pmgDown = &gm_mgDeadzone;
gm_lhGadgets.AddTail(gm_mgSensitivity.mg_lnNode);
gm_mgSensitivity.mg_strTip = TRANS("set sensitivity for this axis");
gm_mgDeadzone.mg_boxOnScreen = BoxMediumRow(4);
gm_mgDeadzone.mg_strText = TRANS("DEAD ZONE");
gm_mgDeadzone.mg_pmgUp = &gm_mgSensitivity;
gm_mgDeadzone.mg_pmgDown = &gm_mgInvertTrigger;
gm_lhGadgets.AddTail(gm_mgDeadzone.mg_lnNode);
gm_mgDeadzone.mg_strTip = TRANS("set dead zone for this axis");
TRIGGER_MG(gm_mgInvertTrigger, 5, gm_mgDeadzone, gm_mgRelativeTrigger, TRANS("INVERTED"), astrNoYes);
gm_mgInvertTrigger.mg_strTip = TRANS("choose whether to invert this axis or not");
TRIGGER_MG(gm_mgRelativeTrigger, 6, gm_mgInvertTrigger, gm_mgSmoothTrigger, TRANS("RELATIVE"), astrNoYes);
gm_mgRelativeTrigger.mg_strTip = TRANS("select relative or absolute axis reading");
TRIGGER_MG(gm_mgSmoothTrigger, 7, gm_mgRelativeTrigger, gm_mgActionTrigger, TRANS("SMOOTH"), astrNoYes);
gm_mgSmoothTrigger.mg_strTip = TRANS("turn this on to filter readings on this axis");
}
CCustomizeAxisMenu::~CCustomizeAxisMenu(void)
{
delete[] gm_mgActionTrigger.mg_astrTexts;
delete[] gm_mgMountedTrigger.mg_astrTexts;
}
void CCustomizeAxisMenu::ObtainActionSettings(void)
{
ControlsMenuOn();
CControls &ctrls = _pGame->gm_ctrlControlsExtra;
INDEX iSelectedAction = gm_mgActionTrigger.mg_iSelected;
INDEX iMountedAxis = ctrls.ctrl_aaAxisActions[iSelectedAction].aa_iAxisAction;
gm_mgMountedTrigger.mg_iSelected = iMountedAxis;
gm_mgSensitivity.mg_iMinPos = 0;
gm_mgSensitivity.mg_iMaxPos = 50;
gm_mgSensitivity.mg_iCurPos = ctrls.ctrl_aaAxisActions[iSelectedAction].aa_fSensitivity / 2;
gm_mgSensitivity.ApplyCurrentPosition();
gm_mgDeadzone.mg_iMinPos = 0;
gm_mgDeadzone.mg_iMaxPos = 50;
gm_mgDeadzone.mg_iCurPos = ctrls.ctrl_aaAxisActions[iSelectedAction].aa_fDeadZone / 2;
gm_mgDeadzone.ApplyCurrentPosition();
gm_mgInvertTrigger.mg_iSelected = ctrls.ctrl_aaAxisActions[iSelectedAction].aa_bInvert ? 1 : 0;
gm_mgRelativeTrigger.mg_iSelected = ctrls.ctrl_aaAxisActions[iSelectedAction].aa_bRelativeControler ? 1 : 0;
gm_mgSmoothTrigger.mg_iSelected = ctrls.ctrl_aaAxisActions[iSelectedAction].aa_bSmooth ? 1 : 0;
gm_mgActionTrigger.ApplyCurrentSelection();
gm_mgMountedTrigger.ApplyCurrentSelection();
gm_mgInvertTrigger.ApplyCurrentSelection();
gm_mgRelativeTrigger.ApplyCurrentSelection();
gm_mgSmoothTrigger.ApplyCurrentSelection();
}
void CCustomizeAxisMenu::ApplyActionSettings(void)
{
CControls &ctrls = _pGame->gm_ctrlControlsExtra;
INDEX iSelectedAction = gm_mgActionTrigger.mg_iSelected;
INDEX iMountedAxis = gm_mgMountedTrigger.mg_iSelected;
FLOAT fSensitivity =
FLOAT(gm_mgSensitivity.mg_iCurPos - gm_mgSensitivity.mg_iMinPos) /
FLOAT(gm_mgSensitivity.mg_iMaxPos - gm_mgSensitivity.mg_iMinPos)*100.0f;
FLOAT fDeadZone =
FLOAT(gm_mgDeadzone.mg_iCurPos - gm_mgDeadzone.mg_iMinPos) /
FLOAT(gm_mgDeadzone.mg_iMaxPos - gm_mgDeadzone.mg_iMinPos)*100.0f;
BOOL bInvert = gm_mgInvertTrigger.mg_iSelected != 0;
BOOL bRelative = gm_mgRelativeTrigger.mg_iSelected != 0;
BOOL bSmooth = gm_mgSmoothTrigger.mg_iSelected != 0;
ctrls.ctrl_aaAxisActions[iSelectedAction].aa_iAxisAction = iMountedAxis;
if (INDEX(ctrls.ctrl_aaAxisActions[iSelectedAction].aa_fSensitivity) != INDEX(fSensitivity)) {
ctrls.ctrl_aaAxisActions[iSelectedAction].aa_fSensitivity = fSensitivity;
}
if (INDEX(ctrls.ctrl_aaAxisActions[iSelectedAction].aa_fDeadZone) != INDEX(fDeadZone)) {
ctrls.ctrl_aaAxisActions[iSelectedAction].aa_fDeadZone = fDeadZone;
}
ctrls.ctrl_aaAxisActions[iSelectedAction].aa_bInvert = bInvert;
ctrls.ctrl_aaAxisActions[iSelectedAction].aa_bRelativeControler = bRelative;
ctrls.ctrl_aaAxisActions[iSelectedAction].aa_bSmooth = bSmooth;
ctrls.CalculateInfluencesForAllAxis();
ControlsMenuOff();
}
void CCustomizeAxisMenu::StartMenu(void)
{
ObtainActionSettings();
CGameMenu::StartMenu();
}
void CCustomizeAxisMenu::EndMenu(void)
{
ApplyActionSettings();
CGameMenu::EndMenu();
}

View File

@ -0,0 +1,46 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_CUSTOMIZEAXIS_H
#define SE_INCL_GAME_MENU_CUSTOMIZEAXIS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGSlider.h"
#include "GUI/Components/MGTitle.h"
#include "GUI/Components/MGTrigger.h"
class CCustomizeAxisMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGTrigger gm_mgActionTrigger;
CMGTrigger gm_mgMountedTrigger;
CMGSlider gm_mgSensitivity;
CMGSlider gm_mgDeadzone;
CMGTrigger gm_mgInvertTrigger;
CMGTrigger gm_mgRelativeTrigger;
CMGTrigger gm_mgSmoothTrigger;
~CCustomizeAxisMenu(void);
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
void ObtainActionSettings(void);
void ApplyActionSettings(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,111 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MCustomizeKeyboard.h"
void CCustomizeKeyboardMenu::FillListItems(void)
{
// disable all items first
for (INDEX i = 0; i<KEYS_ON_SCREEN; i++) {
gm_mgKey[i].mg_bEnabled = FALSE;
gm_mgKey[i].mg_iInList = -2;
}
BOOL bHasFirst = FALSE;
BOOL bHasLast = FALSE;
// set diks to key buttons
INDEX iLabel = 0;
INDEX ctLabels = _pGame->gm_ctrlControlsExtra.ctrl_lhButtonActions.Count();
FOREACHINLIST(CButtonAction, ba_lnNode, _pGame->gm_ctrlControlsExtra.ctrl_lhButtonActions, itAct)
{
INDEX iInMenu = iLabel - gm_iListOffset;
if ((iLabel >= gm_iListOffset) &&
(iLabel<(gm_iListOffset + gm_ctListVisible)))
{
bHasFirst |= (iLabel == 0);
bHasLast |= (iLabel == ctLabels - 1);
gm_mgKey[iInMenu].mg_strLabel = TranslateConst(itAct->ba_strName, 0);
gm_mgKey[iInMenu].mg_iControlNumber = iLabel;
gm_mgKey[iInMenu].SetBindingNames(FALSE);
gm_mgKey[iInMenu].mg_strTip = TRANS("Enter - change binding, Backspace - unbind");
gm_mgKey[iInMenu].mg_bEnabled = TRUE;
gm_mgKey[iInMenu].mg_iInList = iLabel;
}
iLabel++;
}
// enable/disable up/down arrows
gm_mgArrowUp.mg_bEnabled = !bHasFirst && ctLabels>0;
gm_mgArrowDn.mg_bEnabled = !bHasLast && ctLabels>0;
}
void CCustomizeKeyboardMenu::Initialize_t(void)
{
// intialize Audio options menu
gm_mgTitle.mg_strText = TRANS("CUSTOMIZE BUTTONS");
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
#define KL_START 3.0f
#define KL_STEEP -1.45f
for (INDEX iLabel = 0; iLabel<KEYS_ON_SCREEN; iLabel++)
{
INDEX iPrev = (gm_ctListVisible + iLabel - 1) % KEYS_ON_SCREEN;
INDEX iNext = (iLabel + 1) % KEYS_ON_SCREEN;
// initialize label entities
gm_mgKey[iLabel].mg_boxOnScreen = BoxKeyRow(iLabel);
// initialize label gadgets
gm_mgKey[iLabel].mg_pmgUp = &gm_mgKey[iPrev];
gm_mgKey[iLabel].mg_pmgDown = &gm_mgKey[iNext];
gm_mgKey[iLabel].mg_bVisible = TRUE;
gm_lhGadgets.AddTail(gm_mgKey[iLabel].mg_lnNode);
}
// arrows just exist
gm_lhGadgets.AddTail(gm_mgArrowDn.mg_lnNode);
gm_lhGadgets.AddTail(gm_mgArrowUp.mg_lnNode);
gm_mgArrowDn.mg_adDirection = AD_DOWN;
gm_mgArrowUp.mg_adDirection = AD_UP;
gm_mgArrowDn.mg_boxOnScreen = BoxArrow(AD_DOWN);
gm_mgArrowUp.mg_boxOnScreen = BoxArrow(AD_UP);
gm_mgArrowDn.mg_pmgRight = gm_mgArrowDn.mg_pmgUp =
&gm_mgKey[KEYS_ON_SCREEN - 1];
gm_mgArrowUp.mg_pmgRight = gm_mgArrowUp.mg_pmgDown =
&gm_mgKey[0];
gm_ctListVisible = KEYS_ON_SCREEN;
gm_pmgArrowUp = &gm_mgArrowUp;
gm_pmgArrowDn = &gm_mgArrowDn;
gm_pmgListTop = &gm_mgKey[0];
gm_pmgListBottom = &gm_mgKey[KEYS_ON_SCREEN - 1];
}
void CCustomizeKeyboardMenu::StartMenu(void)
{
ControlsMenuOn();
gm_iListOffset = 0;
gm_ctListTotal = _pGame->gm_ctrlControlsExtra.ctrl_lhButtonActions.Count();
gm_iListWantedItem = 0;
CGameMenu::StartMenu();
}
void CCustomizeKeyboardMenu::EndMenu(void)
{
ControlsMenuOff();
CGameMenu::EndMenu();
}

View File

@ -0,0 +1,40 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_CUSTOMIZEKEYBOARD_H
#define SE_INCL_GAME_MENU_CUSTOMIZEKEYBOARD_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGArrow.h"
#include "GUI/Components/MGKeyDefinition.h"
#include "GUI/Components/MGTitle.h"
class CCustomizeKeyboardMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGKeyDefinition gm_mgKey[KEYS_ON_SCREEN];
CMGArrow gm_mgArrowUp;
CMGArrow gm_mgArrowDn;
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
void FillListItems(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,30 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MDisabled.h"
void CDisabledMenu::Initialize_t(void)
{
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgButton.mg_bfsFontSize = BFS_MEDIUM;
gm_mgButton.mg_boxOnScreen = BoxBigRow(0.0f);
gm_lhGadgets.AddTail(gm_mgButton.mg_lnNode);
gm_mgButton.mg_pActivatedFunction = NULL;
}

View File

@ -0,0 +1,34 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_DISABLED_H
#define SE_INCL_GAME_MENU_DISABLED_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class CDisabledMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgButton;
void Initialize_t(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,35 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MHighScore.h"
void CHighScoreMenu::Initialize_t(void)
{
gm_mgHScore.mg_boxOnScreen = FLOATaabbox2D(FLOAT2D(0, 0), FLOAT2D(1, 0.5));
gm_lhGadgets.AddTail(gm_mgHScore.mg_lnNode);
gm_mgTitle.mg_strText = TRANS("HIGH SCORE TABLE");
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
}
void CHighScoreMenu::StartMenu(void)
{
gm_pgmParentMenu = pgmCurrentMenu;
CGameMenu::StartMenu();
}

View File

@ -0,0 +1,35 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_HIGHSCORE_H
#define SE_INCL_GAME_MENU_HIGHSCORE_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGHighScore.h"
#include "GUI/Components/MGTitle.h"
class CHighScoreMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGHighScore gm_mgHScore;
void Initialize_t(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,173 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MInGame.h"
void CInGameMenu::Initialize_t(void)
{
// intialize main menu
gm_mgTitle.mg_strText = TRANS("GAME");
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgLabel1.mg_strText = "";
gm_mgLabel1.mg_boxOnScreen = BoxMediumRow(-2.0);
gm_mgLabel1.mg_bfsFontSize = BFS_MEDIUM;
gm_mgLabel1.mg_iCenterI = -1;
gm_mgLabel1.mg_bEnabled = FALSE;
gm_mgLabel1.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgLabel1.mg_lnNode);
gm_mgLabel2.mg_strText = "";
gm_mgLabel2.mg_boxOnScreen = BoxMediumRow(-1.0);
gm_mgLabel2.mg_bfsFontSize = BFS_MEDIUM;
gm_mgLabel2.mg_iCenterI = -1;
gm_mgLabel2.mg_bEnabled = FALSE;
gm_mgLabel2.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgLabel2.mg_lnNode);
gm_mgQuickLoad.mg_strText = TRANS("QUICK LOAD");
gm_mgQuickLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgQuickLoad.mg_boxOnScreen = BoxBigRow(0.0f);
gm_mgQuickLoad.mg_strTip = TRANS("load a quick-saved game (F9)");
gm_lhGadgets.AddTail(gm_mgQuickLoad.mg_lnNode);
gm_mgQuickLoad.mg_pmgUp = &gm_mgQuit;
gm_mgQuickLoad.mg_pmgDown = &gm_mgQuickSave;
gm_mgQuickLoad.mg_pActivatedFunction = NULL;
gm_mgQuickSave.mg_strText = TRANS("QUICK SAVE");
gm_mgQuickSave.mg_bfsFontSize = BFS_LARGE;
gm_mgQuickSave.mg_boxOnScreen = BoxBigRow(1.0f);
gm_mgQuickSave.mg_strTip = TRANS("quick-save current game (F6)");
gm_lhGadgets.AddTail(gm_mgQuickSave.mg_lnNode);
gm_mgQuickSave.mg_pmgUp = &gm_mgQuickLoad;
gm_mgQuickSave.mg_pmgDown = &gm_mgLoad;
gm_mgQuickSave.mg_pActivatedFunction = NULL;
gm_mgLoad.mg_strText = TRANS("LOAD");
gm_mgLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgLoad.mg_boxOnScreen = BoxBigRow(2.0f);
gm_mgLoad.mg_strTip = TRANS("load a saved game");
gm_lhGadgets.AddTail(gm_mgLoad.mg_lnNode);
gm_mgLoad.mg_pmgUp = &gm_mgQuickSave;
gm_mgLoad.mg_pmgDown = &gm_mgSave;
gm_mgLoad.mg_pActivatedFunction = NULL;
gm_mgSave.mg_strText = TRANS("SAVE");
gm_mgSave.mg_bfsFontSize = BFS_LARGE;
gm_mgSave.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgSave.mg_strTip = TRANS("save current game (each player has own slots!)");
gm_lhGadgets.AddTail(gm_mgSave.mg_lnNode);
gm_mgSave.mg_pmgUp = &gm_mgLoad;
gm_mgSave.mg_pmgDown = &gm_mgDemoRec;
gm_mgSave.mg_pActivatedFunction = NULL;
gm_mgDemoRec.mg_boxOnScreen = BoxBigRow(4.0f);
gm_mgDemoRec.mg_bfsFontSize = BFS_LARGE;
gm_mgDemoRec.mg_pmgUp = &gm_mgSave;
gm_mgDemoRec.mg_pmgDown = &gm_mgHighScore;
gm_mgDemoRec.mg_strText = "Text not set";
gm_lhGadgets.AddTail(gm_mgDemoRec.mg_lnNode);
gm_mgDemoRec.mg_pActivatedFunction = NULL;
gm_mgHighScore.mg_strText = TRANS("HIGH SCORES");
gm_mgHighScore.mg_bfsFontSize = BFS_LARGE;
gm_mgHighScore.mg_boxOnScreen = BoxBigRow(5.0f);
gm_mgHighScore.mg_strTip = TRANS("view list of top ten best scores");
gm_lhGadgets.AddTail(gm_mgHighScore.mg_lnNode);
gm_mgHighScore.mg_pmgUp = &gm_mgDemoRec;
gm_mgHighScore.mg_pmgDown = &gm_mgOptions;
gm_mgHighScore.mg_pActivatedFunction = NULL;
gm_mgOptions.mg_strText = TRANS("OPTIONS");
gm_mgOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgOptions.mg_boxOnScreen = BoxBigRow(6.0f);
gm_mgOptions.mg_strTip = TRANS("adjust video, audio and input options");
gm_lhGadgets.AddTail(gm_mgOptions.mg_lnNode);
gm_mgOptions.mg_pmgUp = &gm_mgHighScore;
gm_mgOptions.mg_pmgDown = &gm_mgStop;
gm_mgOptions.mg_pActivatedFunction = NULL;
gm_mgStop.mg_strText = TRANS("STOP GAME");
gm_mgStop.mg_bfsFontSize = BFS_LARGE;
gm_mgStop.mg_boxOnScreen = BoxBigRow(7.0f);
gm_mgStop.mg_strTip = TRANS("stop currently running game");
gm_lhGadgets.AddTail(gm_mgStop.mg_lnNode);
gm_mgStop.mg_pmgUp = &gm_mgOptions;
gm_mgStop.mg_pmgDown = &gm_mgQuit;
gm_mgStop.mg_pActivatedFunction = NULL;
gm_mgQuit.mg_strText = TRANS("QUIT");
gm_mgQuit.mg_bfsFontSize = BFS_LARGE;
gm_mgQuit.mg_boxOnScreen = BoxBigRow(8.0f);
gm_mgQuit.mg_strTip = TRANS("exit game immediately");
gm_lhGadgets.AddTail(gm_mgQuit.mg_lnNode);
gm_mgQuit.mg_pmgUp = &gm_mgStop;
gm_mgQuit.mg_pmgDown = &gm_mgQuickLoad;
gm_mgQuit.mg_pActivatedFunction = NULL;
}
void CInGameMenu::StartMenu(void)
{
gm_mgQuickLoad.mg_bEnabled = _pNetwork->IsServer();
gm_mgQuickSave.mg_bEnabled = _pNetwork->IsServer();
gm_mgLoad.mg_bEnabled = _pNetwork->IsServer();
gm_mgSave.mg_bEnabled = _pNetwork->IsServer();
gm_mgDemoRec.mg_bEnabled = TRUE;//_pNetwork->IsServer();
extern void SetDemoStartStopRecText();
SetDemoStartStopRecText();
if (_gmRunningGameMode == GM_SINGLE_PLAYER) {
CPlayerCharacter &pc = _pGame->gm_apcPlayers[_pGame->gm_iSinglePlayer];
gm_mgLabel1.mg_strText.PrintF(TRANS("Player: %s"), pc.GetNameForPrinting());
gm_mgLabel2.mg_strText = "";
} else {
if (_pNetwork->IsServer()) {
CTString strHost, strAddress;
CTString strHostName;
_pNetwork->GetHostName(strHost, strAddress);
if (strHost == "") {
strHostName = TRANS("<not started yet>");
}
else {
strHostName = strHost + " (" + strAddress + ")";
}
gm_mgLabel1.mg_strText = TRANS("Address: ") + strHostName;
gm_mgLabel2.mg_strText = "";
} else {
CTString strConfig;
strConfig = TRANS("<not adjusted>");
extern CTString sam_strNetworkSettings;
if (sam_strNetworkSettings != "") {
LoadStringVar(CTFileName(sam_strNetworkSettings).NoExt() + ".des", strConfig);
strConfig.OnlyFirstLine();
}
gm_mgLabel1.mg_strText = TRANS("Connected to: ") + _pGame->gam_strJoinAddress;
gm_mgLabel2.mg_strText = TRANS("Connection: ") + strConfig;
}
}
CGameMenu::StartMenu();
}

View File

@ -0,0 +1,45 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_INGAME_H
#define SE_INCL_GAME_MENU_INGAME_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class CInGameMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgLabel1;
CMGButton gm_mgLabel2;
CMGButton gm_mgQuickLoad;
CMGButton gm_mgQuickSave;
CMGButton gm_mgLoad;
CMGButton gm_mgSave;
CMGButton gm_mgDemoRec;
CMGButton gm_mgHighScore;
CMGButton gm_mgOptions;
CMGButton gm_mgStop;
CMGButton gm_mgQuit;
void Initialize_t(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,111 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "LevelInfo.h"
#include "MLevels.h"
void CLevelsMenu::Initialize_t(void)
{
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("CHOOSE LEVEL");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
for (INDEX iLabel = 0; iLabel<LEVELS_ON_SCREEN; iLabel++)
{
INDEX iPrev = (LEVELS_ON_SCREEN + iLabel - 1) % LEVELS_ON_SCREEN;
INDEX iNext = (iLabel + 1) % LEVELS_ON_SCREEN;
// initialize label gadgets
gm_mgManualLevel[iLabel].mg_pmgUp = &gm_mgManualLevel[iPrev];
gm_mgManualLevel[iLabel].mg_pmgDown = &gm_mgManualLevel[iNext];
gm_mgManualLevel[iLabel].mg_boxOnScreen = BoxMediumRow(iLabel);
gm_mgManualLevel[iLabel].mg_pActivatedFunction = NULL; // never called!
gm_lhGadgets.AddTail(gm_mgManualLevel[iLabel].mg_lnNode);
}
gm_lhGadgets.AddTail(gm_mgArrowUp.mg_lnNode);
gm_lhGadgets.AddTail(gm_mgArrowDn.mg_lnNode);
gm_mgArrowUp.mg_adDirection = AD_UP;
gm_mgArrowDn.mg_adDirection = AD_DOWN;
gm_mgArrowUp.mg_boxOnScreen = BoxArrow(AD_UP);
gm_mgArrowDn.mg_boxOnScreen = BoxArrow(AD_DOWN);
gm_mgArrowUp.mg_pmgRight = gm_mgArrowUp.mg_pmgDown =
&gm_mgManualLevel[0];
gm_mgArrowDn.mg_pmgRight = gm_mgArrowDn.mg_pmgUp =
&gm_mgManualLevel[LEVELS_ON_SCREEN - 1];
gm_ctListVisible = LEVELS_ON_SCREEN;
gm_pmgArrowUp = &gm_mgArrowUp;
gm_pmgArrowDn = &gm_mgArrowDn;
gm_pmgListTop = &gm_mgManualLevel[0];
gm_pmgListBottom = &gm_mgManualLevel[LEVELS_ON_SCREEN - 1];
}
void CLevelsMenu::FillListItems(void)
{
// disable all items first
for (INDEX i = 0; i<LEVELS_ON_SCREEN; i++) {
gm_mgManualLevel[i].mg_bEnabled = FALSE;
gm_mgManualLevel[i].mg_strText = TRANS("<empty>");
gm_mgManualLevel[i].mg_iInList = -2;
}
BOOL bHasFirst = FALSE;
BOOL bHasLast = FALSE;
INDEX ctLabels = _lhFilteredLevels.Count();
INDEX iLabel = 0;
FOREACHINLIST(CLevelInfo, li_lnNode, _lhFilteredLevels, itli) {
CLevelInfo &li = *itli;
INDEX iInMenu = iLabel - gm_iListOffset;
if ((iLabel >= gm_iListOffset) &&
(iLabel<(gm_iListOffset + LEVELS_ON_SCREEN)))
{
bHasFirst |= (iLabel == 0);
bHasLast |= (iLabel == ctLabels - 1);
gm_mgManualLevel[iInMenu].mg_strText = li.li_strName;
gm_mgManualLevel[iInMenu].mg_fnmLevel = li.li_fnLevel;
gm_mgManualLevel[iInMenu].mg_bEnabled = TRUE;
gm_mgManualLevel[iInMenu].mg_iInList = iLabel;
}
iLabel++;
}
// enable/disable up/down arrows
gm_mgArrowUp.mg_bEnabled = !bHasFirst && ctLabels>0;
gm_mgArrowDn.mg_bEnabled = !bHasLast && ctLabels>0;
}
void CLevelsMenu::StartMenu(void)
{
// set default parameters for the list
gm_iListOffset = 0;
gm_ctListTotal = _lhFilteredLevels.Count();
gm_iListWantedItem = 0;
// for each level
INDEX i = 0;
FOREACHINLIST(CLevelInfo, li_lnNode, _lhFilteredLevels, itlid) {
CLevelInfo &lid = *itlid;
// if it is the chosen one
if (lid.li_fnLevel == _pGame->gam_strCustomLevel) {
// demand focus on it
gm_iListWantedItem = i;
break;
}
i++;
}
CGameMenu::StartMenu();
}

View File

@ -0,0 +1,39 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_LEVELS_H
#define SE_INCL_GAME_MENU_LEVELS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGArrow.h"
#include "GUI/Components/MGLevelButton.h"
#include "GUI/Components/MGTitle.h"
class CLevelsMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGLevelButton gm_mgManualLevel[LEVELS_ON_SCREEN];
CMGArrow gm_mgArrowUp;
CMGArrow gm_mgArrowDn;
void Initialize_t(void);
void FillListItems(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,235 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MLoadSave.h"
void CLoadSaveMenu::Initialize_t(void)
{
gm_pgmNextMenu = NULL;
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgNotes.mg_boxOnScreen = BoxMediumRow(10.0);
gm_mgNotes.mg_bfsFontSize = BFS_MEDIUM;
gm_mgNotes.mg_iCenterI = -1;
gm_mgNotes.mg_bEnabled = FALSE;
gm_mgNotes.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgNotes.mg_lnNode);
for (INDEX iLabel = 0; iLabel<SAVELOAD_BUTTONS_CT; iLabel++)
{
INDEX iPrev = (SAVELOAD_BUTTONS_CT + iLabel - 1) % SAVELOAD_BUTTONS_CT;
INDEX iNext = (iLabel + 1) % SAVELOAD_BUTTONS_CT;
// initialize label gadgets
gm_amgButton[iLabel].mg_pmgUp = &gm_amgButton[iPrev];
gm_amgButton[iLabel].mg_pmgDown = &gm_amgButton[iNext];
gm_amgButton[iLabel].mg_boxOnScreen = BoxSaveLoad(iLabel);
gm_amgButton[iLabel].mg_pActivatedFunction = NULL; // never called!
gm_amgButton[iLabel].mg_iCenterI = -1;
gm_lhGadgets.AddTail(gm_amgButton[iLabel].mg_lnNode);
}
gm_lhGadgets.AddTail(gm_mgArrowUp.mg_lnNode);
gm_lhGadgets.AddTail(gm_mgArrowDn.mg_lnNode);
gm_mgArrowUp.mg_adDirection = AD_UP;
gm_mgArrowDn.mg_adDirection = AD_DOWN;
gm_mgArrowUp.mg_boxOnScreen = BoxArrow(AD_UP);
gm_mgArrowDn.mg_boxOnScreen = BoxArrow(AD_DOWN);
gm_mgArrowUp.mg_pmgRight = gm_mgArrowUp.mg_pmgDown = &gm_amgButton[0];
gm_mgArrowDn.mg_pmgRight = gm_mgArrowDn.mg_pmgUp = &gm_amgButton[SAVELOAD_BUTTONS_CT - 1];
gm_ctListVisible = SAVELOAD_BUTTONS_CT;
gm_pmgArrowUp = &gm_mgArrowUp;
gm_pmgArrowDn = &gm_mgArrowDn;
gm_pmgListTop = &gm_amgButton[0];
gm_pmgListBottom = &gm_amgButton[SAVELOAD_BUTTONS_CT - 1];
}
void CLoadSaveMenu::StartMenu(void)
{
gm_bNoEscape = FALSE;
// delete all file infos
FORDELETELIST(CFileInfo, fi_lnNode, gm_lhFileInfos, itfi) {
delete &itfi.Current();
}
// list the directory
CDynamicStackArray<CTFileName> afnmDir;
MakeDirList(afnmDir, gm_fnmDirectory, "", 0);
gm_iLastFile = -1;
// for each file in the directory
for (INDEX i = 0; i<afnmDir.Count(); i++) {
CTFileName fnm = afnmDir[i];
// if it can be parsed
CTString strName;
if (ParseFile(fnm, strName)) {
// create new info for that file
CFileInfo *pfi = new CFileInfo;
pfi->fi_fnFile = fnm;
pfi->fi_strName = strName;
// add it to list
gm_lhFileInfos.AddTail(pfi->fi_lnNode);
}
}
// sort if needed
switch (gm_iSortType) {
default: ASSERT(FALSE);
case LSSORT_NONE: break;
case LSSORT_NAMEUP:
gm_lhFileInfos.Sort(qsort_CompareFileInfos_NameUp, offsetof(CFileInfo, fi_lnNode));
break;
case LSSORT_NAMEDN:
gm_lhFileInfos.Sort(qsort_CompareFileInfos_NameDn, offsetof(CFileInfo, fi_lnNode));
break;
case LSSORT_FILEUP:
gm_lhFileInfos.Sort(qsort_CompareFileInfos_FileUp, offsetof(CFileInfo, fi_lnNode));
break;
case LSSORT_FILEDN:
gm_lhFileInfos.Sort(qsort_CompareFileInfos_FileDn, offsetof(CFileInfo, fi_lnNode));
break;
}
// if saving
if (gm_bSave) {
// add one info as empty slot
CFileInfo *pfi = new CFileInfo;
CTString strNumber;
strNumber.PrintF("%04d", gm_iLastFile + 1);
pfi->fi_fnFile = gm_fnmDirectory + gm_fnmBaseName + strNumber + gm_fnmExt;
pfi->fi_strName = EMPTYSLOTSTRING;
// add it to beginning
gm_lhFileInfos.AddHead(pfi->fi_lnNode);
}
// set default parameters for the list
gm_iListOffset = 0;
gm_ctListTotal = gm_lhFileInfos.Count();
// find which one should be selected
gm_iListWantedItem = 0;
if (gm_fnmSelected != "") {
INDEX i = 0;
FOREACHINLIST(CFileInfo, fi_lnNode, gm_lhFileInfos, itfi) {
CFileInfo &fi = *itfi;
if (fi.fi_fnFile == gm_fnmSelected) {
gm_iListWantedItem = i;
break;
}
i++;
}
}
CGameMenu::StartMenu();
}
void CLoadSaveMenu::EndMenu(void)
{
// delete all file infos
FORDELETELIST(CFileInfo, fi_lnNode, gm_lhFileInfos, itfi) {
delete &itfi.Current();
}
gm_pgmNextMenu = NULL;
CGameMenu::EndMenu();
}
void CLoadSaveMenu::FillListItems(void)
{
// disable all items first
for (INDEX i = 0; i<SAVELOAD_BUTTONS_CT; i++) {
gm_amgButton[i].mg_bEnabled = FALSE;
gm_amgButton[i].mg_strText = TRANS("<empty>");
gm_amgButton[i].mg_strTip = "";
gm_amgButton[i].mg_iInList = -2;
}
BOOL bHasFirst = FALSE;
BOOL bHasLast = FALSE;
INDEX ctLabels = gm_lhFileInfos.Count();
INDEX iLabel = 0;
FOREACHINLIST(CFileInfo, fi_lnNode, gm_lhFileInfos, itfi) {
CFileInfo &fi = *itfi;
INDEX iInMenu = iLabel - gm_iListOffset;
if ((iLabel >= gm_iListOffset) &&
(iLabel<(gm_iListOffset + SAVELOAD_BUTTONS_CT)))
{
bHasFirst |= (iLabel == 0);
bHasLast |= (iLabel == ctLabels - 1);
gm_amgButton[iInMenu].mg_iInList = iLabel;
gm_amgButton[iInMenu].mg_strDes = fi.fi_strName;
gm_amgButton[iInMenu].mg_fnm = fi.fi_fnFile;
gm_amgButton[iInMenu].mg_bEnabled = TRUE;
gm_amgButton[iInMenu].RefreshText();
if (gm_bSave) {
if (!FileExistsForWriting(gm_amgButton[iInMenu].mg_fnm)) {
gm_amgButton[iInMenu].mg_strTip = TRANS("Enter - save in new slot");
}
else {
gm_amgButton[iInMenu].mg_strTip = TRANS("Enter - save here, F2 - rename, Del - delete");
}
}
else if (gm_bManage) {
gm_amgButton[iInMenu].mg_strTip = TRANS("Enter - load this, F2 - rename, Del - delete");
}
else {
gm_amgButton[iInMenu].mg_strTip = TRANS("Enter - load this");
}
}
iLabel++;
}
// enable/disable up/down arrows
gm_mgArrowUp.mg_bEnabled = !bHasFirst && ctLabels>0;
gm_mgArrowDn.mg_bEnabled = !bHasLast && ctLabels>0;
}
// called to get info of a file from directory, or to skip it
BOOL CLoadSaveMenu::ParseFile(const CTFileName &fnm, CTString &strName)
{
if (fnm.FileExt() != gm_fnmExt) {
return FALSE;
}
CTFileName fnSaveGameDescription = fnm.NoExt() + ".des";
try {
strName.Load_t(fnSaveGameDescription);
} catch (char *strError) {
(void)strError;
strName = fnm.FileName();
if (fnm.FileExt() == ".ctl") {
INDEX iCtl = -1;
strName.ScanF("Controls%d", &iCtl);
if (iCtl >= 0 && iCtl <= 7) {
strName.PrintF(TRANS("From player: %s"), _pGame->gm_apcPlayers[iCtl].GetNameForPrinting());
}
}
}
INDEX iFile = -1;
fnm.FileName().ScanF((const char*)(gm_fnmBaseName + "%d"), &iFile);
gm_iLastFile = Max(gm_iLastFile, iFile);
return TRUE;
}

View File

@ -0,0 +1,79 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_LOADSAVE_H
#define SE_INCL_GAME_MENU_LOADSAVE_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGArrow.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGFileButton.h"
#include "GUI/Components/MGTitle.h"
#define SAVELOAD_BUTTONS_CT 14
enum ELSSortType
{
LSSORT_NONE,
LSSORT_NAMEUP,
LSSORT_NAMEDN,
LSSORT_FILEUP,
LSSORT_FILEDN,
};
class CLoadSaveMenu : public CGameMenu {
public:
// settings adjusted before starting the menu
CGameMenu *gm_pgmNextMenu; // menu to go to after selecting a file (if null, use parent menu)
CTFileName gm_fnmSelected; // file that is selected initially
CTFileName gm_fnmDirectory; // directory that should be read
CTFileName gm_fnmBaseName; // base file name for saving (numbers are auto-added)
CTFileName gm_fnmExt; // accepted file extension
BOOL gm_bSave; // set when chosing file for saving
BOOL gm_bManage; // set if managing (rename/delet is enabled)
CTString gm_strSaveDes; // default description (if saving)
BOOL gm_bAllowThumbnails; // set when chosing file for saving
BOOL gm_bNoEscape; // forbid exiting with escape/rmb
INDEX gm_iSortType; // sort type
// function to activate when file is chosen
// return true if saving succeeded - description is saved automatically
// always return true for loading
BOOL(*gm_pAfterFileChosen)(const CTFileName &fnm);
// internal properties
CListHead gm_lhFileInfos; // all file infos to list
INDEX gm_iLastFile; // index of last saved file in numbered format
CMGTitle gm_mgTitle;
CMGButton gm_mgNotes;
CMGFileButton gm_amgButton[SAVELOAD_BUTTONS_CT];
CMGArrow gm_mgArrowUp;
CMGArrow gm_mgArrowDn;
// called to get info of a file from directory, or to skip it
BOOL ParseFile(const CTFileName &fnm, CTString &strName);
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
void FillListItems(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,129 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MMain.h"
void CMainMenu::Initialize_t(void)
{
// intialize main menu
/*
gm_mgTitle.mg_strText = "SERIOUS SAM - BETA"; // nothing to see here, kazuya
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail( gm_mgTitle.mg_lnNode);
*/
extern CTString sam_strVersion;
gm_mgVersionLabel.mg_strText = sam_strVersion;
gm_mgVersionLabel.mg_boxOnScreen = BoxVersion();
gm_mgVersionLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgVersionLabel.mg_iCenterI = +1;
gm_mgVersionLabel.mg_bEnabled = FALSE;
gm_mgVersionLabel.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgVersionLabel.mg_lnNode);
extern CTString sam_strModName;
gm_mgModLabel.mg_strText = sam_strModName;
gm_mgModLabel.mg_boxOnScreen = BoxMediumRow(-2.0f);
gm_mgModLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgModLabel.mg_iCenterI = 0;
gm_mgModLabel.mg_bEnabled = FALSE;
gm_mgModLabel.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgModLabel.mg_lnNode);
gm_mgSingle.mg_strText = TRANS("SINGLE PLAYER");
gm_mgSingle.mg_bfsFontSize = BFS_LARGE;
gm_mgSingle.mg_boxOnScreen = BoxBigRow(0.0f);
gm_mgSingle.mg_strTip = TRANS("single player game menus");
gm_lhGadgets.AddTail(gm_mgSingle.mg_lnNode);
gm_mgSingle.mg_pmgUp = &gm_mgQuit;
gm_mgSingle.mg_pmgDown = &gm_mgNetwork;
gm_mgSingle.mg_pActivatedFunction = NULL;
gm_mgNetwork.mg_strText = TRANS("NETWORK");
gm_mgNetwork.mg_bfsFontSize = BFS_LARGE;
gm_mgNetwork.mg_boxOnScreen = BoxBigRow(1.0f);
gm_mgNetwork.mg_strTip = TRANS("LAN/iNet multiplayer menus");
gm_lhGadgets.AddTail(gm_mgNetwork.mg_lnNode);
gm_mgNetwork.mg_pmgUp = &gm_mgSingle;
gm_mgNetwork.mg_pmgDown = &gm_mgSplitScreen;
gm_mgNetwork.mg_pActivatedFunction = NULL;
gm_mgSplitScreen.mg_strText = TRANS("SPLIT SCREEN");
gm_mgSplitScreen.mg_bfsFontSize = BFS_LARGE;
gm_mgSplitScreen.mg_boxOnScreen = BoxBigRow(2.0f);
gm_mgSplitScreen.mg_strTip = TRANS("play with multiple players on one computer");
gm_lhGadgets.AddTail(gm_mgSplitScreen.mg_lnNode);
gm_mgSplitScreen.mg_pmgUp = &gm_mgNetwork;
gm_mgSplitScreen.mg_pmgDown = &gm_mgDemo;
gm_mgSplitScreen.mg_pActivatedFunction = NULL;
gm_mgDemo.mg_strText = TRANS("DEMO");
gm_mgDemo.mg_bfsFontSize = BFS_LARGE;
gm_mgDemo.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgDemo.mg_strTip = TRANS("play a game demo");
gm_lhGadgets.AddTail(gm_mgDemo.mg_lnNode);
gm_mgDemo.mg_pmgUp = &gm_mgSplitScreen;
gm_mgDemo.mg_pmgDown = &gm_mgMods;
gm_mgDemo.mg_pActivatedFunction = NULL;
gm_mgMods.mg_strText = TRANS("MODS");
gm_mgMods.mg_bfsFontSize = BFS_LARGE;
gm_mgMods.mg_boxOnScreen = BoxBigRow(4.0f);
gm_mgMods.mg_strTip = TRANS("run one of installed game modifications");
gm_lhGadgets.AddTail(gm_mgMods.mg_lnNode);
gm_mgMods.mg_pmgUp = &gm_mgDemo;
gm_mgMods.mg_pmgDown = &gm_mgHighScore;
gm_mgMods.mg_pActivatedFunction = NULL;
gm_mgHighScore.mg_strText = TRANS("HIGH SCORES");
gm_mgHighScore.mg_bfsFontSize = BFS_LARGE;
gm_mgHighScore.mg_boxOnScreen = BoxBigRow(5.0f);
gm_mgHighScore.mg_strTip = TRANS("view list of top ten best scores");
gm_lhGadgets.AddTail(gm_mgHighScore.mg_lnNode);
gm_mgHighScore.mg_pmgUp = &gm_mgMods;
gm_mgHighScore.mg_pmgDown = &gm_mgOptions;
gm_mgHighScore.mg_pActivatedFunction = NULL;
gm_mgOptions.mg_strText = TRANS("OPTIONS");
gm_mgOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgOptions.mg_boxOnScreen = BoxBigRow(6.0f);
gm_mgOptions.mg_strTip = TRANS("adjust video, audio and input options");
gm_lhGadgets.AddTail(gm_mgOptions.mg_lnNode);
gm_mgOptions.mg_pmgUp = &gm_mgHighScore;
gm_mgOptions.mg_pmgDown = &gm_mgQuit;
gm_mgOptions.mg_pActivatedFunction = NULL;
gm_mgQuit.mg_strText = TRANS("QUIT");
gm_mgQuit.mg_bfsFontSize = BFS_LARGE;
gm_mgQuit.mg_boxOnScreen = BoxBigRow(7.0f);
gm_mgQuit.mg_strTip = TRANS("exit game immediately");
gm_lhGadgets.AddTail(gm_mgQuit.mg_lnNode);
gm_mgQuit.mg_pmgUp = &gm_mgOptions;
gm_mgQuit.mg_pmgDown = &gm_mgSingle;
gm_mgQuit.mg_pActivatedFunction = NULL;
}
void CMainMenu::StartMenu(void)
{
gm_mgSingle.mg_bEnabled = IsMenuEnabled("Single Player");
gm_mgNetwork.mg_bEnabled = IsMenuEnabled("Network");
gm_mgSplitScreen.mg_bEnabled = IsMenuEnabled("Split Screen");
gm_mgHighScore.mg_bEnabled = IsMenuEnabled("High Score");
CGameMenu::StartMenu();
}

View File

@ -0,0 +1,42 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_MAIN_H
#define SE_INCL_GAME_MENU_MAIN_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
class CMainMenu : public CGameMenu {
public:
CMGButton gm_mgVersionLabel;
CMGButton gm_mgModLabel;
CMGButton gm_mgSingle;
CMGButton gm_mgNetwork;
CMGButton gm_mgSplitScreen;
CMGButton gm_mgDemo;
CMGButton gm_mgMods;
CMGButton gm_mgHighScore;
CMGButton gm_mgOptions;
CMGButton gm_mgQuit;
void Initialize_t(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,68 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MNetwork.h"
void CNetworkMenu::Initialize_t(void)
{
// intialize network menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("NETWORK");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgJoin.mg_bfsFontSize = BFS_LARGE;
gm_mgJoin.mg_boxOnScreen = BoxBigRow(1.0f);
gm_mgJoin.mg_pmgUp = &gm_mgLoad;
gm_mgJoin.mg_pmgDown = &gm_mgStart;
gm_mgJoin.mg_strText = TRANS("JOIN GAME");
gm_mgJoin.mg_strTip = TRANS("join a network game");
gm_lhGadgets.AddTail(gm_mgJoin.mg_lnNode);
gm_mgJoin.mg_pActivatedFunction = NULL;
gm_mgStart.mg_bfsFontSize = BFS_LARGE;
gm_mgStart.mg_boxOnScreen = BoxBigRow(2.0f);
gm_mgStart.mg_pmgUp = &gm_mgJoin;
gm_mgStart.mg_pmgDown = &gm_mgQuickLoad;
gm_mgStart.mg_strText = TRANS("START SERVER");
gm_mgStart.mg_strTip = TRANS("start a network game server");
gm_lhGadgets.AddTail(gm_mgStart.mg_lnNode);
gm_mgStart.mg_pActivatedFunction = NULL;
gm_mgQuickLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgQuickLoad.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgQuickLoad.mg_pmgUp = &gm_mgStart;
gm_mgQuickLoad.mg_pmgDown = &gm_mgLoad;
gm_mgQuickLoad.mg_strText = TRANS("QUICK LOAD");
gm_mgQuickLoad.mg_strTip = TRANS("load a quick-saved game (F9)");
gm_lhGadgets.AddTail(gm_mgQuickLoad.mg_lnNode);
gm_mgQuickLoad.mg_pActivatedFunction = NULL;
gm_mgLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgLoad.mg_boxOnScreen = BoxBigRow(4.0f);
gm_mgLoad.mg_pmgUp = &gm_mgQuickLoad;
gm_mgLoad.mg_pmgDown = &gm_mgJoin;
gm_mgLoad.mg_strText = TRANS("LOAD");
gm_mgLoad.mg_strTip = TRANS("start server and load a network game (server only)");
gm_lhGadgets.AddTail(gm_mgLoad.mg_lnNode);
gm_mgLoad.mg_pActivatedFunction = NULL;
}
void CNetworkMenu::StartMenu(void)
{
CGameMenu::StartMenu();
}

View File

@ -0,0 +1,38 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_NETWORK_H
#define SE_INCL_GAME_MENU_NETWORK_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class CNetworkMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgJoin;
CMGButton gm_mgStart;
CMGButton gm_mgQuickLoad;
CMGButton gm_mgLoad;
void Initialize_t(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,55 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MNetworkJoin.h"
void CNetworkJoinMenu::Initialize_t(void)
{
// title
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("JOIN GAME");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgLAN.mg_bfsFontSize = BFS_LARGE;
gm_mgLAN.mg_boxOnScreen = BoxBigRow(1.0f);
gm_mgLAN.mg_pmgUp = &gm_mgOpen;
gm_mgLAN.mg_pmgDown = &gm_mgNET;
gm_mgLAN.mg_strText = TRANS("SEARCH LAN");
gm_mgLAN.mg_strTip = TRANS("search local network for servers");
gm_lhGadgets.AddTail(gm_mgLAN.mg_lnNode);
gm_mgLAN.mg_pActivatedFunction = NULL;
gm_mgNET.mg_bfsFontSize = BFS_LARGE;
gm_mgNET.mg_boxOnScreen = BoxBigRow(2.0f);
gm_mgNET.mg_pmgUp = &gm_mgLAN;
gm_mgNET.mg_pmgDown = &gm_mgOpen;
gm_mgNET.mg_strText = TRANS("SEARCH INTERNET");
gm_mgNET.mg_strTip = TRANS("search internet for servers");
gm_lhGadgets.AddTail(gm_mgNET.mg_lnNode);
gm_mgNET.mg_pActivatedFunction = NULL;
gm_mgOpen.mg_bfsFontSize = BFS_LARGE;
gm_mgOpen.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgOpen.mg_pmgUp = &gm_mgNET;
gm_mgOpen.mg_pmgDown = &gm_mgLAN;
gm_mgOpen.mg_strText = TRANS("SPECIFY SERVER");
gm_mgOpen.mg_strTip = TRANS("type in server address to connect to");
gm_lhGadgets.AddTail(gm_mgOpen.mg_lnNode);
gm_mgOpen.mg_pActivatedFunction = NULL;
}

View File

@ -0,0 +1,36 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_NETWORKJOIN_H
#define SE_INCL_GAME_MENU_NETWORKJOIN_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class CNetworkJoinMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgLAN;
CMGButton gm_mgNET;
CMGButton gm_mgOpen;
void Initialize_t(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,78 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MNetworkOpen.h"
void CNetworkOpenMenu::Initialize_t(void)
{
// intialize network join menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("JOIN");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgAddressLabel.mg_strText = TRANS("Address:");
gm_mgAddressLabel.mg_boxOnScreen = BoxMediumLeft(1);
gm_mgAddressLabel.mg_iCenterI = -1;
gm_lhGadgets.AddTail(gm_mgAddressLabel.mg_lnNode);
gm_mgAddress.mg_strText = _pGame->gam_strJoinAddress;
gm_mgAddress.mg_ctMaxStringLen = 20;
gm_mgAddress.mg_pstrToChange = &_pGame->gam_strJoinAddress;
gm_mgAddress.mg_boxOnScreen = BoxMediumMiddle(1);
gm_mgAddress.mg_bfsFontSize = BFS_MEDIUM;
gm_mgAddress.mg_iCenterI = -1;
gm_mgAddress.mg_pmgUp = &gm_mgJoin;
gm_mgAddress.mg_pmgDown = &gm_mgPort;
gm_mgAddress.mg_strTip = TRANS("specify server address");
gm_lhGadgets.AddTail(gm_mgAddress.mg_lnNode);
gm_mgPortLabel.mg_strText = TRANS("Port:");
gm_mgPortLabel.mg_boxOnScreen = BoxMediumLeft(2);
gm_mgPortLabel.mg_iCenterI = -1;
gm_lhGadgets.AddTail(gm_mgPortLabel.mg_lnNode);
gm_mgPort.mg_strText = "";
gm_mgPort.mg_ctMaxStringLen = 10;
gm_mgPort.mg_pstrToChange = &gm_strPort;
gm_mgPort.mg_boxOnScreen = BoxMediumMiddle(2);
gm_mgPort.mg_bfsFontSize = BFS_MEDIUM;
gm_mgPort.mg_iCenterI = -1;
gm_mgPort.mg_pmgUp = &gm_mgAddress;
gm_mgPort.mg_pmgDown = &gm_mgJoin;
gm_mgPort.mg_strTip = TRANS("specify server address");
gm_lhGadgets.AddTail(gm_mgPort.mg_lnNode);
gm_mgJoin.mg_boxOnScreen = BoxMediumMiddle(3);
gm_mgJoin.mg_pmgUp = &gm_mgPort;
gm_mgJoin.mg_pmgDown = &gm_mgAddress;
gm_mgJoin.mg_strText = TRANS("Join");
gm_lhGadgets.AddTail(gm_mgJoin.mg_lnNode);
gm_mgJoin.mg_pActivatedFunction = NULL;
}
void CNetworkOpenMenu::StartMenu(void)
{
gm_strPort = _pShell->GetValue("net_iPort");
gm_mgPort.mg_strText = gm_strPort;
}
void CNetworkOpenMenu::EndMenu(void)
{
_pShell->SetValue("net_iPort", gm_strPort);
}

View File

@ -0,0 +1,43 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_NETWORKOPEN_H
#define SE_INCL_GAME_MENU_NETWORKOPEN_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGEdit.h"
#include "GUI/Components/MGTitle.h"
class CNetworkOpenMenu : public CGameMenu {
public:
CTString gm_strPort;
CMGTitle gm_mgTitle;
CMGButton gm_mgAddressLabel;
CMGEdit gm_mgAddress;
CMGButton gm_mgPortLabel;
CMGEdit gm_mgPort;
CMGButton gm_mgJoin;
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,146 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "LevelInfo.h"
#include "MenuStuff.h"
#include "MNetworkStart.h"
extern void UpdateNetworkLevel(INDEX iDummy);
void CNetworkStartMenu::Initialize_t(void)
{
// title
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("START SERVER");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
// session name edit box
gm_mgSessionName.mg_strText = _pGame->gam_strSessionName;
gm_mgSessionName.mg_strLabel = TRANS("Session name:");
gm_mgSessionName.mg_ctMaxStringLen = 25;
gm_mgSessionName.mg_pstrToChange = &_pGame->gam_strSessionName;
gm_mgSessionName.mg_boxOnScreen = BoxMediumRow(1);
gm_mgSessionName.mg_bfsFontSize = BFS_MEDIUM;
gm_mgSessionName.mg_iCenterI = -1;
gm_mgSessionName.mg_pmgUp = &gm_mgStart;
gm_mgSessionName.mg_pmgDown = &gm_mgGameType;
gm_mgSessionName.mg_strTip = TRANS("name the session to start");
gm_lhGadgets.AddTail(gm_mgSessionName.mg_lnNode);
// game type trigger
TRIGGER_MG(gm_mgGameType, 2,
gm_mgSessionName, gm_mgDifficulty, TRANS("Game type:"), astrGameTypeRadioTexts);
gm_mgGameType.mg_ctTexts = ctGameTypeRadioTexts;
gm_mgGameType.mg_strTip = TRANS("choose type of multiplayer game");
gm_mgGameType.mg_pOnTriggerChange = &UpdateNetworkLevel;
// difficulty trigger
TRIGGER_MG(gm_mgDifficulty, 3,
gm_mgGameType, gm_mgLevel, TRANS("Difficulty:"), astrDifficultyRadioTexts);
gm_mgDifficulty.mg_strTip = TRANS("choose difficulty level");
// level name
gm_mgLevel.mg_strText = "";
gm_mgLevel.mg_strLabel = TRANS("Level:");
gm_mgLevel.mg_boxOnScreen = BoxMediumRow(4);
gm_mgLevel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgLevel.mg_iCenterI = -1;
gm_mgLevel.mg_pmgUp = &gm_mgDifficulty;
gm_mgLevel.mg_pmgDown = &gm_mgMaxPlayers;
gm_mgLevel.mg_strTip = TRANS("choose the level to start");
gm_mgLevel.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgLevel.mg_lnNode);
// max players trigger
TRIGGER_MG(gm_mgMaxPlayers, 5,
gm_mgLevel, gm_mgWaitAllPlayers, TRANS("Max players:"), astrMaxPlayersRadioTexts);
gm_mgMaxPlayers.mg_strTip = TRANS("choose maximum allowed number of players");
// wait all players trigger
TRIGGER_MG(gm_mgWaitAllPlayers, 6,
gm_mgMaxPlayers, gm_mgVisible, TRANS("Wait for all players:"), astrNoYes);
gm_mgWaitAllPlayers.mg_strTip = TRANS("if on, game won't start until all players have joined");
// server visible trigger
TRIGGER_MG(gm_mgVisible, 7,
gm_mgMaxPlayers, gm_mgGameOptions, TRANS("Server visible:"), astrNoYes);
gm_mgVisible.mg_strTip = TRANS("invisible servers are not listed, cleints have to join manually");
// options button
gm_mgGameOptions.mg_strText = TRANS("Game options");
gm_mgGameOptions.mg_boxOnScreen = BoxMediumRow(8);
gm_mgGameOptions.mg_bfsFontSize = BFS_MEDIUM;
gm_mgGameOptions.mg_iCenterI = 0;
gm_mgGameOptions.mg_pmgUp = &gm_mgVisible;
gm_mgGameOptions.mg_pmgDown = &gm_mgStart;
gm_mgGameOptions.mg_strTip = TRANS("adjust game rules");
gm_mgGameOptions.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgGameOptions.mg_lnNode);
// start button
gm_mgStart.mg_bfsFontSize = BFS_LARGE;
gm_mgStart.mg_boxOnScreen = BoxBigRow(7);
gm_mgStart.mg_pmgUp = &gm_mgGameOptions;
gm_mgStart.mg_pmgDown = &gm_mgSessionName;
gm_mgStart.mg_strText = TRANS("START");
gm_lhGadgets.AddTail(gm_mgStart.mg_lnNode);
gm_mgStart.mg_pActivatedFunction = NULL;
}
void CNetworkStartMenu::StartMenu(void)
{
extern INDEX sam_bMentalActivated;
gm_mgDifficulty.mg_ctTexts = sam_bMentalActivated ? 6 : 5;
gm_mgGameType.mg_iSelected = Clamp(_pShell->GetINDEX("gam_iStartMode"), 0L, ctGameTypeRadioTexts - 1L);
gm_mgGameType.ApplyCurrentSelection();
gm_mgDifficulty.mg_iSelected = _pShell->GetINDEX("gam_iStartDifficulty") + 1;
gm_mgDifficulty.ApplyCurrentSelection();
_pShell->SetINDEX("gam_iStartMode", CSessionProperties::GM_COOPERATIVE);
INDEX ctMaxPlayers = _pShell->GetINDEX("gam_ctMaxPlayers");
if (ctMaxPlayers<2 || ctMaxPlayers>16) {
ctMaxPlayers = 2;
_pShell->SetINDEX("gam_ctMaxPlayers", ctMaxPlayers);
}
gm_mgMaxPlayers.mg_iSelected = ctMaxPlayers - 2;
gm_mgMaxPlayers.ApplyCurrentSelection();
gm_mgWaitAllPlayers.mg_iSelected = Clamp(_pShell->GetINDEX("gam_bWaitAllPlayers"), 0L, 1L);
gm_mgWaitAllPlayers.ApplyCurrentSelection();
gm_mgVisible.mg_iSelected = _pShell->GetINDEX("ser_bEnumeration");
gm_mgVisible.ApplyCurrentSelection();
UpdateNetworkLevel(0);
CGameMenu::StartMenu();
}
void CNetworkStartMenu::EndMenu(void)
{
_pShell->SetINDEX("gam_iStartDifficulty", gm_mgDifficulty.mg_iSelected - 1);
_pShell->SetINDEX("gam_iStartMode", gm_mgGameType.mg_iSelected);
_pShell->SetINDEX("gam_bWaitAllPlayers", gm_mgWaitAllPlayers.mg_iSelected);
_pShell->SetINDEX("gam_ctMaxPlayers", gm_mgMaxPlayers.mg_iSelected + 2);
_pShell->SetINDEX("ser_bEnumeration", gm_mgVisible.mg_iSelected);
CGameMenu::EndMenu();
}

View File

@ -0,0 +1,46 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_NETWORKSTART_H
#define SE_INCL_GAME_MENU_NETWORKSTART_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGEdit.h"
#include "GUI/Components/MGTitle.h"
#include "GUI/Components/MGTrigger.h"
class CNetworkStartMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGEdit gm_mgSessionName;
CMGTrigger gm_mgGameType;
CMGTrigger gm_mgDifficulty;
CMGButton gm_mgLevel;
CMGTrigger gm_mgMaxPlayers;
CMGTrigger gm_mgWaitAllPlayers;
CMGTrigger gm_mgVisible;
CMGButton gm_mgGameOptions;
CMGButton gm_mgStart;
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,81 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MOptions.h"
void COptionsMenu::Initialize_t(void)
{
// intialize options menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("OPTIONS");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgVideoOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgVideoOptions.mg_boxOnScreen = BoxBigRow(0.0f);
gm_mgVideoOptions.mg_pmgUp = &gm_mgAddonOptions;
gm_mgVideoOptions.mg_pmgDown = &gm_mgAudioOptions;
gm_mgVideoOptions.mg_strText = TRANS("VIDEO OPTIONS");
gm_mgVideoOptions.mg_strTip = TRANS("set video mode and driver");
gm_lhGadgets.AddTail(gm_mgVideoOptions.mg_lnNode);
gm_mgVideoOptions.mg_pActivatedFunction = NULL;
gm_mgAudioOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgAudioOptions.mg_boxOnScreen = BoxBigRow(1.0f);
gm_mgAudioOptions.mg_pmgUp = &gm_mgVideoOptions;
gm_mgAudioOptions.mg_pmgDown = &gm_mgPlayerProfileOptions;
gm_mgAudioOptions.mg_strText = TRANS("AUDIO OPTIONS");
gm_mgAudioOptions.mg_strTip = TRANS("set audio quality and volume");
gm_lhGadgets.AddTail(gm_mgAudioOptions.mg_lnNode);
gm_mgAudioOptions.mg_pActivatedFunction = NULL;
gm_mgPlayerProfileOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgPlayerProfileOptions.mg_boxOnScreen = BoxBigRow(2.0f);
gm_mgPlayerProfileOptions.mg_pmgUp = &gm_mgAudioOptions;
gm_mgPlayerProfileOptions.mg_pmgDown = &gm_mgNetworkOptions;
gm_mgPlayerProfileOptions.mg_strText = TRANS("PLAYERS AND CONTROLS");
gm_mgPlayerProfileOptions.mg_strTip = TRANS("change currently active player or adjust controls");
gm_lhGadgets.AddTail(gm_mgPlayerProfileOptions.mg_lnNode);
gm_mgPlayerProfileOptions.mg_pActivatedFunction = NULL;
gm_mgNetworkOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgNetworkOptions.mg_boxOnScreen = BoxBigRow(3);
gm_mgNetworkOptions.mg_pmgUp = &gm_mgPlayerProfileOptions;
gm_mgNetworkOptions.mg_pmgDown = &gm_mgCustomOptions;
gm_mgNetworkOptions.mg_strText = TRANS("NETWORK CONNECTION");
gm_mgNetworkOptions.mg_strTip = TRANS("choose your connection parameters");
gm_lhGadgets.AddTail(gm_mgNetworkOptions.mg_lnNode);
gm_mgNetworkOptions.mg_pActivatedFunction = NULL;
gm_mgCustomOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgCustomOptions.mg_boxOnScreen = BoxBigRow(4);
gm_mgCustomOptions.mg_pmgUp = &gm_mgNetworkOptions;
gm_mgCustomOptions.mg_pmgDown = &gm_mgAddonOptions;
gm_mgCustomOptions.mg_strText = TRANS("ADVANCED OPTIONS");
gm_mgCustomOptions.mg_strTip = TRANS("for advanced users only");
gm_lhGadgets.AddTail(gm_mgCustomOptions.mg_lnNode);
gm_mgCustomOptions.mg_pActivatedFunction = NULL;
gm_mgAddonOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgAddonOptions.mg_boxOnScreen = BoxBigRow(5);
gm_mgAddonOptions.mg_pmgUp = &gm_mgCustomOptions;
gm_mgAddonOptions.mg_pmgDown = &gm_mgVideoOptions;
gm_mgAddonOptions.mg_strText = TRANS("EXECUTE ADDON");
gm_mgAddonOptions.mg_strTip = TRANS("choose from list of addons to execute");
gm_lhGadgets.AddTail(gm_mgAddonOptions.mg_lnNode);
gm_mgAddonOptions.mg_pActivatedFunction = NULL;
}

View File

@ -0,0 +1,39 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_OPTIONS_H
#define SE_INCL_GAME_MENU_OPTIONS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class COptionsMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgVideoOptions;
CMGButton gm_mgAudioOptions;
CMGButton gm_mgPlayerProfileOptions;
CMGButton gm_mgNetworkOptions;
CMGButton gm_mgCustomOptions;
CMGButton gm_mgAddonOptions;
void Initialize_t(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,306 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MPlayerProfile.h"
#include "GUI/Menus/MenuManager.h"
#define ADD_SELECT_PLAYER_MG( index, mg, mgprev, mgnext, me)\
mg.mg_iIndex = index; \
mg.mg_bfsFontSize = BFS_MEDIUM; \
mg.mg_boxOnScreen = BoxNoUp(index); \
mg.mg_bRectangle = TRUE; \
mg.mg_pmgLeft = &mgprev; \
mg.mg_pmgRight = &mgnext; \
mg.mg_pmgUp = &gm_mgCustomizeControls; \
mg.mg_pmgDown = &gm_mgNameField; \
mg.mg_pActivatedFunction = &PPOnPlayerSelect; \
mg.mg_strText = #index; \
mg.mg_strTip = TRANS("select new currently active player"); \
gm_lhGadgets.AddTail(mg.mg_lnNode);
extern BOOL _bPlayerMenuFromSinglePlayer;
extern CTString _strLastPlayerAppearance;
extern void PPOnPlayerSelect(void);
void CPlayerProfileMenu::Initialize_t(void)
{
// intialize player and controls menu
_bPlayerMenuFromSinglePlayer = FALSE;
gm_mgProfileTitle.mg_boxOnScreen = BoxTitle();
gm_mgProfileTitle.mg_strText = TRANS("PLAYER PROFILE");
gm_lhGadgets.AddTail(gm_mgProfileTitle.mg_lnNode);
gm_mgNoLabel.mg_strText = TRANS("PROFILE:");
gm_mgNoLabel.mg_boxOnScreen = BoxMediumLeft(0.0f);
gm_mgNoLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgNoLabel.mg_iCenterI = -1;
gm_lhGadgets.AddTail(gm_mgNoLabel.mg_lnNode);
ADD_SELECT_PLAYER_MG(0, gm_mgNumber[0], gm_mgNumber[7], gm_mgNumber[1], gm_mgNumber[0]);
ADD_SELECT_PLAYER_MG(1, gm_mgNumber[1], gm_mgNumber[0], gm_mgNumber[2], gm_mgNumber[1]);
ADD_SELECT_PLAYER_MG(2, gm_mgNumber[2], gm_mgNumber[1], gm_mgNumber[3], gm_mgNumber[2]);
ADD_SELECT_PLAYER_MG(3, gm_mgNumber[3], gm_mgNumber[2], gm_mgNumber[4], gm_mgNumber[3]);
ADD_SELECT_PLAYER_MG(4, gm_mgNumber[4], gm_mgNumber[3], gm_mgNumber[5], gm_mgNumber[4]);
ADD_SELECT_PLAYER_MG(5, gm_mgNumber[5], gm_mgNumber[4], gm_mgNumber[6], gm_mgNumber[5]);
ADD_SELECT_PLAYER_MG(6, gm_mgNumber[6], gm_mgNumber[5], gm_mgNumber[7], gm_mgNumber[6]);
ADD_SELECT_PLAYER_MG(7, gm_mgNumber[7], gm_mgNumber[6], gm_mgNumber[0], gm_mgNumber[7]);
gm_mgNumber[7].mg_pmgRight = &gm_mgModel;
gm_mgNameLabel.mg_strText = TRANS("NAME:");
gm_mgNameLabel.mg_boxOnScreen = BoxMediumLeft(1.25f);
gm_mgNameLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgNameLabel.mg_iCenterI = -1;
gm_lhGadgets.AddTail(gm_mgNameLabel.mg_lnNode);
// setup of player name button is done on start menu
gm_mgNameField.mg_strText = "<???>";
gm_mgNameField.mg_ctMaxStringLen = 25;
gm_mgNameField.mg_boxOnScreen = BoxPlayerEdit(1.25);
gm_mgNameField.mg_bfsFontSize = BFS_MEDIUM;
gm_mgNameField.mg_iCenterI = -1;
gm_mgNameField.mg_pmgUp = &gm_mgNumber[0];
gm_mgNameField.mg_pmgDown = &gm_mgTeam;
gm_mgNameField.mg_pmgRight = &gm_mgModel;
gm_mgNameField.mg_strTip = TRANS("rename currently active player");
gm_lhGadgets.AddTail(gm_mgNameField.mg_lnNode);
gm_mgTeamLabel.mg_strText = TRANS("TEAM:");
gm_mgTeamLabel.mg_boxOnScreen = BoxMediumLeft(2.25f);
gm_mgTeamLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgTeamLabel.mg_iCenterI = -1;
gm_lhGadgets.AddTail(gm_mgTeamLabel.mg_lnNode);
// setup of player name button is done on start menu
gm_mgTeam.mg_strText = "<???>";
gm_mgTeam.mg_ctMaxStringLen = 25;
gm_mgTeam.mg_boxOnScreen = BoxPlayerEdit(2.25f);
gm_mgTeam.mg_bfsFontSize = BFS_MEDIUM;
gm_mgTeam.mg_iCenterI = -1;
gm_mgTeam.mg_pmgUp = gm_mgNameField.mg_pmgUp = &gm_mgNumber[0];
gm_mgTeam.mg_pmgDown = &gm_mgCrosshair;
gm_mgTeam.mg_pmgRight = &gm_mgModel;
//gm_mgTeam.mg_strTip = TRANS("teamplay is disabled in this version");
gm_mgTeam.mg_strTip = TRANS("enter team name, if playing in team");
gm_lhGadgets.AddTail(gm_mgTeam.mg_lnNode);
TRIGGER_MG(gm_mgCrosshair, 4.0, gm_mgTeam, gm_mgWeaponSelect, TRANS("CROSSHAIR"), astrCrosshair);
gm_mgCrosshair.mg_bVisual = TRUE;
gm_mgCrosshair.mg_boxOnScreen = BoxPlayerSwitch(5.0f);
gm_mgCrosshair.mg_iCenterI = -1;
gm_mgCrosshair.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgWeaponSelect, 4.0, gm_mgCrosshair, gm_mgWeaponHide, TRANS("AUTO SELECT WEAPON"), astrWeapon);
gm_mgWeaponSelect.mg_boxOnScreen = BoxPlayerSwitch(6.0f);
gm_mgWeaponSelect.mg_iCenterI = -1;
gm_mgWeaponSelect.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgWeaponHide, 4.0, gm_mgWeaponSelect, gm_mg3rdPerson, TRANS("HIDE WEAPON MODEL"), astrNoYes);
gm_mgWeaponHide.mg_boxOnScreen = BoxPlayerSwitch(7.0f);
gm_mgWeaponHide.mg_iCenterI = -1;
gm_mgWeaponHide.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mg3rdPerson, 4.0, gm_mgWeaponHide, gm_mgQuotes, TRANS("PREFER 3RD PERSON VIEW"), astrNoYes);
gm_mg3rdPerson.mg_boxOnScreen = BoxPlayerSwitch(8.0f);
gm_mg3rdPerson.mg_iCenterI = -1;
gm_mg3rdPerson.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgQuotes, 4.0, gm_mg3rdPerson, gm_mgAutoSave, TRANS("VOICE QUOTES"), astrNoYes);
gm_mgQuotes.mg_boxOnScreen = BoxPlayerSwitch(9.0f);
gm_mgQuotes.mg_iCenterI = -1;
gm_mgQuotes.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgAutoSave, 4.0, gm_mgQuotes, gm_mgCompDoubleClick, TRANS("AUTO SAVE"), astrNoYes);
gm_mgAutoSave.mg_boxOnScreen = BoxPlayerSwitch(10.0f);
gm_mgAutoSave.mg_iCenterI = -1;
gm_mgAutoSave.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgCompDoubleClick, 4.0, gm_mgAutoSave, gm_mgSharpTurning, TRANS("INVOKE COMPUTER"), astrComputerInvoke);
gm_mgCompDoubleClick.mg_boxOnScreen = BoxPlayerSwitch(11.0f);
gm_mgCompDoubleClick.mg_iCenterI = -1;
gm_mgCompDoubleClick.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgSharpTurning, 4.0, gm_mgCompDoubleClick, gm_mgViewBobbing, TRANS("SHARP TURNING"), astrNoYes);
gm_mgSharpTurning.mg_boxOnScreen = BoxPlayerSwitch(12.0f);
gm_mgSharpTurning.mg_iCenterI = -1;
gm_mgSharpTurning.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgViewBobbing, 4.0, gm_mgSharpTurning, gm_mgCustomizeControls, TRANS("VIEW BOBBING"), astrNoYes);
gm_mgViewBobbing.mg_boxOnScreen = BoxPlayerSwitch(13.0f);
gm_mgViewBobbing.mg_iCenterI = -1;
gm_mgViewBobbing.mg_pOnTriggerChange = NULL;
gm_mgCustomizeControls.mg_strText = TRANS("CUSTOMIZE CONTROLS");
gm_mgCustomizeControls.mg_boxOnScreen = BoxMediumLeft(14.5f);
gm_mgCustomizeControls.mg_bfsFontSize = BFS_MEDIUM;
gm_mgCustomizeControls.mg_iCenterI = -1;
gm_mgCustomizeControls.mg_pmgUp = &gm_mgViewBobbing;
gm_mgCustomizeControls.mg_pActivatedFunction = NULL;
gm_mgCustomizeControls.mg_pmgDown = &gm_mgNumber[0];
gm_mgCustomizeControls.mg_pmgRight = &gm_mgModel;
gm_mgCustomizeControls.mg_strTip = TRANS("customize controls for this player");
gm_lhGadgets.AddTail(gm_mgCustomizeControls.mg_lnNode);
gm_mgModel.mg_boxOnScreen = BoxPlayerModel();
gm_mgModel.mg_pmgLeft = &gm_mgNameField;
gm_mgModel.mg_pActivatedFunction = NULL;
gm_mgModel.mg_pmgDown = &gm_mgNameField;
gm_mgModel.mg_pmgLeft = &gm_mgNameField;
gm_mgModel.mg_strTip = TRANS("change model for this player");
gm_lhGadgets.AddTail(gm_mgModel.mg_lnNode);
}
INDEX CPlayerProfileMenu::ComboFromPlayer(INDEX iPlayer)
{
return iPlayer;
}
INDEX CPlayerProfileMenu::PlayerFromCombo(INDEX iCombo)
{
return iCombo;
}
void CPlayerProfileMenu::SelectPlayer(INDEX iPlayer)
{
CPlayerCharacter &pc = _pGame->gm_apcPlayers[iPlayer];
for (INDEX iPl = 0; iPl<8; iPl++)
{
gm_mgNumber[iPl].mg_bHighlighted = FALSE;
}
gm_mgNumber[iPlayer].mg_bHighlighted = TRUE;
iPlayer = Clamp(iPlayer, INDEX(0), INDEX(7));
if (_iLocalPlayer >= 0 && _iLocalPlayer<4) {
_pGame->gm_aiMenuLocalPlayers[_iLocalPlayer] = iPlayer;
} else {
_pGame->gm_iSinglePlayer = iPlayer;
}
gm_mgNameField.mg_pstrToChange = &pc.pc_strName;
gm_mgNameField.SetText(*gm_mgNameField.mg_pstrToChange);
gm_mgTeam.mg_pstrToChange = &pc.pc_strTeam;
gm_mgTeam.SetText(*gm_mgTeam.mg_pstrToChange);
CPlayerSettings *pps = (CPlayerSettings *)pc.pc_aubAppearance;
gm_mgCrosshair.mg_iSelected = pps->ps_iCrossHairType + 1;
gm_mgCrosshair.ApplyCurrentSelection();
gm_mgWeaponSelect.mg_iSelected = pps->ps_iWeaponAutoSelect;
gm_mgWeaponSelect.ApplyCurrentSelection();
gm_mgWeaponHide.mg_iSelected = (pps->ps_ulFlags&PSF_HIDEWEAPON) ? 1 : 0;
gm_mgWeaponHide.ApplyCurrentSelection();
gm_mg3rdPerson.mg_iSelected = (pps->ps_ulFlags&PSF_PREFER3RDPERSON) ? 1 : 0;
gm_mg3rdPerson.ApplyCurrentSelection();
gm_mgQuotes.mg_iSelected = (pps->ps_ulFlags&PSF_NOQUOTES) ? 0 : 1;
gm_mgQuotes.ApplyCurrentSelection();
gm_mgAutoSave.mg_iSelected = (pps->ps_ulFlags&PSF_AUTOSAVE) ? 1 : 0;
gm_mgAutoSave.ApplyCurrentSelection();
gm_mgCompDoubleClick.mg_iSelected = (pps->ps_ulFlags&PSF_COMPSINGLECLICK) ? 0 : 1;
gm_mgCompDoubleClick.ApplyCurrentSelection();
gm_mgViewBobbing.mg_iSelected = (pps->ps_ulFlags&PSF_NOBOBBING) ? 0 : 1;
gm_mgViewBobbing.ApplyCurrentSelection();
gm_mgSharpTurning.mg_iSelected = (pps->ps_ulFlags&PSF_SHARPTURNING) ? 1 : 0;
gm_mgSharpTurning.ApplyCurrentSelection();
// get function that will set player appearance
CShellSymbol *pss = _pShell->GetSymbol("SetPlayerAppearance", /*bDeclaredOnly=*/ TRUE);
// if none
if (pss == NULL) {
// no model
gm_mgModel.mg_moModel.SetData(NULL);
// if there is some
} else {
// set the model
BOOL(*pFunc)(CModelObject *, CPlayerCharacter *, CTString &, BOOL) =
(BOOL(*)(CModelObject *, CPlayerCharacter *, CTString &, BOOL))pss->ss_pvValue;
CTString strName;
BOOL bSet;
if (_gmRunningGameMode != GM_SINGLE_PLAYER && !_bPlayerMenuFromSinglePlayer) {
bSet = pFunc(&gm_mgModel.mg_moModel, &pc, strName, TRUE);
gm_mgModel.mg_strTip = TRANS("change model for this player");
gm_mgModel.mg_bEnabled = TRUE;
}
else {
// cannot change player appearance in single player mode
bSet = pFunc(&gm_mgModel.mg_moModel, NULL, strName, TRUE);
gm_mgModel.mg_strTip = TRANS("cannot change model for single-player game");
gm_mgModel.mg_bEnabled = FALSE;
}
// ignore gender flags, if any
strName.RemovePrefix("#female#");
strName.RemovePrefix("#male#");
gm_mgModel.mg_plModel = CPlacement3D(FLOAT3D(0.1f, -1.0f, -3.5f), ANGLE3D(150, 0, 0));
gm_mgModel.mg_strText = strName;
CPlayerSettings *pps = (CPlayerSettings *)pc.pc_aubAppearance;
_strLastPlayerAppearance = pps->GetModelFilename();
try {
gm_mgModel.mg_moFloor.SetData_t(CTFILENAME("Models\\Computer\\Floor.mdl"));
gm_mgModel.mg_moFloor.mo_toTexture.SetData_t(CTFILENAME("Models\\Computer\\Floor.tex"));
}
catch (char *strError) {
(void)strError;
}
}
}
void CPlayerProfileMenu::StartMenu(void)
{
_pGUIM->gmPlayerProfile.gm_pmgSelectedByDefault = &gm_mgNameField;
if (_gmRunningGameMode == GM_NONE || _gmRunningGameMode == GM_DEMO) {
for (INDEX i = 0; i<8; i++) {
gm_mgNumber[i].mg_bEnabled = TRUE;
}
} else {
for (INDEX i = 0; i<8; i++) {
gm_mgNumber[i].mg_bEnabled = FALSE;
}
INDEX iFirstEnabled = 0;
{for (INDEX ilp = 0; ilp<4; ilp++) {
CLocalPlayer &lp = _pGame->gm_lpLocalPlayers[ilp];
if (lp.lp_bActive) {
gm_mgNumber[lp.lp_iPlayer].mg_bEnabled = TRUE;
if (iFirstEnabled == 0) {
iFirstEnabled = lp.lp_iPlayer;
}
}
}}
// backup to first player in case current player is disabled
if (!gm_mgNumber[*gm_piCurrentPlayer].mg_bEnabled) *gm_piCurrentPlayer = iFirstEnabled;
}
// done
SelectPlayer(*gm_piCurrentPlayer);
CGameMenu::StartMenu();
}
void CPlayerProfileMenu::EndMenu(void)
{
_pGame->SavePlayersAndControls();
CGameMenu::EndMenu();
}

View File

@ -0,0 +1,61 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_PLAYERPROFILE_H
#define SE_INCL_GAME_MENU_PLAYERPROFILE_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGEdit.h"
#include "GUI/Components/MGModel.h"
#include "GUI/Components/MGTitle.h"
#include "GUI/Components/MGTrigger.h"
class CPlayerProfileMenu : public CGameMenu {
public:
INDEX *gm_piCurrentPlayer;
CMGTitle gm_mgProfileTitle;
CMGButton gm_mgNoLabel;
CMGButton gm_mgNumber[8];
CMGButton gm_mgNameLabel;
CMGEdit gm_mgNameField;
CMGButton gm_mgTeamLabel;
CMGEdit gm_mgTeam;
CMGButton gm_mgCustomizeControls;
CMGTrigger gm_mgCrosshair;
CMGTrigger gm_mgWeaponSelect;
CMGTrigger gm_mgWeaponHide;
CMGTrigger gm_mg3rdPerson;
CMGTrigger gm_mgQuotes;
CMGTrigger gm_mgAutoSave;
CMGTrigger gm_mgCompDoubleClick;
CMGTrigger gm_mgViewBobbing;
CMGTrigger gm_mgSharpTurning;
CMGModel gm_mgModel;
void Initialize_t(void);
INDEX ComboFromPlayer(INDEX iPlayer);
INDEX PlayerFromCombo(INDEX iCombo);
void SelectPlayer(INDEX iPlayer);
void ApplyComboPlayer(INDEX iPlayer);
void StartMenu(void);
void EndMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,30 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_RENDERINGOPTIONS_H
#define SE_INCL_GAME_MENU_RENDERINGOPTIONS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
class CRenderingOptionsMenu : public CGameMenu {
public:
void StartMenu(void);
void EndMenu(void);
void Initialize_t(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,117 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MSelectPlayers.h"
#define ADD_GADGET( gd, box, up, dn, lf, rt, txt) \
gd.mg_boxOnScreen = box; \
gd.mg_pmgUp = up; \
gd.mg_pmgDown = dn; \
gd.mg_pmgLeft = lf; \
gd.mg_pmgRight = rt; \
gd.mg_strText = txt; \
gm_lhGadgets.AddTail(gd.mg_lnNode);
extern CTString astrNoYes[2];
extern CTString astrSplitScreenRadioTexts[4];
extern void SelectPlayersFillMenu(void);
extern void SelectPlayersApplyMenu(void);
void CSelectPlayersMenu::Initialize_t(void)
{
// intialize split screen menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("SELECT PLAYERS");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
TRIGGER_MG(gm_mgDedicated, 0, gm_mgStart, gm_mgObserver, TRANS("Dedicated:"), astrNoYes);
gm_mgDedicated.mg_strTip = TRANS("select to start dedicated server");
gm_mgDedicated.mg_pOnTriggerChange = NULL;
TRIGGER_MG(gm_mgObserver, 1, gm_mgDedicated, gm_mgSplitScreenCfg, TRANS("Observer:"), astrNoYes);
gm_mgObserver.mg_strTip = TRANS("select to join in for observing, not for playing");
gm_mgObserver.mg_pOnTriggerChange = NULL;
// split screen config trigger
TRIGGER_MG(gm_mgSplitScreenCfg, 2, gm_mgObserver, gm_mgPlayer0Change, TRANS("Number of players:"), astrSplitScreenRadioTexts);
gm_mgSplitScreenCfg.mg_strTip = TRANS("choose more than one player to play in split screen");
gm_mgSplitScreenCfg.mg_pOnTriggerChange = NULL;
gm_mgPlayer0Change.mg_iCenterI = -1;
gm_mgPlayer1Change.mg_iCenterI = -1;
gm_mgPlayer2Change.mg_iCenterI = -1;
gm_mgPlayer3Change.mg_iCenterI = -1;
gm_mgPlayer0Change.mg_boxOnScreen = BoxMediumMiddle(4);
gm_mgPlayer1Change.mg_boxOnScreen = BoxMediumMiddle(5);
gm_mgPlayer2Change.mg_boxOnScreen = BoxMediumMiddle(6);
gm_mgPlayer3Change.mg_boxOnScreen = BoxMediumMiddle(7);
gm_mgPlayer0Change.mg_strTip =
gm_mgPlayer1Change.mg_strTip =
gm_mgPlayer2Change.mg_strTip =
gm_mgPlayer3Change.mg_strTip = TRANS("select profile for this player");
gm_lhGadgets.AddTail(gm_mgPlayer0Change.mg_lnNode);
gm_lhGadgets.AddTail(gm_mgPlayer1Change.mg_lnNode);
gm_lhGadgets.AddTail(gm_mgPlayer2Change.mg_lnNode);
gm_lhGadgets.AddTail(gm_mgPlayer3Change.mg_lnNode);
gm_mgNotes.mg_boxOnScreen = BoxMediumRow(9.0);
gm_mgNotes.mg_bfsFontSize = BFS_MEDIUM;
gm_mgNotes.mg_iCenterI = -1;
gm_mgNotes.mg_bEnabled = FALSE;
gm_mgNotes.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgNotes.mg_lnNode);
gm_mgNotes.mg_strText = "";
/* // options button
mgSplitOptions.mg_strText = TRANS("Game options");
mgSplitOptions.mg_boxOnScreen = BoxMediumRow(3);
mgSplitOptions.mg_bfsFontSize = BFS_MEDIUM;
mgSplitOptions.mg_iCenterI = 0;
mgSplitOptions.mg_pmgUp = &mgSplitLevel;
mgSplitOptions.mg_pmgDown = &mgSplitStartStart;
mgSplitOptions.mg_strTip = TRANS("adjust game rules");
mgSplitOptions.mg_pActivatedFunction = &StartGameOptionsFromSplitScreen;
gm_lhGadgets.AddTail( mgSplitOptions.mg_lnNode);*/
/* // start button
mgSplitStartStart.mg_bfsFontSize = BFS_LARGE;
mgSplitStartStart.mg_boxOnScreen = BoxBigRow(4);
mgSplitStartStart.mg_pmgUp = &mgSplitOptions;
mgSplitStartStart.mg_pmgDown = &mgSplitGameType;
mgSplitStartStart.mg_strText = TRANS("START");
gm_lhGadgets.AddTail( mgSplitStartStart.mg_lnNode);
mgSplitStartStart.mg_pActivatedFunction = &StartSelectPlayersMenuFromSplit;
*/
ADD_GADGET(gm_mgStart, BoxMediumRow(11), &gm_mgSplitScreenCfg, &gm_mgPlayer0Change, NULL, NULL, TRANS("START"));
gm_mgStart.mg_bfsFontSize = BFS_LARGE;
gm_mgStart.mg_iCenterI = 0;
}
void CSelectPlayersMenu::StartMenu(void)
{
CGameMenu::StartMenu();
SelectPlayersFillMenu();
SelectPlayersApplyMenu();
}
void CSelectPlayersMenu::EndMenu(void)
{
SelectPlayersApplyMenu();
CGameMenu::EndMenu();
}

View File

@ -0,0 +1,53 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_SELECTPLAYERS_H
#define SE_INCL_GAME_MENU_SELECTPLAYERS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGChangePlayer.h"
#include "GUI/Components/MGTitle.h"
#include "GUI/Components/MGTrigger.h"
class CSelectPlayersMenu : public CGameMenu {
public:
BOOL gm_bAllowDedicated;
BOOL gm_bAllowObserving;
CMGTitle gm_mgTitle;
CMGTrigger gm_mgDedicated;
CMGTrigger gm_mgObserver;
CMGTrigger gm_mgSplitScreenCfg;
CMGChangePlayer gm_mgPlayer0Change;
CMGChangePlayer gm_mgPlayer1Change;
CMGChangePlayer gm_mgPlayer2Change;
CMGChangePlayer gm_mgPlayer3Change;
CMGButton gm_mgNotes;
CMGButton gm_mgStart;
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,109 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MServers.h"
CTString _strServerFilter[7];
CMGButton mgServerColumn[7];
CMGEdit mgServerFilter[7];
void CServersMenu::Initialize_t(void)
{
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("CHOOSE SERVER");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgList.mg_boxOnScreen = FLOATaabbox2D(FLOAT2D(0, 0), FLOAT2D(1, 1));
gm_mgList.mg_pmgLeft = &gm_mgList; // make sure it can get focus
gm_mgList.mg_bEnabled = TRUE;
gm_lhGadgets.AddTail(gm_mgList.mg_lnNode);
ASSERT(ARRAYCOUNT(mgServerColumn) == ARRAYCOUNT(mgServerFilter));
for (INDEX i = 0; i<ARRAYCOUNT(mgServerFilter); i++) {
mgServerColumn[i].mg_strText = "";
mgServerColumn[i].mg_boxOnScreen = BoxPlayerEdit(5.0);
mgServerColumn[i].mg_bfsFontSize = BFS_SMALL;
mgServerColumn[i].mg_iCenterI = -1;
mgServerColumn[i].mg_pmgUp = &gm_mgList;
mgServerColumn[i].mg_pmgDown = &mgServerFilter[i];
gm_lhGadgets.AddTail(mgServerColumn[i].mg_lnNode);
mgServerFilter[i].mg_ctMaxStringLen = 25;
mgServerFilter[i].mg_boxOnScreen = BoxPlayerEdit(5.0);
mgServerFilter[i].mg_bfsFontSize = BFS_SMALL;
mgServerFilter[i].mg_iCenterI = -1;
mgServerFilter[i].mg_pmgUp = &mgServerColumn[i];
mgServerFilter[i].mg_pmgDown = &gm_mgList;
gm_lhGadgets.AddTail(mgServerFilter[i].mg_lnNode);
mgServerFilter[i].mg_pstrToChange = &_strServerFilter[i];
mgServerFilter[i].SetText(*mgServerFilter[i].mg_pstrToChange);
}
gm_mgRefresh.mg_strText = TRANS("REFRESH");
gm_mgRefresh.mg_boxOnScreen = BoxLeftColumn(15.0);
gm_mgRefresh.mg_bfsFontSize = BFS_SMALL;
gm_mgRefresh.mg_iCenterI = -1;
gm_mgRefresh.mg_pmgDown = &gm_mgList;
gm_mgRefresh.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgRefresh.mg_lnNode);
CTString astrColumns[7];
mgServerColumn[0].mg_strText = TRANS("Server");
mgServerColumn[1].mg_strText = TRANS("Map");
mgServerColumn[2].mg_strText = TRANS("Ping");
mgServerColumn[3].mg_strText = TRANS("Players");
mgServerColumn[4].mg_strText = TRANS("Game");
mgServerColumn[5].mg_strText = TRANS("Mod");
mgServerColumn[6].mg_strText = TRANS("Ver");
mgServerColumn[0].mg_pActivatedFunction = NULL;
mgServerColumn[1].mg_pActivatedFunction = NULL;
mgServerColumn[2].mg_pActivatedFunction = NULL;
mgServerColumn[3].mg_pActivatedFunction = NULL;
mgServerColumn[4].mg_pActivatedFunction = NULL;
mgServerColumn[5].mg_pActivatedFunction = NULL;
mgServerColumn[6].mg_pActivatedFunction = NULL;
mgServerColumn[0].mg_strTip = TRANS("sort by server");
mgServerColumn[1].mg_strTip = TRANS("sort by map");
mgServerColumn[2].mg_strTip = TRANS("sort by ping");
mgServerColumn[3].mg_strTip = TRANS("sort by players");
mgServerColumn[4].mg_strTip = TRANS("sort by game");
mgServerColumn[5].mg_strTip = TRANS("sort by mod");
mgServerColumn[6].mg_strTip = TRANS("sort by version");
mgServerFilter[0].mg_strTip = TRANS("filter by server");
mgServerFilter[1].mg_strTip = TRANS("filter by map");
mgServerFilter[2].mg_strTip = TRANS("filter by ping (ie. <200)");
mgServerFilter[3].mg_strTip = TRANS("filter by players (ie. >=2)");
mgServerFilter[4].mg_strTip = TRANS("filter by game (ie. coop)");
mgServerFilter[5].mg_strTip = TRANS("filter by mod");
mgServerFilter[6].mg_strTip = TRANS("filter by version");
}
void CServersMenu::StartMenu(void)
{
extern void RefreshServerList(void);
RefreshServerList();
CGameMenu::StartMenu();
}
void CServersMenu::Think(void)
{
if (!_pNetwork->ga_bEnumerationChange) {
return;
}
_pNetwork->ga_bEnumerationChange = FALSE;
}

View File

@ -0,0 +1,41 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_SERVERS_H
#define SE_INCL_GAME_MENU_SERVERS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGEdit.h"
#include "GUI/Components/MGServerList.h"
#include "GUI/Components/MGTitle.h"
class CServersMenu : public CGameMenu {
public:
BOOL m_bInternet;
CMGTitle gm_mgTitle;
CMGServerList gm_mgList;
CMGButton gm_mgRefresh;
void Initialize_t(void);
void StartMenu(void);
void Think(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,155 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MSinglePlayer.h"
void CSinglePlayerMenu::Initialize_t(void)
{
// intialize single player menu
gm_mgTitle.mg_strText = TRANS("SINGLE PLAYER");
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgPlayerLabel.mg_boxOnScreen = BoxBigRow(-1.0f);
gm_mgPlayerLabel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgPlayerLabel.mg_iCenterI = -1;
gm_mgPlayerLabel.mg_bEnabled = FALSE;
gm_mgPlayerLabel.mg_bLabel = TRUE;
gm_lhGadgets.AddTail(gm_mgPlayerLabel.mg_lnNode);
gm_mgNewGame.mg_strText = TRANS("NEW GAME");
gm_mgNewGame.mg_bfsFontSize = BFS_LARGE;
gm_mgNewGame.mg_boxOnScreen = BoxBigRow(0.0f);
gm_mgNewGame.mg_strTip = TRANS("start new game with current player");
gm_lhGadgets.AddTail(gm_mgNewGame.mg_lnNode);
gm_mgNewGame.mg_pmgUp = &gm_mgOptions;
gm_mgNewGame.mg_pmgDown = &gm_mgCustom;
gm_mgNewGame.mg_pActivatedFunction = NULL;
gm_mgCustom.mg_strText = TRANS("CUSTOM LEVEL");
gm_mgCustom.mg_bfsFontSize = BFS_LARGE;
gm_mgCustom.mg_boxOnScreen = BoxBigRow(1.0f);
gm_mgCustom.mg_strTip = TRANS("start new game on a custom level");
gm_lhGadgets.AddTail(gm_mgCustom.mg_lnNode);
gm_mgCustom.mg_pmgUp = &gm_mgNewGame;
gm_mgCustom.mg_pmgDown = &gm_mgQuickLoad;
gm_mgCustom.mg_pActivatedFunction = NULL;
gm_mgQuickLoad.mg_strText = TRANS("QUICK LOAD");
gm_mgQuickLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgQuickLoad.mg_boxOnScreen = BoxBigRow(2.0f);
gm_mgQuickLoad.mg_strTip = TRANS("load a quick-saved game (F9)");
gm_lhGadgets.AddTail(gm_mgQuickLoad.mg_lnNode);
gm_mgQuickLoad.mg_pmgUp = &gm_mgCustom;
gm_mgQuickLoad.mg_pmgDown = &gm_mgLoad;
gm_mgQuickLoad.mg_pActivatedFunction = NULL;
gm_mgLoad.mg_strText = TRANS("LOAD");
gm_mgLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgLoad.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgLoad.mg_strTip = TRANS("load a saved game of current player");
gm_lhGadgets.AddTail(gm_mgLoad.mg_lnNode);
gm_mgLoad.mg_pmgUp = &gm_mgQuickLoad;
gm_mgLoad.mg_pmgDown = &gm_mgTraining;
gm_mgLoad.mg_pActivatedFunction = NULL;
gm_mgTraining.mg_strText = TRANS("TRAINING");
gm_mgTraining.mg_bfsFontSize = BFS_LARGE;
gm_mgTraining.mg_boxOnScreen = BoxBigRow(4.0f);
gm_mgTraining.mg_strTip = TRANS("start training level - KarnakDemo");
gm_lhGadgets.AddTail(gm_mgTraining.mg_lnNode);
gm_mgTraining.mg_pmgUp = &gm_mgLoad;
gm_mgTraining.mg_pmgDown = &gm_mgTechTest;
gm_mgTraining.mg_pActivatedFunction = NULL;
gm_mgTechTest.mg_strText = TRANS("TECHNOLOGY TEST");
gm_mgTechTest.mg_bfsFontSize = BFS_LARGE;
gm_mgTechTest.mg_boxOnScreen = BoxBigRow(5.0f);
gm_mgTechTest.mg_strTip = TRANS("start technology testing level");
gm_lhGadgets.AddTail(gm_mgTechTest.mg_lnNode);
gm_mgTechTest.mg_pmgUp = &gm_mgTraining;
gm_mgTechTest.mg_pmgDown = &gm_mgPlayersAndControls;
gm_mgTechTest.mg_pActivatedFunction = NULL;
gm_mgPlayersAndControls.mg_bfsFontSize = BFS_LARGE;
gm_mgPlayersAndControls.mg_boxOnScreen = BoxBigRow(6.0f);
gm_mgPlayersAndControls.mg_pmgUp = &gm_mgTechTest;
gm_mgPlayersAndControls.mg_pmgDown = &gm_mgOptions;
gm_mgPlayersAndControls.mg_strText = TRANS("PLAYERS AND CONTROLS");
gm_mgPlayersAndControls.mg_strTip = TRANS("change currently active player or adjust controls");
gm_lhGadgets.AddTail(gm_mgPlayersAndControls.mg_lnNode);
gm_mgPlayersAndControls.mg_pActivatedFunction = NULL;
gm_mgOptions.mg_strText = TRANS("GAME OPTIONS");
gm_mgOptions.mg_bfsFontSize = BFS_LARGE;
gm_mgOptions.mg_boxOnScreen = BoxBigRow(7.0f);
gm_mgOptions.mg_strTip = TRANS("adjust miscellaneous game options");
gm_lhGadgets.AddTail(gm_mgOptions.mg_lnNode);
gm_mgOptions.mg_pmgUp = &gm_mgPlayersAndControls;
gm_mgOptions.mg_pmgDown = &gm_mgNewGame;
gm_mgOptions.mg_pActivatedFunction = NULL;
}
void CSinglePlayerMenu::StartMenu(void)
{
gm_mgTraining.mg_bEnabled = IsMenuEnabled("Training");
gm_mgTechTest.mg_bEnabled = IsMenuEnabled("Technology Test");
if (gm_mgTraining.mg_bEnabled) {
if (!gm_mgTraining.mg_lnNode.IsLinked()) {
gm_lhGadgets.AddTail(gm_mgTraining.mg_lnNode);
}
gm_mgLoad.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgLoad.mg_pmgUp = &gm_mgQuickLoad;
gm_mgLoad.mg_pmgDown = &gm_mgTraining;
gm_mgTraining.mg_boxOnScreen = BoxBigRow(4.0f);
gm_mgTraining.mg_pmgUp = &gm_mgLoad;
gm_mgTraining.mg_pmgDown = &gm_mgTechTest;
gm_mgTechTest.mg_boxOnScreen = BoxBigRow(5.0f);
gm_mgTechTest.mg_pmgUp = &gm_mgTraining;
gm_mgTechTest.mg_pmgDown = &gm_mgPlayersAndControls;
gm_mgPlayersAndControls.mg_boxOnScreen = BoxBigRow(6.0f);
gm_mgOptions.mg_boxOnScreen = BoxBigRow(7.0f);
} else {
if (gm_mgTraining.mg_lnNode.IsLinked()) {
gm_mgTraining.mg_lnNode.Remove();
}
gm_mgLoad.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgLoad.mg_pmgUp = &gm_mgQuickLoad;
gm_mgLoad.mg_pmgDown = &gm_mgTechTest;
gm_mgTechTest.mg_boxOnScreen = BoxBigRow(4.0f);
gm_mgTechTest.mg_pmgUp = &gm_mgLoad;
gm_mgTechTest.mg_pmgDown = &gm_mgPlayersAndControls;
gm_mgPlayersAndControls.mg_boxOnScreen = BoxBigRow(5.0f);
gm_mgOptions.mg_boxOnScreen = BoxBigRow(6.0f);
}
CGameMenu::StartMenu();
CPlayerCharacter &pc = _pGame->gm_apcPlayers[_pGame->gm_iSinglePlayer];
gm_mgPlayerLabel.mg_strText.PrintF(TRANS("Player: %s\n"), pc.GetNameForPrinting());
}

View File

@ -0,0 +1,43 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_SINGLEPLAYER_H
#define SE_INCL_GAME_MENU_SINGLEPLAYER_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class CSinglePlayerMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgPlayerLabel;
CMGButton gm_mgNewGame;
CMGButton gm_mgCustom;
CMGButton gm_mgQuickLoad;
CMGButton gm_mgLoad;
CMGButton gm_mgTraining;
CMGButton gm_mgTechTest;
CMGButton gm_mgPlayersAndControls;
CMGButton gm_mgOptions;
void Initialize_t(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,99 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MSinglePlayerNew.h"
void CSinglePlayerNewMenu::Initialize_t(void)
{
// intialize single player new menu
gm_mgTitle.mg_strText = TRANS("NEW GAME");
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgTourist.mg_strText = TRANS("TOURIST");
gm_mgTourist.mg_bfsFontSize = BFS_LARGE;
gm_mgTourist.mg_boxOnScreen = BoxBigRow(0.0f);
gm_mgTourist.mg_strTip = TRANS("for non-FPS players");
gm_lhGadgets.AddTail(gm_mgTourist.mg_lnNode);
gm_mgTourist.mg_pmgUp = &gm_mgSerious;
gm_mgTourist.mg_pmgDown = &gm_mgEasy;
gm_mgTourist.mg_pActivatedFunction = NULL;
gm_mgEasy.mg_strText = TRANS("EASY");
gm_mgEasy.mg_bfsFontSize = BFS_LARGE;
gm_mgEasy.mg_boxOnScreen = BoxBigRow(1.0f);
gm_mgEasy.mg_strTip = TRANS("for unexperienced FPS players");
gm_lhGadgets.AddTail(gm_mgEasy.mg_lnNode);
gm_mgEasy.mg_pmgUp = &gm_mgTourist;
gm_mgEasy.mg_pmgDown = &gm_mgMedium;
gm_mgEasy.mg_pActivatedFunction = NULL;
gm_mgMedium.mg_strText = TRANS("NORMAL");
gm_mgMedium.mg_bfsFontSize = BFS_LARGE;
gm_mgMedium.mg_boxOnScreen = BoxBigRow(2.0f);
gm_mgMedium.mg_strTip = TRANS("for experienced FPS players");
gm_lhGadgets.AddTail(gm_mgMedium.mg_lnNode);
gm_mgMedium.mg_pmgUp = &gm_mgEasy;
gm_mgMedium.mg_pmgDown = &gm_mgHard;
gm_mgMedium.mg_pActivatedFunction = NULL;
gm_mgHard.mg_strText = TRANS("HARD");
gm_mgHard.mg_bfsFontSize = BFS_LARGE;
gm_mgHard.mg_boxOnScreen = BoxBigRow(3.0f);
gm_mgHard.mg_strTip = TRANS("for experienced Serious Sam players");
gm_lhGadgets.AddTail(gm_mgHard.mg_lnNode);
gm_mgHard.mg_pmgUp = &gm_mgMedium;
gm_mgHard.mg_pmgDown = &gm_mgSerious;
gm_mgHard.mg_pActivatedFunction = NULL;
gm_mgSerious.mg_strText = TRANS("SERIOUS");
gm_mgSerious.mg_bfsFontSize = BFS_LARGE;
gm_mgSerious.mg_boxOnScreen = BoxBigRow(4.0f);
gm_mgSerious.mg_strTip = TRANS("are you serious?");
gm_lhGadgets.AddTail(gm_mgSerious.mg_lnNode);
gm_mgSerious.mg_pmgUp = &gm_mgHard;
gm_mgSerious.mg_pmgDown = &gm_mgTourist;
gm_mgSerious.mg_pActivatedFunction = NULL;
gm_mgMental.mg_strText = TRANS("MENTAL");
gm_mgMental.mg_bfsFontSize = BFS_LARGE;
gm_mgMental.mg_boxOnScreen = BoxBigRow(5.0f);
gm_mgMental.mg_strTip = TRANS("you are not serious!");
gm_lhGadgets.AddTail(gm_mgMental.mg_lnNode);
gm_mgMental.mg_pmgUp = &gm_mgSerious;
gm_mgMental.mg_pmgDown = &gm_mgTourist;
gm_mgMental.mg_pActivatedFunction = NULL;
gm_mgMental.mg_bMental = TRUE;
}
void CSinglePlayerNewMenu::StartMenu(void)
{
CGameMenu::StartMenu();
extern INDEX sam_bMentalActivated;
if (sam_bMentalActivated) {
gm_mgMental.Appear();
gm_mgSerious.mg_pmgDown = &gm_mgMental;
gm_mgTourist.mg_pmgUp = &gm_mgMental;
} else {
gm_mgMental.Disappear();
gm_mgSerious.mg_pmgDown = &gm_mgTourist;
gm_mgTourist.mg_pmgUp = &gm_mgSerious;
}
}

View File

@ -0,0 +1,40 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_SINGLEPLAYERNEW_H
#define SE_INCL_GAME_MENU_SINGLEPLAYERNEW_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class CSinglePlayerNewMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgTourist;
CMGButton gm_mgEasy;
CMGButton gm_mgMedium;
CMGButton gm_mgHard;
CMGButton gm_mgSerious;
CMGButton gm_mgMental;
void Initialize_t(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,59 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MSplitScreen.h"
void CSplitScreenMenu::Initialize_t(void)
{
// intialize split screen menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("SPLIT SCREEN");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
gm_mgStart.mg_bfsFontSize = BFS_LARGE;
gm_mgStart.mg_boxOnScreen = BoxBigRow(0);
gm_mgStart.mg_pmgUp = &gm_mgLoad;
gm_mgStart.mg_pmgDown = &gm_mgQuickLoad;
gm_mgStart.mg_strText = TRANS("NEW GAME");
gm_mgStart.mg_strTip = TRANS("start new split-screen game");
gm_lhGadgets.AddTail(gm_mgStart.mg_lnNode);
gm_mgStart.mg_pActivatedFunction = NULL;
gm_mgQuickLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgQuickLoad.mg_boxOnScreen = BoxBigRow(1);
gm_mgQuickLoad.mg_pmgUp = &gm_mgStart;
gm_mgQuickLoad.mg_pmgDown = &gm_mgLoad;
gm_mgQuickLoad.mg_strText = TRANS("QUICK LOAD");
gm_mgQuickLoad.mg_strTip = TRANS("load a quick-saved game (F9)");
gm_lhGadgets.AddTail(gm_mgQuickLoad.mg_lnNode);
gm_mgQuickLoad.mg_pActivatedFunction = NULL;
gm_mgLoad.mg_bfsFontSize = BFS_LARGE;
gm_mgLoad.mg_boxOnScreen = BoxBigRow(2);
gm_mgLoad.mg_pmgUp = &gm_mgQuickLoad;
gm_mgLoad.mg_pmgDown = &gm_mgStart;
gm_mgLoad.mg_strText = TRANS("LOAD");
gm_mgLoad.mg_strTip = TRANS("load a saved split-screen game");
gm_lhGadgets.AddTail(gm_mgLoad.mg_lnNode);
gm_mgLoad.mg_pActivatedFunction = NULL;
}
void CSplitScreenMenu::StartMenu(void)
{
CGameMenu::StartMenu();
}

View File

@ -0,0 +1,37 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_SPLITSCREEN_H
#define SE_INCL_GAME_MENU_SPLITSCREEN_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
class CSplitScreenMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGButton gm_mgStart;
CMGButton gm_mgQuickLoad;
CMGButton gm_mgLoad;
void Initialize_t(void);
void StartMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,100 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "LevelInfo.h"
#include "MenuStuff.h"
#include "MSplitStart.h"
extern void UpdateSplitLevel(INDEX iDummy);
void CSplitStartMenu::Initialize_t(void)
{
// intialize split screen menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("START SPLIT SCREEN");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
// game type trigger
TRIGGER_MG(gm_mgGameType, 0,
gm_mgStart, gm_mgDifficulty, TRANS("Game type:"), astrGameTypeRadioTexts);
gm_mgGameType.mg_ctTexts = ctGameTypeRadioTexts;
gm_mgGameType.mg_strTip = TRANS("choose type of multiplayer game");
gm_mgGameType.mg_pOnTriggerChange = &UpdateSplitLevel;
// difficulty trigger
TRIGGER_MG(gm_mgDifficulty, 1,
gm_mgGameType, gm_mgLevel, TRANS("Difficulty:"), astrDifficultyRadioTexts);
gm_mgDifficulty.mg_strTip = TRANS("choose difficulty level");
// level name
gm_mgLevel.mg_strText = "";
gm_mgLevel.mg_strLabel = TRANS("Level:");
gm_mgLevel.mg_boxOnScreen = BoxMediumRow(2);
gm_mgLevel.mg_bfsFontSize = BFS_MEDIUM;
gm_mgLevel.mg_iCenterI = -1;
gm_mgLevel.mg_pmgUp = &gm_mgDifficulty;
gm_mgLevel.mg_pmgDown = &gm_mgOptions;
gm_mgLevel.mg_strTip = TRANS("choose the level to start");
gm_mgLevel.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgLevel.mg_lnNode);
// options button
gm_mgOptions.mg_strText = TRANS("Game options");
gm_mgOptions.mg_boxOnScreen = BoxMediumRow(3);
gm_mgOptions.mg_bfsFontSize = BFS_MEDIUM;
gm_mgOptions.mg_iCenterI = 0;
gm_mgOptions.mg_pmgUp = &gm_mgLevel;
gm_mgOptions.mg_pmgDown = &gm_mgStart;
gm_mgOptions.mg_strTip = TRANS("adjust game rules");
gm_mgOptions.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgOptions.mg_lnNode);
// start button
gm_mgStart.mg_bfsFontSize = BFS_LARGE;
gm_mgStart.mg_boxOnScreen = BoxBigRow(4);
gm_mgStart.mg_pmgUp = &gm_mgOptions;
gm_mgStart.mg_pmgDown = &gm_mgGameType;
gm_mgStart.mg_strText = TRANS("START");
gm_lhGadgets.AddTail(gm_mgStart.mg_lnNode);
gm_mgStart.mg_pActivatedFunction = NULL;
}
void CSplitStartMenu::StartMenu(void)
{
extern INDEX sam_bMentalActivated;
gm_mgDifficulty.mg_ctTexts = sam_bMentalActivated ? 6 : 5;
gm_mgGameType.mg_iSelected = Clamp(_pShell->GetINDEX("gam_iStartMode"), 0L, ctGameTypeRadioTexts - 1L);
gm_mgGameType.ApplyCurrentSelection();
gm_mgDifficulty.mg_iSelected = _pShell->GetINDEX("gam_iStartDifficulty") + 1;
gm_mgDifficulty.ApplyCurrentSelection();
// clamp maximum number of players to at least 4
_pShell->SetINDEX("gam_ctMaxPlayers", ClampDn(_pShell->GetINDEX("gam_ctMaxPlayers"), 4L));
UpdateSplitLevel(0);
CGameMenu::StartMenu();
}
void CSplitStartMenu::EndMenu(void)
{
_pShell->SetINDEX("gam_iStartDifficulty", gm_mgDifficulty.mg_iSelected - 1);
_pShell->SetINDEX("gam_iStartMode", gm_mgGameType.mg_iSelected);
CGameMenu::EndMenu();
}

View File

@ -0,0 +1,41 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_SPLITSTART_H
#define SE_INCL_GAME_MENU_SPLITSTART_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
#include "GUI/Components/MGTrigger.h"
class CSplitStartMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGTrigger gm_mgGameType;
CMGTrigger gm_mgDifficulty;
CMGButton gm_mgLevel;
CMGButton gm_mgOptions;
CMGButton gm_mgStart;
void Initialize_t(void);
void StartMenu(void);
void EndMenu(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,133 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "VarList.h"
#include "MVar.h"
extern BOOL _bVarChanged;
void CVarMenu::Initialize_t(void)
{
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = "";
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
for (INDEX iLabel = 0; iLabel<VARS_ON_SCREEN; iLabel++)
{
INDEX iPrev = (VARS_ON_SCREEN + iLabel - 1) % VARS_ON_SCREEN;
INDEX iNext = (iLabel + 1) % VARS_ON_SCREEN;
// initialize label gadgets
gm_mgVar[iLabel].mg_pmgUp = &gm_mgVar[iPrev];
gm_mgVar[iLabel].mg_pmgDown = &gm_mgVar[iNext];
gm_mgVar[iLabel].mg_pmgLeft = &gm_mgApply;
gm_mgVar[iLabel].mg_boxOnScreen = BoxMediumRow(iLabel);
gm_mgVar[iLabel].mg_pActivatedFunction = NULL; // never called!
gm_lhGadgets.AddTail(gm_mgVar[iLabel].mg_lnNode);
}
gm_mgApply.mg_boxOnScreen = BoxMediumRow(16.5f);
gm_mgApply.mg_bfsFontSize = BFS_LARGE;
gm_mgApply.mg_iCenterI = 1;
gm_mgApply.mg_pmgLeft =
gm_mgApply.mg_pmgRight =
gm_mgApply.mg_pmgUp =
gm_mgApply.mg_pmgDown = &gm_mgVar[0];
gm_mgApply.mg_strText = TRANS("APPLY");
gm_mgApply.mg_strTip = TRANS("apply changes");
gm_lhGadgets.AddTail(gm_mgApply.mg_lnNode);
gm_mgApply.mg_pActivatedFunction = NULL;
gm_lhGadgets.AddTail(gm_mgArrowUp.mg_lnNode);
gm_lhGadgets.AddTail(gm_mgArrowDn.mg_lnNode);
gm_mgArrowUp.mg_adDirection = AD_UP;
gm_mgArrowDn.mg_adDirection = AD_DOWN;
gm_mgArrowUp.mg_boxOnScreen = BoxArrow(AD_UP);
gm_mgArrowDn.mg_boxOnScreen = BoxArrow(AD_DOWN);
gm_mgArrowUp.mg_pmgRight = gm_mgArrowUp.mg_pmgDown =
&gm_mgVar[0];
gm_mgArrowDn.mg_pmgRight = gm_mgArrowDn.mg_pmgUp =
&gm_mgVar[VARS_ON_SCREEN - 1];
gm_ctListVisible = VARS_ON_SCREEN;
gm_pmgArrowUp = &gm_mgArrowUp;
gm_pmgArrowDn = &gm_mgArrowDn;
gm_pmgListTop = &gm_mgVar[0];
gm_pmgListBottom = &gm_mgVar[VARS_ON_SCREEN - 1];
}
void CVarMenu::FillListItems(void)
{
// disable all items first
for (INDEX i = 0; i<VARS_ON_SCREEN; i++) {
gm_mgVar[i].mg_bEnabled = FALSE;
gm_mgVar[i].mg_pvsVar = NULL;
gm_mgVar[i].mg_iInList = -2;
}
BOOL bHasFirst = FALSE;
BOOL bHasLast = FALSE;
INDEX ctLabels = _lhVarSettings.Count();
INDEX iLabel = 0;
FOREACHINLIST(CVarSetting, vs_lnNode, _lhVarSettings, itvs) {
CVarSetting &vs = *itvs;
INDEX iInMenu = iLabel - gm_iListOffset;
if ((iLabel >= gm_iListOffset) &&
(iLabel<(gm_iListOffset + VARS_ON_SCREEN)))
{
bHasFirst |= (iLabel == 0);
bHasLast |= (iLabel == ctLabels - 1);
gm_mgVar[iInMenu].mg_pvsVar = &vs;
gm_mgVar[iInMenu].mg_strTip = vs.vs_strTip;
gm_mgVar[iInMenu].mg_bEnabled = gm_mgVar[iInMenu].IsEnabled();
gm_mgVar[iInMenu].mg_iInList = iLabel;
}
iLabel++;
}
// enable/disable up/down arrows
gm_mgArrowUp.mg_bEnabled = !bHasFirst && ctLabels>0;
gm_mgArrowDn.mg_bEnabled = !bHasLast && ctLabels>0;
}
void CVarMenu::StartMenu(void)
{
LoadVarSettings(gm_fnmMenuCFG);
// set default parameters for the list
gm_iListOffset = 0;
gm_ctListTotal = _lhVarSettings.Count();
gm_iListWantedItem = 0;
CGameMenu::StartMenu();
}
void CVarMenu::EndMenu(void)
{
// disable all items first
for (INDEX i = 0; i<VARS_ON_SCREEN; i++) {
gm_mgVar[i].mg_bEnabled = FALSE;
gm_mgVar[i].mg_pvsVar = NULL;
gm_mgVar[i].mg_iInList = -2;
}
FlushVarSettings(FALSE);
_bVarChanged = FALSE;
}
void CVarMenu::Think(void)
{
gm_mgApply.mg_bEnabled = _bVarChanged;
extern void FixupBackButton(CGameMenu *pgm);
FixupBackButton(this);
}

View File

@ -0,0 +1,45 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_VAR_H
#define SE_INCL_GAME_MENU_VAR_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
#include "GUI/Components/MGArrow.h"
#include "GUI/Components/MGButton.h"
#include "GUI/Components/MGTitle.h"
#include "GUI/Components/MGVarButton.h"
class CVarMenu : public CGameMenu {
public:
CTFileName gm_fnmMenuCFG;
CMGTitle gm_mgTitle;
CMGVarButton gm_mgVar[LEVELS_ON_SCREEN];
CMGButton gm_mgApply;
CMGArrow gm_mgArrowUp;
CMGArrow gm_mgArrowDn;
void Initialize_t(void);
void FillListItems(void);
void StartMenu(void);
void EndMenu(void);
void Think(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,84 @@
/* 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 "StdH.h"
#include <Engine/CurrentVersion.h>
#include "MenuPrinting.h"
#include "MenuStuff.h"
#include "MVideoOptions.h"
extern void InitVideoOptionsButtons();
extern void UpdateVideoOptionsButtons(INDEX iSelected);
void CVideoOptionsMenu::Initialize_t(void)
{
// intialize video options menu
gm_mgTitle.mg_boxOnScreen = BoxTitle();
gm_mgTitle.mg_strText = TRANS("VIDEO");
gm_lhGadgets.AddTail(gm_mgTitle.mg_lnNode);
TRIGGER_MG(gm_mgDisplayAPITrigger, 0,
gm_mgApply, gm_mgDisplayAdaptersTrigger, TRANS("GRAPHICS API"), astrDisplayAPIRadioTexts);
gm_mgDisplayAPITrigger.mg_strTip = TRANS("choose graphics API to be used");
TRIGGER_MG(gm_mgDisplayAdaptersTrigger, 1,
gm_mgDisplayAPITrigger, gm_mgDisplayPrefsTrigger, TRANS("DISPLAY ADAPTER"), astrNoYes);
gm_mgDisplayAdaptersTrigger.mg_strTip = TRANS("choose display adapter to be used");
TRIGGER_MG(gm_mgDisplayPrefsTrigger, 2,
gm_mgDisplayAdaptersTrigger, gm_mgResolutionsTrigger, TRANS("PREFERENCES"), astrDisplayPrefsRadioTexts);
gm_mgDisplayPrefsTrigger.mg_strTip = TRANS("balance between speed and rendering quality, depending on your system");
TRIGGER_MG(gm_mgResolutionsTrigger, 3,
gm_mgDisplayPrefsTrigger, gm_mgFullScreenTrigger, TRANS("RESOLUTION"), astrNoYes);
gm_mgResolutionsTrigger.mg_strTip = TRANS("select video mode resolution");
TRIGGER_MG(gm_mgFullScreenTrigger, 4,
gm_mgResolutionsTrigger, gm_mgBitsPerPixelTrigger, TRANS("FULL SCREEN"), astrNoYes);
gm_mgFullScreenTrigger.mg_strTip = TRANS("make game run in a window or in full screen");
TRIGGER_MG(gm_mgBitsPerPixelTrigger, 5,
gm_mgFullScreenTrigger, gm_mgVideoRendering, TRANS("BITS PER PIXEL"), astrBitsPerPixelRadioTexts);
gm_mgBitsPerPixelTrigger.mg_strTip = TRANS("select number of colors used for display");
gm_mgDisplayPrefsTrigger.mg_pOnTriggerChange = NULL;
gm_mgDisplayAPITrigger.mg_pOnTriggerChange = NULL;
gm_mgDisplayAdaptersTrigger.mg_pOnTriggerChange = NULL;
gm_mgFullScreenTrigger.mg_pOnTriggerChange = NULL;
gm_mgResolutionsTrigger.mg_pOnTriggerChange = NULL;
gm_mgBitsPerPixelTrigger.mg_pOnTriggerChange = NULL;
gm_mgVideoRendering.mg_bfsFontSize = BFS_MEDIUM;
gm_mgVideoRendering.mg_boxOnScreen = BoxMediumRow(7.0f);
gm_mgVideoRendering.mg_pmgUp = &gm_mgBitsPerPixelTrigger;
gm_mgVideoRendering.mg_pmgDown = &gm_mgApply;
gm_mgVideoRendering.mg_strText = TRANS("RENDERING OPTIONS");
gm_mgVideoRendering.mg_strTip = TRANS("manually adjust rendering settings");
gm_lhGadgets.AddTail(gm_mgVideoRendering.mg_lnNode);
gm_mgVideoRendering.mg_pActivatedFunction = NULL;
gm_mgApply.mg_bfsFontSize = BFS_LARGE;
gm_mgApply.mg_boxOnScreen = BoxBigRow(5.5f);
gm_mgApply.mg_pmgUp = &gm_mgVideoRendering;
gm_mgApply.mg_pmgDown = &gm_mgDisplayAPITrigger;
gm_mgApply.mg_strText = TRANS("APPLY");
gm_mgApply.mg_strTip = TRANS("apply selected options");
gm_lhGadgets.AddTail(gm_mgApply.mg_lnNode);
gm_mgApply.mg_pActivatedFunction = NULL;
}
void CVideoOptionsMenu::StartMenu(void)
{
InitVideoOptionsButtons();
CGameMenu::StartMenu();
UpdateVideoOptionsButtons(-1);
}

View File

@ -0,0 +1,40 @@
/* 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. */
#ifndef SE_INCL_GAME_MENU_VIDEOOPTIONS_H
#define SE_INCL_GAME_MENU_VIDEOOPTIONS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "GameMenu.h"
class CVideoOptionsMenu : public CGameMenu {
public:
CMGTitle gm_mgTitle;
CMGTrigger gm_mgDisplayAPITrigger;
CMGTrigger gm_mgDisplayAdaptersTrigger;
CMGTrigger gm_mgFullScreenTrigger;
CMGTrigger gm_mgResolutionsTrigger;
CMGTrigger gm_mgDisplayPrefsTrigger;
CMGButton gm_mgVideoRendering;
CMGTrigger gm_mgBitsPerPixelTrigger;
CMGButton gm_mgApply;
void StartMenu(void);
void Initialize_t(void);
};
#endif /* include-once check. */

View File

@ -0,0 +1,971 @@
/* 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 "StdH.h"
#include <Engine/Build.h>
#include <sys/timeb.h>
#include <time.h>
#include <io.h>
#include "MainWindow.h"
#include <Engine/CurrentVersion.h>
#include <Engine/Templates/Stock_CSoundData.h>
#include <GameMP/LCDDrawing.h>
#include "MenuPrinting.h"
#include "LevelInfo.h"
#include "VarList.h"
#include "FileInfo.h"
#include "MenuManager.h"
#include "MenuActions.h"
#include "MenuStuff.h"
#include "MenuStarters.h"
// macros for translating radio button text arrays
#define TRANSLATERADIOARRAY(array) TranslateRadioTexts(array, ARRAYCOUNT(array))
extern BOOL bMenuActive;
extern BOOL bMenuRendering;
extern CTextureObject *_ptoLogoCT;
extern CTextureObject *_ptoLogoODI;
extern CTextureObject *_ptoLogoEAX;
INDEX _iLocalPlayer = -1;
extern BOOL _bPlayerMenuFromSinglePlayer = FALSE;
GameMode _gmMenuGameMode = GM_NONE;
GameMode _gmRunningGameMode = GM_NONE;
CListHead _lhServers;
void OnPlayerSelect(void);
// last tick done
TIME _tmMenuLastTickDone = -1;
// all possible menu entities
CListHead lhMenuEntities;
extern CTString _strLastPlayerAppearance = "";
extern CTString sam_strNetworkSettings;
// function to activate when level is chosen
void (*_pAfterLevelChosen)(void);
// functions for init actions
void FixupBackButton(CGameMenu *pgm);
// mouse cursor position
extern PIX _pixCursorPosI = 0;
extern PIX _pixCursorPosJ = 0;
extern PIX _pixCursorExternPosI = 0;
extern PIX _pixCursorExternPosJ = 0;
extern BOOL _bMouseUsedLast = FALSE;
extern CMenuGadget *_pmgUnderCursor = NULL;
extern BOOL _bDefiningKey;
extern BOOL _bEditingString;
// thumbnail for showing in menu
CTextureObject _toThumbnail;
BOOL _bThumbnailOn = FALSE;
CFontData _fdBig;
CFontData _fdMedium;
CFontData _fdSmall;
CFontData _fdTitle;
CSoundData *_psdSelect = NULL;
CSoundData *_psdPress = NULL;
CSoundObject *_psoMenuSound = NULL;
static CTextureObject _toPointer;
static CTextureObject _toLogoMenuA;
static CTextureObject _toLogoMenuB;
// -------------- All possible menu entities
#define BIG_BUTTONS_CT 6
#define CHANGETRIGGERARRAY(ltbmg, astr) \
ltbmg.mg_astrTexts = astr;\
ltbmg.mg_ctTexts = sizeof( astr)/sizeof( astr[0]);\
ltbmg.mg_iSelected = 0;\
ltbmg.mg_strText = astr[ltbmg.mg_iSelected];
#define PLACEMENT(x,y,z) CPlacement3D( FLOAT3D( x, y, z), \
ANGLE3D( AngleDeg(0.0f), AngleDeg(0.0f), AngleDeg(0.0f)))
// ptr to current menu
CGameMenu *pgmCurrentMenu = NULL;
// global back button
CMGButton mgBack;
// -------- console variable adjustment menu
extern BOOL _bVarChanged = FALSE;
extern void PlayMenuSound(CSoundData *psd)
{
if (_psoMenuSound!=NULL && !_psoMenuSound->IsPlaying()) {
_psoMenuSound->Play(psd, SOF_NONGAME);
}
}
// translate all texts in array for one radio button
void TranslateRadioTexts(CTString astr[], INDEX ct)
{
for (INDEX i=0; i<ct; i++) {
astr[i] = TranslateConst(astr[i], 4);
}
}
// set new thumbnail
void SetThumbnail(CTFileName fn)
{
_bThumbnailOn = TRUE;
try {
_toThumbnail.SetData_t(fn.NoExt()+"Tbn.tex");
} catch(char *strError) {
(void)strError;
try {
_toThumbnail.SetData_t(fn.NoExt()+".tbn");
} catch(char *strError) {
(void)strError;
_toThumbnail.SetData(NULL);
}
}
}
// remove thumbnail
void ClearThumbnail(void)
{
_bThumbnailOn = FALSE;
_toThumbnail.SetData(NULL);
_pShell->Execute( "FreeUnusedStock();");
}
void StartMenus(char *str)
{
_tmMenuLastTickDone=_pTimer->GetRealTimeTick();
// disable printing of last lines
CON_DiscardLastLineTimes();
// stop all IFeel effects
IFeel_StopEffect(NULL);
if (pgmCurrentMenu == &_pGUIM->gmMainMenu || pgmCurrentMenu == &_pGUIM->gmInGameMenu) {
if (_gmRunningGameMode==GM_NONE) {
pgmCurrentMenu = &_pGUIM->gmMainMenu;
} else {
pgmCurrentMenu = &_pGUIM->gmInGameMenu;
}
}
// start main menu, or last active one
if (pgmCurrentMenu!=NULL) {
ChangeToMenu(pgmCurrentMenu);
} else {
if (_gmRunningGameMode==GM_NONE) {
ChangeToMenu(&_pGUIM->gmMainMenu);
} else {
ChangeToMenu(&_pGUIM->gmInGameMenu);
}
}
if (CTString(str)=="load") {
StartCurrentLoadMenu();
_pGUIM->gmLoadSaveMenu.gm_pgmParentMenu = NULL;
}
if (CTString(str)=="save") {
StartCurrentSaveMenu();
_pGUIM->gmLoadSaveMenu.gm_pgmParentMenu = NULL;
FixupBackButton(&_pGUIM->gmLoadSaveMenu);
}
if (CTString(str)=="controls") {
void StartControlsMenuFromOptions(void);
StartControlsMenuFromOptions();
_pGUIM->gmControls.gm_pgmParentMenu = NULL;
FixupBackButton(&_pGUIM->gmControls);
}
if (CTString(str)=="join") {
void StartSelectPlayersMenuFromOpen(void);
StartSelectPlayersMenuFromOpen();
_pGUIM->gmSelectPlayersMenu.gm_pgmParentMenu = &_pGUIM->gmMainMenu;
FixupBackButton(&_pGUIM->gmSelectPlayersMenu);
}
if (CTString(str)=="hiscore") {
ChangeToMenu(&_pGUIM->gmHighScoreMenu);
_pGUIM->gmHighScoreMenu.gm_pgmParentMenu = &_pGUIM->gmMainMenu;
FixupBackButton(&_pGUIM->gmHighScoreMenu);
}
bMenuActive = TRUE;
bMenuRendering = TRUE;
}
void StopMenus( BOOL bGoToRoot /*=TRUE*/)
{
ClearThumbnail();
if (pgmCurrentMenu!=NULL && bMenuActive) {
pgmCurrentMenu->EndMenu();
}
bMenuActive = FALSE;
if (bGoToRoot) {
if (_gmRunningGameMode==GM_NONE) {
pgmCurrentMenu = &_pGUIM->gmMainMenu;
} else {
pgmCurrentMenu = &_pGUIM->gmInGameMenu;
}
}
}
BOOL IsMenusInRoot(void)
{
return pgmCurrentMenu == NULL || pgmCurrentMenu == &_pGUIM->gmMainMenu || pgmCurrentMenu == &_pGUIM->gmInGameMenu;
}
// ------------------------ Global menu function implementation
void InitializeMenus(void)
{
_pGUIM = new CMenuManager();
try {
// initialize and load corresponding fonts
_fdSmall.Load_t( CTFILENAME( "Fonts\\Display3-narrow.fnt"));
_fdMedium.Load_t( CTFILENAME( "Fonts\\Display3-normal.fnt"));
_fdBig.Load_t( CTFILENAME( "Fonts\\Display3-caps.fnt"));
_fdTitle.Load_t( CTFILENAME( "Fonts\\Title2.fnt"));
_fdSmall.SetCharSpacing(-1);
_fdSmall.SetLineSpacing( 0);
_fdSmall.SetSpaceWidth(0.4f);
_fdMedium.SetCharSpacing(+1);
_fdMedium.SetLineSpacing( 0);
_fdMedium.SetSpaceWidth(0.4f);
_fdBig.SetCharSpacing(+1);
_fdBig.SetLineSpacing( 0);
_fdTitle.SetCharSpacing(+1);
_fdTitle.SetLineSpacing( 0);
// load menu sounds
_psdSelect = _pSoundStock->Obtain_t( CTFILENAME("Sounds\\Menu\\Select.wav"));
_psdPress = _pSoundStock->Obtain_t( CTFILENAME("Sounds\\Menu\\Press.wav"));
_psoMenuSound = new CSoundObject;
// initialize and load menu textures
_toPointer.SetData_t( CTFILENAME( "Textures\\General\\Pointer.tex"));
_toLogoMenuA.SetData_t( CTFILENAME( "Textures\\Logo\\sam_menulogo256a.tex"));
_toLogoMenuB.SetData_t( CTFILENAME( "Textures\\Logo\\sam_menulogo256b.tex"));
}
catch( char *strError) {
FatalError( strError);
}
// force logo textures to be of maximal size
((CTextureData*)_toLogoMenuA.GetData())->Force(TEX_CONSTANT);
((CTextureData*)_toLogoMenuB.GetData())->Force(TEX_CONSTANT);
// menu's relative placement
CPlacement3D plRelative = CPlacement3D( FLOAT3D( 0.0f, 0.0f, -9.0f),
ANGLE3D( AngleDeg(0.0f), AngleDeg(0.0f), AngleDeg(0.0f)));
try
{
TRANSLATERADIOARRAY(astrNoYes);
TRANSLATERADIOARRAY(astrComputerInvoke);
TRANSLATERADIOARRAY(astrDisplayAPIRadioTexts);
TRANSLATERADIOARRAY(astrDisplayPrefsRadioTexts);
TRANSLATERADIOARRAY(astrBitsPerPixelRadioTexts);
TRANSLATERADIOARRAY(astrFrequencyRadioTexts);
TRANSLATERADIOARRAY(astrSoundAPIRadioTexts);
TRANSLATERADIOARRAY(astrDifficultyRadioTexts);
TRANSLATERADIOARRAY(astrMaxPlayersRadioTexts);
TRANSLATERADIOARRAY(astrWeapon);
TRANSLATERADIOARRAY(astrSplitScreenRadioTexts);
// initialize game type strings table
InitGameTypes();
// ------------------- Initialize menus
_pGUIM->gmConfirmMenu.Initialize_t();
_pGUIM->gmConfirmMenu.gm_strName = "Confirm";
_pGUIM->gmConfirmMenu.gm_pmgSelectedByDefault = &_pGUIM->gmConfirmMenu.gm_mgConfirmYes;
_pGUIM->gmConfirmMenu.gm_pgmParentMenu = NULL;
InitActionsForConfirmMenu();
_pGUIM->gmMainMenu.Initialize_t();
_pGUIM->gmMainMenu.gm_strName = "Main";
_pGUIM->gmMainMenu.gm_pmgSelectedByDefault = &_pGUIM->gmMainMenu.gm_mgSingle;
_pGUIM->gmMainMenu.gm_pgmParentMenu = NULL;
InitActionsForMainMenu();
_pGUIM->gmInGameMenu.Initialize_t();
_pGUIM->gmInGameMenu.gm_strName = "InGame";
_pGUIM->gmInGameMenu.gm_pmgSelectedByDefault = &_pGUIM->gmInGameMenu.gm_mgQuickLoad;
_pGUIM->gmInGameMenu.gm_pgmParentMenu = NULL;
InitActionsForInGameMenu();
_pGUIM->gmSinglePlayerMenu.Initialize_t();
_pGUIM->gmSinglePlayerMenu.gm_strName = "SinglePlayer";
_pGUIM->gmSinglePlayerMenu.gm_pmgSelectedByDefault = &_pGUIM->gmSinglePlayerMenu.gm_mgNewGame;
_pGUIM->gmSinglePlayerMenu.gm_pgmParentMenu = &_pGUIM->gmMainMenu;
InitActionsForSinglePlayerMenu();
_pGUIM->gmSinglePlayerNewMenu.Initialize_t();
_pGUIM->gmSinglePlayerNewMenu.gm_strName = "SinglePlayerNew";
_pGUIM->gmSinglePlayerNewMenu.gm_pmgSelectedByDefault = &_pGUIM->gmSinglePlayerNewMenu.gm_mgMedium;
_pGUIM->gmSinglePlayerNewMenu.gm_pgmParentMenu = &_pGUIM->gmSinglePlayerMenu;
InitActionsForSinglePlayerNewMenu();
_pGUIM->gmDisabledFunction.Initialize_t();
_pGUIM->gmDisabledFunction.gm_strName = "DisabledFunction";
_pGUIM->gmDisabledFunction.gm_pmgSelectedByDefault = &_pGUIM->gmDisabledFunction.gm_mgButton;
_pGUIM->gmDisabledFunction.gm_pgmParentMenu = NULL;
_pGUIM->gmPlayerProfile.Initialize_t();
_pGUIM->gmPlayerProfile.gm_strName = "PlayerProfile";
_pGUIM->gmPlayerProfile.gm_pmgSelectedByDefault = &_pGUIM->gmPlayerProfile.gm_mgNameField;
InitActionsForPlayerProfileMenu();
_pGUIM->gmControls.Initialize_t();
_pGUIM->gmControls.gm_strName = "Controls";
_pGUIM->gmControls.gm_pmgSelectedByDefault = &_pGUIM->gmControls.gm_mgButtons;
InitActionsForControlsMenu();
// warning! parent menu has to be set inside button activate function from where
// Load/Save menu is called
_pGUIM->gmLoadSaveMenu.Initialize_t();
_pGUIM->gmLoadSaveMenu.gm_strName = "LoadSave";
_pGUIM->gmLoadSaveMenu.gm_pmgSelectedByDefault = &_pGUIM->gmLoadSaveMenu.gm_amgButton[0];
_pGUIM->gmHighScoreMenu.Initialize_t();
_pGUIM->gmHighScoreMenu.gm_strName = "HighScore";
_pGUIM->gmHighScoreMenu.gm_pmgSelectedByDefault = &mgBack;
_pGUIM->gmCustomizeKeyboardMenu.Initialize_t();
_pGUIM->gmCustomizeKeyboardMenu.gm_strName = "CustomizeKeyboard";
_pGUIM->gmCustomizeKeyboardMenu.gm_pmgSelectedByDefault = &_pGUIM->gmCustomizeKeyboardMenu.gm_mgKey[0];
_pGUIM->gmCustomizeKeyboardMenu.gm_pgmParentMenu = &_pGUIM->gmControls;
_pGUIM->gmCustomizeAxisMenu.Initialize_t();
_pGUIM->gmCustomizeAxisMenu.gm_strName = "CustomizeAxis";
_pGUIM->gmCustomizeAxisMenu.gm_pmgSelectedByDefault = &_pGUIM->gmCustomizeAxisMenu.gm_mgActionTrigger;
_pGUIM->gmCustomizeAxisMenu.gm_pgmParentMenu = &_pGUIM->gmControls;
InitActionsForCustomizeAxisMenu();
_pGUIM->gmOptionsMenu.Initialize_t();
_pGUIM->gmOptionsMenu.gm_strName = "Options";
_pGUIM->gmOptionsMenu.gm_pmgSelectedByDefault = &_pGUIM->gmOptionsMenu.gm_mgVideoOptions;
_pGUIM->gmOptionsMenu.gm_pgmParentMenu = &_pGUIM->gmMainMenu;
InitActionsForOptionsMenu();
_pGUIM->gmVideoOptionsMenu.Initialize_t();
_pGUIM->gmVideoOptionsMenu.gm_strName = "VideoOptions";
_pGUIM->gmVideoOptionsMenu.gm_pmgSelectedByDefault = &_pGUIM->gmVideoOptionsMenu.gm_mgDisplayAPITrigger;
_pGUIM->gmVideoOptionsMenu.gm_pgmParentMenu = &_pGUIM->gmOptionsMenu;
InitActionsForVideoOptionsMenu();
_pGUIM->gmAudioOptionsMenu.Initialize_t();
_pGUIM->gmAudioOptionsMenu.gm_strName = "AudioOptions";
_pGUIM->gmAudioOptionsMenu.gm_pmgSelectedByDefault = &_pGUIM->gmAudioOptionsMenu.gm_mgFrequencyTrigger;
_pGUIM->gmAudioOptionsMenu.gm_pgmParentMenu = &_pGUIM->gmOptionsMenu;
InitActionsForAudioOptionsMenu();
_pGUIM->gmLevelsMenu.Initialize_t();
_pGUIM->gmLevelsMenu.gm_strName = "Levels";
_pGUIM->gmLevelsMenu.gm_pmgSelectedByDefault = &_pGUIM->gmLevelsMenu.gm_mgManualLevel[0];
_pGUIM->gmLevelsMenu.gm_pgmParentMenu = &_pGUIM->gmSinglePlayerMenu;
_pGUIM->gmVarMenu.Initialize_t();
_pGUIM->gmVarMenu.gm_strName = "Var";
_pGUIM->gmVarMenu.gm_pmgSelectedByDefault = &_pGUIM->gmVarMenu.gm_mgVar[0];
_pGUIM->gmVarMenu.gm_pgmParentMenu = &_pGUIM->gmNetworkStartMenu;
InitActionsForVarMenu();
_pGUIM->gmServersMenu.Initialize_t();
_pGUIM->gmServersMenu.gm_strName = "Servers";
_pGUIM->gmServersMenu.gm_pmgSelectedByDefault = &_pGUIM->gmServersMenu.gm_mgList;
_pGUIM->gmServersMenu.gm_pgmParentMenu = &_pGUIM->gmNetworkOpenMenu;
InitActionsForServersMenu();
_pGUIM->gmNetworkMenu.Initialize_t();
_pGUIM->gmNetworkMenu.gm_strName = "Network";
_pGUIM->gmNetworkMenu.gm_pmgSelectedByDefault = &_pGUIM->gmNetworkMenu.gm_mgJoin;
_pGUIM->gmNetworkMenu.gm_pgmParentMenu = &_pGUIM->gmMainMenu;
InitActionsForNetworkMenu();
_pGUIM->gmNetworkStartMenu.Initialize_t();
_pGUIM->gmNetworkStartMenu.gm_strName = "NetworkStart";
_pGUIM->gmNetworkStartMenu.gm_pmgSelectedByDefault = &_pGUIM->gmNetworkStartMenu.gm_mgStart;
_pGUIM->gmNetworkStartMenu.gm_pgmParentMenu = &_pGUIM->gmNetworkMenu;
InitActionsForNetworkStartMenu();
_pGUIM->gmNetworkJoinMenu.Initialize_t();
_pGUIM->gmNetworkJoinMenu.gm_strName = "NetworkJoin";
_pGUIM->gmNetworkJoinMenu.gm_pmgSelectedByDefault = &_pGUIM->gmNetworkJoinMenu.gm_mgLAN;
_pGUIM->gmNetworkJoinMenu.gm_pgmParentMenu = &_pGUIM->gmNetworkMenu;
InitActionsForNetworkJoinMenu();
_pGUIM->gmSelectPlayersMenu.gm_bAllowDedicated = FALSE;
_pGUIM->gmSelectPlayersMenu.gm_bAllowObserving = FALSE;
_pGUIM->gmSelectPlayersMenu.Initialize_t();
_pGUIM->gmSelectPlayersMenu.gm_strName = "SelectPlayers";
_pGUIM->gmSelectPlayersMenu.gm_pmgSelectedByDefault = &_pGUIM->gmSelectPlayersMenu.gm_mgStart;
InitActionsForSelectPlayersMenu();
_pGUIM->gmNetworkOpenMenu.Initialize_t();
_pGUIM->gmNetworkOpenMenu.gm_strName = "NetworkOpen";
_pGUIM->gmNetworkOpenMenu.gm_pmgSelectedByDefault = &_pGUIM->gmNetworkOpenMenu.gm_mgJoin;
_pGUIM->gmNetworkOpenMenu.gm_pgmParentMenu = &_pGUIM->gmNetworkJoinMenu;
InitActionsForNetworkOpenMenu();
_pGUIM->gmSplitScreenMenu.Initialize_t();
_pGUIM->gmSplitScreenMenu.gm_strName = "SplitScreen";
_pGUIM->gmSplitScreenMenu.gm_pmgSelectedByDefault = &_pGUIM->gmSplitScreenMenu.gm_mgStart;
_pGUIM->gmSplitScreenMenu.gm_pgmParentMenu = &_pGUIM->gmMainMenu;
InitActionsForSplitScreenMenu();
_pGUIM->gmSplitStartMenu.Initialize_t();
_pGUIM->gmSplitStartMenu.gm_strName = "SplitStart";
_pGUIM->gmSplitStartMenu.gm_pmgSelectedByDefault = &_pGUIM->gmSplitStartMenu.gm_mgStart;
_pGUIM->gmSplitStartMenu.gm_pgmParentMenu = &_pGUIM->gmSplitScreenMenu;
InitActionsForSplitStartMenu();
}
catch( char *strError)
{
FatalError( strError);
}
}
void DestroyMenus( void)
{
_pGUIM->gmMainMenu.Destroy();
pgmCurrentMenu = NULL;
_pSoundStock->Release(_psdSelect);
_pSoundStock->Release(_psdPress);
delete _psoMenuSound;
_psdSelect = NULL;
_psdPress = NULL;
_psoMenuSound = NULL;
}
// go to parent menu if possible
void MenuGoToParent(void)
{
// if there is no parent menu
if( pgmCurrentMenu->gm_pgmParentMenu == NULL) {
// if in game
if (_gmRunningGameMode!=GM_NONE) {
// exit menus
StopMenus();
// if no game is running
} else {
// go to main menu
ChangeToMenu(&_pGUIM->gmMainMenu);
}
// if there is some parent menu
} else {
// go to parent menu
ChangeToMenu( pgmCurrentMenu->gm_pgmParentMenu);
}
}
void MenuOnKeyDown( int iVKey)
{
// check if mouse buttons used
_bMouseUsedLast = (iVKey==VK_LBUTTON || iVKey==VK_RBUTTON || iVKey==VK_MBUTTON
|| iVKey==10 || iVKey==11);
// ignore mouse when editing
if (_bEditingString && _bMouseUsedLast) {
_bMouseUsedLast = FALSE;
return;
}
// initially the message is not handled
BOOL bHandled = FALSE;
// if not a mouse button, or mouse is over some gadget
if (!_bMouseUsedLast || _pmgUnderCursor!=NULL) {
// ask current menu to handle the key
bHandled = pgmCurrentMenu->OnKeyDown( iVKey);
}
// if not handled
if(!bHandled) {
// if escape or right mouse pressed
if(iVKey==VK_ESCAPE || iVKey==VK_RBUTTON) {
if (pgmCurrentMenu==&_pGUIM->gmLoadSaveMenu && _pGUIM->gmLoadSaveMenu.gm_bNoEscape) {
return;
}
// go to parent menu if possible
MenuGoToParent();
}
}
}
void MenuOnChar(MSG msg)
{
// check if mouse buttons used
_bMouseUsedLast = FALSE;
// ask current menu to handle the key
pgmCurrentMenu->OnChar(msg);
}
void MenuOnMouseMove(PIX pixI, PIX pixJ)
{
static PIX pixLastI = 0;
static PIX pixLastJ = 0;
if (pixLastI==pixI && pixLastJ==pixJ) {
return;
}
pixLastI = pixI;
pixLastJ = pixJ;
_bMouseUsedLast = !_bEditingString && !_bDefiningKey && !_pInput->IsInputEnabled();
}
void MenuUpdateMouseFocus(void)
{
// get real cursor position
POINT pt;
GetCursorPos(&pt);
ScreenToClient(_hwndMain, &pt);
extern INDEX sam_bWideScreen;
extern CDrawPort *pdp;
if( sam_bWideScreen) {
const PIX pixHeight = pdp->GetHeight();
pt.y -= (pixHeight/0.75f-pixHeight)/2;
}
_pixCursorPosI += pt.x-_pixCursorExternPosI;
_pixCursorPosJ = _pixCursorExternPosJ;
_pixCursorExternPosI = pt.x;
_pixCursorExternPosJ = pt.y;
// if mouse not used last
if (!_bMouseUsedLast||_bDefiningKey||_bEditingString) {
// do nothing
return;
}
CMenuGadget *pmgActive = NULL;
// for all gadgets in menu
FOREACHINLIST( CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
CMenuGadget &mg = *itmg;
// if focused
if( itmg->mg_bFocused) {
// remember it
pmgActive = &itmg.Current();
}
}
// if there is some under cursor
if (_pmgUnderCursor!=NULL) {
_pmgUnderCursor->OnMouseOver(_pixCursorPosI, _pixCursorPosJ);
// if the one under cursor has no neighbours
if (_pmgUnderCursor->mg_pmgLeft ==NULL
&&_pmgUnderCursor->mg_pmgRight==NULL
&&_pmgUnderCursor->mg_pmgUp ==NULL
&&_pmgUnderCursor->mg_pmgDown ==NULL) {
// it cannot be focused
_pmgUnderCursor = NULL;
return;
}
// if the one under cursor is not active and not disappearing
if (pmgActive!=_pmgUnderCursor && _pmgUnderCursor->mg_bVisible) {
// change focus
if (pmgActive!=NULL) {
pmgActive->OnKillFocus();
}
_pmgUnderCursor->OnSetFocus();
}
}
}
static CTimerValue _tvInitialization;
static TIME _tmInitializationTick = -1;
extern TIME _tmMenuLastTickDone;
void SetMenuLerping(void)
{
CTimerValue tvNow = _pTimer->GetHighPrecisionTimer();
// if lerping was never set before
if (_tmInitializationTick<0) {
// initialize it
_tvInitialization = tvNow;
_tmInitializationTick = _tmMenuLastTickDone;
}
// get passed time from session state starting in precise time and in ticks
FLOAT tmRealDelta = FLOAT((tvNow-_tvInitialization).GetSeconds());
FLOAT tmTickDelta = _tmMenuLastTickDone-_tmInitializationTick;
// calculate factor
FLOAT fFactor = 1.0f-(tmTickDelta-tmRealDelta)/_pTimer->TickQuantum;
// if the factor starts getting below zero
if (fFactor<0) {
// clamp it
fFactor = 0.0f;
// readjust timers so that it gets better
_tvInitialization = tvNow;
_tmInitializationTick = _tmMenuLastTickDone-_pTimer->TickQuantum;
}
if (fFactor>1) {
// clamp it
fFactor = 1.0f;
// readjust timers so that it gets better
_tvInitialization = tvNow;
_tmInitializationTick = _tmMenuLastTickDone;
}
// set lerping factor and timer
_pTimer->SetCurrentTick(_tmMenuLastTickDone);
_pTimer->SetLerp(fFactor);
}
// render mouse cursor if needed
void RenderMouseCursor(CDrawPort *pdp)
{
// if mouse not used last
if (!_bMouseUsedLast|| _bDefiningKey || _bEditingString) {
// don't render cursor
return;
}
LCDSetDrawport(pdp);
LCDDrawPointer(_pixCursorPosI, _pixCursorPosJ);
}
BOOL DoMenu( CDrawPort *pdp)
{
pdp->Unlock();
CDrawPort dpMenu(pdp, TRUE);
dpMenu.Lock();
MenuUpdateMouseFocus();
// if in fullscreen
CDisplayMode dmCurrent;
_pGfx->GetCurrentDisplayMode(dmCurrent);
if (dmCurrent.IsFullScreen()) {
// clamp mouse pointer
_pixCursorPosI = Clamp(_pixCursorPosI, 0L, dpMenu.GetWidth());
_pixCursorPosJ = Clamp(_pixCursorPosJ, 0L, dpMenu.GetHeight());
// if in window
} else {
// use same mouse pointer as windows
_pixCursorPosI = _pixCursorExternPosI;
_pixCursorPosJ = _pixCursorExternPosJ;
}
pgmCurrentMenu->Think();
TIME tmTickNow = _pTimer->GetRealTimeTick();
while( _tmMenuLastTickDone<tmTickNow)
{
_pTimer->SetCurrentTick(_tmMenuLastTickDone);
// call think for all gadgets in menu
FOREACHINLIST( CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
itmg->Think();
}
_tmMenuLastTickDone+=_pTimer->TickQuantum;
}
SetMenuLerping();
PIX pixW = dpMenu.GetWidth();
PIX pixH = dpMenu.GetHeight();
// blend background if menu is on
if( bMenuActive)
{
// get current time
TIME tmNow = _pTimer->GetLerpedCurrentTick();
UBYTE ubH1 = (INDEX)(tmNow*08.7f) & 255;
UBYTE ubH2 = (INDEX)(tmNow*27.6f) & 255;
UBYTE ubH3 = (INDEX)(tmNow*16.5f) & 255;
UBYTE ubH4 = (INDEX)(tmNow*35.4f) & 255;
// clear screen with background texture
LCDPrepare(1.0f);
LCDSetDrawport(&dpMenu);
// do not allow game to show through
dpMenu.Fill(C_BLACK|255);
LCDRenderClouds1();
LCDRenderGrid();
LCDRenderClouds2();
FLOAT fScaleW = (FLOAT)pixW / 640.0f;
FLOAT fScaleH = (FLOAT)pixH / 480.0f;
PIX pixI0, pixJ0, pixI1, pixJ1;
// put logo(s) to main menu (if logos exist)
if (pgmCurrentMenu == &_pGUIM->gmMainMenu)
{
if( _ptoLogoODI!=NULL) {
CTextureData &td = (CTextureData&)*_ptoLogoODI->GetData();
#define LOGOSIZE 50
const PIX pixLogoWidth = LOGOSIZE * dpMenu.dp_fWideAdjustment;
const PIX pixLogoHeight = LOGOSIZE* td.GetHeight() / td.GetWidth();
pixI0 = (640-pixLogoWidth -16)*fScaleW;
pixJ0 = (480-pixLogoHeight-16)*fScaleH;
pixI1 = pixI0+ pixLogoWidth *fScaleW;
pixJ1 = pixJ0+ pixLogoHeight*fScaleH;
dpMenu.PutTexture( _ptoLogoODI, PIXaabbox2D( PIX2D( pixI0, pixJ0),PIX2D( pixI1, pixJ1)));
#undef LOGOSIZE
}
if( _ptoLogoCT!=NULL) {
CTextureData &td = (CTextureData&)*_ptoLogoCT->GetData();
#define LOGOSIZE 50
const PIX pixLogoWidth = LOGOSIZE * dpMenu.dp_fWideAdjustment;
const PIX pixLogoHeight = LOGOSIZE* td.GetHeight() / td.GetWidth();
pixI0 = 12*fScaleW;
pixJ0 = (480-pixLogoHeight-16)*fScaleH;
pixI1 = pixI0+ pixLogoWidth *fScaleW;
pixJ1 = pixJ0+ pixLogoHeight*fScaleH;
dpMenu.PutTexture( _ptoLogoCT, PIXaabbox2D( PIX2D( pixI0, pixJ0),PIX2D( pixI1, pixJ1)));
#undef LOGOSIZE
}
{
FLOAT fResize = Min(dpMenu.GetWidth()/640.0f, dpMenu.GetHeight()/480.0f);
PIX pixSizeI = 256*fResize;
PIX pixSizeJ = 64*fResize;
PIX pixCenterI = dpMenu.GetWidth()/2;
PIX pixHeightJ = 10*fResize;
dpMenu.PutTexture(&_toLogoMenuA, PIXaabbox2D(
PIX2D( pixCenterI-pixSizeI, pixHeightJ),PIX2D( pixCenterI, pixHeightJ+pixSizeJ)));
dpMenu.PutTexture(&_toLogoMenuB, PIXaabbox2D(
PIX2D( pixCenterI, pixHeightJ),PIX2D( pixCenterI+pixSizeI, pixHeightJ+pixSizeJ)));
}
} else if (pgmCurrentMenu == &_pGUIM->gmAudioOptionsMenu) {
if( _ptoLogoEAX!=NULL) {
CTextureData &td = (CTextureData&)*_ptoLogoEAX->GetData();
const INDEX iSize = 95;
const PIX pixLogoWidth = iSize * dpMenu.dp_fWideAdjustment;
const PIX pixLogoHeight = iSize * td.GetHeight() / td.GetWidth();
pixI0 = (640-pixLogoWidth - 35)*fScaleW;
pixJ0 = (480-pixLogoHeight - 7)*fScaleH;
pixI1 = pixI0+ pixLogoWidth *fScaleW;
pixJ1 = pixJ0+ pixLogoHeight*fScaleH;
dpMenu.PutTexture( _ptoLogoEAX, PIXaabbox2D( PIX2D( pixI0, pixJ0),PIX2D( pixI1, pixJ1)));
}
}
#define THUMBW 96
#define THUMBH 96
// if there is a thumbnail
if( _bThumbnailOn) {
const FLOAT fThumbScaleW = fScaleW * dpMenu.dp_fWideAdjustment;
PIX pixOfs = 8*fScaleW;
pixI0 = 8*fScaleW;
pixJ0 = (240-THUMBW/2)*fScaleH;
pixI1 = pixI0+ THUMBW*fThumbScaleW;
pixJ1 = pixJ0+ THUMBH*fScaleH;
if( _toThumbnail.GetData()!=NULL)
{ // show thumbnail with shadow and border
dpMenu.Fill( pixI0+pixOfs, pixJ0+pixOfs, THUMBW*fThumbScaleW, THUMBH*fScaleH, C_BLACK|128);
dpMenu.PutTexture( &_toThumbnail, PIXaabbox2D( PIX2D( pixI0, pixJ0), PIX2D( pixI1, pixJ1)), C_WHITE|255);
dpMenu.DrawBorder( pixI0,pixJ0, THUMBW*fThumbScaleW,THUMBH*fScaleH, LCDGetColor(C_mdGREEN|255, "thumbnail border"));
} else {
dpMenu.SetFont( _pfdDisplayFont);
dpMenu.SetTextScaling( fScaleW);
dpMenu.SetTextAspect( 1.0f);
dpMenu.PutTextCXY( TRANS("no thumbnail"), (pixI0+pixI1)/2, (pixJ0+pixJ1)/2, LCDGetColor(C_GREEN|255, "no thumbnail"));
}
}
// assure we can listen to non-3d sounds
_pSound->UpdateSounds();
}
// if this is popup menu
if (pgmCurrentMenu->gm_bPopup) {
// render parent menu first
if (pgmCurrentMenu->gm_pgmParentMenu!=NULL) {
_pGame->MenuPreRenderMenu(pgmCurrentMenu->gm_pgmParentMenu->gm_strName);
FOREACHINLIST( CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_pgmParentMenu->gm_lhGadgets, itmg) {
if( itmg->mg_bVisible) {
itmg->Render( &dpMenu);
}
}
_pGame->MenuPostRenderMenu(pgmCurrentMenu->gm_pgmParentMenu->gm_strName);
}
// gray it out
dpMenu.Fill(C_BLACK|128);
// clear popup box
dpMenu.Unlock();
PIXaabbox2D box = FloatBoxToPixBox(&dpMenu, BoxPopup());
CDrawPort dpPopup(pdp, box);
dpPopup.Lock();
LCDSetDrawport(&dpPopup);
dpPopup.Fill(C_BLACK|255);
LCDRenderClouds1();
LCDRenderGrid();
//LCDRenderClouds2();
LCDScreenBox(LCDGetColor(C_GREEN|255, "popup box"));
dpPopup.Unlock();
dpMenu.Lock();
}
// no entity is under cursor initially
_pmgUnderCursor = NULL;
BOOL bStilInMenus = FALSE;
_pGame->MenuPreRenderMenu(pgmCurrentMenu->gm_strName);
// for each menu gadget
FOREACHINLIST( CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
// if gadget is visible
if( itmg->mg_bVisible) {
bStilInMenus = TRUE;
itmg->Render( &dpMenu);
if (FloatBoxToPixBox(&dpMenu, itmg->mg_boxOnScreen)>=PIX2D(_pixCursorPosI, _pixCursorPosJ)) {
_pmgUnderCursor = itmg;
}
}
}
_pGame->MenuPostRenderMenu(pgmCurrentMenu->gm_strName);
// no currently active gadget initially
CMenuGadget *pmgActive = NULL;
// if mouse was not active last
if (!_bMouseUsedLast) {
// find focused gadget
FOREACHINLIST( CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
CMenuGadget &mg = *itmg;
// if focused
if( itmg->mg_bFocused) {
// it is active
pmgActive = &itmg.Current();
break;
}
}
// if mouse was active last
} else {
// gadget under cursor is active
pmgActive = _pmgUnderCursor;
}
// if editing
if (_bEditingString && pmgActive!=NULL) {
// dim the menu bit
dpMenu.Fill(C_BLACK|0x40);
// render the edit gadget again
pmgActive->Render(&dpMenu);
}
// if there is some active gadget and it has tips
if (pmgActive!=NULL && (pmgActive->mg_strTip!="" || _bEditingString)) {
CTString strTip = pmgActive->mg_strTip;
if (_bEditingString) {
strTip = TRANS("Enter - OK, Escape - Cancel");
}
// print the tip
SetFontMedium(&dpMenu);
dpMenu.PutTextC(strTip,
pixW*0.5f, pixH*0.92f, LCDGetColor(C_WHITE|255, "tool tip"));
}
_pGame->ConsolePrintLastLines(&dpMenu);
RenderMouseCursor(&dpMenu);
dpMenu.Unlock();
pdp->Lock();
return bStilInMenus;
}
void MenuBack(void)
{
MenuGoToParent();
}
extern void FixupBackButton(CGameMenu *pgm)
{
BOOL bResume = FALSE;
if (mgBack.mg_lnNode.IsLinked()) {
mgBack.mg_lnNode.Remove();
}
BOOL bHasBack = TRUE;
if (pgm->gm_bPopup) {
bHasBack = FALSE;
}
if (pgm->gm_pgmParentMenu==NULL) {
if (_gmRunningGameMode==GM_NONE) {
bHasBack = FALSE;
} else {
bResume = TRUE;
}
}
if (!bHasBack) {
mgBack.Disappear();
return;
}
if (bResume) {
mgBack.mg_strText = TRANS("RESUME");
mgBack.mg_strTip = TRANS("return to game");
} else {
if (_bVarChanged) {
mgBack.mg_strText = TRANS("CANCEL");
mgBack.mg_strTip = TRANS("cancel changes");
} else {
mgBack.mg_strText = TRANS("BACK");
mgBack.mg_strTip = TRANS("return to previous menu");
}
}
mgBack.mg_iCenterI = -1;
mgBack.mg_bfsFontSize = BFS_LARGE;
mgBack.mg_boxOnScreen = BoxBack();
mgBack.mg_boxOnScreen = BoxLeftColumn(16.5f);
pgm->gm_lhGadgets.AddTail( mgBack.mg_lnNode);
mgBack.mg_pmgLeft =
mgBack.mg_pmgRight =
mgBack.mg_pmgUp =
mgBack.mg_pmgDown = pgm->gm_pmgSelectedByDefault;
mgBack.mg_pActivatedFunction = &MenuBack;
mgBack.Appear();
}
void ChangeToMenu( CGameMenu *pgmNewMenu)
{
// auto-clear old thumbnail when going out of menu
ClearThumbnail();
if( pgmCurrentMenu != NULL) {
if (!pgmNewMenu->gm_bPopup) {
pgmCurrentMenu->EndMenu();
} else {
FOREACHINLIST(CMenuGadget, mg_lnNode, pgmCurrentMenu->gm_lhGadgets, itmg) {
itmg->OnKillFocus();
}
}
}
pgmNewMenu->StartMenu();
if (pgmNewMenu->gm_pmgSelectedByDefault) {
if (mgBack.mg_bFocused) {
mgBack.OnKillFocus();
}
pgmNewMenu->gm_pmgSelectedByDefault->OnSetFocus();
}
FixupBackButton(pgmNewMenu);
pgmCurrentMenu = pgmNewMenu;
}

View File

@ -0,0 +1,68 @@
/* 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. */
#ifndef SE_INCL_MENU_H
#define SE_INCL_MENU_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
// set new thumbnail
void SetThumbnail(CTFileName fn);
// remove thumbnail
void ClearThumbnail(void);
void InitializeMenus( void);
void DestroyMenus( void);
void MenuOnKeyDown( int iVKey);
void MenuOnChar(MSG msg);
void MenuOnMouseMove(PIX pixI, PIX pixJ);
void MenuOnLMBDown(void);
BOOL DoMenu( CDrawPort *pdp); // returns TRUE if still active, FALSE if should quit
void StartMenus( char *str="");
void StopMenus(BOOL bGoToRoot =TRUE);
BOOL IsMenusInRoot(void);
void ChangeToMenu( class CGameMenu *pgmNew);
extern void PlayMenuSound(CSoundData *psd);
#define KEYS_ON_SCREEN 14
#define LEVELS_ON_SCREEN 16
#define SERVERS_ON_SCREEN 15
#define VARS_ON_SCREEN 14
extern CListHead _lhServers;
extern INDEX _iLocalPlayer;
enum GameMode {
GM_NONE = 0,
GM_SINGLE_PLAYER,
GM_NETWORK,
GM_SPLIT_SCREEN,
GM_DEMO,
GM_INTRO,
};
extern GameMode _gmMenuGameMode;
extern GameMode _gmRunningGameMode;
extern CGameMenu *pgmCurrentMenu;
#include "GameMenu.h"
#include "MLoadSave.h"
#include "MPlayerProfile.h"
#include "MSelectPlayers.h"
#endif /* include-once check. */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
/* 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. */
#ifndef SE_INCL_MENU_ACTIONS_H
#define SE_INCL_MENU_ACTIONS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
void InitActionsForAudioOptionsMenu();
void InitActionsForConfirmMenu();
void InitActionsForControlsMenu();
void InitActionsForCustomizeAxisMenu();
void InitActionsForMainMenu();
void InitActionsForInGameMenu();
void InitActionsForNetworkMenu();
void InitActionsForNetworkJoinMenu();
void InitActionsForNetworkOpenMenu();
void InitActionsForNetworkStartMenu();
void InitActionsForOptionsMenu();
void InitActionsForPlayerProfileMenu();
void InitActionsForSelectPlayersMenu();
void InitActionsForServersMenu();
void InitActionsForSinglePlayerMenu();
void InitActionsForSinglePlayerNewMenu();
void InitActionsForSplitScreenMenu();
void InitActionsForSplitStartMenu();
void InitActionsForVideoOptionsMenu();
void InitActionsForVarMenu();
#endif /* include-once check. */

View File

@ -1,9 +1,8 @@
/* Copyright (c) 2002-2012 Croteam Ltd.
/* 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
@ -13,4 +12,9 @@ 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. */
#define CD_CHECK 1
#include "StdH.h"
#include <Engine/Build.h>
#include "MenuManager.h"
extern CMenuManager* _pGUIM = NULL;

View File

@ -0,0 +1,79 @@
/* 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. */
#ifndef SE_INCL_MENUMANAGER_H
#define SE_INCL_MENUMANAGER_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
#include "MAudioOptions.h"
#include "MConfirm.h"
#include "MControls.h"
#include "MCustomizeAxis.h"
#include "MCustomizeKeyboard.h"
#include "MCredits.h"
#include "MDisabled.h"
#include "MHighScore.h"
#include "MInGame.h"
#include "MLevels.h"
#include "MMain.h"
#include "MNetwork.h"
#include "MNetworkJoin.h"
#include "MNetworkOpen.h"
#include "MNetworkStart.h"
#include "MOptions.h"
#include "MRenderingOptions.h"
#include "MServers.h"
#include "MSinglePlayer.h"
#include "MSinglePlayerNew.h"
#include "MSplitScreen.h"
#include "MSplitStart.h"
#include "MVar.h"
#include "MVideoOptions.h"
class CMenuManager {
public:
CConfirmMenu gmConfirmMenu;
CMainMenu gmMainMenu;
CInGameMenu gmInGameMenu;
CSinglePlayerMenu gmSinglePlayerMenu;
CSinglePlayerNewMenu gmSinglePlayerNewMenu;
CDisabledMenu gmDisabledFunction;
CLevelsMenu gmLevelsMenu;
CVarMenu gmVarMenu;
CPlayerProfileMenu gmPlayerProfile;
CControlsMenu gmControls;
CLoadSaveMenu gmLoadSaveMenu;
CHighScoreMenu gmHighScoreMenu;
CCustomizeKeyboardMenu gmCustomizeKeyboardMenu;
CServersMenu gmServersMenu;
CCustomizeAxisMenu gmCustomizeAxisMenu;
COptionsMenu gmOptionsMenu;
CVideoOptionsMenu gmVideoOptionsMenu;
CAudioOptionsMenu gmAudioOptionsMenu;
CNetworkMenu gmNetworkMenu;
CNetworkJoinMenu gmNetworkJoinMenu;
CNetworkStartMenu gmNetworkStartMenu;
CNetworkOpenMenu gmNetworkOpenMenu;
CSplitScreenMenu gmSplitScreenMenu;
CSplitStartMenu gmSplitStartMenu;
CSelectPlayersMenu gmSelectPlayersMenu;
};
extern CMenuManager *_pGUIM; // TODO: Make singleton!
#endif /* include-once check. */

View File

@ -16,6 +16,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "StdH.h"
#include "MenuPrinting.h"
#include "ArrowDir.h"
static const FLOAT _fBigStartJ = 0.25f;
static const FLOAT _fBigSizeJ = 0.066f;
@ -34,18 +35,21 @@ FLOATaabbox2D BoxTitle(void)
FLOAT2D(0, _fBigSizeJ),
FLOAT2D(1, _fBigSizeJ));
}
FLOATaabbox2D BoxNoUp(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(_fNoStartI+fRow*(_fNoSizeI+_fNoSpaceI), _fNoUpStartJ),
FLOAT2D(_fNoStartI+fRow*(_fNoSizeI+_fNoSpaceI)+_fNoSizeI, _fNoUpStartJ+_fNoSizeJ));
}
FLOATaabbox2D BoxNoDown(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(_fNoStartI+fRow*(_fNoSizeI+_fNoSpaceI), _fNoDownStartJ),
FLOAT2D(_fNoStartI+fRow*(_fNoSizeI+_fNoSpaceI)+_fNoSizeI, _fNoDownStartJ+_fNoSizeJ));
}
FLOATaabbox2D BoxBigRow(FLOAT fRow)
{
return FLOATaabbox2D(
@ -58,6 +62,7 @@ FLOATaabbox2D BoxBigLeft(FLOAT fRow)
FLOAT2D(0.1f, _fBigStartJ+fRow*_fBigSizeJ),
FLOAT2D(0.45f, _fBigStartJ+(fRow+1)*_fBigSizeJ));
}
FLOATaabbox2D BoxBigRight(FLOAT fRow)
{
return FLOATaabbox2D(
@ -78,48 +83,56 @@ FLOATaabbox2D BoxVersion(void)
FLOAT2D(0.05f, _fBigStartJ+-5.5f*_fMediumSizeJ),
FLOAT2D(0.97f, _fBigStartJ+(-5.5f+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxMediumRow(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(0.05f, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.95f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxKeyRow(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(0.15f, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.85f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxMediumLeft(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(0.05f, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.45f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxPlayerSwitch(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(0.05f, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.65f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxMediumMiddle(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(_fNoStartI, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.95f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxPlayerEdit(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(_fNoStartI, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.65f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxMediumRight(FLOAT fRow)
{
return FLOATaabbox2D(
FLOAT2D(0.55f, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.95f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxPopup(void)
{
return FLOATaabbox2D(FLOAT2D(0.2f, 0.4f), FLOAT2D(0.8f, 0.6f));
@ -131,30 +144,35 @@ FLOATaabbox2D BoxPopupLabel(void)
FLOAT2D(0.22f, 0.43f),
FLOAT2D(0.78f, 0.49f));
}
FLOATaabbox2D BoxPopupYesLarge(void)
{
return FLOATaabbox2D(
FLOAT2D(0.30f, 0.51f),
FLOAT2D(0.48f, 0.57f));
}
FLOATaabbox2D BoxPopupNoLarge(void)
{
return FLOATaabbox2D(
FLOAT2D(0.52f, 0.51f),
FLOAT2D(0.70f, 0.57f));
}
FLOATaabbox2D BoxPopupYesSmall(void)
{
return FLOATaabbox2D(
FLOAT2D(0.30f, 0.54f),
FLOAT2D(0.48f, 0.59f));
}
FLOATaabbox2D BoxPopupNoSmall(void)
{
return FLOATaabbox2D(
FLOAT2D(0.52f, 0.54f),
FLOAT2D(0.70f, 0.59f));
}
FLOATaabbox2D BoxChangePlayer(INDEX iTable, INDEX iButton)
{
return FLOATaabbox2D(
@ -217,6 +235,7 @@ FLOATaabbox2D BoxLeftColumn(FLOAT fRow)
FLOAT2D(0.02f, _fBigStartJ+fRow*_fMediumSizeJ),
FLOAT2D(0.15f, _fBigStartJ+(fRow+1)*_fMediumSizeJ));
}
FLOATaabbox2D BoxPlayerModel(void)
{
extern INDEX sam_bWideScreen;
@ -226,10 +245,12 @@ FLOATaabbox2D BoxPlayerModel(void)
return FLOATaabbox2D(FLOAT2D(0.68f, 0.235f), FLOAT2D(0.68f+(0.965f-0.68f)*9.0f/12.0f, 0.78f));
}
}
FLOATaabbox2D BoxPlayerModelName(void)
{
return FLOATaabbox2D(FLOAT2D(0.68f, 0.78f), FLOAT2D(0.965f, 0.82f));
}
PIXaabbox2D FloatBoxToPixBox(const CDrawPort *pdp, const FLOATaabbox2D &boxF)
{
PIX pixW = pdp->GetWidth();
@ -255,6 +276,7 @@ void SetFontTitle(CDrawPort *pdp)
pdp->SetTextScaling( 1.25f * pdp->GetWidth() /640 *pdp->dp_fWideAdjustment);
pdp->SetTextAspect(1.0f);
}
extern CFontData _fdBig;
void SetFontBig(CDrawPort *pdp)
{
@ -262,6 +284,7 @@ void SetFontBig(CDrawPort *pdp)
pdp->SetTextScaling( 1.0f * pdp->GetWidth() /640 *pdp->dp_fWideAdjustment);
pdp->SetTextAspect(1.0f);
}
extern CFontData _fdMedium;
void SetFontMedium(CDrawPort *pdp)
{
@ -269,6 +292,7 @@ void SetFontMedium(CDrawPort *pdp)
pdp->SetTextScaling( 1.0f * pdp->GetWidth() /640 *pdp->dp_fWideAdjustment);
pdp->SetTextAspect(0.75f);
}
void SetFontSmall(CDrawPort *pdp)
{
pdp->SetFont( _pfdConsoleFont);

View File

@ -0,0 +1,859 @@
/* 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. */
/* This file contains starter fuctions for all menus. */
#include "StdH.h"
#include <Engine/Build.h>
#include "MenuManager.h"
#include "MenuStarters.h"
#include "MenuStartersAF.h"
#include "MenuStuff.h"
#include "LevelInfo.h"
extern void(*_pAfterLevelChosen)(void);
extern BOOL _bPlayerMenuFromSinglePlayer;
extern CTString _strLastPlayerAppearance;
extern CTString sam_strNetworkSettings;
extern CTFileName _fnmModSelected;
extern CTString _strModURLSelected;
extern CTString _strModServerSelected;
void StartVideoOptionsMenu(void)
{
ChangeToMenu(&_pGUIM->gmVideoOptionsMenu);
}
void StartAudioOptionsMenu(void)
{
ChangeToMenu(&_pGUIM->gmAudioOptionsMenu);
}
void StartSinglePlayerMenu(void)
{
ChangeToMenu(&_pGUIM->gmSinglePlayerMenu);
}
void StartNetworkMenu(void)
{
ChangeToMenu(&_pGUIM->gmNetworkMenu);
}
void StartNetworkJoinMenu(void)
{
ChangeToMenu(&_pGUIM->gmNetworkJoinMenu);
}
void StartNetworkStartMenu(void)
{
ChangeToMenu(&_pGUIM->gmNetworkStartMenu);
}
void StartNetworkOpenMenu(void)
{
ChangeToMenu(&_pGUIM->gmNetworkOpenMenu);
}
void StartSplitScreenMenu(void)
{
ChangeToMenu(&_pGUIM->gmSplitScreenMenu);
}
void StartSplitStartMenu(void)
{
ChangeToMenu(&_pGUIM->gmSplitStartMenu);
}
void StartSinglePlayerNewMenuCustom(void)
{
_pGUIM->gmSinglePlayerNewMenu.gm_pgmParentMenu = &_pGUIM->gmLevelsMenu;
ChangeToMenu(&_pGUIM->gmSinglePlayerNewMenu);
}
static void SetQuickLoadNotes(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
if (_pShell->GetINDEX("gam_iQuickSaveSlots") <= 8) {
gmCurrent.gm_mgNotes.mg_strText = TRANS(
"In-game QuickSave shortcuts:\n"
"F6 - save a new QuickSave\n"
"F9 - load the last QuickSave\n");
} else {
gmCurrent.gm_mgNotes.mg_strText = "";
}
}
extern CTString sam_strFirstLevel;
void StartSinglePlayerNewMenu(void)
{
CVarMenu &gmCurrent = _pGUIM->gmVarMenu;
_pGame->gam_strCustomLevel = sam_strFirstLevel;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmSinglePlayerMenu;
ChangeToMenu(&gmCurrent);
}
// game options var settings
void StartVarGameOptions(void)
{
CVarMenu &gmCurrent = _pGUIM->gmVarMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("GAME OPTIONS");
gmCurrent.gm_fnmMenuCFG = CTFILENAME("Scripts\\Menu\\GameOptions.cfg");
ChangeToMenu(&gmCurrent);
}
void StartSinglePlayerGameOptions(void)
{
CVarMenu &gmCurrent = _pGUIM->gmVarMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("GAME OPTIONS");
gmCurrent.gm_fnmMenuCFG = CTFILENAME("Scripts\\Menu\\SPOptions.cfg");
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmSinglePlayerMenu;
ChangeToMenu(&gmCurrent);
}
void StartGameOptionsFromNetwork(void)
{
StartVarGameOptions();
_pGUIM->gmVarMenu.gm_pgmParentMenu = &_pGUIM->gmNetworkStartMenu;
}
void StartGameOptionsFromSplitScreen(void)
{
StartVarGameOptions();
_pGUIM->gmVarMenu.gm_pgmParentMenu = &_pGUIM->gmSplitStartMenu;
}
// rendering options var settings
void StartRenderingOptionsMenu(void)
{
CVarMenu &gmCurrent = _pGUIM->gmVarMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("RENDERING OPTIONS");
gmCurrent.gm_fnmMenuCFG = CTFILENAME("Scripts\\Menu\\RenderingOptions.cfg");
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmVideoOptionsMenu;
ChangeToMenu(&gmCurrent);
}
void StartCustomizeKeyboardMenu(void)
{
ChangeToMenu(&_pGUIM->gmCustomizeKeyboardMenu);
}
void StartCustomizeAxisMenu(void)
{
ChangeToMenu(&_pGUIM->gmCustomizeAxisMenu);
}
void StartOptionsMenu(void)
{
_pGUIM->gmOptionsMenu.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&_pGUIM->gmOptionsMenu);
}
void StartCurrentLoadMenu()
{
if (_gmRunningGameMode == GM_NETWORK) {
void StartNetworkLoadMenu(void);
StartNetworkLoadMenu();
} else if (_gmRunningGameMode == GM_SPLIT_SCREEN) {
void StartSplitScreenLoadMenu(void);
StartSplitScreenLoadMenu();
} else {
void StartSinglePlayerLoadMenu(void);
StartSinglePlayerLoadMenu();
}
}
void StartCurrentSaveMenu()
{
if (_gmRunningGameMode == GM_NETWORK) {
void StartNetworkSaveMenu(void);
StartNetworkSaveMenu();
} else if (_gmRunningGameMode == GM_SPLIT_SCREEN) {
void StartSplitScreenSaveMenu(void);
StartSplitScreenSaveMenu();
} else {
void StartSinglePlayerSaveMenu(void);
StartSinglePlayerSaveMenu();
}
}
void StartCurrentQuickLoadMenu()
{
if (_gmRunningGameMode == GM_NETWORK) {
void StartNetworkQuickLoadMenu(void);
StartNetworkQuickLoadMenu();
} else if (_gmRunningGameMode == GM_SPLIT_SCREEN) {
void StartSplitScreenQuickLoadMenu(void);
StartSplitScreenQuickLoadMenu();
} else {
void StartSinglePlayerQuickLoadMenu(void);
StartSinglePlayerQuickLoadMenu();
}
}
void StartChangePlayerMenuFromOptions(void)
{
_bPlayerMenuFromSinglePlayer = FALSE;
_pGUIM->gmPlayerProfile.gm_piCurrentPlayer = &_pGame->gm_iSinglePlayer;
_pGUIM->gmPlayerProfile.gm_pgmParentMenu = &_pGUIM->gmOptionsMenu;
ChangeToMenu(&_pGUIM->gmPlayerProfile);
}
void StartChangePlayerMenuFromSinglePlayer(void)
{
_iLocalPlayer = -1;
_bPlayerMenuFromSinglePlayer = TRUE;
_pGUIM->gmPlayerProfile.gm_piCurrentPlayer = &_pGame->gm_iSinglePlayer;
_pGUIM->gmPlayerProfile.gm_pgmParentMenu = &_pGUIM->gmSinglePlayerMenu;
ChangeToMenu(&_pGUIM->gmPlayerProfile);
}
void StartControlsMenuFromPlayer(void)
{
_pGUIM->gmControls.gm_pgmParentMenu = &_pGUIM->gmPlayerProfile;
ChangeToMenu(&_pGUIM->gmControls);
}
void StartControlsMenuFromOptions(void)
{
_pGUIM->gmControls.gm_pgmParentMenu = &_pGUIM->gmOptionsMenu;
ChangeToMenu(&_pGUIM->gmControls);
}
void StartHighScoreMenu(void)
{
_pGUIM->gmHighScoreMenu.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&_pGUIM->gmHighScoreMenu);
}
void StartSplitScreenGame(void)
{
// _pGame->gm_MenuSplitScreenCfg = (enum CGame::SplitScreenCfg) mgSplitScreenCfg.mg_iSelected;
_pGame->gm_StartSplitScreenCfg = _pGame->gm_MenuSplitScreenCfg;
_pGame->gm_aiStartLocalPlayers[0] = _pGame->gm_aiMenuLocalPlayers[0];
_pGame->gm_aiStartLocalPlayers[1] = _pGame->gm_aiMenuLocalPlayers[1];
_pGame->gm_aiStartLocalPlayers[2] = _pGame->gm_aiMenuLocalPlayers[2];
_pGame->gm_aiStartLocalPlayers[3] = _pGame->gm_aiMenuLocalPlayers[3];
CTFileName fnWorld = _pGame->gam_strCustomLevel;
_pGame->gm_strNetworkProvider = "Local";
CUniversalSessionProperties sp;
_pGame->SetMultiPlayerSession(sp);
if (_pGame->NewGame(fnWorld.FileName(), fnWorld, sp))
{
StopMenus();
_gmRunningGameMode = GM_SPLIT_SCREEN;
} else {
_gmRunningGameMode = GM_NONE;
}
}
void StartNetworkGame(void)
{
// _pGame->gm_MenuSplitScreenCfg = (enum CGame::SplitScreenCfg) mgSplitScreenCfg.mg_iSelected;
_pGame->gm_StartSplitScreenCfg = _pGame->gm_MenuSplitScreenCfg;
_pGame->gm_aiStartLocalPlayers[0] = _pGame->gm_aiMenuLocalPlayers[0];
_pGame->gm_aiStartLocalPlayers[1] = _pGame->gm_aiMenuLocalPlayers[1];
_pGame->gm_aiStartLocalPlayers[2] = _pGame->gm_aiMenuLocalPlayers[2];
_pGame->gm_aiStartLocalPlayers[3] = _pGame->gm_aiMenuLocalPlayers[3];
CTFileName fnWorld = _pGame->gam_strCustomLevel;
_pGame->gm_strNetworkProvider = "TCP/IP Server";
CUniversalSessionProperties sp;
_pGame->SetMultiPlayerSession(sp);
if (_pGame->NewGame(_pGame->gam_strSessionName, fnWorld, sp))
{
StopMenus();
_gmRunningGameMode = GM_NETWORK;
// if starting a dedicated server
if (_pGame->gm_MenuSplitScreenCfg == CGame::SSC_DEDICATED) {
// pull down the console
extern INDEX sam_bToggleConsole;
sam_bToggleConsole = TRUE;
}
} else {
_gmRunningGameMode = GM_NONE;
}
}
void JoinNetworkGame(void)
{
// _pGame->gm_MenuSplitScreenCfg = (enum CGame::SplitScreenCfg) mgSplitScreenCfg.mg_iSelected;
_pGame->gm_StartSplitScreenCfg = _pGame->gm_MenuSplitScreenCfg;
_pGame->gm_aiStartLocalPlayers[0] = _pGame->gm_aiMenuLocalPlayers[0];
_pGame->gm_aiStartLocalPlayers[1] = _pGame->gm_aiMenuLocalPlayers[1];
_pGame->gm_aiStartLocalPlayers[2] = _pGame->gm_aiMenuLocalPlayers[2];
_pGame->gm_aiStartLocalPlayers[3] = _pGame->gm_aiMenuLocalPlayers[3];
_pGame->gm_strNetworkProvider = "TCP/IP Client";
if (_pGame->JoinGame(CNetworkSession(_pGame->gam_strJoinAddress)))
{
StopMenus();
_gmRunningGameMode = GM_NETWORK;
} else {
if (_pNetwork->ga_strRequiredMod != "") {
extern CTFileName _fnmModToLoad;
extern CTString _strModServerJoin;
char strModName[256] = { 0 };
char strModURL[256] = { 0 };
_pNetwork->ga_strRequiredMod.ScanF("%250[^\\]\\%s", &strModName, &strModURL);
_fnmModSelected = CTString(strModName);
_strModURLSelected = strModURL;
if (_strModURLSelected = "") {
_strModURLSelected = "http://www.croteam.com/mods/Old";
}
_strModServerSelected.PrintF("%s:%s", _pGame->gam_strJoinAddress, _pShell->GetValue("net_iPort"));
extern void ModConnectConfirm(void);
ModConnectConfirm();
}
_gmRunningGameMode = GM_NONE;
}
}
// -------- Servers Menu Functions
void StartSelectServerLAN(void)
{
CServersMenu &gmCurrent = _pGUIM->gmServersMenu;
gmCurrent.m_bInternet = FALSE;
ChangeToMenu(&gmCurrent);
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmNetworkJoinMenu;
}
void StartSelectServerNET(void)
{
CServersMenu &gmCurrent = _pGUIM->gmServersMenu;
gmCurrent.m_bInternet = TRUE;
ChangeToMenu(&gmCurrent);
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmNetworkJoinMenu;
}
// -------- Levels Menu Functions
void StartSelectLevelFromSingle(void)
{
CLevelsMenu &gmCurrent = _pGUIM->gmLevelsMenu;
FilterLevels(GetSpawnFlagsForGameType(-1));
_pAfterLevelChosen = StartSinglePlayerNewMenuCustom;
ChangeToMenu(&gmCurrent);
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmSinglePlayerMenu;
}
void StartSelectLevelFromSplit(void)
{
CLevelsMenu &gmCurrent = _pGUIM->gmLevelsMenu;
FilterLevels(GetSpawnFlagsForGameType(_pGUIM->gmSplitStartMenu.gm_mgGameType.mg_iSelected));
void StartSplitStartMenu(void);
_pAfterLevelChosen = StartSplitStartMenu;
ChangeToMenu(&gmCurrent);
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmSplitStartMenu;
}
void StartSelectLevelFromNetwork(void)
{
CLevelsMenu &gmCurrent = _pGUIM->gmLevelsMenu;
FilterLevels(GetSpawnFlagsForGameType(_pGUIM->gmNetworkStartMenu.gm_mgGameType.mg_iSelected));
void StartNetworkStartMenu(void);
_pAfterLevelChosen = StartNetworkStartMenu;
ChangeToMenu(&gmCurrent);
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmNetworkStartMenu;
}
// -------- Players Selection Menu Functions
void StartSelectPlayersMenuFromSplit(void)
{
CSelectPlayersMenu &gmCurrent = _pGUIM->gmSelectPlayersMenu;
gmCurrent.gm_bAllowDedicated = FALSE;
gmCurrent.gm_bAllowObserving = FALSE;
gmCurrent.gm_mgStart.mg_pActivatedFunction = &StartSplitScreenGame;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmSplitStartMenu;
ChangeToMenu(&gmCurrent);
}
void StartSelectPlayersMenuFromNetwork(void)
{
CSelectPlayersMenu &gmCurrent = _pGUIM->gmSelectPlayersMenu;
gmCurrent.gm_bAllowDedicated = TRUE;
gmCurrent.gm_bAllowObserving = TRUE;
gmCurrent.gm_mgStart.mg_pActivatedFunction = &StartNetworkGame;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmNetworkStartMenu;
ChangeToMenu(&gmCurrent);
}
void StartSelectPlayersMenuFromNetworkLoad(void)
{
CSelectPlayersMenu &gmCurrent = _pGUIM->gmSelectPlayersMenu;
gmCurrent.gm_bAllowDedicated = FALSE;
gmCurrent.gm_bAllowObserving = TRUE;
gmCurrent.gm_mgStart.mg_pActivatedFunction = &StartNetworkLoadGame;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmLoadSaveMenu;
ChangeToMenu(&gmCurrent);
}
void StartSelectPlayersMenuFromSplitScreenLoad(void)
{
CSelectPlayersMenu &gmCurrent = _pGUIM->gmSelectPlayersMenu;
gmCurrent.gm_bAllowDedicated = FALSE;
gmCurrent.gm_bAllowObserving = FALSE;
gmCurrent.gm_mgStart.mg_pActivatedFunction = &StartSplitScreenGameLoad;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmLoadSaveMenu;
ChangeToMenu(&gmCurrent);
}
void StartSelectPlayersMenuFromOpen(void)
{
CSelectPlayersMenu &gmCurrent = _pGUIM->gmSelectPlayersMenu;
gmCurrent.gm_bAllowDedicated = FALSE;
gmCurrent.gm_bAllowObserving = TRUE;
gmCurrent.gm_mgStart.mg_pActivatedFunction = &JoinNetworkGame;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmNetworkOpenMenu;
ChangeToMenu(&gmCurrent);
/*if (sam_strNetworkSettings=="")*/ {
void StartNetworkSettingsMenu(void);
StartNetworkSettingsMenu();
_pGUIM->gmLoadSaveMenu.gm_bNoEscape = TRUE;
_pGUIM->gmLoadSaveMenu.gm_pgmParentMenu = &_pGUIM->gmNetworkOpenMenu;
_pGUIM->gmLoadSaveMenu.gm_pgmNextMenu = &gmCurrent;
}
}
void StartSelectPlayersMenuFromServers(void)
{
CSelectPlayersMenu &gmCurrent = _pGUIM->gmSelectPlayersMenu;
gmCurrent.gm_bAllowDedicated = FALSE;
gmCurrent.gm_bAllowObserving = TRUE;
gmCurrent.gm_mgStart.mg_pActivatedFunction = &JoinNetworkGame;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmServersMenu;
ChangeToMenu(&gmCurrent);
/*if (sam_strNetworkSettings=="")*/ {
void StartNetworkSettingsMenu(void);
StartNetworkSettingsMenu();
_pGUIM->gmLoadSaveMenu.gm_bNoEscape = TRUE;
_pGUIM->gmLoadSaveMenu.gm_pgmParentMenu = &_pGUIM->gmServersMenu;
_pGUIM->gmLoadSaveMenu.gm_pgmNextMenu = &gmCurrent;
}
}
// -------- Save/Load Menu Calling Functions
void StartPlayerModelLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("CHOOSE MODEL");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEUP;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = FALSE;
gmCurrent.gm_fnmDirectory = CTString("Models\\Player\\");
gmCurrent.gm_fnmSelected = _strLastPlayerAppearance;
gmCurrent.gm_fnmExt = CTString(".amc");
gmCurrent.gm_pAfterFileChosen = &LSLoadPlayerModel;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmPlayerProfile;
ChangeToMenu(&gmCurrent);
}
void StartControlsLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("LOAD CONTROLS");
gmCurrent.gm_bAllowThumbnails = FALSE;
gmCurrent.gm_iSortType = LSSORT_FILEUP;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = FALSE;
gmCurrent.gm_fnmDirectory = CTString("Controls\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".ctl");
gmCurrent.gm_pAfterFileChosen = &LSLoadControls;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmControls;
ChangeToMenu(&gmCurrent);
}
void StartCustomLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("ADVANCED OPTIONS");
gmCurrent.gm_bAllowThumbnails = FALSE;
gmCurrent.gm_iSortType = LSSORT_NAMEUP;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = FALSE;
gmCurrent.gm_fnmDirectory = CTString("Scripts\\CustomOptions\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".cfg");
gmCurrent.gm_pAfterFileChosen = &LSLoadCustom;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmOptionsMenu;
ChangeToMenu(&gmCurrent);
}
void StartAddonsLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("EXECUTE ADDON");
gmCurrent.gm_bAllowThumbnails = FALSE;
gmCurrent.gm_iSortType = LSSORT_NAMEUP;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = FALSE;
gmCurrent.gm_fnmDirectory = CTString("Scripts\\Addons\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".ini");
gmCurrent.gm_pAfterFileChosen = &LSLoadAddon;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmOptionsMenu;
ChangeToMenu(&gmCurrent);
}
void StartModsLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("CHOOSE MOD");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_NAMEUP;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = FALSE;
gmCurrent.gm_fnmDirectory = CTString("Mods\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".des");
gmCurrent.gm_pAfterFileChosen = &LSLoadMod;
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmMainMenu;
ChangeToMenu(&gmCurrent);
}
void StartNetworkSettingsMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
gmCurrent.gm_mgTitle.mg_strText = TRANS("CONNECTION SETTINGS");
gmCurrent.gm_bAllowThumbnails = FALSE;
gmCurrent.gm_iSortType = LSSORT_FILEUP;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = FALSE;
gmCurrent.gm_fnmDirectory = CTString("Scripts\\NetSettings\\");
gmCurrent.gm_fnmSelected = sam_strNetworkSettings;
gmCurrent.gm_fnmExt = CTString(".ini");
gmCurrent.gm_pAfterFileChosen = &LSLoadNetSettings;
if (sam_strNetworkSettings == "") {
gmCurrent.gm_mgNotes.mg_strText = TRANS(
"Before joining a network game,\n"
"you have to adjust your connection parameters.\n"
"Choose one option from the list.\n"
"If you have problems with connection, you can adjust\n"
"these parameters again from the Options menu.\n"
);
} else {
gmCurrent.gm_mgNotes.mg_strText = "";
}
gmCurrent.gm_pgmParentMenu = &_pGUIM->gmOptionsMenu;
ChangeToMenu(&gmCurrent);
}
void StartSinglePlayerQuickLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_SINGLE_PLAYER;
gmCurrent.gm_mgTitle.mg_strText = TRANS("QUICK LOAD");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory.PrintF("SaveGame\\Player%d\\Quick\\", _pGame->gm_iSinglePlayer);
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSLoadSinglePlayer;
SetQuickLoadNotes();
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartSinglePlayerLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_SINGLE_PLAYER;
gmCurrent.gm_mgTitle.mg_strText = TRANS("LOAD");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory.PrintF("SaveGame\\Player%d\\", _pGame->gm_iSinglePlayer);
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSLoadSinglePlayer;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartSinglePlayerSaveMenu(void)
{
if (_gmRunningGameMode != GM_SINGLE_PLAYER) return;
// if no live players
if (_pGame->GetPlayersCount()>0 && _pGame->GetLivePlayersCount() <= 0) {
// do nothing
return;
}
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_SINGLE_PLAYER;
gmCurrent.gm_mgTitle.mg_strText = TRANS("SAVE");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = TRUE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory.PrintF("SaveGame\\Player%d\\", _pGame->gm_iSinglePlayer);
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmBaseName = CTString("SaveGame");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSSaveAnyGame;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_strSaveDes = _pGame->GetDefaultGameDescription(TRUE);
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartDemoLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_DEMO;
gmCurrent.gm_mgTitle.mg_strText = TRANS("PLAY DEMO");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("Demos\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".dem");
gmCurrent.gm_pAfterFileChosen = &LSLoadDemo;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartDemoSaveMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
if (_gmRunningGameMode == GM_NONE) return;
_gmMenuGameMode = GM_DEMO;
gmCurrent.gm_mgTitle.mg_strText = TRANS("RECORD DEMO");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEUP;
gmCurrent.gm_bSave = TRUE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("Demos\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmBaseName = CTString("Demo");
gmCurrent.gm_fnmExt = CTString(".dem");
gmCurrent.gm_pAfterFileChosen = &LSSaveDemo;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_strSaveDes = _pGame->GetDefaultGameDescription(FALSE);
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartNetworkQuickLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_NETWORK;
gmCurrent.gm_mgTitle.mg_strText = TRANS("QUICK LOAD");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("SaveGame\\Network\\Quick\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSLoadNetwork;
SetQuickLoadNotes();
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartNetworkLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_NETWORK;
gmCurrent.gm_mgTitle.mg_strText = TRANS("LOAD");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("SaveGame\\Network\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSLoadNetwork;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartNetworkSaveMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
if (_gmRunningGameMode != GM_NETWORK) return;
_gmMenuGameMode = GM_NETWORK;
gmCurrent.gm_mgTitle.mg_strText = TRANS("SAVE");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = TRUE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("SaveGame\\Network\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmBaseName = CTString("SaveGame");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSSaveAnyGame;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_strSaveDes = _pGame->GetDefaultGameDescription(TRUE);
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartSplitScreenQuickLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_SPLIT_SCREEN;
gmCurrent.gm_mgTitle.mg_strText = TRANS("QUICK LOAD");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("SaveGame\\SplitScreen\\Quick\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSLoadSplitScreen;
SetQuickLoadNotes();
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartSplitScreenLoadMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
_gmMenuGameMode = GM_SPLIT_SCREEN;
gmCurrent.gm_mgTitle.mg_strText = TRANS("LOAD");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = FALSE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("SaveGame\\SplitScreen\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSLoadSplitScreen;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
void StartSplitScreenSaveMenu(void)
{
CLoadSaveMenu &gmCurrent = _pGUIM->gmLoadSaveMenu;
if (_gmRunningGameMode != GM_SPLIT_SCREEN) return;
_gmMenuGameMode = GM_SPLIT_SCREEN;
gmCurrent.gm_mgTitle.mg_strText = TRANS("SAVE");
gmCurrent.gm_bAllowThumbnails = TRUE;
gmCurrent.gm_iSortType = LSSORT_FILEDN;
gmCurrent.gm_bSave = TRUE;
gmCurrent.gm_bManage = TRUE;
gmCurrent.gm_fnmDirectory = CTString("SaveGame\\SplitScreen\\");
gmCurrent.gm_fnmSelected = CTString("");
gmCurrent.gm_fnmBaseName = CTString("SaveGame");
gmCurrent.gm_fnmExt = CTString(".sav");
gmCurrent.gm_pAfterFileChosen = &LSSaveAnyGame;
gmCurrent.gm_mgNotes.mg_strText = "";
gmCurrent.gm_strSaveDes = _pGame->GetDefaultGameDescription(TRUE);
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
ChangeToMenu(&gmCurrent);
}
// -------- Disabled Menu Calling Function
void DisabledFunction(void)
{
CDisabledMenu &gmCurrent = _pGUIM->gmDisabledFunction;
gmCurrent.gm_pgmParentMenu = pgmCurrentMenu;
gmCurrent.gm_mgButton.mg_strText = TRANS("The feature is not available in this version!");
gmCurrent.gm_mgTitle.mg_strText = TRANS("DISABLED");
ChangeToMenu(&gmCurrent);
}

View File

@ -0,0 +1,80 @@
/* 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. */
#ifndef SE_INCL_MENU_STARTERS_H
#define SE_INCL_MENU_STARTERS_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
void StartVideoOptionsMenu(void);
void StartAudioOptionsMenu(void);
void StartNetworkMenu(void);
void StartNetworkJoinMenu(void);
void StartNetworkStartMenu(void);
void StartNetworkOpenMenu(void);
void StartSplitScreenMenu(void);
void StartSplitStartMenu(void);
void StartSinglePlayerNewMenuCustom(void);
void StartSinglePlayerNewMenu(void);
void StartSinglePlayerQuickLoadMenu(void);
void StartSinglePlayerLoadMenu(void);
void StartSinglePlayerSaveMenu(void);
void StartDemoLoadMenu(void);
void StartDemoSaveMenu(void);
void StartNetworkQuickLoadMenu(void);
void StartNetworkLoadMenu(void);
void StartNetworkSaveMenu(void);
void StartSplitScreenQuickLoadMenu(void);
void StartSplitScreenLoadMenu(void);
void StartSplitScreenSaveMenu(void);
void StartVarGameOptions(void);
void StartSinglePlayerGameOptions(void);
void StartGameOptionsFromNetwork(void);
void StartGameOptionsFromSplitScreen(void);
void StartRenderingOptionsMenu(void);
void StartCustomizeKeyboardMenu(void);
void StartCustomizeAxisMenu(void);
void StartOptionsMenu(void);
void StartCurrentLoadMenu();
void StartCurrentSaveMenu();
void StartCurrentQuickLoadMenu();
void StartChangePlayerMenuFromOptions(void);
void StartChangePlayerMenuFromSinglePlayer(void);
void StartControlsMenuFromPlayer(void);
void StartControlsMenuFromOptions(void);
void StartSelectLevelFromSingle(void);
void StartHighScoreMenu(void);
void StartSelectPlayersMenuFromSplit(void);
void StartSelectPlayersMenuFromNetwork(void);
void StartSelectPlayersMenuFromOpen(void);
void StartSelectPlayersMenuFromServers(void);
void StartSelectServerLAN(void);
void StartSelectServerNET(void);
void StartSelectLevelFromSplit(void);
void StartSelectLevelFromNetwork(void);
void StartSelectPlayersMenuFromSplitScreen(void);
void StartSelectPlayersMenuFromNetworkLoad(void);
void StartSelectPlayersMenuFromSplitScreenLoad(void);
void StartPlayerModelLoadMenu(void);
void StartControlsLoadMenu(void);
void StartCustomLoadMenu(void);
void StartAddonsLoadMenu(void);
void StartModsLoadMenu(void);
void StartNetworkSettingsMenu(void);
void StartSinglePlayerMenu(void);
void DisabledFunction(void);
#endif /* include-once check. */

View File

@ -0,0 +1,229 @@
/* 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. */
/* This file contains additional functions called from starters. */
#include "StdH.h"
#include <Engine/Build.h>
#include "MenuManager.h"
#include "MenuStartersAF.h"
#include "MenuStarters.h"
#include "MenuStuff.h"
static CTFileName _fnDemoToPlay;
static CTFileName _fnGameToLoad;
extern CTString sam_strNetworkSettings;
extern CTFileName _fnmModSelected;
extern CTString _strModURLSelected;
extern CTString _strModServerSelected;
BOOL LSLoadSinglePlayer(const CTFileName &fnm)
{
_pGame->gm_StartSplitScreenCfg = CGame::SSC_PLAY1;
_pGame->gm_aiStartLocalPlayers[0] = _pGame->gm_iSinglePlayer;
_pGame->gm_aiStartLocalPlayers[1] = -1;
_pGame->gm_aiStartLocalPlayers[2] = -1;
_pGame->gm_aiStartLocalPlayers[3] = -1;
_pGame->gm_strNetworkProvider = "Local";
if (_pGame->LoadGame(fnm)) {
StopMenus();
_gmRunningGameMode = GM_SINGLE_PLAYER;
}
else {
_gmRunningGameMode = GM_NONE;
}
return TRUE;
}
BOOL LSLoadNetwork(const CTFileName &fnm)
{
// call local players menu
_fnGameToLoad = fnm;
StartSelectPlayersMenuFromNetworkLoad();
return TRUE;
}
BOOL LSLoadSplitScreen(const CTFileName &fnm)
{
// call local players menu
_fnGameToLoad = fnm;
StartSelectPlayersMenuFromSplitScreenLoad();
return TRUE;
}
void StartDemoPlay(void)
{
_pGame->gm_StartSplitScreenCfg = CGame::SSC_OBSERVER;
// play the demo
_pGame->gm_strNetworkProvider = "Local";
if (_pGame->StartDemoPlay(_fnDemoToPlay))
{
// exit menu and pull up the console
StopMenus();
if (_pGame->gm_csConsoleState != CS_OFF) _pGame->gm_csConsoleState = CS_TURNINGOFF;
_gmRunningGameMode = GM_DEMO;
}
else {
_gmRunningGameMode = GM_NONE;
}
}
extern BOOL LSLoadDemo(const CTFileName &fnm)
{
// call local players menu
_fnDemoToPlay = fnm;
StartDemoPlay();
return TRUE;
}
BOOL LSLoadPlayerModel(const CTFileName &fnm)
{
// get base filename
CTString strBaseName = fnm.FileName();
// set it for current player
CPlayerCharacter &pc = _pGame->gm_apcPlayers[*_pGUIM->gmPlayerProfile.gm_piCurrentPlayer];
CPlayerSettings *pps = (CPlayerSettings *)pc.pc_aubAppearance;
memset(pps->ps_achModelFile, 0, sizeof(pps->ps_achModelFile));
strncpy(pps->ps_achModelFile, strBaseName, sizeof(pps->ps_achModelFile));
void MenuGoToParent(void);
MenuGoToParent();
return TRUE;
}
BOOL LSLoadControls(const CTFileName &fnm)
{
try {
ControlsMenuOn();
_pGame->gm_ctrlControlsExtra.Load_t(fnm);
ControlsMenuOff();
}
catch (char *strError) {
CPrintF("%s", strError);
}
void MenuGoToParent(void);
MenuGoToParent();
return TRUE;
}
BOOL LSLoadAddon(const CTFileName &fnm)
{
extern INDEX _iAddonExecState;
extern CTFileName _fnmAddonToExec;
_iAddonExecState = 1;
_fnmAddonToExec = fnm;
return TRUE;
}
BOOL LSLoadMod(const CTFileName &fnm)
{
_fnmModSelected = fnm;
extern void ModConfirm(void);
ModConfirm();
return TRUE;
}
BOOL LSLoadCustom(const CTFileName &fnm)
{
_pGUIM->gmVarMenu.gm_mgTitle.mg_strText = TRANS("ADVANCED OPTIONS");
// LoadStringVar(fnm.NoExt()+".des", mgVarTitle.mg_strText);
// mgVarTitle.mg_strText.OnlyFirstLine();
_pGUIM->gmVarMenu.gm_fnmMenuCFG = fnm;
_pGUIM->gmVarMenu.gm_pgmParentMenu = &_pGUIM->gmLoadSaveMenu;
ChangeToMenu(&_pGUIM->gmVarMenu);
return TRUE;
}
BOOL LSLoadNetSettings(const CTFileName &fnm)
{
sam_strNetworkSettings = fnm;
CTString strCmd;
strCmd.PrintF("include \"%s\"", (const char*)sam_strNetworkSettings);
_pShell->Execute(strCmd);
void MenuGoToParent(void);
MenuGoToParent();
return TRUE;
}
// same function for saving in singleplay, network and splitscreen
BOOL LSSaveAnyGame(const CTFileName &fnm)
{
if (_pGame->SaveGame(fnm)) {
StopMenus();
return TRUE;
}
else {
return FALSE;
}
}
BOOL LSSaveDemo(const CTFileName &fnm)
{
// save the demo
if (_pGame->StartDemoRec(fnm)) {
StopMenus();
return TRUE;
}
else {
return FALSE;
}
}
void StartNetworkLoadGame(void)
{
// _pGame->gm_MenuSplitScreenCfg = (enum CGame::SplitScreenCfg) mgSplitScreenCfg.mg_iSelected;
_pGame->gm_StartSplitScreenCfg = _pGame->gm_MenuSplitScreenCfg;
_pGame->gm_aiStartLocalPlayers[0] = _pGame->gm_aiMenuLocalPlayers[0];
_pGame->gm_aiStartLocalPlayers[1] = _pGame->gm_aiMenuLocalPlayers[1];
_pGame->gm_aiStartLocalPlayers[2] = _pGame->gm_aiMenuLocalPlayers[2];
_pGame->gm_aiStartLocalPlayers[3] = _pGame->gm_aiMenuLocalPlayers[3];
_pGame->gm_strNetworkProvider = "TCP/IP Server";
if (_pGame->LoadGame(_fnGameToLoad))
{
StopMenus();
_gmRunningGameMode = GM_NETWORK;
}
else {
_gmRunningGameMode = GM_NONE;
}
}
void StartSplitScreenGameLoad(void)
{
// _pGame->gm_MenuSplitScreenCfg = (enum CGame::SplitScreenCfg) mgSplitScreenCfg.mg_iSelected;
_pGame->gm_StartSplitScreenCfg = _pGame->gm_MenuSplitScreenCfg;
_pGame->gm_aiStartLocalPlayers[0] = _pGame->gm_aiMenuLocalPlayers[0];
_pGame->gm_aiStartLocalPlayers[1] = _pGame->gm_aiMenuLocalPlayers[1];
_pGame->gm_aiStartLocalPlayers[2] = _pGame->gm_aiMenuLocalPlayers[2];
_pGame->gm_aiStartLocalPlayers[3] = _pGame->gm_aiMenuLocalPlayers[3];
_pGame->gm_strNetworkProvider = "Local";
if (_pGame->LoadGame(_fnGameToLoad)) {
StopMenus();
_gmRunningGameMode = GM_SPLIT_SCREEN;
}
else {
_gmRunningGameMode = GM_NONE;
}
}

View File

@ -0,0 +1,38 @@
/* 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. */
#ifndef SE_INCL_MENU_STARTERSAF_H
#define SE_INCL_MENU_STARTERSAF_H
#ifdef PRAGMA_ONCE
#pragma once
#endif
BOOL LSLoadSinglePlayer(const CTFileName &fnm);
BOOL LSLoadNetwork(const CTFileName &fnm);
BOOL LSLoadSplitScreen(const CTFileName &fnm);
BOOL LSLoadDemo(const CTFileName &fnm);
BOOL LSLoadPlayerModel(const CTFileName &fnm);
BOOL LSLoadControls(const CTFileName &fnm);
BOOL LSLoadAddon(const CTFileName &fnm);
BOOL LSLoadMod(const CTFileName &fnm);
BOOL LSLoadCustom(const CTFileName &fnm);
BOOL LSLoadNetSettings(const CTFileName &fnm);
BOOL LSSaveAnyGame(const CTFileName &fnm);
BOOL LSSaveDemo(const CTFileName &fnm);
void StartDemoPlay(void);
void StartNetworkLoadGame(void);
void StartSplitScreenGameLoad(void);
#endif /* include-once check. */

Some files were not shown because too many files have changed in this diff Show More