/* ** Command & Conquer Generals(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: PopupPlayerInfo.cpp // Author: Matthew D. Campbell, July 2002 // Description: Player info right-click popup screen /////////////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine #include "Common/PlayerTemplate.h" #include "Common/BattleHonors.h" #include "Common/CustomMatchPreferences.h" #include "Common/GameSpyMiscPreferences.h" #include "Common/Filesystem.h" #include "GameClient/mouse.h" #include "GameClient/GameText.h" #include "GameClient/WindowLayout.h" #include "GameClient/Gadget.h" #include "GameClient/KeyDefs.h" #include "GameClient/GameWindowManager.h" #include "GameClient/GadgetListBox.h" #include "GameClient/GadgetCheckBox.h" #include "GameClient/GadgetProgressBar.h" #include "GameClient/GadgetStaticText.h" #include "GameClient/Display.h" #include "GameClient/MessageBox.h" #include "GameNetwork/GameSpyOverlay.h" #include "GameNetwork/GameSpy/PeerDefs.h" #include "GameNetwork/GameSpy/PeerThread.h" #include "GameNetwork/GameSpy/PersistentStorageDefs.h" #include "GameNetwork/GameSpy/PersistentStorageThread.h" #include "GameNetwork/RankPointValue.h" #include "GameNetwork/GameSpy/BuddyThread.h" #include "GameNetwork/GameSpy/GSConfig.h" #include "GameNetwork/GameSpy/LobbyUtils.h" #include "WWDownload/Registry.h" #ifdef _INTERNAL // for occasional debugging... //#pragma optimize("", off) //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes") #endif // PRIVATE DATA /////////////////////////////////////////////////////////////////////////////////// // window ids ------------------------------------------------------------------------------ static NameKeyType parentID = NAMEKEY_INVALID; static NameKeyType listboxInfoID = NAMEKEY_INVALID; static NameKeyType buttonCloseID = NAMEKEY_INVALID; static NameKeyType buttonBuddiesID = NAMEKEY_INVALID; //static NameKeyType buttonOptionsID = NAMEKEY_INVALID; static NameKeyType buttonSetLocaleID = NAMEKEY_INVALID; static NameKeyType buttonDeleteAccountID = NAMEKEY_INVALID; static NameKeyType checkBoxAsianFontID = NAMEKEY_INVALID; static NameKeyType checkBoxNonAsianFontID = NAMEKEY_INVALID; // Window Pointers ------------------------------------------------------------------------ static GameWindow *parent = NULL; static GameWindow *listboxInfo = NULL; static GameWindow *buttonClose = NULL; static GameWindow *buttonBuddies = NULL; //static GameWindow *buttonbuttonOptions = NULL; static GameWindow *buttonSetLocale = NULL; static GameWindow *buttonDeleteAccount = NULL; static GameWindow *checkBoxAsianFont = NULL; static GameWindow *checkBoxNonAsianFont = NULL; static Bool isOverlayActive = false; static Bool raiseMessageBox = false; static Int lookAtPlayerID = 0; static std::string lookAtPlayerName; static const char *rankNames[] = { "Private", "Corporal", "Sergeant", "Lieutenant", "Captain", "Major", "Colonel", "General", "Brigadier", "Commander", }; static const Image* lookupRankImage(AsciiString side, Int rank) { if (side.isEmpty()) return TheMappedImageCollection->findImageByName("NewPlayer"); if (rank < 0 || rank >= MAX_RANKS) return NULL; // dirty hack rather than try to get artists to follow a naming convention if (side == "America") side = "_USA"; else if (side == "China") side = "_China"; else if (side == "GLA") side = "_GLA"; else if (side == "Random") side = "Elite"; AsciiString fullImageName; fullImageName.format("Rank_%s%s", rankNames[rank], side.str()); if(strcmp(fullImageName.str(),"Rank_PrivateElite") == 0) fullImageName = "Rank";//_Private_Elite"; const Image *img = TheMappedImageCollection->findImageByName(fullImageName); if (img) { DEBUG_LOG(("*** Loaded rank image '%s' from TheMappedImageCollection!\n", fullImageName.str())); } else { DEBUG_LOG(("*** Could not load rank image '%s' from TheMappedImageCollection!\n", fullImageName.str())); } return img; } static Int getTotalDisconnectsFromFile(Int playerID) { Int retval = 0; if (playerID == 0) { return 0; } UserPreferences pref; AsciiString userPrefFilename; userPrefFilename.format("GeneralsOnline\\MiscPref%d.ini", playerID); DEBUG_LOG(("setPersistentDataCallback - reading stats from file %s\n", userPrefFilename.str())); pref.load(userPrefFilename); // if there is a file override, use that data instead. if (pref.find("0") != pref.end()) { retval = atoi(pref.find("0")->second.str()); } if (pref.find("1") != pref.end()) { retval += atoi(pref.find("1")->second.str()); } if (pref.find("2") != pref.end()) { retval += atoi(pref.find("2")->second.str()); } if (pref.find("3") != pref.end()) { retval += atoi(pref.find("3")->second.str()); } if (pref.find("4") != pref.end()) { retval += atoi(pref.find("4")->second.str()); } if (pref.find("5") != pref.end()) { retval += atoi(pref.find("5")->second.str()); } return retval; } Int GetAdditionalDisconnectsFromUserFile(Int playerID) { Int retval = getTotalDisconnectsFromFile(playerID); if (playerID == 0) { return 0; } if (TheGameSpyInfo->getAdditionalDisconnects() > 0 && !retval) { DEBUG_LOG(("Clearing additional disconnects\n")); TheGameSpyInfo->clearAdditionalDisconnects(); } if (TheGameSpyInfo->getAdditionalDisconnects() != -1) { return TheGameSpyInfo->getAdditionalDisconnects(); } return retval; } void GetAdditionalDisconnectsFromUserFile(PSPlayerStats *stats) { if (!stats || stats->id == 0) { return; } if (TheGameSpyInfo->getAdditionalDisconnects() > 0 && !getTotalDisconnectsFromFile(stats->id)) { DEBUG_LOG(("Clearing additional disconnects\n")); TheGameSpyInfo->clearAdditionalDisconnects(); } if (TheGameSpyInfo->getAdditionalDisconnects() < 1) { return; } UserPreferences pref; AsciiString userPrefFilename; userPrefFilename.format("GeneralsOnline\\MiscPref%d.ini", stats->id); DEBUG_LOG(("setPersistentDataCallback - reading stats from file %s\n", userPrefFilename.str())); pref.load(userPrefFilename); // if there is a file override, use that data instead. if (pref.find("0") != pref.end()) { stats->desyncs[2] += abs(atoi(pref.find("0")->second.str())); } if (pref.find("1") != pref.end()) { stats->desyncs[3] += abs(atoi(pref.find("1")->second.str())); } if (pref.find("2") != pref.end()) { stats->desyncs[4] += abs(atoi(pref.find("2")->second.str())); } if (pref.find("3") != pref.end()) { stats->discons[2] += abs(atoi(pref.find("3")->second.str())); } if (pref.find("4") != pref.end()) { stats->discons[3] += abs(atoi(pref.find("4")->second.str())); } if (pref.find("5") != pref.end()) { stats->discons[4] += abs(atoi(pref.find("5")->second.str())); } } // default values RankPoints::RankPoints(void) { m_ranks[RANK_PRIVATE] = 0; m_ranks[RANK_CORPORAL] = TheGameSpyConfig->getPointsForRank(RANK_CORPORAL); // 5 m_ranks[RANK_SERGEANT] = TheGameSpyConfig->getPointsForRank(RANK_SERGEANT); // 10 m_ranks[RANK_LIEUTENANT] = TheGameSpyConfig->getPointsForRank(RANK_LIEUTENANT); // 20 m_ranks[RANK_CAPTAIN] = TheGameSpyConfig->getPointsForRank(RANK_CAPTAIN); // 50 m_ranks[RANK_MAJOR] = TheGameSpyConfig->getPointsForRank(RANK_MAJOR); // 100 m_ranks[RANK_COLONEL] = TheGameSpyConfig->getPointsForRank(RANK_COLONEL); // 200 m_ranks[RANK_BRIGADIER_GENERAL] = TheGameSpyConfig->getPointsForRank(RANK_BRIGADIER_GENERAL); // 500 m_ranks[RANK_GENERAL] = TheGameSpyConfig->getPointsForRank(RANK_GENERAL); // 1000 m_ranks[RANK_COMMANDER_IN_CHIEF] = TheGameSpyConfig->getPointsForRank(RANK_COMMANDER_IN_CHIEF); // 2000 m_winMultiplier = 3.0f; m_lostMultiplier = 0.0f; m_hourSpentOnlineMultiplier = 1.0f; m_completedSoloCampaigns = 5.0f; m_disconnectMultiplier = -1.0f; #ifdef DEBUG_LOGGING AsciiStringList sidesList; ThePlayerTemplateStore->getAllSideStrings(&sidesList); for (AsciiStringList::iterator sit = sidesList.begin(); sit != sidesList.end(); ++sit) { for (Int i=0; isetCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonors") ); return; } Int battleHonor = (Int)GadgetListBoxGetItemData( window, row, col ); if (battleHonor == 0) { //DEBUG_CRASH(("No Battle Honor in listbox row %d, col %d!", row, col)); TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonors") ); return; } Real tooltipWidth = 1.5f; if (BitTest(battleHonor, BATTLE_HONOR_NOT_GAINED)) { if(BitTest(battleHonor, BATTLE_HONOR_STREAK_3)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorStreak3Disabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_LOYALTY_USA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorLoyaltyUSADisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_LOYALTY_CHINA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorLoyaltyChinaDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_LOYALTY_GLA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorLoyaltyGLADisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_BATTLE_TANK)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorBattleTankDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_AIR_WING)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorAirWingDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_ENDURANCE)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorEnduranceDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_CAMPAIGN_USA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorCampaignUSADisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_CAMPAIGN_CHINA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorCampaignChinaDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_CAMPAIGN_GLA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorCampaignGLADisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_BLITZ10)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorBlitz10Disabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_FAIR_PLAY)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorFairPlayDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_APOCALYPSE)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorApocalypseDisabled"), -1, NULL, tooltipWidth ); /* else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_USA_B)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloUSABDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_USA_S)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloUSASDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_USA_G)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloUSAGDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_CHINA_B)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloChinaBDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_CHINA_S)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloChinaSDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_CHINA_G)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloChinaGDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_GLA_B)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloGLABDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_GLA_S)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloGLASDisabled"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_GLA_G)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloGLAGDisabled"), -1, NULL, tooltipWidth ); */ else if(BitTest(battleHonor, BATTLE_HONOR_CHALLENGE)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorChallengeDisabled"), -1, NULL, tooltipWidth ); } else { if(BitTest(battleHonor, BATTLE_HONOR_LADDER_CHAMP)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorLadderChamp"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_STREAK_3)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorStreak3"), -1, NULL, tooltipWidth ); //else if(BitTest(battleHonor, BATTLE_HONOR_STREAK_5)) //TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorStreak5"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_STREAK_10)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorStreak10"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_STREAK_25)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorStreak25"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_LOYALTY_USA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorLoyaltyUSA"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_LOYALTY_CHINA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorLoyaltyChina"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_LOYALTY_GLA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorLoyaltyGLA"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_BATTLE_TANK)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorBattleTank"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_AIR_WING)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorAirWing"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_ENDURANCE)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorEndurance"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_CAMPAIGN_USA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorCampaignUSA"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_CAMPAIGN_CHINA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorCampaignChina"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_CAMPAIGN_GLA)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorCampaignGLA"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_BLITZ5)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorBlitz5"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_BLITZ10)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorBlitz10"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_FAIR_PLAY)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorFairPlay"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_APOCALYPSE)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorApocalypse"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_OFFICERSCLUB)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorOfficersClub"), -1, NULL, tooltipWidth ); /* else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_USA_B)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloUSAB"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_USA_S)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloUSAS"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_USA_G)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloUSAG"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_CHINA_B)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloChinaB"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_CHINA_S)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloChinaS"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_CHINA_G)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloChinaG"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_GLA_B)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloGLAB"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_GLA_S)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloGLAS"), -1, NULL, tooltipWidth ); else if(BitTest(battleHonor, BATTLE_HONOR_SOLO_GLA_G)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorSoloGLAG"), -1, NULL, tooltipWidth ); */ else if(BitTest(battleHonor, BATTLE_HONOR_CHALLENGE)) TheMouse->setCursorTooltip( TheGameText->fetch("TOOLTIP:BattleHonorChallenge"), -1, NULL, tooltipWidth ); } } static Int rowsToSkip = 0; void ResetBattleHonorInsertion(void) { rowsToSkip = 0; } void InsertBattleHonor(GameWindow *list, const Image *image, Bool enabled, Int itemData, Int& row, Int& column, UnicodeString text = UnicodeString::TheEmptyString) { Int width = MAX_BATTLE_HONOR_IMAGE_WIDTH * (TheDisplay->getWidth() / 800.0f); Int height = MAX_BATTLE_HONOR_IMAGE_HEIGHT * (TheDisplay->getHeight() / 600.0f); static Int enabledColor = 0xFFFFFFFF; static Int disabledColor = GameMakeColor(80, 80, 80, 255); Int color; if (enabled) color = enabledColor; else color = disabledColor; if (!enabled) itemData |= BATTLE_HONOR_NOT_GAINED; GadgetListBoxAddEntryImage(list, image, row, column, height, width, TRUE, color); GadgetListBoxSetItemData(list, (void *)itemData, row, column ); /* ** removing text, since every place that adds text has alternate displays of the same thing if (!text.isEmpty()) { GadgetListBoxAddEntryText(list, text, GameSpyColor[GSCOLOR_DEFAULT], row+1, column, TRUE ); GadgetListBoxSetItemData(list, (void *)itemData, row+1, column ); rowsToSkip++; } */ if(++column >= GadgetListBoxGetNumColumns(list)) { column = 0; row = row + 1 + rowsToSkip; rowsToSkip = max(rowsToSkip-1, 0); } } static void populateBattleHonors(const PSPlayerStats& stats, Int battleHonors, Int gamesInRow, Int lastGen, Int challenge, GameWindow *list) { if( !list ) return; list->winSetTooltipFunc(BattleHonorTooltip); GadgetListBoxReset( list ); Int column = 0; Int row = 0; Bool isFairPlayer = FALSE; Int numGames = 0; Int numDiscons = 0; PerGeneralMap::const_iterator it; for(it = stats.games.begin(); it != stats.games.end(); ++it) { numGames += it->second; } for(it = stats.discons.begin(); it != stats.discons.end(); ++it) { numDiscons += it->second; } for(it = stats.desyncs.begin(); it != stats.desyncs.end(); ++it) { numDiscons += it->second; } if (numGames >= 10 && numDiscons * 10 < numGames) { isFairPlayer = TRUE; } ResetBattleHonorInsertion(); GadgetListBoxAddEntryImage(list, NULL, 0, 0, 10, 10, TRUE, GameMakeColor(255,255,255,255)); row = 1; InsertBattleHonor(list, TheMappedImageCollection->findImageByName("FairPlay"), isFairPlayer, BATTLE_HONOR_FAIR_PLAY, row, column); InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorAirWing"), BitTest(battleHonors, BATTLE_HONOR_AIR_WING), BATTLE_HONOR_AIR_WING, row, column); InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorBattleTank"), BitTest(battleHonors, BATTLE_HONOR_BATTLE_TANK), BATTLE_HONOR_BATTLE_TANK, row, column); InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Apocalypse"), BitTest(battleHonors, BATTLE_HONOR_APOCALYPSE), BATTLE_HONOR_APOCALYPSE, row, column); if (BitTest(battleHonors, BATTLE_HONOR_BLITZ5)) { InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorBlitz5"), TRUE, BATTLE_HONOR_BLITZ5, row, column); } else if (BitTest(battleHonors, 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); } GadgetListBoxAddEntryImage(list, NULL, 2, 0, 10, 10, TRUE, GameMakeColor(255,255,255,255)); row = 3; UnicodeString uStr; uStr.format(L"%10d", stats.maxWinsInARow); if(BitTest(battleHonors, BATTLE_HONOR_STREAK_25)) { InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_G"), TRUE, BATTLE_HONOR_STREAK_25, row, column, uStr); } else if(BitTest(battleHonors, BATTLE_HONOR_STREAK_10)) { InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_S"), TRUE, BATTLE_HONOR_STREAK_10, row, column, uStr); } else if(BitTest(battleHonors, BATTLE_HONOR_STREAK_3)) { InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_B"), TRUE, BATTLE_HONOR_STREAK_3, row, column, uStr); } else { InsertBattleHonor(list, TheMappedImageCollection->findImageByName("HonorStreak_B"), FALSE, BATTLE_HONOR_STREAK_3, row, column); } /* Bool isLoyal; isLoyal = ThePlayerTemplateStore->getNthPlayerTemplate(lastGen)->getSide().compareNoCase( "america") == 0 && gamesInRow >= 20; InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Loyalty_USA"), isLoyal, BATTLE_HONOR_LOYALTY_USA, row, column); isLoyal = ThePlayerTemplateStore->getNthPlayerTemplate(lastGen)->getSide().compareNoCase( "china") == 0 && gamesInRow >= 20; InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Loyalty_China"), isLoyal, BATTLE_HONOR_LOYALTY_CHINA, row, column); isLoyal = ThePlayerTemplateStore->getNthPlayerTemplate(lastGen)->getSide().compareNoCase( "gla") == 0 && gamesInRow >= 20; InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Loyalty_GLA"), isLoyal, BATTLE_HONOR_LOYALTY_GLA, row, column); */ //insertBattleHonor(list, TheMappedImageCollection->findImageByName("Endurance"), BitTest(battleHonors, BATTLE_HONOR_ENDURANCE), //BATTLE_HONOR_ENDURANCE, row, column); /* InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Campaign_USA"), BitTest(battleHonors, BATTLE_HONOR_CAMPAIGN_USA), BATTLE_HONOR_CAMPAIGN_USA, row, column); InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Campaign_China"), BitTest(battleHonors, BATTLE_HONOR_CAMPAIGN_CHINA), BATTLE_HONOR_CAMPAIGN_CHINA, row, column); InsertBattleHonor(list, TheMappedImageCollection->findImageByName("Campaign_GLA"), BitTest(battleHonors, BATTLE_HONOR_CAMPAIGN_GLA), BATTLE_HONOR_CAMPAIGN_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); } */ if (TheGameSpyInfo->didPlayerPreorder(stats.id)) { InsertBattleHonor(list, TheMappedImageCollection->findImageByName("OfficersClub"), TRUE, BATTLE_HONOR_OFFICERSCLUB, row, column); } } Int GetFavoriteSide( const PSPlayerStats& stats ) { PerGeneralMap::const_iterator it; Int numGames = 0; Int favorite = 0; for(it =stats.games.begin(); it != stats.games.end(); ++it) { if(it->second >= numGames) { numGames = it->second; favorite = it->first; } } if(numGames == 0) return -1; else if( stats.gamesAsRandom >= numGames ) return 0; return favorite; } Int CalculateRank( const PSPlayerStats& stats ) { if(stats.id == 0 || !TheRankPointValues) return 0; PerGeneralMap::const_iterator it; Int rankPoints = 0; Int numGames = 0; for(it =stats.wins.begin(); it != stats.wins.end(); ++it) { numGames += it->second; } rankPoints += (numGames * TheRankPointValues->m_winMultiplier); numGames = 0; for(it =stats.losses.begin(); it != stats.losses.end(); ++it) { numGames += it->second; } rankPoints += (numGames * TheRankPointValues->m_lostMultiplier); numGames = 0; for(it =stats.duration.begin(); it != stats.duration.end(); ++it) { numGames += it->second; } rankPoints += (numGames / 60) * TheRankPointValues->m_hourSpentOnlineMultiplier; numGames = 0; for(it =stats.discons.begin(); it != stats.discons.end(); ++it) { numGames += it->second; } for(it =stats.desyncs.begin(); it != stats.desyncs.end(); ++it) { numGames += it->second; } rankPoints += numGames * TheRankPointValues->m_disconnectMultiplier; if(BitTest(stats.battleHonors, BATTLE_HONOR_CAMPAIGN_USA | BATTLE_HONOR_CAMPAIGN_CHINA |BATTLE_HONOR_CAMPAIGN_GLA)) { rankPoints += 1 * TheRankPointValues->m_completedSoloCampaigns; } rankPoints = max(0, rankPoints); // clip off negative values, since discons can push us below 0. return rankPoints; } static GameWindow* findWindow(GameWindow *parent, AsciiString baseWindow, AsciiString gadgetName) { AsciiString fullPath; fullPath.format("%s:%s", baseWindow.str(), gadgetName.str()); GameWindow *res = TheWindowManager->winGetWindowFromId(parent, NAMEKEY(fullPath)); DEBUG_ASSERTLOG(res, ("Cannot find window %s\n", fullPath.str())); return res; } void PopulatePlayerInfoWindows( AsciiString parentWindowName ) { Int lookupID = TheGameSpyInfo->getLocalProfileID(); if(parentWindowName == "PopupPlayerInfo.wnd") { lookupID = lookAtPlayerID; if (lookAtPlayerID <= 0 || !parent) return; } PSPlayerStats stats = TheGameSpyPSMessageQueue->findPlayerStatsByID(lookupID); Bool weHaveStats = (stats.id != 0); // if we don't have the stats from the server, see if we have cached stats if( !weHaveStats && lookupID == TheGameSpyInfo->getLocalProfileID() ) { stats = TheGameSpyInfo->getCachedLocalPlayerStats(); weHaveStats = TRUE; } Int currentRank = 0; Int rankPoints = CalculateRank(stats); Int i = 0; while( rankPoints >= TheRankPointValues->m_ranks[i + 1]) ++i; currentRank = i; PerGeneralMap::iterator it; Int numWins = 0; Int numLosses = 0; Int numDiscons = 0; Int numGames = 0; for(it =stats.wins.begin(); it != stats.wins.end(); ++it) { numWins += it->second; } for(it =stats.losses.begin(); it != stats.losses.end(); ++it) { numLosses += it->second; } for(it =stats.discons.begin(); it != stats.discons.end(); ++it) { numDiscons += it->second; } for(it =stats.desyncs.begin(); it != stats.desyncs.end(); ++it) { numDiscons += it->second; } numDiscons += GetAdditionalDisconnectsFromUserFile(lookupID); numGames = numWins + numLosses + numDiscons; GameWindow *win = NULL; UnicodeString uStr; win = findWindow(NULL, parentWindowName, "StaticTextPlayerStatisticsLabel"); if(win) { AsciiString localeID = "WOL:Locale00"; if (stats.locale >= LOC_MIN && stats.locale <= LOC_MAX) localeID.format("WOL:Locale%2.2d", stats.locale); uStr.format(TheGameText->fetch("GUI:PlayerStatistics"), lookAtPlayerName.c_str(), TheGameText->fetch(localeID).str()); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextGamesPlayedValue"); if(win) { uStr.format(L"%d", numGames); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextWinsValue"); if(win) { uStr.format(L"%d", numWins); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextLossesValue"); if(win) { uStr.format(L"%d", numLosses); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextDisconnectsValue"); if(win) { uStr.format(L"%d", numDiscons); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextBestStreakValue"); if (win) { uStr.format(L"%d", stats.maxWinsInARow); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextStreak"); if (win) { if (stats.lossesInARow > 0) { GadgetStaticTextSetText(win, TheGameText->fetch("GUI:CurrentLossStreak")); } else { GadgetStaticTextSetText(win, TheGameText->fetch("GUI:CurrentWinStreak")); } } win = findWindow(NULL, parentWindowName, "StaticTextStreakValue"); if(win) { Int streak = max(stats.lossesInARow, stats.winsInARow); uStr.format(L"%d", streak); GadgetStaticTextSetText(win, uStr); } AsciiString favoriteSide = "Random"; win = findWindow(NULL, parentWindowName, "StaticTextFavoriteSideValue"); { Int numGames = 0; Int favorite = 0; for(it =stats.games.begin(); it != stats.games.end(); ++it) { if(it->second >= numGames) { numGames = it->second; favorite = it->first; } } if(numGames == 0) GadgetStaticTextSetText(win, TheGameText->fetch("GUI:None")); else if( stats.gamesAsRandom >= numGames ) GadgetStaticTextSetText(win, TheGameText->fetch("GUI:Random")); else { const PlayerTemplate *fac = ThePlayerTemplateStore->getNthPlayerTemplate(favorite); if (fac) { AsciiString side; side.format("SIDE:%s", fac->getSide().str()); GadgetStaticTextSetText(win, TheGameText->fetch(side)); favoriteSide = fac->getSide(); } } } win = findWindow(NULL, parentWindowName, "StaticTextTotalKillsValue"); if(win) { Int numGames = 0; for(it =stats.unitsKilled.begin(); it != stats.unitsKilled.end(); ++it) { numGames += it->second; } uStr.format(L"%d", numGames); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextTotalDeathsValue"); if(win) { Int numGames = 0; for(it =stats.unitsLost.begin(); it != stats.unitsLost.end(); ++it) { numGames += it->second; } uStr.format(L"%d", numGames); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextTotalBuiltValue"); if(win) { Int numGames = 0; for(it =stats.unitsBuilt.begin(); it != stats.unitsBuilt.end(); ++it) { numGames += it->second; } uStr.format(L"%d", numGames); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextBuildingsKilledValue"); if(win) { Int numGames = 0; for(it =stats.buildingsKilled.begin(); it != stats.buildingsKilled.end(); ++it) { numGames += it->second; } uStr.format(L"%d", numGames); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextBuildingsLostValue"); if(win) { Int numGames = 0; for(it =stats.buildingsLost.begin(); it != stats.buildingsLost.end(); ++it) { numGames += it->second; } uStr.format(L"%d", numGames); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextBuildingsBuiltValue"); if(win) { Int numGames = 0; for(it =stats.buildingsBuilt.begin(); it != stats.buildingsBuilt.end(); ++it) { numGames += it->second; } uStr.format(L"%d", numGames); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "StaticTextWinPercentValue"); if(win) { uStr.format(TheGameText->fetch("GUI:WinPercent"), REAL_TO_INT(numWins/(Real)numGames*100.0f)); GadgetStaticTextSetText(win, uStr); } win = findWindow(NULL, parentWindowName, "ProgressBarRank"); if(win && TheRankPointValues) { if( currentRank == MAX_RANKS - 1) { // we've reached the max rank win->winHide(TRUE); } else { GadgetProgressBarSetProgress(win, 100 * INT_TO_REAL(rankPoints - TheRankPointValues->m_ranks[currentRank])/( TheRankPointValues->m_ranks[currentRank + 1] - TheRankPointValues->m_ranks[currentRank])); } } win = findWindow(NULL, parentWindowName, "WinRank"); if(win && TheRankPointValues) { if (rankPoints == 0) win->winSetEnabledImage(0, lookupRankImage(AsciiString::TheEmptyString, 0)); else win->winSetEnabledImage(0, lookupRankImage(favoriteSide, currentRank)); } win = findWindow(NULL, parentWindowName, "StaticTextRank"); if(win) { AsciiString rankStr; rankStr.format("GUI:GSRank%d", currentRank); GadgetStaticTextSetText(win, TheGameText->fetch(rankStr)); } win = findWindow(NULL, parentWindowName, "StaticTextInProgress"); if (win) { if (weHaveStats) { win->winHide(TRUE); } else { win->winHide(FALSE); GadgetStaticTextSetText(win, TheGameText->fetch("GUI:FetchingPlayerInfo")); } } win = findWindow(NULL, parentWindowName, "ListboxInfo"); if(win) { populateBattleHonors(stats, stats.battleHonors,stats.gamesInRowWithLastGeneral,stats.lastGeneral,stats.challengeMedals, win); } } void HandlePersistentStorageResponses( void ) { if (TheGameSpyPSMessageQueue) { PSResponse resp; if (TheGameSpyPSMessageQueue->getResponse( resp )) { switch (resp.responseType) { case PSResponse::PSRESPONSE_COULDNOTCONNECT: { // message box & hide the window GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:PSCannotConnect"), NULL); GameSpyCloseOverlay(GSOVERLAY_PLAYERINFO); } break; case PSResponse::PSRESPONSE_PREORDER: { if (resp.preorder) { SetUnsignedIntInRegistry("", "Preorder", 1); TheGameSpyInfo->markPlayerAsPreorder( TheGameSpyInfo->getLocalProfileID() ); // force an update of our shtuff PSResponse newResp; newResp.responseType = PSResponse::PSRESPONSE_PLAYERSTATS; newResp.player = TheGameSpyPSMessageQueue->findPlayerStatsByID(TheGameSpyInfo->getLocalProfileID()); TheGameSpyPSMessageQueue->addResponse(newResp); } } break; case PSResponse::PSRESPONSE_PLAYERSTATS: { DEBUG_LOG(("LocalProfileID %d, resp.player.id %d, resp.player.locale %d\n", TheGameSpyInfo->getLocalProfileID(), resp.player.id, resp.player.locale)); /* if(resp.player.id == TheGameSpyInfo->getLocalProfileID() && resp.player.locale < LOC_MIN) { if (!GameSpyIsOverlayOpen(GSOVERLAY_LOCALESELECT)) GameSpyOpenOverlay(GSOVERLAY_LOCALESELECT); } else */ if (resp.player.id == TheGameSpyInfo->getLocalProfileID()) { PeerRequest req; req.peerRequestType = PeerRequest::PEERREQUEST_PUSHSTATS; GameSpyMiscPreferences cPref; req.statsToPush.locale = cPref.getLocale(); Int wins = 0, losses = 0; PerGeneralMap::const_iterator it; for (it = resp.player.wins.begin(); it != resp.player.wins.end(); ++it) { wins += it->second; } for (it = resp.player.losses.begin(); it != resp.player.losses.end(); ++it) { losses += it->second; } req.statsToPush.wins = wins; req.statsToPush.losses = losses; req.statsToPush.rankPoints = CalculateRank( resp.player ); Int numGames = 0; Int favorite = 0; for(it =resp.player.games.begin(); it != resp.player.games.end(); ++it) { if(it->second >= numGames) { numGames = it->second; favorite = it->first; } } if(numGames == 0) req.statsToPush.side = 0; else if( resp.player.gamesAsRandom >= numGames ) req.statsToPush.side = 0; else req.statsToPush.side = favorite; Bool isPreorder = TheGameSpyInfo->didPlayerPreorder( TheGameSpyInfo->getLocalProfileID() ); req.statsToPush.preorder = isPreorder; DEBUG_LOG(("PEERREQUEST_PUSHSTATS: stats will be %d,%d,%d,%d,%d,%d\n", req.statsToPush.locale, req.statsToPush.wins, req.statsToPush.losses, req.statsToPush.rankPoints, req.statsToPush.side, req.statsToPush.preorder)); TheGameSpyPeerMessageQueue->addRequest(req); } TheGameSpyPSMessageQueue->trackPlayerStats(resp.player); if (resp.player.id == TheGameSpyInfo->getLocalProfileID()) { UpdateLocalPlayerStats(); } DEBUG_LOG(("PopulatePlayerInfoWindows() - lookAtPlayerID is %d, got %d\n", lookAtPlayerID, resp.player.id)); PopulatePlayerInfoWindows("PopupPlayerInfo.wnd"); //GadgetListBoxAddEntryText(listboxInfo, UnicodeString(L"Got info!"), GameSpyColor[GSCOLOR_DEFAULT], -1); // also update info for player list in lobby PlayerInfoMap::iterator it = TheGameSpyInfo->getPlayerInfoMap()->begin(); while (it != TheGameSpyInfo->getPlayerInfoMap()->end()) { PlayerInfo *info = &(it->second); if (info && info->m_profileID == resp.player.id) { // update m_wins, m_losses, m_rankPoints Int wins = 0, losses = 0; PerGeneralMap::const_iterator it; for (it = resp.player.wins.begin(); it != resp.player.wins.end(); ++it) { wins += it->second; } for (it = resp.player.losses.begin(); it != resp.player.losses.end(); ++it) { losses += it->second; } info->m_wins = wins; info->m_losses = losses; info->m_rankPoints = CalculateRank( resp.player ); Int numGames = 0; Int favorite = 0; for(it = resp.player.games.begin(); it != resp.player.games.end(); ++it) { if(it->second >= numGames) { numGames = it->second; favorite = it->first; } } if(numGames == 0) info->m_side = 0; else if( resp.player.gamesAsRandom >= numGames ) info->m_side = 0; else info->m_side = favorite; PeerResponse r; r.peerResponseType = PeerResponse::PEERRESPONSE_PLAYERINFO; r.nick = info->m_name.str(); r.player.profileID = info->m_profileID; r.player.flags = info->m_flags; r.player.wins = info->m_wins; r.player.losses = info->m_losses; r.locale = info->m_locale.str(); r.player.rankPoints = info->m_rankPoints; r.player.side = info->m_side; r.player.preorder = info->m_preorder; TheGameSpyPeerMessageQueue->addResponse(r); break; } ++it; } } break; } } } } //------------------------------------------------------------------------------------------------- /** Initialize the Overlay */ //------------------------------------------------------------------------------------------------- void GameSpyPlayerInfoOverlayInit( WindowLayout *layout, void *userData ) { parentID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:PopupParent" ); buttonCloseID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:ButtonClose" ); buttonBuddiesID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:ButtonCommunicator" ); listboxInfoID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:ListboxInfo" ); //buttonOptionsID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:ButtonOptions" ); buttonSetLocaleID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:ButtonSetLocale" ); buttonDeleteAccountID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:ButtonDeleteAccount" ); checkBoxAsianFontID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:CheckBoxAsianText" ); checkBoxNonAsianFontID = TheNameKeyGenerator->nameToKey( "PopupPlayerInfo.wnd:CheckBoxNonAsianText" ); parent = TheWindowManager->winGetWindowFromId( NULL, parentID ); buttonClose = TheWindowManager->winGetWindowFromId( parent, buttonCloseID); buttonBuddies = TheWindowManager->winGetWindowFromId( parent, buttonBuddiesID); listboxInfo = TheWindowManager->winGetWindowFromId( parent, listboxInfoID); //buttonbuttonOptions = TheWindowManager->winGetWindowFromId( parent, buttonOptionsID); buttonSetLocale = TheWindowManager->winGetWindowFromId( parent, buttonSetLocaleID); buttonDeleteAccount = TheWindowManager->winGetWindowFromId( parent, buttonDeleteAccountID); checkBoxAsianFont = TheWindowManager->winGetWindowFromId( parent, checkBoxAsianFontID); checkBoxNonAsianFont = TheWindowManager->winGetWindowFromId( parent, checkBoxNonAsianFontID); // Show Menu layout->hide( FALSE ); // Set Keyboard to Main Parent TheWindowManager->winSetFocus( parent ); isOverlayActive = true; //GadgetListBoxAddEntryText(listboxInfo, UnicodeString(L"Working"), GameSpyColor[GSCOLOR_DEFAULT], -1); GameSpyCloseOverlay(GSOVERLAY_BUDDY); raiseMessageBox = true; PopulatePlayerInfoWindows("PopupPlayerInfo.wnd"); // we're on the myinfo screen if(lookAtPlayerID == TheGameSpyInfo->getLocalProfileID()) { //buttonbuttonOptions->winHide(FALSE); buttonSetLocale->winHide(FALSE); buttonDeleteAccount->winHide(TRUE); // set back to false when we have this worked out. checkBoxAsianFont->winHide(FALSE); checkBoxNonAsianFont->winHide(FALSE); } else { //buttonbuttonOptions->winHide(TRUE); buttonSetLocale->winHide(TRUE); buttonDeleteAccount->winHide(TRUE); checkBoxAsianFont->winHide(TRUE); checkBoxNonAsianFont->winHide(TRUE); } // set the asian check boxes CustomMatchPreferences pref; GadgetCheckBoxSetChecked(checkBoxAsianFont,!pref.getDisallowAsianText()); GadgetCheckBoxSetChecked(checkBoxNonAsianFont,!pref.getDisallowNonAsianText()); OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); if (GetVersionEx(&osvi)) { //check if we're running Win9x variant since they may need different fonts if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { if (checkBoxAsianFont) checkBoxAsianFont->winEnable(FALSE); if (checkBoxNonAsianFont) checkBoxNonAsianFont->winEnable(FALSE); } } //TheWindowManager->winSetModal(parent); } // GameSpyPlayerInfoOverlayInit //------------------------------------------------------------------------------------------------- /** Overlay shutdown method */ //------------------------------------------------------------------------------------------------- void GameSpyPlayerInfoOverlayShutdown( WindowLayout *layout, void *userData ) { // hide menu layout->hide( TRUE ); parent = NULL; // our shutdown is complete isOverlayActive = false; } // GameSpyPlayerInfoOverlayShutdown //------------------------------------------------------------------------------------------------- /** Overlay update method */ //------------------------------------------------------------------------------------------------- void GameSpyPlayerInfoOverlayUpdate( WindowLayout * layout, void *userData) { if (raiseMessageBox) RaiseGSMessageBox(); raiseMessageBox = false; }// GameSpyPlayerInfoOverlayUpdate //------------------------------------------------------------------------------------------------- /** Overlay input callback */ //------------------------------------------------------------------------------------------------- WindowMsgHandledType GameSpyPlayerInfoOverlayInput( 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)buttonClose, buttonCloseID ); } // end if // don't let key fall through anywhere else return MSG_HANDLED; } // end escape } // end switch( key ) } // end char } // end switch( msg ) return MSG_IGNORED; }// GameSpyPlayerInfoOverlayInput void messageBoxYes( void ); //------------------------------------------------------------------------------------------------- /** Overlay window system callback */ //------------------------------------------------------------------------------------------------- WindowMsgHandledType GameSpyPlayerInfoOverlaySystem( 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 GBM_SELECTED: { GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if (controlID == buttonCloseID) { RefreshGameListBoxes(); GameSpyCloseOverlay( GSOVERLAY_PLAYERINFO ); } else if (controlID == buttonBuddiesID) { RefreshGameListBoxes(); //GameSpyCloseOverlay( GSOVERLAY_PLAYERINFO ); GameSpyOpenOverlay( GSOVERLAY_BUDDY ); } // else if (controlID == buttonOptionsID) // { // RefreshGameListBoxes(); // GameSpyCloseOverlay( GSOVERLAY_PLAYERINFO ); // GameSpyOpenOverlay( GSOVERLAY_OPTIONS ); // } else if (controlID == buttonSetLocaleID) { RefreshGameListBoxes(); GameSpyCloseOverlay( GSOVERLAY_PLAYERINFO ); if (!GameSpyIsOverlayOpen(GSOVERLAY_LOCALESELECT)) GameSpyOpenOverlay( GSOVERLAY_LOCALESELECT ); ReOpenPlayerInfo(); } else if (controlID == buttonDeleteAccountID) { RefreshGameListBoxes(); GameSpyCloseOverlay( GSOVERLAY_PLAYERINFO ); MessageBoxYesNo(TheGameText->fetch("GUI:DeleteAccount"), TheGameText->fetch("GUI:AreYouSureDeleteAccount"),messageBoxYes, NULL); } else if (controlID == checkBoxAsianFontID) { Bool isChecked = !GadgetCheckBoxIsChecked(control); CustomMatchPreferences pref; pref.setDisallowAsianText(isChecked); pref.write(); if(TheGameSpyInfo) TheGameSpyInfo->setDisallowAsianText(isChecked); if(isChecked && !GadgetCheckBoxIsChecked(checkBoxNonAsianFont)) { GadgetCheckBoxSetChecked(checkBoxNonAsianFont, TRUE); CustomMatchPreferences pref; pref.setDisallowNonAsianText(FALSE); pref.write(); if(TheGameSpyInfo) TheGameSpyInfo->setDisallowNonAsianText(FALSE); } } else if (controlID == checkBoxNonAsianFontID) { Bool isChecked = !GadgetCheckBoxIsChecked(control); CustomMatchPreferences pref; pref.setDisallowNonAsianText(isChecked); pref.write(); if(TheGameSpyInfo) TheGameSpyInfo->setDisallowNonAsianText(isChecked); if(isChecked && !GadgetCheckBoxIsChecked(checkBoxAsianFont)) { GadgetCheckBoxSetChecked(checkBoxAsianFont, TRUE); CustomMatchPreferences pref; pref.setDisallowAsianText(FALSE); pref.write(); if(TheGameSpyInfo) TheGameSpyInfo->setDisallowAsianText(FALSE); } } break; }// case GBM_SELECTED: default: return MSG_IGNORED; }//Switch return MSG_HANDLED; }// GameSpyPlayerInfoOverlaySystem static void messageBoxYes( void ) { BuddyRequest breq; breq.buddyRequestType = BuddyRequest::BUDDYREQUEST_DELETEACCT; TheGameSpyBuddyMessageQueue->addRequest( breq ); TheGameSpyInfo->setLocalProfileID(0); }