/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** 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, see .
*/
////////////////////////////////////////////////////////////////////////////////
// //
// (c) 2001-2003 Electronic Arts Inc. //
// //
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
// FILE: SkirmishGameOptionsMenu.cpp
// Author: Chris Brue, August 2002
// Description: Lan Game Options Menu
///////////////////////////////////////////////////////////////////////////////////////
#include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
#include "Common/BattleHonors.h"
#include "Common/FileSystem.h"
#include "Common/GameEngine.h"
#include "Common/PlayerTemplate.h"
#include "Common/QuotedPrintable.h"
#include "Common/RandomValue.h"
#include "Common/SkirmishBattleHonors.h"
#include "Common/SkirmishPreferences.h"
#include "GameLogic/GameLogic.h"
#include "GameClient/AnimateWindowManager.h"
#include "GameClient/WindowLayout.h"
#include "GameClient/Gadget.h"
#include "GameClient/Shell.h"
#include "GameClient/ShellHooks.h"
#include "GameClient/KeyDefs.h"
#include "GameClient/GameWindowManager.h"
#include "GameClient/GadgetListBox.h"
#include "GameClient/GadgetCheckBox.h"
#include "GameClient/GadgetComboBox.h"
#include "GameClient/GadgetTextEntry.h"
#include "GameClient/GadgetPushButton.h"
#include "GameClient/GadgetSlider.h"
#include "GameClient/GadgetStaticText.h"
#include "GameClient/MapUtil.h"
#include "GameClient/Mouse.h"
#include "GameClient/GameWindowTransitions.h"
#include "GameNetwork/GameSpy/LobbyUtils.h"
#include "Common/MultiplayerSettings.h"
#include "GameClient/GameText.h"
#include "GameClient/CDCheck.h"
#include "GameClient/ExtendedMessageBox.h"
#include "GameClient/MessageBox.h"
#include "GameNetwork/GameInfo.h"
#include "GameNetwork/GUIUtil.h"
#include "GameNetwork/IPEnumeration.h"
#include "WWDownload/Registry.h"
#ifdef _INTERNAL
// for occasional debugging...
//#pragma optimize("", off)
//#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes")
#endif
SkirmishGameInfo *TheSkirmishGameInfo = NULL;
// window ids ------------------------------------------------------------------------------
static NameKeyType parentSkirmishGameOptionsID = NAMEKEY_INVALID;
static NameKeyType textEntryPlayerNameID = NAMEKEY_INVALID;
static NameKeyType comboBoxPlayerID[MAX_SLOTS] = { NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID };
static NameKeyType comboBoxColorID[MAX_SLOTS] = { NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID };
static NameKeyType comboBoxPlayerTemplateID[MAX_SLOTS] = { NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID };
static NameKeyType comboBoxTeamID[MAX_SLOTS] = { NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID };
//static NameKeyType buttonStartPositionID[MAX_SLOTS] = { NAMEKEY_INVALID,NAMEKEY_INVALID,
// NAMEKEY_INVALID,NAMEKEY_INVALID,
// NAMEKEY_INVALID,NAMEKEY_INVALID,
// NAMEKEY_INVALID,NAMEKEY_INVALID };
static NameKeyType buttonMapStartPositionID[MAX_SLOTS] = { NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID,
NAMEKEY_INVALID,NAMEKEY_INVALID };
static NameKeyType textEntryMapDisplayID = NAMEKEY_INVALID;
static NameKeyType buttonExitID = NAMEKEY_INVALID;
static NameKeyType buttonStartID = NAMEKEY_INVALID;
static NameKeyType buttonSelectMapID = NAMEKEY_INVALID;
static NameKeyType buttonResetID = NAMEKEY_INVALID;
static NameKeyType windowMapID = NAMEKEY_INVALID;
static NameKeyType sliderGameSpeedID = NAMEKEY_INVALID;
static NameKeyType staticTextGameSpeedID = NAMEKEY_INVALID;
static NameKeyType checkBoxLimitSuperweaponsID = NAMEKEY_INVALID;
static NameKeyType comboBoxStartingCashID = NAMEKEY_INVALID;
// Window Pointers ------------------------------------------------------------------------
static GameWindow *staticTextGameSpeed = NULL;
static GameWindow *parentSkirmishGameOptions = NULL;
static GameWindow *buttonExit = NULL;
static GameWindow *buttonStart = NULL;
static GameWindow *buttonSelectMap = NULL;
static GameWindow *textEntryMapDisplay = NULL;
static GameWindow *buttonReset = NULL;
static GameWindow *windowMap = NULL;
static GameWindow *textEntryPlayerName = NULL;
static GameWindow *checkBoxLimitSuperweapons = NULL;
static GameWindow *comboBoxStartingCash = NULL;
static GameWindow *comboBoxPlayer[MAX_SLOTS] = {NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL };
static GameWindow *comboBoxColor[MAX_SLOTS] = {NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL };
static GameWindow *comboBoxPlayerTemplate[MAX_SLOTS] = {NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL };
static GameWindow *comboBoxTeam[MAX_SLOTS] = {NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL };
//static GameWindow *buttonStartPosition[MAX_SLOTS] = {NULL,NULL,NULL,NULL,
// NULL,NULL,NULL,NULL };
//
static GameWindow *buttonMapStartPosition[MAX_SLOTS] = {NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL };
//external declarations of the Gadgets the callbacks can use
WindowLayout *skirmishMapSelectLayout = NULL;
static Int initialGadgetDelay = 2;
static Bool justEntered = FALSE;
static Bool buttonPushed = FALSE;
static Bool stillNeedsToSetOptions = FALSE;
void skirmishUpdateSlotList( void );
static void populateSkirmishBattleHonors( void );
enum{ GREATER_NO_FPS_LIMIT = 60};
Bool doUpdateSlotList = TRUE;
static Int getNextSelectablePlayer(Int start)
{
if (!TheSkirmishGameInfo->amIHost())
return -1;
for (Int j=start; jgetSlot(j);
if (slot && slot->getStartPos() == -1 && (j==TheSkirmishGameInfo->getLocalSlotNum() || slot->isAI()))
{
return j;
}
}
return -1;
}
SkirmishPreferences::SkirmishPreferences( void )
{
// note, the superclass will put this in the right dir automatically, this is just a leaf name
load("Skirmish.ini");
}
SkirmishPreferences::~SkirmishPreferences()
{
}
AsciiString SkirmishPreferences::getSlotList(void)
{
return getAsciiString("SlotList", AsciiString::TheEmptyString);
}
void SkirmishPreferences::setSlotList(void)
{
setAsciiString("SlotList", GameInfoToAsciiString(TheSkirmishGameInfo));
}
UnicodeString SkirmishPreferences::getUserName(void)
{
UnicodeString ret;
SkirmishPreferences::const_iterator it = find("UserName");
if (it == end())
{
IPEnumeration IPs;
ret.translate(IPs.getMachineName());
return ret;
}
ret = QuotedPrintableToUnicodeString(it->second);
ret.trim();
if (ret.isEmpty())
{
IPEnumeration IPs;
ret.translate(IPs.getMachineName());
return ret;
}
return ret;
}
Int SkirmishPreferences::getPreferredColor(void)
{
Int ret;
SkirmishPreferences::const_iterator it = find("Color");
if (it == end())
{
return -1;
}
ret = atoi(it->second.str());
if (ret < -1 || ret >= TheMultiplayerSettings->getNumColors())
ret = -1;
return ret;
}
Int SkirmishPreferences::getPreferredFaction(void)
{
Int ret;
SkirmishPreferences::const_iterator it = find("PlayerTemplate");
if (it == end())
{
return PLAYERTEMPLATE_RANDOM;
}
ret = atoi(it->second.str());
if (ret < PLAYERTEMPLATE_MIN || ret >= ThePlayerTemplateStore->getPlayerTemplateCount())
ret = PLAYERTEMPLATE_RANDOM;
if (ret >= 0)
{
const PlayerTemplate *fac = ThePlayerTemplateStore->getNthPlayerTemplate(ret);
if (!fac)
ret = PLAYERTEMPLATE_RANDOM;
else if (fac->getStartingBuilding().isEmpty())
ret = PLAYERTEMPLATE_RANDOM;
}
return ret;
}
Bool SkirmishPreferences::usesSystemMapDir(void)
{
OptionPreferences::const_iterator it = find("UseSystemMapDir");
if (it == end())
return TRUE;
if (stricmp(it->second.str(), "yes") == 0) {
return TRUE;
}
return FALSE;
}
AsciiString SkirmishPreferences::getPreferredMap(void)
{
AsciiString ret;
SkirmishPreferences::const_iterator it = find("Map");
if (it == end())
{
ret = getDefaultMap(TRUE);
return ret;
}
ret = QuotedPrintableToAsciiString(it->second);
ret.trim();
if (ret.isEmpty() || !isValidMap(ret, TRUE))
{
ret = getDefaultMap(TRUE);
return ret;
}
return ret;
}
static const char superweaponRestrictionKey[] = "SuperweaponRestrict";
Bool SkirmishPreferences::getSuperweaponRestricted(void) const
{
const_iterator it = find(superweaponRestrictionKey);
if (it == end())
{
return false;
}
return ( it->second.compareNoCase( "yes" ) == 0 );
}
void SkirmishPreferences::setSuperweaponRestricted( Bool superweaponRestricted )
{
(*this)[superweaponRestrictionKey] = superweaponRestricted ? "Yes" : "No";
}
static const char startingCashKey[] = "StartingCash";
Money SkirmishPreferences::getStartingCash(void) const
{
const_iterator it = find(startingCashKey);
if (it == end())
{
return TheMultiplayerSettings->getDefaultStartingMoney();
}
Money money;
money.deposit( strtoul( it->second.str(), NULL, 10 ), FALSE );
return money;
}
void SkirmishPreferences::setStartingCash( const Money & startingCash )
{
AsciiString option;
option.format( "%d", startingCash.countMoney() );
(*this)[startingCashKey] = option;
}
Bool SkirmishPreferences::write(void)
{
if (!TheSkirmishGameInfo)
return FALSE;
AsciiString tmp;
tmp.format("%d", TheSkirmishGameInfo->getConstSlot(0)->getColor());
(*this)["Color"] = tmp;
tmp.format("%d", TheSkirmishGameInfo->getConstSlot(0)->getPlayerTemplate());
(*this)["PlayerTemplate"] = tmp;
(*this)["Map"] = TheSkirmishGameInfo->getMap();
(*this)["UserName"] = UnicodeStringToQuotedPrintable(TheSkirmishGameInfo->getConstSlot(0)->getName());
setStartingCash( TheSkirmishGameInfo->getStartingCash() );
setSuperweaponRestricted( TheSkirmishGameInfo->getSuperweaponRestriction() != 0 );
setSlotList();
// NameKeyType sliderGameSpeedID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:SliderGameSpeed" ) );
GameWindow *sliderGameSpeed = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, sliderGameSpeedID );
Int maxFPS = GadgetSliderGetPosition( sliderGameSpeed );
setInt("FPS", maxFPS);
return UserPreferences::write();
}
/*
static void playerTooltip(GameWindow *window,
WinInstanceData *instData,
UnsignedInt mouse)
{
Int idx = -1;
for (Int i=1; ifetch("TOOLTIP:LANPlayer") );
TheMouse->setCursorTooltip( tooltip );
}
*/
void setFPSTextBox( Int sliderPos )
{
if(!staticTextGameSpeed)
return;
UnicodeString text;
staticTextGameSpeed->winEnable(TRUE);
if(sliderPos > GREATER_NO_FPS_LIMIT)
{
// set static text to --
text.set(L"--");
GadgetStaticTextSetText(staticTextGameSpeed, text);
return;
}
else if( sliderPos == TheGlobalData->m_framesPerSecondLimit )
{
// set different color
staticTextGameSpeed->winEnable(FALSE);
}
text.format(L"%2d", sliderPos);
GadgetStaticTextSetText(staticTextGameSpeed, text);
}
void reallyDoStart( void )
{
if (TheGameLogic->isInGame())
TheGameLogic->clearGameData(FALSE);
//NameKeyType sliderGameSpeedID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:SliderGameSpeed" ) );
GameWindow *sliderGameSpeed = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, sliderGameSpeedID );
Int maxFPS = GadgetSliderGetPosition( sliderGameSpeed );
DEBUG_LOG(("GameSpeedSlider was at %d\n", maxFPS));
if (maxFPS > GREATER_NO_FPS_LIMIT)
maxFPS = 1000;
if (maxFPS < 15)
maxFPS = 15;
TheWritableGlobalData->m_mapName = TheSkirmishGameInfo->getMap();
TheSkirmishGameInfo->startGame(0);
InitGameLogicRandom(TheSkirmishGameInfo->getSeed());
Bool isSkirmish = TRUE;
const MapMetaData *md = TheMapCache->findMap(TheSkirmishGameInfo->getMap());
if (md)
{
isSkirmish = md->m_isMultiplayer; // we can now select solo campaign maps in Skirmish.
}
if (isSkirmish)
{
GameMessage *msg = TheMessageStream->appendMessage( GameMessage::MSG_NEW_GAME );
msg->appendIntegerArgument(GAME_SKIRMISH);
msg->appendIntegerArgument(DIFFICULTY_NORMAL); // not really used; just specified so we can add the game speed last
msg->appendIntegerArgument(0); // not really used; just specified so we can add the game speed last
msg->appendIntegerArgument(maxFPS); // FPS limit
}
else
{
GameMessage *msg = TheMessageStream->appendMessage( GameMessage::MSG_NEW_GAME );
msg->appendIntegerArgument(GAME_SINGLE_PLAYER);
msg->appendIntegerArgument(DIFFICULTY_NORMAL); // not really used; just specified so we can add the game speed last
msg->appendIntegerArgument(0); // not really used; just specified so we can add the game speed last
msg->appendIntegerArgument(maxFPS); // FPS limit
}
}
static MessageBoxReturnType cancelStartBecauseOfNoCD( void *userData )
{
buttonPushed = FALSE;
return MB_RETURN_CLOSE;
}
Bool IsFirstCDPresent(void)
{
#if !defined(_INTERNAL) && !defined(_DEBUG)
return TheFileSystem->areMusicFilesOnCD();
#else
return TRUE;
#endif
}
static MessageBoxReturnType checkCDCallback( void *userData )
{
if (!IsFirstCDPresent())
{
return (IsFirstCDPresent())?MB_RETURN_CLOSE:MB_RETURN_KEEPOPEN;
}
else
{
gameStartCallback callback = (gameStartCallback)userData;
if (callback)
callback();
return MB_RETURN_CLOSE;
}
}
void CheckForCDAtGameStart( gameStartCallback callback )
{
if (!IsFirstCDPresent())
{
// popup a dialog asking for a CD
ExMessageBoxOkCancel(TheGameText->fetch("GUI:InsertCDPrompt"), TheGameText->fetch("GUI:InsertCDMessage"),
callback, checkCDCallback, cancelStartBecauseOfNoCD);
}
else
{
callback();
}
}
Bool sandboxOk = FALSE;
static void startPressed(void)
{
BOOL isReady = FALSE;
Int playerCount = TheSkirmishGameInfo->getNumPlayers();
AsciiString lowerMap = TheSkirmishGameInfo->getMap();
lowerMap.toLower();
std::map::iterator it = TheMapCache->find(lowerMap);
if (it == TheMapCache->end())
{
buttonPushed = FALSE;
MessageBoxOk(TheGameText->fetch("GUI:ErrorStartingGame"), TheGameText->fetch("GUI:CantFindMap"), NULL);
}
MapMetaData mmd = it->second;
if(playerCount > mmd.m_numPlayers)
{
buttonPushed = FALSE;
UnicodeString msg;
msg.format(TheGameText->fetch("GUI:TooManyPlayers"), mmd.m_numPlayers);
MessageBoxOk(TheGameText->fetch("GUI:ErrorStartingGame"), msg, NULL);
}
/*
else if (playerCount < 2 && !sandboxOk)
{
sandboxOk = TRUE;
MessageBoxOk(TheGameText->fetch("GUI:ErrorStartingGame"), TheGameText->fetch("GUI:SandboxWarning"), NULL);
}
*/
else
{
isReady = TRUE;
}
if(isReady)
{
CheckForCDAtGameStart( reallyDoStart );
}
}//void startPressed(void)
/////////////////////////////////////////////////////
// MapSelectorTooltip - shows tooltips for the tech buildings
// and supply depots
// Added By : Sadullah Nader
/////////////////////////////////////////////////////
void MapSelectorTooltip(GameWindow *window,
WinInstanceData *instData,
UnsignedInt mouse)
{
Int x, y;
x = LOLONGTOSHORT(mouse);
y = HILONGTOSHORT(mouse);
Int pixelX, pixelY;
window->winGetScreenPosition(&pixelX, &pixelY);
const Image *image = TheMappedImageCollection->findImageByName("TecBuilding");
const Image *image2 = TheMappedImageCollection->findImageByName("Cash");
ICoord2DList::iterator it = TheSupplyAndTechImageLocations.m_techPosList.begin();
ICoord2DList::iterator it2 = TheSupplyAndTechImageLocations.m_supplyPosList.begin();
if( image )
{
// Check to see if we mouse over a tech building
while(it != TheSupplyAndTechImageLocations.m_techPosList.end())
{
if ((x > (pixelX + it->x) && x < (pixelX + it->x + SUPPLY_TECH_SIZE))
&& ( y > (pixelY + it->y) && y < (pixelY + it->y + SUPPLY_TECH_SIZE)))
{
TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:TechBuilding"), -1, NULL); //, 1.5f
return;
}
it++;
}
}
if (image2)
{
// Check to see if we mouse over a supply dock
while (it2 != TheSupplyAndTechImageLocations.m_supplyPosList.end())
{
if ((x > (pixelX + it2->x) && x < (pixelX + it2->x + SUPPLY_TECH_SIZE))
&& ( y > (pixelY + it2->y) && y < (pixelY + it2->y + SUPPLY_TECH_SIZE)))
{
TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:SupplyDock"), -1, NULL); // , 1.5f
break;
}
it2++;
}
}
}
void positionStartSpotControls( GameWindow *win, GameWindow *mapWindow, Coord3D *pos, MapMetaData *mmd, GameWindow *buttonMapStartPositions[])
{
if(!win || !mmd || !mapWindow || !buttonMapStartPositions)
return;
DEBUG_ASSERTCRASH(win && mmd,("positionStartSpotControls:: we don't have a window to position or any mapmetadata"));
ICoord2D winMapSize, winMapPos, gadgetPos, gadgetSize;
mapWindow->winGetSize(&winMapSize.x, &winMapSize.y);
mapWindow->winGetScreenPosition(&winMapPos.x, &winMapPos.y);
win->winGetSize(&gadgetSize.x, &gadgetSize.y);
ICoord2D ul, lr;
findDrawPositions(0,0, winMapSize.x, winMapSize.y,mmd->m_extent, &ul, &lr);
Int smallWidth = lr.x - ul.x;
Int smallHeight= lr.y - ul.y;
// When we actually draw the map, save off it's screen position and use that instead of the map window's position/size
Real position;
position = (pos->x - mmd->m_extent.lo.x) / (mmd->m_extent.hi.x - mmd->m_extent.lo.x);
gadgetPos.x = (position * smallWidth) - gadgetSize.x /2 + ul.x;// + winMapPos.x;
position = (pos->y - mmd->m_extent.lo.y) / (mmd->m_extent.hi.y - mmd->m_extent.lo.y);
gadgetPos.y = ((1- position) * smallHeight) - gadgetSize.y /2 + ul.y;// + winMapPos.y;
// loop through and make sure we're not on top of anyone else
for(Int i = 0; i < MAX_SLOTS; ++i)
{
if(buttonMapStartPositions[i] == win)
break;
ICoord2D tempPos;
buttonMapStartPositions[i]->winGetScreenPosition(&tempPos.x, &tempPos.y);
// we're inside the other gadget
if(gadgetPos.x > tempPos.x && gadgetPos.x < tempPos.x + gadgetSize.x
&& gadgetPos.y > tempPos.y && gadgetPos.y < tempPos.y + gadgetSize.y)
{
Int closerRight = tempPos.x + gadgetSize.x - gadgetPos.x;
Int closerBottom = tempPos.y + gadgetSize.y - gadgetPos.y;
// we're closer to the right then the bottom
if( closerRight < closerBottom)
gadgetPos.x = tempPos.x + gadgetSize.x + 1;
else if( closerBottom < closerRight)
gadgetPos.y = tempPos.y + gadgetSize.y + 1;
else
{
gadgetPos.x = tempPos.x + gadgetSize.x + 1;
gadgetPos.y = tempPos.y + gadgetSize.y + 1;
}
}
}
win->winSetPosition(gadgetPos.x,gadgetPos.y);
}
TechAndSupplyImages TheSupplyAndTechImageLocations;
void positionAdditionalImages( MapMetaData *mmd, GameWindow *mapWindow, Bool force)
{
TheSupplyAndTechImageLocations.m_supplyPosList.clear();
TheSupplyAndTechImageLocations.m_techPosList.clear();
if( !mmd || !mapWindow || mapWindow->winIsHidden())
return;
static MapMetaData *prevMMD = NULL;
if(force)
prevMMD = NULL;
// we already populated the supply and tech image locations.
if(mmd == prevMMD)
return;
ICoord2D winMapSize, winMapPos;
mapWindow->winGetSize(&winMapSize.x, &winMapSize.y);
mapWindow->winGetScreenPosition(&winMapPos.x, &winMapPos.y);
//SUPPLY_TECH_SIZE
ICoord2D ul, lr;
findDrawPositions(0,0, winMapSize.x, winMapSize.y,mmd->m_extent, &ul, &lr);
Int smallWidth = lr.x - ul.x;
Int smallHeight= lr.y - ul.y;
Coord3DList::iterator it = mmd->m_supplyPositions.begin();
// loop through and make sure we're not on top of anyone else
while( it != mmd->m_supplyPositions.end())
{
ICoord2D markerPos;
// When we actually draw the map, save off it's screen position and use that instead of the map window's position/size
Real position;
position = (it->x - mmd->m_extent.lo.x) / (mmd->m_extent.hi.x - mmd->m_extent.lo.x);
markerPos.x = (position * smallWidth) - SUPPLY_TECH_SIZE /2 + ul.x;// + winMapPos.x;
position = (it->y - mmd->m_extent.lo.y) / (mmd->m_extent.hi.y - mmd->m_extent.lo.y);
markerPos.y = ((1- position) * smallHeight) - SUPPLY_TECH_SIZE /2 + ul.y;// + winMapPos.y;
TheSupplyAndTechImageLocations.m_supplyPosList.push_front(markerPos);
it++;
}
it = mmd->m_techPositions.begin();
// loop through and make sure we're not on top of anyone else
while( it != mmd->m_techPositions.end())
{
ICoord2D markerPos;
// When we actually draw the map, save off it's screen position and use that instead of the map window's position/size
Real position;
position = (it->x - mmd->m_extent.lo.x) / (mmd->m_extent.hi.x - mmd->m_extent.lo.x);
markerPos.x = (position * smallWidth) - SUPPLY_TECH_SIZE /2 + ul.x;// + winMapPos.x;
position = (it->y - mmd->m_extent.lo.y) / (mmd->m_extent.hi.y - mmd->m_extent.lo.y);
markerPos.y = ((1- position) * smallHeight) - SUPPLY_TECH_SIZE /2 + ul.y;// + winMapPos.y;
TheSupplyAndTechImageLocations.m_techPosList.push_front(markerPos);
it++;
}
//TheSupplyAndTechImageLocations
}
void positionStartSpots( AsciiString mapName, GameWindow *buttonMapStartPositions[], GameWindow *mapWindow)
{
AsciiString lowerMap = mapName;
lowerMap.toLower();
std::map::iterator it = TheMapCache->find(lowerMap);
if (it == TheMapCache->end())
{
mapWindow->winSetUserData(NULL);
static const Image *unknownImage = NULL;
if (!unknownImage)
unknownImage = TheMappedImageCollection->findImageByName("UnknownMap");
if (unknownImage)
{
mapWindow->winSetStatus(WIN_STATUS_IMAGE);
mapWindow->winSetEnabledImage(0, unknownImage);
}
else
{
mapWindow->winClearStatus(WIN_STATUS_IMAGE);
}
positionAdditionalImages(NULL, mapWindow, TRUE);
for (Int i = 0; i < MAX_SLOTS; ++i)
{
if (buttonMapStartPositions[i] != NULL)
{
buttonMapStartPositions[i]->winHide(TRUE);
}
}
}
else
{
MapMetaData mmd = it->second;
Image *image = getMapPreviewImage(mapName);
if (mapWindow != NULL) {
mapWindow->winSetUserData((void *)TheMapCache->findMap(mapName));
if(image)
{
mapWindow->winSetStatus(WIN_STATUS_IMAGE);
mapWindow->winSetEnabledImage(0, image);
}
else
{
static const Image *unknownImage = NULL;
if (!unknownImage)
unknownImage = TheMappedImageCollection->findImageByName("UnknownMap");
if (unknownImage)
{
mapWindow->winSetStatus(WIN_STATUS_IMAGE);
mapWindow->winSetEnabledImage(0, unknownImage);
}
else
{
mapWindow->winClearStatus(WIN_STATUS_IMAGE);
}
}
}
positionAdditionalImages(&mmd, mapWindow, TRUE);
AsciiString waypointName;
for(Int i = 0; i < mmd.m_numPlayers && mmd.m_isMultiplayer; ++i )
{
waypointName.format("Player_%d_Start", i+1); // start pos waypoints are 1-based
WaypointMap::iterator wmIt = mmd.m_waypoints.find(waypointName);
if( wmIt != mmd.m_waypoints.end())
{
Coord3D *pos = &wmIt->second;
positionStartSpotControls(buttonMapStartPositions[i], mapWindow,pos, &mmd, buttonMapStartPositions);
if (buttonMapStartPositions[i] != NULL)
{
buttonMapStartPositions[i]->winHide(FALSE);
}
}
else
{
DEBUG_ASSERTCRASH(FALSE,("positionStartSpots:: someone messed with the map cash. We couldn't find waypoint <%s> in map <%s>", waypointName.str(),lowerMap.str()));
}
}
// hide the rest
for (; i < MAX_SLOTS; ++i)
{
if (buttonMapStartPositions[i] != NULL)
{
buttonMapStartPositions[i]->winHide(TRUE);
}
}
}
}
void positionStartSpots( GameInfo *myGame, GameWindow *buttonMapStartPositions[], GameWindow *mapWindow)
{
AsciiString localMapFname = myGame->getMap();
if (!myGame->isGameInProgress())
{
Int localIdx = myGame->getLocalSlotNum();
if (localIdx == -1)
localMapFname = AsciiString::TheEmptyString;
else
{
if (!myGame->getConstSlot(localIdx)->hasMap())
{
localMapFname = AsciiString::TheEmptyString;
}
}
}
positionStartSpots(localMapFname, buttonMapStartPositions, mapWindow);
}
void updateMapStartSpots( GameInfo *myGame, GameWindow *buttonMapStartPositions[], Bool onLoadScreen )
{
AsciiString lowerMap = myGame->getMap();
lowerMap.toLower();
std::map::iterator it = TheMapCache->find(lowerMap);
if (it == TheMapCache->end())
{
for (Int i = 0; i < MAX_SLOTS; ++i)
{
if ( buttonMapStartPositions[i] != NULL )
{
buttonMapStartPositions[i]->winHide(TRUE);
}
}
return;
}
MapMetaData mmd = it->second;
for(Int i = 0; i < MAX_SLOTS; ++i)
{
if ( buttonMapStartPositions[i] != NULL )
{
GadgetButtonSetText(buttonMapStartPositions[i], UnicodeString::TheEmptyString);
if (!onLoadScreen)
{
buttonMapStartPositions[i]->winSetTooltip(TheGameText->fetch("TOOLTIP:StartPosition"));
}
}
}
for( i = 0; i < MAX_SLOTS; ++i)
{
if ( buttonMapStartPositions[i] == NULL )
continue;
GameSlot *gs =myGame->getSlot(i);
if(onLoadScreen)
{
if(gs->getApparentStartPos() >=0 && gs->getApparentStartPos() < mmd.m_numPlayers && gs->getPlayerTemplate() > PLAYERTEMPLATE_MIN )
{
AsciiString displayNumber;
displayNumber.format("NUMBER:%d",i + 1);
GadgetButtonSetText(buttonMapStartPositions[gs->getApparentStartPos()], TheGameText->fetch(displayNumber));
}
}
else
{
if(gs->getStartPos() >=0 && gs->getStartPos() < mmd.m_numPlayers && gs->getPlayerTemplate() > PLAYERTEMPLATE_MIN )
{
AsciiString displayNumber;
displayNumber.format("NUMBER:%d",i + 1);
GadgetButtonSetText(buttonMapStartPositions[gs->getStartPos()], TheGameText->fetch(displayNumber));
//Added By Sadullah Nader
//Fix for no tooltips at start positions
//added start position tooltip
//Fixed again to show the right number , ie "i + 1"
UnicodeString temp;
temp.format(TheGameText->fetch("TOOLTIP:StartPositionN"), i + 1);
buttonMapStartPositions[gs->getStartPos()]->winSetTooltip(temp);
}
}
}
}
static void handlePlayerSelection(int index)
{
if( index == 0 || index >=MAX_SLOTS)
return;
GameWindow *combo = comboBoxPlayer[index];
Int playerType, selIndex;
GadgetComboBoxGetSelectedPos(combo, &selIndex);
UnicodeString title = GadgetComboBoxGetText(combo);
playerType = (Int)GadgetComboBoxGetItemData(combo, selIndex);
GameInfo *myGame = TheSkirmishGameInfo;
if (myGame)
{
GameSlot * slot = myGame->getSlot(index);
if(!slot)
return;
slot->setState(SlotState(playerType), title);
}
//skirmishUpdateSlotList();
}
static void handleColorSelection(int index)
{
GameWindow *combo = comboBoxColor[index];
Int color, selIndex;
GadgetComboBoxGetSelectedPos(combo, &selIndex);
color = (Int)GadgetComboBoxGetItemData(combo, selIndex);
GameInfo *myGame = TheSkirmishGameInfo;
if (myGame)
{
GameSlot * slot = myGame->getSlot(index);
if(!slot)
return;
if (color == slot->getColor())
return;
if (color >= -1 && color < TheMultiplayerSettings->getNumColors())
{
Bool colorAvailable = TRUE;
if(color != -1 )
{
for(Int i=0; i getSlot(i);
if(checkSlot && color == checkSlot->getColor() && slot != checkSlot)
{
colorAvailable = FALSE;
break;
}
}
}
if(!colorAvailable)
return;
}
slot->setColor(color);
}
//skirmishUpdateSlotList();
}
static void handlePlayerTemplateSelection(int index)
{
GameWindow *combo = comboBoxPlayerTemplate[index];
Int playerTemplate, selIndex;
GadgetComboBoxGetSelectedPos(combo, &selIndex);
playerTemplate = (Int)GadgetComboBoxGetItemData(combo, selIndex);
GameInfo *myGame = TheSkirmishGameInfo;
if (myGame)
{
GameSlot * slot = myGame->getSlot(index);
if(!slot)
return;
if (playerTemplate == slot->getPlayerTemplate())
return;
slot->setPlayerTemplate(playerTemplate);
}
//skirmishUpdateSlotList();
}
static void handleStartPositionSelection(int index, Int position)
{
GameInfo *myGame = TheSkirmishGameInfo;
if (myGame)
{
GameSlot * slot = myGame->getSlot(index);
if (position == slot->getStartPos())
return;
if( position < 0)
{
slot->setStartPos(position);
return;
}
Bool isAvailable = TRUE;
for(Int i = 0; i < MAX_SLOTS; ++i)
{
if(i != index && myGame->getSlot(i)->getStartPos() == position)
{
isAvailable = FALSE;
break;
}
}
if(isAvailable)
{
slot->setStartPos(position);
}
}
}
static void handleTeamSelection(int index)
{
GameWindow *combo = comboBoxTeam[index];
Int team, selIndex;
GadgetComboBoxGetSelectedPos(combo, &selIndex);
team = (Int)GadgetComboBoxGetItemData(combo, selIndex);
GameInfo *myGame = TheSkirmishGameInfo;
if (myGame)
{
GameSlot * slot = myGame->getSlot(index);
if(!slot)
return;
if (team == slot->getTeamNumber())
return;
slot->setTeamNumber(team);
}
//skirmishUpdateSlotList();
}
static void handleStartingCashSelection()
{
GameInfo *myGame = TheSkirmishGameInfo;
if (myGame)
{
Int selIndex;
GadgetComboBoxGetSelectedPos(comboBoxStartingCash, &selIndex);
Money startingCash;
startingCash.deposit( (UnsignedInt)GadgetComboBoxGetItemData( comboBoxStartingCash, selIndex ), FALSE );
myGame->setStartingCash( startingCash );
}
}
static void handleLimitSuperweaponsClick()
{
GameInfo *myGame = TheSkirmishGameInfo;
if (myGame)
{
// At the moment, 1 and 0 are the only choices supported in the GUI, though the system could
// support more.
if ( GadgetCheckBoxIsChecked( checkBoxLimitSuperweapons ) )
{
myGame->setSuperweaponRestriction( 1 );
}
else
{
myGame->setSuperweaponRestriction( 0 );
}
}
}
//-------------------------------------------------------------------------------------------------
/** Initialize the Gadgets Options Menu */
//-------------------------------------------------------------------------------------------------
void InitSkirmishGameGadgets( void )
{
//Initialize the gadget IDs
parentSkirmishGameOptionsID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:SkirmishGameOptionsMenuParent" ) );
buttonExitID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:ButtonBack" ) );
buttonStartID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:ButtonStart" ) );
textEntryMapDisplayID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:TextEntryMapDisplay" ) );
buttonSelectMapID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:ButtonSelectMap" ) );
buttonResetID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:ButtonReset" ) );
windowMapID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:MapWindow" ) );
staticTextGameSpeedID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:StaticTextGameSpeed" ) );
checkBoxLimitSuperweaponsID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:CheckboxLimitSuperweapons" ) );
comboBoxStartingCashID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:ComboBoxStartingCash" ) );
// Initialize the pointers to our gadgets
parentSkirmishGameOptions = TheWindowManager->winGetWindowFromId( NULL, parentSkirmishGameOptionsID );
DEBUG_ASSERTCRASH(parentSkirmishGameOptions, ("Could not find the parentSkirmishGameOptions" ));
buttonSelectMap = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions,buttonSelectMapID );
DEBUG_ASSERTCRASH(buttonSelectMap, ("Could not find the buttonSelectMap"));
buttonStart = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions,buttonStartID );
DEBUG_ASSERTCRASH(buttonStart, ("Could not find the buttonStart"));
buttonExit = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, buttonExitID);
DEBUG_ASSERTCRASH(buttonExit, ("Could not find the buttonExit"));
textEntryMapDisplay = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, textEntryMapDisplayID );
DEBUG_ASSERTCRASH(textEntryMapDisplay, ("Could not find the textEntryMapDisplay"));
buttonReset = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, buttonResetID );
DEBUG_ASSERTCRASH(buttonReset, ("Could not find the buttonReset"));
staticTextGameSpeed = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, staticTextGameSpeedID );
DEBUG_ASSERTCRASH(staticTextGameSpeed, ("Could not find the staticTextGameSpeed"));
checkBoxLimitSuperweapons = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, checkBoxLimitSuperweaponsID );
DEBUG_ASSERTCRASH(checkBoxLimitSuperweapons, ("Could not find the checkBoxLimitSuperweapons"));
comboBoxStartingCash = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, comboBoxStartingCashID );
DEBUG_ASSERTCRASH(comboBoxStartingCash, ("Could not find the comboBoxStartingCash"));
PopulateStartingCashComboBox(comboBoxStartingCash, TheSkirmishGameInfo );
textEntryPlayerNameID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:TextEntryPlayerName" ) );
textEntryPlayerName = TheWindowManager->winGetWindowFromId( NULL, textEntryPlayerNameID );
DEBUG_ASSERTCRASH(textEntryPlayerName, ("Could not find the textEntryPlayerName" ));
windowMap = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions,windowMapID );
DEBUG_ASSERTCRASH(windowMap, ("Could not find the SkirmishGameOptionsMenu.wnd:MapWindow" ));
windowMap->winSetTooltipFunc(MapSelectorTooltip);
for (Int i = 0; i < MAX_SLOTS; i++)
{
AsciiString tmpString;
tmpString.format("SkirmishGameOptionsMenu.wnd:ComboBoxPlayer%d", i);
if(i != 0)
{
comboBoxPlayerID[i] = TheNameKeyGenerator->nameToKey( tmpString );
comboBoxPlayer[i] = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, comboBoxPlayerID[i] );
GadgetComboBoxReset(comboBoxPlayer[i]);
//GadgetComboBoxGetEditBox(comboBoxPlayer[i])->winSetTooltipFunc(playerTooltip);
}
Color white = GameMakeColor( 255, 255, 255, 255 );
if( i == 0 )
{
GadgetTextEntrySetText(textEntryPlayerName, TheGameText->fetch("GUI:Player") );
//GadgetComboBoxAddEntry(comboBoxPlayer[i], TheGameText->fetch( "GUI:Start" ), white);
//GadgetComboBoxSetSelectedPos(comboBoxPlayer[i],0);
}
else
{
GadgetComboBoxAddEntry(comboBoxPlayer[i],TheGameText->fetch("GUI:Open"),white); // leave this first
GadgetComboBoxSetItemData(comboBoxPlayer[i], 0, (void *)SLOT_OPEN);
GadgetComboBoxAddEntry(comboBoxPlayer[i],TheGameText->fetch("GUI:Closed"),white); // leave this first
GadgetComboBoxSetItemData(comboBoxPlayer[i], 1, (void *)SLOT_CLOSED);
GadgetComboBoxAddEntry(comboBoxPlayer[i],TheGameText->fetch("GUI:EasyAI"),white);
GadgetComboBoxSetItemData(comboBoxPlayer[i], 2, (void *)SLOT_EASY_AI);
GadgetComboBoxAddEntry(comboBoxPlayer[i],TheGameText->fetch("GUI:MediumAI"),white);
GadgetComboBoxSetItemData(comboBoxPlayer[i], 3, (void *)SLOT_MED_AI);
GadgetComboBoxAddEntry(comboBoxPlayer[i],TheGameText->fetch("GUI:HardAI"),white);
GadgetComboBoxSetItemData(comboBoxPlayer[i], 4, (void *)SLOT_BRUTAL_AI);
GadgetComboBoxSetSelectedPos(comboBoxPlayer[i],0);
}
tmpString.format("SkirmishGameOptionsMenu.wnd:ComboBoxColor%d", i);
comboBoxColorID[i] = TheNameKeyGenerator->nameToKey( tmpString );
comboBoxColor[i] = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, comboBoxColorID[i] );
DEBUG_ASSERTCRASH(comboBoxColor[i], ("Could not find the comboBoxColor[%d]",i ));
tmpString.format("SkirmishGameOptionsMenu.wnd:ComboBoxPlayerTemplate%d", i);
comboBoxPlayerTemplateID[i] = TheNameKeyGenerator->nameToKey( tmpString );
comboBoxPlayerTemplate[i] = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, comboBoxPlayerTemplateID[i] );
DEBUG_ASSERTCRASH(comboBoxPlayerTemplate[i], ("Could not find the comboBoxPlayerTemplate[%d]",i ));
// add tooltips to the player template combobox and listbox
comboBoxPlayerTemplate[i]->winSetTooltipFunc(playerTemplateComboBoxTooltip);
GadgetComboBoxGetListBox(comboBoxPlayerTemplate[i])->winSetTooltipFunc(playerTemplateListBoxTooltip);
tmpString.format("SkirmishGameOptionsMenu.wnd:ComboBoxTeam%d", i);
comboBoxTeamID[i] = TheNameKeyGenerator->nameToKey( tmpString );
comboBoxTeam[i] = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, comboBoxTeamID[i] );
DEBUG_ASSERTCRASH(comboBoxTeam[i], ("Could not find the comboBoxTeam[%d]",i ));
// tmpString.format("SkirmishGameOptionsMenu.wnd:ButtonStartPosition%d", i);
// buttonStartPositionID[i] = TheNameKeyGenerator->nameToKey( tmpString );
// buttonStartPosition[i] = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, buttonStartPositionID[i] );
// DEBUG_ASSERTCRASH(buttonStartPosition[i], ("Could not find the ButtonStartPosition[%d]",i ));
//
tmpString.format("SkirmishGameOptionsMenu.wnd:ButtonMapStartPosition%d", i);
buttonMapStartPositionID[i] = TheNameKeyGenerator->nameToKey( tmpString );
buttonMapStartPosition[i] = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, buttonMapStartPositionID[i] );
DEBUG_ASSERTCRASH(buttonMapStartPosition[i], ("Could not find the ButtonMapStartPosition[%d]",i ));
}
for (i = 0; i < MAX_SLOTS; ++i)
{
PopulateColorComboBox(i, comboBoxColor, TheSkirmishGameInfo );
GadgetComboBoxSetSelectedPos(comboBoxColor[i], 0);
PopulatePlayerTemplateComboBox(i, comboBoxPlayerTemplate, TheSkirmishGameInfo, FALSE );
PopulateTeamComboBox(i, comboBoxTeam, TheSkirmishGameInfo );
// if (buttonStartPosition[i])
// buttonStartPosition[i]->winHide(TRUE); // not using these right now
}
populateSkirmishBattleHonors();
}
void skirmishUpdateSlotList( void )
{
if(doUpdateSlotList)
{
doUpdateSlotList = FALSE;
AsciiString lowerMap = TheSkirmishGameInfo->getMap();
lowerMap.toLower();
std::map::iterator it = TheMapCache->find(lowerMap);
if (it != TheMapCache->end())
{
GadgetStaticTextSetText(textEntryMapDisplay, it->second.m_displayName);
}
GadgetTextEntrySetText( textEntryPlayerName, TheSkirmishGameInfo->getSlot(0)->getName() );
UpdateSlotList( TheSkirmishGameInfo, comboBoxPlayer,
comboBoxColor, comboBoxPlayerTemplate,
comboBoxTeam, NULL, buttonStart, buttonMapStartPosition );
updateMapStartSpots(TheSkirmishGameInfo, buttonMapStartPosition, FALSE);
doUpdateSlotList = TRUE;
}
}
void updateSkirmishGameOptions( void );
void skirmishPositionStartSpots( void )
{
positionStartSpots( TheSkirmishGameInfo, buttonMapStartPosition, windowMap);
updateSkirmishGameOptions();
}
//-------------------------------------------------------------------------------------------------
/** Init TextEntryMapDisplay */
//-------------------------------------------------------------------------------------------------
void initSkirmishGameOptions( void )
{
}
static const char *layoutFilename = "SkirmishGameOptionsMenu.wnd";
static const char *parentName = "SkirmishGameOptionsMenuParent";
static const char *gadgetsToHide[] =
{
"TextEntryPlayerName",
"StaticTextPlayers",
"StaticTextColor",
"StaticTextTeam",
"StaticTextFaction",
NULL // keep this last
};
static const char *perPlayerGadgetsToHide[] =
{
"ComboBoxPlayer",
"ComboBoxTeam",
"ComboBoxColor",
"ComboBoxPlayerTemplate",
NULL // keep this last
};
//-------------------------------------------------------------------------------------------------
/** Update options on screen */
//-------------------------------------------------------------------------------------------------
void updateSkirmishGameOptions( void )
{
Bool isSkirmish = TRUE;
const MapMetaData *md = TheMapCache->findMap(TheSkirmishGameInfo->getMap());
if (md)
{
isSkirmish = md->m_isMultiplayer; // we can now select solo campaign maps in Skirmish.
GadgetStaticTextSetText(textEntryMapDisplay, md->m_displayName);
}
else
{
DEBUG_CRASH(("map not found, should not happen"));
UnicodeString mapDisplay;
mapDisplay.translate(AsciiString(TheSkirmishGameInfo->getMap().str()));
GadgetStaticTextSetText(textEntryMapDisplay, mapDisplay);
}
if (isSkirmish)
{
ShowUnderlyingGUIElements(TRUE, layoutFilename, parentName, gadgetsToHide, perPlayerGadgetsToHide );
}
else
{
ShowUnderlyingGUIElements(FALSE, layoutFilename, parentName, gadgetsToHide, perPlayerGadgetsToHide );
for (Int i=1; igetSuperweaponRestriction() != 0 );
Int itemCount = GadgetComboBoxGetLength(comboBoxStartingCash);
for ( Int index = 0; index < itemCount; index++ )
{
Int value = (Int)GadgetComboBoxGetItemData(comboBoxStartingCash, index);
if ( value == TheSkirmishGameInfo->getStartingCash().countMoney() )
{
GadgetComboBoxSetSelectedPos(comboBoxStartingCash, index, TRUE);
break;
}
}
DEBUG_ASSERTCRASH( index < itemCount, ("Could not find new starting cash amount %d in list", TheSkirmishGameInfo->getStartingCash().countMoney() ) );
}
//-------------------------------------------------------------------------------------------------
/** Initialize the Skirmish Game Options Menu */
//-------------------------------------------------------------------------------------------------
void SkirmishGameOptionsMenuInit( WindowLayout *layout, void *userData )
{
if (TheGameEngine->getQuitting())
return;
stillNeedsToSetOptions = FALSE;
sliderGameSpeedID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:SliderGameSpeed" ) );
sandboxOk = FALSE;
doUpdateSlotList = FALSE;
if( !TheSkirmishGameInfo )
{
TheSkirmishGameInfo = NEW SkirmishGameInfo;
SignalUIInteraction(SHELL_SCRIPT_HOOK_SKIRMISH_OPENED);
}
else if( TheSkirmishGameInfo->isInGame() )
{
TheSkirmishGameInfo->endGame();
}
else
{
SignalUIInteraction(SHELL_SCRIPT_HOOK_SKIRMISH_OPENED);
}
TheSkirmishGameInfo->init();
TheSkirmishGameInfo->clearSlotList();
TheSkirmishGameInfo->reset();
Int localIP = TheSkirmishGameInfo->getSlot(0)->getIP();
TheSkirmishGameInfo->setLocalIP(localIP);
TheSkirmishGameInfo->enterGame();
EnableSlotListUpdates(FALSE);
//initialize the gadgets
InitSkirmishGameGadgets();
EnableSlotListUpdates(TRUE);
SkirmishPreferences prefs;
GameSlot gSlot;
gSlot.setName(prefs.getUserName());
gSlot.setState( SLOT_PLAYER, prefs.getUserName() );
gSlot.setColor(prefs.getPreferredColor());
gSlot.setPlayerTemplate(prefs.getPreferredFaction());
TheSkirmishGameInfo->setSlot(0,gSlot);
SkirmishBattleHonors honors;
if (honors.getWins() > 10)
gSlot.setState(SLOT_BRUTAL_AI);
else if (honors.getWins() > 5)
gSlot.setState(SLOT_MED_AI);
else
gSlot.setState(SLOT_EASY_AI);
TheSkirmishGameInfo->setSlot(1, gSlot);
ParseAsciiStringToGameInfo(TheSkirmishGameInfo, prefs.getSlotList());
TheSkirmishGameInfo->setSeed(GetTickCount());
UnsignedInt isPreorder = 0;
GetUnsignedIntFromRegistry("", "Preorder", isPreorder);
if (isPreorder != 0)
{
TheSkirmishGameInfo->markPlayerAsPreorder(0);
}
TheSkirmishGameInfo->setStartingCash( prefs.getStartingCash() );
TheSkirmishGameInfo->setSuperweaponRestriction( prefs.getSuperweaponRestricted() ? 1 : 0 );
TheSkirmishGameInfo->setMap(prefs.getPreferredMap());
const MapMetaData *md = TheMapCache->findMap(TheSkirmishGameInfo->getMap());
if (!md)
{
TheSkirmishGameInfo->setMapCRC(0);
TheSkirmishGameInfo->setMapSize(0);
}
else
{
TheSkirmishGameInfo->setMapCRC(md->m_CRC);
TheSkirmishGameInfo->setMapSize(md->m_filesize);
}
AsciiString lowerMap = prefs.getPreferredMap();
lowerMap.toLower();
std::map::iterator it = TheMapCache->find(lowerMap);
if (it != TheMapCache->end())
{
GadgetStaticTextSetText(textEntryMapDisplay, it->second.m_displayName);
}
skirmishPositionStartSpots();
//updateSkirmishGameOptions();
//initSkirmishGameOptions();
// set up the game speed slider
// NameKeyType sliderGameSpeedID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:SliderGameSpeed" ) );
GameWindow *sliderGameSpeed = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, sliderGameSpeedID );
Int sliderPos = max(15,min(61,prefs.getInt("FPS", TheGlobalData->m_framesPerSecondLimit)));
GadgetSliderSetPosition( sliderGameSpeed, sliderPos );
setFPSTextBox(sliderPos);
buttonStart->winSetText(TheGameText->fetch("GUI:Start"));
/* hey, for now we're also going to disable the map select button until it doesn't crash */
//buttonSelectMap->winEnable( FALSE );
//buttonSelectMap->winEnable( TRUE );
//updateSkirmishGameOptions();
for (Int i = 0; i < MAX_SLOTS; ++i)
{
comboBoxColor[i]->winEnable(TRUE);
comboBoxPlayerTemplate[i]->winEnable(TRUE);
comboBoxTeam[i]->winEnable(TRUE);
}
// Show the Menu
layout->hide( FALSE );
// Set Keyboard to Main Parent
TheWindowManager->winSetFocus( parentSkirmishGameOptions );
// animate controls
TheShell->showShellMap(TRUE);
// TheShell->registerWithAnimateManager(buttonExit, WIN_ANIMATION_SLIDE_RIGHT, TRUE, 1);
doUpdateSlotList = TRUE;
skirmishUpdateSlotList();
justEntered = TRUE;
initialGadgetDelay = 2;
GameWindow *win = TheWindowManager->winGetWindowFromId(NULL, TheNameKeyGenerator->nameToKey("SkirmishGameOptionsMenu.wnd:SubParent"));
if(win)
win->winHide(TRUE);
buttonPushed = FALSE;
}// void SkirmishGameOptionsMenuInit( WindowLayout *layout, void *userData )
//-------------------------------------------------------------------------------------------------
/** This is called when a shutdown is complete for this menu */
//-------------------------------------------------------------------------------------------------
static void shutdownComplete( WindowLayout *layout )
{
// hide the layout
layout->hide( TRUE );
TheShell->shutdownComplete( layout );
// our shutdown is complete
// what the munkees does this do?
//TheShell->shutdownComplete( layout, (LANnextScreen != NULL) );
//if (LANnextScreen != NULL)
//{
// TheShell->push(LANnextScreen);
//}
//LANnextScreen = NULL;
} // end if
//-------------------------------------------------------------------------------------------------
/** Skirmish Game Options menu shutdown method */
//-------------------------------------------------------------------------------------------------
void SkirmishGameOptionsMenuShutdown( WindowLayout *layout, void *userData )
{
SignalUIInteraction(SHELL_SCRIPT_HOOK_SKIRMISH_CLOSED);
TheMouse->setCursor(Mouse::ARROW);
TheMouse->setMouseText(UnicodeString::TheEmptyString,NULL,NULL);
// if we are shutting down for an immediate pop, skip the animations
Bool popImmediate = *(Bool *)userData;
if( popImmediate )
{
shutdownComplete( layout );
return;
} //end if
TheShell->reverseAnimatewindow();
// hide menu
// layout->hide( TRUE );
// our shutdown is complete
TheTransitionHandler->reverse("SkirmishGameOptionsMenuFade");
} // void SkirmishGameOptionsMenuShutdown( WindowLayout *layout, void *userData )
//-------------------------------------------------------------------------------------------------
/** Skirmish Game Options menu update method */
//-------------------------------------------------------------------------------------------------
void SkirmishGameOptionsMenuUpdate( WindowLayout * layout, void *userData)
{
if (TheGameLogic->isInShellGame() && TheGameLogic->getFrame() == 1)
{
SignalUIInteraction(SHELL_SCRIPT_HOOK_SKIRMISH_ENTERED_FROM_GAME);
}
if(justEntered)
{
if(initialGadgetDelay == 1)
{
stillNeedsToSetOptions = TRUE;
TheWindowManager->winSetFocus( parentSkirmishGameOptions );
initialGadgetDelay = 2;
justEntered = FALSE;
}
else
initialGadgetDelay--;
}
// Coming back from a game, the shell map will be reloading,
// in which case this transition isn't wanted until the load is done.
if(stillNeedsToSetOptions && !TheGameLogic->isLoadingMap())
{
TheTransitionHandler->setGroup("SkirmishGameOptionsMenuFade");
stillNeedsToSetOptions = FALSE;
}
if(TheShell->isAnimFinished() && TheTransitionHandler->isFinished())
TheShell->shutdownComplete( layout );
}// void SkirmishGameOptionsMenuUpdate( WindowLayout * layout, void *userData)
//-------------------------------------------------------------------------------------------------
/** Skirmish Game Options menu input callback */
//-------------------------------------------------------------------------------------------------
WindowMsgHandledType SkirmishGameOptionsMenuInput( GameWindow *window, UnsignedInt msg,
WindowMsgData mData1, WindowMsgData mData2 )
{
switch( msg )
{
// --------------------------------------------------------------------------------------------
case GWM_CHAR:
{
UnsignedByte key = mData1;
UnsignedByte state = mData2;
switch( key )
{
// ----------------------------------------------------------------------------------------
case KEY_ESC:
{
//
// send a simulated selected event to the parent window of the
// back/exit button
//
if( BitTest( state, KEY_STATE_UP ) )
{
TheWindowManager->winSendSystemMsg( window, GBM_SELECTED,
(WindowMsgData)buttonExit, buttonExitID );
} // end if
// don't let key fall through anywhere else
return MSG_HANDLED;
} // end escape
} // end switch( key )
} // end char
break;
} // end switch( msg )
return MSG_IGNORED;
}//WindowMsgHandledType SkirmishGameOptionsMenuInput( GameWindow *window, UnsignedInt msg,
//-------------------------------------------------------------------------------------------------
/** Skirmish Game Options menu window system callback */
//-------------------------------------------------------------------------------------------------
WindowMsgHandledType SkirmishGameOptionsMenuSystem( GameWindow *window, UnsignedInt msg,
WindowMsgData mData1, WindowMsgData mData2 )
{
UnicodeString txtInput;
switch( msg )
{
//-------------------------------------------------------------------------------------------------
case GWM_CREATE:
{
break;
} // case GWM_DESTROY:
//-------------------------------------------------------------------------------------------------
case GWM_DESTROY:
{
break;
} // case GWM_DESTROY:
//-------------------------------------------------------------------------------------------------
case GWM_INPUT_FOCUS:
{
// if we're givin the opportunity to take the keyboard focus we must say we want it
if( mData1 == TRUE )
*(Bool *)mData2 = TRUE;
return MSG_HANDLED;
}//case GWM_INPUT_FOCUS:
//-------------------------------------------------------------------------------------------------
case GCM_SELECTED:
{
GameWindow *control = (GameWindow *)mData1;
Int controlID = control->winGetWindowId();
if ( controlID == comboBoxStartingCashID )
{
handleStartingCashSelection();
}
else
{
for (Int i = 0; i < MAX_SLOTS; i++)
{
if (controlID == comboBoxColorID[i])
{
handleColorSelection(i);
}
else if (controlID == comboBoxPlayerTemplateID[i])
{
handlePlayerTemplateSelection(i);
}
else if (controlID == comboBoxTeamID[i])
{
handleTeamSelection(i);
}
else if (controlID == comboBoxPlayerID[i])
{
handlePlayerSelection(i);
}
}
}
sandboxOk = FALSE;
skirmishUpdateSlotList();
break;
}// case GCM_SELECTED:
//-------------------------------------------------------------------------------------------------
case GSM_SLIDER_TRACK:
{
GameWindow *control = (GameWindow *)mData1;
Int sliderPos = (Int)mData2;
Int controlID = control->winGetWindowId();
if(controlID == sliderGameSpeedID)
{
setFPSTextBox(sliderPos);
}
}
//-------------------------------------------------------------------------------------------------
case GBM_SELECTED:
{
GameWindow *control = (GameWindow *)mData1;
Int controlID = control->winGetWindowId();
/// static NameKeyType buttonResetFPSID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:ButtonResetFPS" ) );
if(buttonPushed)
break;
if ( controlID == buttonExitID )
{
buttonPushed = TRUE;
SkirmishPreferences prefs;
prefs.write();
if( skirmishMapSelectLayout )
{
skirmishMapSelectLayout->destroyWindows();
skirmishMapSelectLayout->deleteInstance();
skirmishMapSelectLayout = NULL;
}
TheShell->pop();
delete TheSkirmishGameInfo;
TheSkirmishGameInfo = NULL;
} //if ( controlID == buttonBack )
// else if ( controlID == buttonResetFPSID )
// {
// static NameKeyType sliderGameSpeedID = TheNameKeyGenerator->nameToKey( AsciiString( "SkirmishGameOptionsMenu.wnd:SliderGameSpeed" ) );
// GameWindow *sliderGameSpeed = TheWindowManager->winGetWindowFromId( parentSkirmishGameOptions, sliderGameSpeedID );
// GadgetSliderSetPosition( sliderGameSpeed, TheGlobalData->m_framesPerSecondLimit );
// }
else if ( controlID == buttonSelectMapID )
{
sandboxOk = FALSE;
//buttonBack->winEnable( false );
skirmishMapSelectLayout = TheWindowManager->winCreateLayout( AsciiString( "Menus/SkirmishMapSelectMenu.wnd" ) );
skirmishMapSelectLayout->runInit();
skirmishMapSelectLayout->hide( FALSE );
skirmishMapSelectLayout->bringForward();
}
else if ( controlID == buttonStartID )
{
buttonPushed = TRUE;
SkirmishPreferences prefs;
prefs.write();
startPressed();
}
else if ( controlID == buttonResetID )
{
SkirmishBattleHonors stats;
stats.clear();
stats.write();
populateSkirmishBattleHonors();
}
else if ( controlID == checkBoxLimitSuperweaponsID )
{
handleLimitSuperweaponsClick();
}
else
{
for (Int i = 0; i < MAX_SLOTS; i++)
{
if (controlID == buttonMapStartPositionID[i])
{
Int playerIdxInPos = -1;
for (Int j=0; jgetSlot(j);
if (slot && slot->getStartPos() == i)
{
playerIdxInPos = j;
break;
}
}
if (playerIdxInPos >= 0)
{
GameSlot *slot = TheSkirmishGameInfo->getSlot(playerIdxInPos);
if (playerIdxInPos == TheSkirmishGameInfo->getLocalSlotNum() || (TheSkirmishGameInfo->amIHost() && slot && slot->isAI()))
{
// it's one of my type. Try to change it.
Int nextPlayer = getNextSelectablePlayer(playerIdxInPos+1);
handleStartPositionSelection(playerIdxInPos, -1);
if (nextPlayer >= 0)
{
handleStartPositionSelection(nextPlayer, i);
}
}
}
else
{
// nobody in the slot - put us in
Int nextPlayer = getNextSelectablePlayer(0);
if (nextPlayer < 0)
nextPlayer = TheSkirmishGameInfo->getLocalSlotNum();
handleStartPositionSelection(nextPlayer, i);
}
skirmishUpdateSlotList();
sandboxOk = FALSE;
}
}
}
break;
}// case GBM_SELECTED:
//-------------------------------------------------------------------------------------------------
case GBM_SELECTED_RIGHT:
{
GameWindow *control = (GameWindow *)mData1;
Int controlID = control->winGetWindowId();
for (Int i = 0; i < MAX_SLOTS; i++)
{
if (controlID == buttonMapStartPositionID[i])
{
Int playerIdxInPos = -1;
for (Int j=0; jgetSlot(j);
if (slot && slot->getStartPos() == i)
{
playerIdxInPos = j;
break;
}
}
if (playerIdxInPos >= 0)
{
GameSlot *slot = TheSkirmishGameInfo->getSlot(playerIdxInPos);
if (playerIdxInPos == TheSkirmishGameInfo->getLocalSlotNum() || (TheSkirmishGameInfo->amIHost() && slot && slot->isAI()))
{
// it's one of my type. Remove it.
handleStartPositionSelection(playerIdxInPos, -1);
}
skirmishUpdateSlotList();
sandboxOk = FALSE;
}
}
}
break;
}
//-------------------------------------------------------------------------------------------------
case GEM_EDIT_DONE:
case GEM_UPDATE_TEXT:
{
GameWindow *control = (GameWindow *)mData1;
Int controlID = control->winGetWindowId();
if( controlID == textEntryPlayerNameID)
{
TheSkirmishGameInfo->getSlot(0)->setName(GadgetTextEntryGetText(textEntryPlayerName));
//GadgetTextEntrySetText( textEntryPlayerName, TheSkirmishGameInfo->getSlot(0)->getName() );
}
break;
}
//-------------------------------------------------------------------------------------------------
default:
return MSG_IGNORED;
}//Switch
return MSG_HANDLED;
}
void populateSkirmishBattleHonors(void)
{
GameWindow *list = TheWindowManager->winGetWindowFromId(NULL, NAMEKEY("SkirmishGameOptionsMenu.wnd:ListboxInfo"));
if (!list)
return;
SkirmishBattleHonors stats;
list->winSetTooltipFunc(BattleHonorTooltip);
GadgetListBoxReset( list );
Int column = 0;
Int row = 0;
Int honors = stats.getHonors();
UnicodeString uStr;
GameWindow *streakWindow = TheWindowManager->winGetWindowFromId( NULL, NAMEKEY("SkirmishGameOptionsMenu.wnd:StaticTextStreakValue") );
if (streakWindow)
{
uStr.format(L"%d", stats.getWinStreak());
GadgetStaticTextSetText(streakWindow, uStr);
}
GameWindow *bestStreakWindow = TheWindowManager->winGetWindowFromId( NULL, NAMEKEY("SkirmishGameOptionsMenu.wnd:StaticTextBestStreakValue") );
if (bestStreakWindow)
{
uStr.format(L"%d", stats.getBestWinStreak());
GadgetStaticTextSetText(bestStreakWindow, uStr);
}
GameWindow *winsWindow = TheWindowManager->winGetWindowFromId( NULL, NAMEKEY("SkirmishGameOptionsMenu.wnd:StaticTextWinsValue") );
if (winsWindow)
{
uStr.format(L"%d", stats.getWins());
GadgetStaticTextSetText(winsWindow, uStr);
}
GameWindow *lossesWindow = TheWindowManager->winGetWindowFromId( NULL, NAMEKEY("SkirmishGameOptionsMenu.wnd:StaticTextLossesValue") );
if (lossesWindow)
{
uStr.format(L"%d", stats.getLosses());
GadgetStaticTextSetText(lossesWindow, uStr);
}
ResetBattleHonorInsertion();
GadgetListBoxAddEntryImage(list, NULL, 0, 0, 10, 10, TRUE, GameMakeColor(255,255,255,255));
// FIRST ROW OF HONORS
row = 1; column = 0;
// TEST FOR CHINA CAMPAIGN HONOR (GOLD, SILVER, BRONZE or GREYED OUT)
if (stats.getCHINACampaignComplete(DIFFICULTY_HARD))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("ChinaCampaign_G"), TRUE,
BATTLE_HONOR_CAMPAIGN_CHINA, row, column);
}
else if (stats.getCHINACampaignComplete(DIFFICULTY_NORMAL))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("ChinaCampaign_S"), TRUE,
BATTLE_HONOR_CAMPAIGN_CHINA, row, column);
}
else if (stats.getCHINACampaignComplete(DIFFICULTY_EASY))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("ChinaCampaign_B"), TRUE,
BATTLE_HONOR_CAMPAIGN_CHINA, row, column);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("ChinaCampaign_B"), (honors & BATTLE_HONOR_CAMPAIGN_CHINA),
BATTLE_HONOR_CAMPAIGN_CHINA, row, column);
}
// TEST FOR GLA CAMPAIGN HONOR (GOLD, SILVER, BRONZE or GREYED OUT)
if (stats.getGLACampaignComplete(DIFFICULTY_HARD))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("GLACampaign_G"), TRUE,
BATTLE_HONOR_CAMPAIGN_GLA, row, column);
}
else if (stats.getGLACampaignComplete(DIFFICULTY_NORMAL))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("GLACampaign_S"), TRUE,
BATTLE_HONOR_CAMPAIGN_GLA, row, column);
}
else if (stats.getGLACampaignComplete(DIFFICULTY_EASY))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("GLACampaign_B"), TRUE,
BATTLE_HONOR_CAMPAIGN_GLA, row, column);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("GLACampaign_B"), (honors & BATTLE_HONOR_CAMPAIGN_GLA),
BATTLE_HONOR_CAMPAIGN_GLA, row, column);
}
// TEST FOR GLA CAMPAIGN HONOR (GOLD, SILVER, BRONZE or GREYED OUT)
if (stats.getUSACampaignComplete(DIFFICULTY_HARD))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("USACampaign_G"), TRUE,
BATTLE_HONOR_CAMPAIGN_USA, row, column);
}
else if (stats.getUSACampaignComplete(DIFFICULTY_NORMAL))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("USACampaign_S"), TRUE,
BATTLE_HONOR_CAMPAIGN_USA, row, column);
}
else if (stats.getUSACampaignComplete(DIFFICULTY_EASY))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("USACampaign_B"), TRUE,
BATTLE_HONOR_CAMPAIGN_USA, row, column);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("USACampaign_B"), (honors & BATTLE_HONOR_CAMPAIGN_USA),
BATTLE_HONOR_CAMPAIGN_USA, row, column);
}
// TEST FOR GENERALS CHALLENGE HONOR (GOLD, SILVER, BRONZE or GREYED OUT)
Bool completedOnHard = FALSE;
Bool completedOnNormal = FALSE;
Bool completedOnEasy = FALSE;
for (int i = 0; i < MAX_GLOBAL_GENERAL_TYPES; ++i)
{
if (stats.getChallengeCampaignComplete(i, DIFFICULTY_HARD))
completedOnHard = TRUE;
if (stats.getChallengeCampaignComplete(i, DIFFICULTY_NORMAL))
completedOnNormal = TRUE;
if (stats.getChallengeCampaignComplete(i, DIFFICULTY_EASY))
completedOnEasy = TRUE;
}
if (completedOnHard)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Challenge_Gold"), TRUE,
BATTLE_HONOR_CHALLENGE_MODE, row, column);
}
else if (completedOnNormal)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Challenge_Silver"), TRUE,
BATTLE_HONOR_CHALLENGE_MODE, row, column);
}
else if (completedOnEasy)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Challenge_Bronz"), TRUE,
BATTLE_HONOR_CHALLENGE_MODE, row, column);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Challenge_Bronz"), FALSE,
BATTLE_HONOR_CHALLENGE_MODE, row, column);
}
// TEST FOR AIR WING HONOR
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorAirWing"), (honors & BATTLE_HONOR_AIR_WING),
BATTLE_HONOR_AIR_WING, row, column);
// TEST FOR BATTLE TANK HONOR
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorBattleTank"), (honors & BATTLE_HONOR_BATTLE_TANK),
BATTLE_HONOR_BATTLE_TANK, row, column);
GadgetListBoxAddEntryImage(list, NULL, 2, 0, 10, 10, TRUE, GameMakeColor(255,255,255,255));
// NEXT ROW OF HONORS
row = 3; column = 0;
// TEST FOR ENDURANCE HONOR (GOLD, SILVER, BRONZE or GREYED OUT)
MapCache::const_iterator it;
Bool missingEasy = FALSE;
Bool missingMedium = FALSE;
Bool missingBrutal = FALSE;
for (it = TheMapCache->begin(); it != TheMapCache->end(); ++it)
{
if (!it->second.m_isOfficial || !it->second.m_isMultiplayer)
continue;
Bool easy = TRUE;
Bool med = TRUE;
Bool hard = TRUE;
if (stats.getEnduranceMedal(it->first, SLOT_EASY_AI) == 0)
easy = FALSE;
if (stats.getEnduranceMedal(it->first, SLOT_MED_AI) == 0)
med = FALSE;
if (stats.getEnduranceMedal(it->first, SLOT_BRUTAL_AI) == 0)
hard = FALSE;
if (!easy && !med && !hard)
missingEasy = TRUE;
if (!med && !hard)
missingMedium = TRUE;
if (!hard)
missingBrutal = TRUE;
}
if (!missingBrutal)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Endurance_G"), TRUE,
BATTLE_HONOR_ENDURANCE, row, column);
}
else if (!missingMedium)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Endurance_S"), TRUE,
BATTLE_HONOR_ENDURANCE, row, column);
}
else if (!missingEasy)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Endurance_B"), TRUE,
BATTLE_HONOR_ENDURANCE, row, column);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Endurance_B"), FALSE,
BATTLE_HONOR_ENDURANCE, row, column);
}
// TEST FOR APOCALYPSE HONOR
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Apocalypse"), (honors & BATTLE_HONOR_APOCALYPSE),
BATTLE_HONOR_APOCALYPSE, row, column);
// TEST FOR BLITZ HONOR
if (honors & BATTLE_HONOR_BLITZ5)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorBlitz5"), TRUE,
BATTLE_HONOR_BLITZ5, row, column);
}
else if (honors & BATTLE_HONOR_BLITZ10)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorBlitz10"), TRUE,
BATTLE_HONOR_BLITZ10, row, column);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorBlitz10"), FALSE,
BATTLE_HONOR_BLITZ10, row, column);
}
// TEST FOR STREAK HONOR
Int streak = stats.getBestWinStreak();
uStr.format(L"%10d", streak);
if (streak >= 1000)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_1000"), TRUE,
BATTLE_HONOR_STREAK, row, column, uStr, streak);
}
else if (streak >= 500)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_500"), TRUE,
BATTLE_HONOR_STREAK, row, column, uStr, streak);
}
else if (streak >= 100)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_100"), TRUE,
BATTLE_HONOR_STREAK, row, column, uStr, streak);
}
else if (streak >= 25)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_G"), TRUE,
BATTLE_HONOR_STREAK, row, column, uStr, streak);
}
else if (streak >= 10)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_S"), TRUE,
BATTLE_HONOR_STREAK, row, column, uStr, streak);
}
else if (streak >= 3)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_B"), TRUE,
BATTLE_HONOR_STREAK, row, column, uStr, streak);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_B"), FALSE,
BATTLE_HONOR_STREAK, row, column, uStr, streak);
}
// TEST FOR DOMINATION HONOR
Int totalWins = stats.getWins();
uStr.format(L"%10d", totalWins);
if (totalWins >= 10000)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Domination_10000"), TRUE,
BATTLE_HONOR_DOMINATION, row, column, uStr, totalWins);
}
else if (totalWins >= 1000)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Domination_1000"), TRUE,
BATTLE_HONOR_DOMINATION, row, column, uStr, totalWins);
}
else if (totalWins >= 500)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Domination_500"), TRUE,
BATTLE_HONOR_DOMINATION, row, column, uStr, totalWins);
}
else if (totalWins >= 100)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Domination_100"), TRUE,
BATTLE_HONOR_DOMINATION, row, column, uStr, totalWins);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Domination_100"), FALSE,
BATTLE_HONOR_DOMINATION, row, column, uStr, totalWins);
}
// TEST FOR ULTIMATE HONOR
Bool perfect = TRUE;
for (it = TheMapCache->begin(); it != TheMapCache->end(); ++it)
{
if (!it->second.m_isOfficial || !it->second.m_isMultiplayer)
continue;
Int totalOpponentSlots = it->second.m_numPlayers - 1;
Int numBrutalOpponentsBeaten = stats.getEnduranceMedal(it->first, SLOT_BRUTAL_AI);
if (numBrutalOpponentsBeaten < totalOpponentSlots)
{
perfect = FALSE;
break;
}
}
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Ultimate"), perfect,
BATTLE_HONOR_ULTIMATE, row, column);
// TEST FOR CHALLENGE HONOR
/*
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Loyalty_USA"), (honors & BATTLE_HONOR_LOYALTY_USA),
BATTLE_HONOR_LOYALTY_USA, row, column);
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Loyalty_China"), (honors & BATTLE_HONOR_LOYALTY_CHINA),
BATTLE_HONOR_LOYALTY_CHINA, row, column);
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Loyalty_GLA"), (honors & BATTLE_HONOR_LOYALTY_GLA),
BATTLE_HONOR_LOYALTY_GLA, row, column);
*/
/*
if(BitTest(challenge, BH_CHALLENGE_MASK_7))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge7"), TRUE,
BATTLE_HONOR_CHALLENGE, row, column);
}
else if (BitTest(challenge, BH_CHALLENGE_MASK_6))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge6"), TRUE,
BATTLE_HONOR_CHALLENGE, row, column);
}
else if (BitTest(challenge, BH_CHALLENGE_MASK_5))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge5"), TRUE,
BATTLE_HONOR_CHALLENGE, row, column);
}
else if (BitTest(challenge, BH_CHALLENGE_MASK_4))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge4"), TRUE,
BATTLE_HONOR_CHALLENGE, row, column);
}
else if (BitTest(challenge, BH_CHALLENGE_MASK_3))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge3"), TRUE,
BATTLE_HONOR_CHALLENGE, row, column);
}
else if (BitTest(challenge, BH_CHALLENGE_MASK_2))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge2"), TRUE,
BATTLE_HONOR_CHALLENGE, row, column);
}
else if (BitTest(challenge, BH_CHALLENGE_MASK_1))
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge1"), TRUE,
BATTLE_HONOR_CHALLENGE, row, column);
}
else
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorChallenge1"), FALSE,
BATTLE_HONOR_CHALLENGE, row, column);
}
*/
UnsignedInt isPreorder = 0;
GetUnsignedIntFromRegistry("", "Preorder", isPreorder);
if (isPreorder != 0)
{
InsertBattleHonor(list, TheMappedImageCollection->findImageByName("OfficersClub"), TRUE,
BATTLE_HONOR_OFFICERSCLUB, row, column);
}
}