Rise of Mankind: A New Dawn Code
Brought to you by:
afforess,
n4538-e1347
//---------------------------------------------------------------------------------------
//
// ***************** Civilization IV ********************
//
// FILE: CvGameTextMgr.cpp
//
// PURPOSE: Interfaces with GameText XML Files to manage the paths of art files
//
//---------------------------------------------------------------------------------------
// Copyright (c) 2004 Firaxis Games, Inc. All rights reserved.
//---------------------------------------------------------------------------------------
#include "CvGameCoreDLL.h"
#include "CvGameTextMgr.h"
#include "CvGameCoreUtils.h"
#include "CvDLLUtilityIFaceBase.h"
#include "CvDLLInterfaceIFaceBase.h"
#include "CvDLLSymbolIFaceBase.h"
#include "CvInfos.h"
#include "CvXMLLoadUtility.h"
#include "CvCity.h"
#include "CvPlayerAI.h"
#include "CvTeamAI.h"
#include "CvGameAI.h"
#include "CvSelectionGroup.h"
#include "CvMap.h"
#include "CvArea.h"
#include "CvPlot.h"
#include "CvPopupInfo.h"
#include "FProfiler.h"
#include "CyArgsList.h"
#include "CvDLLPythonIFaceBase.h"
#include "CvArtFileMgr.h"
#include <hash_map>
// BUG - start
#include "CvBugOptions.h"
// BUG - end
// BUG - Advanced Combat Odds - start
// RevolutionDCM - AdvancedCombatOdds.h included in CvGlobals.h
//#include "AdvancedCombatOdds.h"
// BUG - Advanced Combat Odds - end
int shortenID(int iId)
{
return iId;
}
// For displaying Asserts and error messages
static char* szErrorMsg;
//----------------------------------------------------------------------------
//
// FUNCTION: GetInstance()
//
// PURPOSE: Get the instance of this class.
//
//----------------------------------------------------------------------------
CvGameTextMgr& CvGameTextMgr::GetInstance()
{
static CvGameTextMgr gs_GameTextMgr;
return gs_GameTextMgr;
}
//----------------------------------------------------------------------------
//
// FUNCTION: CvGameTextMgr()
//
// PURPOSE: Constructor
//
//----------------------------------------------------------------------------
CvGameTextMgr::CvGameTextMgr()
{
}
CvGameTextMgr::~CvGameTextMgr()
{
}
//----------------------------------------------------------------------------
//
// FUNCTION: Initialize()
//
// PURPOSE: Allocates memory
//
//----------------------------------------------------------------------------
void CvGameTextMgr::Initialize()
{
}
//----------------------------------------------------------------------------
//
// FUNCTION: DeInitialize()
//
// PURPOSE: Clears memory
//
//----------------------------------------------------------------------------
void CvGameTextMgr::DeInitialize()
{
for(int i=0;i<(int)m_apbPromotion.size();i++)
{
delete [] m_apbPromotion[i];
}
}
//----------------------------------------------------------------------------
//
// FUNCTION: Reset()
//
// PURPOSE: Accesses CvXMLLoadUtility to clean global text memory and
// reload the XML files
//
//----------------------------------------------------------------------------
void CvGameTextMgr::Reset()
{
CvXMLLoadUtility pXML;
pXML.LoadGlobalText();
}
// Returns the current language
int CvGameTextMgr::getCurrentLanguage()
{
return gDLL->getCurrentLanguage();
}
void CvGameTextMgr::setYearStr(CvWString& szString, int iGameTurn, bool bSave, CalendarTypes eCalendar, int iStartYear, GameSpeedTypes eSpeed)
{
int iTurnYear = getTurnYearForGame(iGameTurn, iStartYear, eCalendar, eSpeed);
if (iTurnYear < 0)
{
if (bSave)
{
szString = gDLL->getText("TXT_KEY_TIME_BC_SAVE", CvWString::format(L"%04d", -iTurnYear).GetCString());
}
else
{
szString = gDLL->getText("TXT_KEY_TIME_BC", -(iTurnYear));
}
}
else if (iTurnYear > 0)
{
if (bSave)
{
szString = gDLL->getText("TXT_KEY_TIME_AD_SAVE", CvWString::format(L"%04d", iTurnYear).GetCString());
}
else
{
szString = gDLL->getText("TXT_KEY_TIME_AD", iTurnYear);
}
}
else
{
if (bSave)
{
szString = gDLL->getText("TXT_KEY_TIME_AD_SAVE", L"0000");
}
else
{
szString = gDLL->getText("TXT_KEY_TIME_AD", 0);
}
}
}
void CvGameTextMgr::setDateStr(CvWString& szString, int iGameTurn, bool bSave, CalendarTypes eCalendar, int iStartYear, GameSpeedTypes eSpeed)
{
CvWString szYearBuffer;
CvWString szWeekBuffer;
CvDate date;
CvDateIncrement inc;
setYearStr(szYearBuffer, iGameTurn, bSave, eCalendar, iStartYear, eSpeed);
switch (eCalendar)
{
case CALENDAR_DEFAULT:
if (GC.getGameINLINE().getGameTurn() == iGameTurn)
{
date = GC.getGameINLINE().getCurrentDate();
}
else
{
date = CvDate::getDate(iGameTurn, eSpeed);
}
inc = date.getIncrement(eSpeed);
if (((0 == inc.m_iIncrementMonth % GC.getNumMonthInfos()) && (inc.m_iIncrementMonth > 0)) || inc.m_iIncrementMonth >= 2*GC.getNumMonthInfos())
{
// Years
szString = szYearBuffer;
}
else if (inc.m_iIncrementMonth >= 3)
{
// Seasons
if (bSave)
{
szString = (szYearBuffer + "-" + GC.getSeasonInfo(date.getSeason()).getDescription());
}
else
{
szString = (GC.getSeasonInfo(date.getSeason())).getDescription() + CvString(", ") + szYearBuffer;
}
}
else if ((inc.m_iIncrementDay == 0) || (inc.m_iIncrementMonth >= 2))
{
// Months
if (bSave)
{
szString = (szYearBuffer + "-" + GC.getMonthInfo((MonthTypes)date.getMonth()).getDescription());
}
else
{
szString = (GC.getMonthInfo((MonthTypes)date.getMonth()).getDescription() + CvString(", ") + szYearBuffer);
}
}
else
{
// Exact date
szString = gDLL->getText("TXT_KEY_TIME_DATE", szYearBuffer.GetCString(), GC.getMonthInfo((MonthTypes)date.getMonth()).getDescription(), date.getDay());
}
break;
case CALENDAR_YEARS:
case CALENDAR_BI_YEARLY:
szString = szYearBuffer;
break;
case CALENDAR_TURNS:
szString = gDLL->getText("TXT_KEY_TIME_TURN", (iGameTurn + 1));
break;
case CALENDAR_SEASONS:
if (bSave)
{
szString = (szYearBuffer + "-" + GC.getSeasonInfo((SeasonTypes)(iGameTurn % GC.getNumSeasonInfos())).getDescription());
}
else
{
szString = (GC.getSeasonInfo((SeasonTypes)(iGameTurn % GC.getNumSeasonInfos())).getDescription() + CvString(", ") + szYearBuffer);
}
break;
case CALENDAR_MONTHS:
if (bSave)
{
szString = (szYearBuffer + "-" + GC.getMonthInfo((MonthTypes)(iGameTurn % GC.getNumMonthInfos())).getDescription());
}
else
{
szString = (GC.getMonthInfo((MonthTypes)(iGameTurn % GC.getNumMonthInfos())).getDescription() + CvString(", ") + szYearBuffer);
}
break;
case CALENDAR_WEEKS:
szWeekBuffer = gDLL->getText("TXT_KEY_TIME_WEEK", ((iGameTurn % GC.getDefineINT("WEEKS_PER_MONTHS")) + 1));
if (bSave)
{
szString = (szYearBuffer + "-" + GC.getMonthInfo((MonthTypes)((iGameTurn / GC.getDefineINT("WEEKS_PER_MONTHS")) % GC.getNumMonthInfos())).getDescription() + "-" + szWeekBuffer);
}
else
{
szString = (szWeekBuffer + ", " + GC.getMonthInfo((MonthTypes)((iGameTurn / GC.getDefineINT("WEEKS_PER_MONTHS")) % GC.getNumMonthInfos())).getDescription() + ", " + szYearBuffer);
}
break;
default:
FAssert(false);
}
}
void CvGameTextMgr::setTimeStr(CvWString& szString, int iGameTurn, bool bSave)
{
setDateStr(szString, iGameTurn, bSave, GC.getGameINLINE().getCalendar(), GC.getGameINLINE().getStartYear(), GC.getGameINLINE().getGameSpeedType());
}
void CvGameTextMgr::setInterfaceTime(CvWString& szString, PlayerTypes ePlayer)
{
CvWString szTempBuffer;
if (GET_PLAYER(ePlayer).isGoldenAge())
{
szString.Format(L"%c(%d) ", gDLL->getSymbolID(GOLDEN_AGE_CHAR), GET_PLAYER(ePlayer).getGoldenAgeTurns());
}
/************************************************************************************************/
/* Afforess Start 02/02/10 */
/* */
/* */
/************************************************************************************************/
/* else if (GET_PLAYER(ePlayer).isDarkAge())
{
szString.Format(L"%s", gDLL->getText("TXT_KEY_TURNS_LEFT_IN_DARK_AGE", GET_PLAYER(ePlayer).getDarkAgeTurns()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
else
{
szString.clear();
}
setTimeStr(szTempBuffer, GC.getGameINLINE().getGameTurn(), false);
szString += CvWString(szTempBuffer);
}
void CvGameTextMgr::setGoldStr(CvWString& szString, PlayerTypes ePlayer)
{
if (GET_PLAYER(ePlayer).getGold() < 0)
{
szString.Format(L"%c: " SETCOLR L"%d" SETCOLR, GC.getCommerceInfo(COMMERCE_GOLD).getChar(), TEXT_COLOR("COLOR_NEGATIVE_TEXT"), GET_PLAYER(ePlayer).getGold());
}
else
{
szString.Format(L"%c: %d", GC.getCommerceInfo(COMMERCE_GOLD).getChar(), GET_PLAYER(ePlayer).getGold());
}
int iGoldRate = GET_PLAYER(ePlayer).calculateGoldRate();
if (iGoldRate < 0)
{
szString += gDLL->getText("TXT_KEY_MISC_NEG_GOLD_PER_TURN", iGoldRate);
}
else if (iGoldRate > 0)
{
szString += gDLL->getText("TXT_KEY_MISC_POS_GOLD_PER_TURN", iGoldRate);
}
if (GET_PLAYER(ePlayer).isStrike())
{
szString += gDLL->getText("TXT_KEY_MISC_STRIKE");
}
}
void CvGameTextMgr::setResearchStr(CvWString& szString, PlayerTypes ePlayer)
{
CvWString szTempBuffer;
szString = gDLL->getText("TXT_KEY_MISC_RESEARCH_STRING", GC.getTechInfo(GET_PLAYER(ePlayer).getCurrentResearch()).getTextKeyWide());
if (GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getTechCount(GET_PLAYER(ePlayer).getCurrentResearch()) > 0)
{
szTempBuffer.Format(L" %d", (GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getTechCount(GET_PLAYER(ePlayer).getCurrentResearch()) + 1));
szString+=szTempBuffer;
}
szTempBuffer.Format(L" (%d)", GET_PLAYER(ePlayer).getResearchTurnsLeft(GET_PLAYER(ePlayer).getCurrentResearch(), true));
szString+=szTempBuffer;
}
void CvGameTextMgr::setOOSSeeds(CvWString& szString, PlayerTypes ePlayer)
{
if (GET_PLAYER(ePlayer).isHuman())
{
int iNetID = GET_PLAYER(ePlayer).getNetID();
if (gDLL->isConnected(iNetID))
{
szString = gDLL->getText("TXT_KEY_PLAYER_OOS", gDLL->GetSyncOOS(iNetID), gDLL->GetOptionsOOS(iNetID));
}
}
}
void CvGameTextMgr::setNetStats(CvWString& szString, PlayerTypes ePlayer)
{
if (ePlayer != GC.getGameINLINE().getActivePlayer())
{
if (GET_PLAYER(ePlayer).isHuman())
{
if (gDLL->getInterfaceIFace()->isNetStatsVisible())
{
int iNetID = GET_PLAYER(ePlayer).getNetID();
if (gDLL->isConnected(iNetID))
{
szString = gDLL->getText("TXT_KEY_MISC_NUM_MS", gDLL->GetLastPing(iNetID));
}
else
{
szString = gDLL->getText("TXT_KEY_MISC_DISCONNECTED");
}
}
}
else
{
szString = gDLL->getText("TXT_KEY_MISC_AI");
}
}
}
void CvGameTextMgr::setMinimizePopupHelp(CvWString& szString, const CvPopupInfo & info)
{
CvCity* pCity;
UnitTypes eTrainUnit;
BuildingTypes eConstructBuilding;
ProjectTypes eCreateProject;
ReligionTypes eReligion;
CivicTypes eCivic;
switch (info.getButtonPopupType())
{
case BUTTONPOPUP_CHOOSEPRODUCTION:
pCity = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCity(info.getData1());
if (pCity != NULL)
{
eTrainUnit = NO_UNIT;
eConstructBuilding = NO_BUILDING;
eCreateProject = NO_PROJECT;
switch (info.getData2())
{
case (ORDER_TRAIN):
eTrainUnit = (UnitTypes)info.getData3();
break;
case (ORDER_CONSTRUCT):
eConstructBuilding = (BuildingTypes)info.getData3();
break;
case (ORDER_CREATE):
eCreateProject = (ProjectTypes)info.getData3();
break;
default:
break;
}
if (eTrainUnit != NO_UNIT)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_PRODUCTION_UNIT", GC.getUnitInfo(eTrainUnit).getTextKeyWide(), pCity->getNameKey());
}
else if (eConstructBuilding != NO_BUILDING)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_PRODUCTION_BUILDING", GC.getBuildingInfo(eConstructBuilding).getTextKeyWide(), pCity->getNameKey());
}
else if (eCreateProject != NO_PROJECT)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_PRODUCTION_PROJECT", GC.getProjectInfo(eCreateProject).getTextKeyWide(), pCity->getNameKey());
}
else
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_PRODUCTION", pCity->getNameKey());
}
}
break;
case BUTTONPOPUP_CHANGERELIGION:
eReligion = ((ReligionTypes)(info.getData1()));
if (eReligion != NO_RELIGION)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHANGE_RELIGION", GC.getReligionInfo(eReligion).getTextKeyWide());
}
break;
case BUTTONPOPUP_CHOOSETECH:
if (info.getData1() > 0)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_TECH_FREE");
}
else
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHOOSE_TECH");
}
break;
case BUTTONPOPUP_CHANGECIVIC:
eCivic = ((CivicTypes)(info.getData2()));
if (eCivic != NO_CIVIC)
{
szString += gDLL->getText("TXT_KEY_MINIMIZED_CHANGE_CIVIC", GC.getCivicInfo(eCivic).getTextKeyWide());
}
break;
}
}
void CvGameTextMgr::setEspionageMissionHelp(CvWStringBuffer &szBuffer, const CvUnit* pUnit)
{
if (pUnit->isSpy())
{
PlayerTypes eOwner = pUnit->plot()->getOwnerINLINE();
if (NO_PLAYER != eOwner && GET_PLAYER(eOwner).getTeam() != pUnit->getTeam())
{
if (!pUnit->canEspionage(pUnit->plot()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HELP_NO_ESPIONAGE"));
if (pUnit->hasMoved() || pUnit->isMadeAttack())
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HELP_NO_ESPIONAGE_REASON_MOVED"));
}
else if (!pUnit->isInvisible(GET_PLAYER(eOwner).getTeam(), false))
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HELP_NO_ESPIONAGE_REASON_VISIBLE", GET_PLAYER(eOwner).getNameKey()));
}
}
else if (pUnit->getFortifyTurns() > 0)
{
int iModifier = -(pUnit->getFortifyTurns() * GC.getDefineINT("ESPIONAGE_EACH_TURN_UNIT_COST_DECREASE"));
if (0 != iModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_COST", iModifier));
}
}
}
}
}
void CvGameTextMgr::setUnitHelp(CvWStringBuffer &szString, const CvUnit* pUnit, bool bOneLine, bool bShort)
{
PROFILE_FUNC();
CvWString szTempBuffer;
BuildTypes eBuild;
int iCurrMoves;
int iI;
bool bFirst;
bool bShift = gDLL->shiftKey();
bool bAlt = gDLL->altKey();
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_UNIT_TEXT"), pUnit->getName().GetCString());
szString.append(szTempBuffer);
szString.append(L", ");
if (pUnit->getDomainType() == DOMAIN_AIR)
{
if (pUnit->airBaseCombatStr() > 0)
{
if (pUnit->isFighting())
{
szTempBuffer.Format(L"?/%d%c, ", pUnit->airBaseCombatStr(), gDLL->getSymbolID(STRENGTH_CHAR));
}
else if (pUnit->isHurt())
{
szTempBuffer.Format(L"%.1f/%d%c, ", (((float)(pUnit->airBaseCombatStr() * pUnit->currHitPoints())) / ((float)(pUnit->maxHitPoints()))), pUnit->airBaseCombatStr(), gDLL->getSymbolID(STRENGTH_CHAR));
}
else
{
szTempBuffer.Format(L"%d%c, ", pUnit->airBaseCombatStr(), gDLL->getSymbolID(STRENGTH_CHAR));
}
szString.append(szTempBuffer);
}
}
else
{
if (pUnit->canFight())
{
if (pUnit->isFighting())
{
szTempBuffer.Format(L"?/%d%c, ", pUnit->baseCombatStr(), gDLL->getSymbolID(STRENGTH_CHAR));
}
else if (pUnit->isHurt())
{
szTempBuffer.Format(L"%.1f/%d%c, ", (((float)(pUnit->baseCombatStr() * pUnit->currHitPoints())) / ((float)(pUnit->maxHitPoints()))), pUnit->baseCombatStr(), gDLL->getSymbolID(STRENGTH_CHAR));
}
else
{
szTempBuffer.Format(L"%d%c, ", pUnit->baseCombatStr(), gDLL->getSymbolID(STRENGTH_CHAR));
}
szString.append(szTempBuffer);
}
}
iCurrMoves = ((pUnit->movesLeft() / GC.getMOVE_DENOMINATOR()) + (((pUnit->movesLeft() % GC.getMOVE_DENOMINATOR()) > 0) ? 1 : 0));
if ((pUnit->baseMoves() == iCurrMoves) || (pUnit->getTeam() != GC.getGameINLINE().getActiveTeam()))
{
szTempBuffer.Format(L"%d%c", pUnit->baseMoves(), gDLL->getSymbolID(MOVES_CHAR));
}
else
{
szTempBuffer.Format(L"%d/%d%c", iCurrMoves, pUnit->baseMoves(), gDLL->getSymbolID(MOVES_CHAR));
}
szString.append(szTempBuffer);
if (pUnit->airRange() > 0)
{
szString.append(gDLL->getText("TXT_KEY_UNIT_HELP_AIR_RANGE", pUnit->airRange()));
}
eBuild = pUnit->getBuildType();
if (eBuild != NO_BUILD)
{
szString.append(L", ");
szTempBuffer.Format(L"%s (%d)", GC.getBuildInfo(eBuild).getDescription(), pUnit->plot()->getBuildTurnsLeft(eBuild, 0, 0));
szString.append(szTempBuffer);
}
if (pUnit->getImmobileTimer() > 0)
{
szString.append(L", ");
szString.append(gDLL->getText("TXT_KEY_UNIT_HELP_IMMOBILE", pUnit->getImmobileTimer()));
}
/*if (!bOneLine)
{
if (pUnit->getUnitCombatType() != NO_UNITCOMBAT)
{
szTempBuffer.Format(L" (%s)", GC.getUnitCombatInfo(pUnit->getUnitCombatType()).getDescription());
szString += szTempBuffer;
}
}*/
if (GC.getGameINLINE().isDebugMode() && !bAlt && !bShift)
{
FAssertMsg(pUnit->AI_getUnitAIType() != NO_UNITAI, "pUnit's AI type expected to != NO_UNITAI");
szTempBuffer.Format(L" (%s)", GC.getUnitAIInfo(pUnit->AI_getUnitAIType()).getDescription());
szString.append(szTempBuffer);
}
if ((pUnit->getTeam() == GC.getGameINLINE().getActiveTeam()) || GC.getGameINLINE().isDebugMode())
{
/************************************************************************************************/
/* Afforess Start 05/24/10 */
/* */
/* */
/************************************************************************************************/
/** ---- Start Original Code ---- **
if ((pUnit->getExperience() > 0) && !(pUnit->isFighting()))
{
szString.append(gDLL->getText("TXT_KEY_UNIT_HELP_LEVEL", pUnit->getExperience(), pUnit->experienceNeeded()));
/** ---- End Original Code ---- **/
if ((pUnit->getExperience100() > 0) && !(pUnit->isFighting()))
{
float fValue = (float)pUnit->getExperience100();
if (fmod(fValue,100) == 0)
{
szTempBuffer.Format(L"%.0f", fValue/100);
}
else if (fmod(fValue,10) == 0)
{
szTempBuffer.Format(L"%.1f", fValue/100);
}
else
{
szTempBuffer.Format(L"%.2f", fValue/100);
}
szString.append(gDLL->getText("TXT_KEY_UNIT_HELP_LEVEL", szTempBuffer.GetCString(), pUnit->experienceNeeded()));
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
/************************************************************************************************/
/* Afforess Start 02/27/10 */
/* */
/* */
/************************************************************************************************/
if (pUnit->isCommander())
{
szString.append(gDLL->getText("TXT_KEY_UNIT_HELP_COMMAND_RANGE", pUnit->commandRange()));
szString.append(gDLL->getText("TXT_KEY_UNIT_HELP_CONTROL_POINTS", pUnit->controlPointsLeft(), pUnit->controlPoints()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (pUnit->getOwnerINLINE() != GC.getGameINLINE().getActivePlayer() && !pUnit->isAnimal() && !pUnit->getUnitInfo().isHiddenNationality())
{
szString.append(L", ");
/************************************************************************************************/
/* REVOLUTION_MOD 02/01/08 jdog5000 */
/* */
/* */
/************************************************************************************************/
/* original code
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorA(), GET_PLAYER(pUnit->getOwnerINLINE()).getName());
*/
// For minor civs, display civ name instead of player name ... to differentiate
// and help human recognize why they can't contact that player
if( GET_PLAYER(pUnit->getOwnerINLINE()).isMinorCiv() )
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorA(), GET_PLAYER(pUnit->getOwnerINLINE()).getCivilizationDescription());
else
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorA(), GET_PLAYER(pUnit->getOwnerINLINE()).getName());
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
szString.append(szTempBuffer);
}
//TB SubCombat Mod begin
UnitCombatTypes eUnitCombatType;
bool bfirst = true;
bool bwrapup = false;
for (iI = 0; iI < GC.getNumUnitCombatInfos(); iI++)
{
if (pUnit->hasCombatType((UnitCombatTypes)iI))
{
bwrapup = true;
eUnitCombatType = ((UnitCombatTypes)iI);
if (bfirst)
{
szTempBuffer.Format(L"(%s", GC.getUnitCombatInfo(eUnitCombatType).getDescription());
szString.append(szTempBuffer);
bfirst = false;
}
else
{
szTempBuffer.Format(L", %s", GC.getUnitCombatInfo(eUnitCombatType).getDescription());
szString.append(szTempBuffer);
}
}
}
if (bwrapup)
{
szTempBuffer.Format(L")");
szString.append(szTempBuffer);
}
for (iI = 0; iI < GC.getNumPromotionInfos(); ++iI)
{
if (pUnit->isHasPromotion((PromotionTypes)iI))
{
szTempBuffer.Format(L"<img=%S size=16></img>", GC.getPromotionInfo((PromotionTypes)iI).getButton());
szString.append(szTempBuffer);
}
}
if (bAlt && (gDLL->getChtLvl() > 0))
{
CvSelectionGroup* eGroup = pUnit->getGroup();
if (eGroup != NULL)
{
if (pUnit->isGroupHead())
szString.append(CvWString::format(L"\nLeading "));
else
szString.append(L"\n");
szTempBuffer.Format(L"Group(%d), %d units", eGroup->getID(), eGroup->getNumUnits());
szString.append(szTempBuffer);
}
}
if (!bOneLine)
{
setEspionageMissionHelp(szString, pUnit);
// Thomas SG - AC: Advanced Cargo START
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_CARGO))
{
if (pUnit->totalCargoSpace() > 0)
{
if (pUnit->getNumSpecialCargos() == 0 || pUnit->getTotalSpecialCargoSpace() == 0)
{
if (pUnit->getTeam() == GC.getGameINLINE().getActiveTeam())
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_HELP_CARGO_SPACE", pUnit->getCargo(), pUnit->totalCargoSpace());
}
else
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_CARGO_SPACE", pUnit->totalCargoSpace());
}
szString.append(szTempBuffer);
}
if (pUnit->getNumSpecialCargos() > 0)
{
std::vector<int> aLoad;
aLoad.clear();
int GeneralCargo = pUnit->totalCargoSpace();
for (int j = 0; j < pUnit->getNumSpecialCargos(); j++)
{
GeneralCargo -= pUnit->getSpecialCargoSpace(j);
}
int FreeGeneralCargo = GeneralCargo;
for (int j = 0; j < pUnit->getNumSpecialCargos(); j++)
{
int loaded = 0;
if (pUnit->hasCargo())
{
CvPlot* pPlot = pUnit->plot();
CLLNode<IDInfo>* pUnitNode = pPlot->headUnitNode();
while (pUnitNode != NULL)
{
CvUnit* pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = pPlot->nextUnitNode(pUnitNode);
if (pLoopUnit->getTransportUnit() == pUnit)
{
bool isSpecial = false;
for (int k = 0;k < pLoopUnit->getNumSpecialUnitTypes();k++)
{
if (pUnit->getSpecialCargo(j) == pLoopUnit->getSpecialUnitType(k))
{
loaded++;
isSpecial = true;
}
}
if (!isSpecial)
{
FreeGeneralCargo--;
}
}
}
}
aLoad.push_back(loaded);
FreeGeneralCargo -= std::max(0, loaded - pUnit->getSpecialCargoSpace(j));
}
if (GeneralCargo > 0)
{
if (pUnit->getTeam() == GC.getGameINLINE().getActiveTeam())
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_HELP_CARGO_SPACE", GeneralCargo - FreeGeneralCargo, GeneralCargo);
}
else
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_CARGO_SPACE", GeneralCargo);
}
szString.append(szTempBuffer);
}
for (int j = 0; j < pUnit->getNumSpecialCargos(); j++)
{
if (pUnit->getSpecialCargoSpace(j) > 0)
{
if (pUnit->getTeam() == GC.getGameINLINE().getActiveTeam())
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_HELP_CARGO_SPACE", std::min (pUnit->getSpecialCargoSpace(j), aLoad[j]), pUnit->getSpecialCargoSpace(j));
}
else
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_CARGO_SPACE", pUnit->getSpecialCargoSpace(j));
}
szString.append(szTempBuffer);
szString.append(gDLL->getText("TXT_KEY_UNIT_ADVANCED_CARGO", GC.getSpecialUnitInfo(pUnit->getSpecialCargo(j)).getTextKeyWide()));
}
}
}
}
}
else
{
if (pUnit->cargoSpace() > 0)
{
if (pUnit->getTeam() == GC.getGameINLINE().getActiveTeam())
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_HELP_CARGO_SPACE", pUnit->getCargo(), pUnit->cargoSpace());
}
else
{
szTempBuffer = NEWLINE + gDLL->getText("TXT_KEY_UNIT_CARGO_SPACE", pUnit->cargoSpace());
}
szString.append(szTempBuffer);
if (pUnit->getNumSpecialCargos() > 0)
{
szString.append(gDLL->getText("TXT_KEY_UNIT_CARRIES", GC.getSpecialUnitInfo(pUnit->getSpecialCargo(0)).getTextKeyWide()));
}
}
}
// Thomas SG - AC: Advanced Cargo END
if (pUnit->fortifyModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_HELP_FORTIFY_BONUS", pUnit->fortifyModifier()));
}
if (!bShort)
{
if (pUnit->nukeRange() >= 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_CAN_NUKE"));
}
if (pUnit->alwaysInvisible())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_INVISIBLE_ALL"));
}
else if (pUnit->getInvisibleType() != NO_INVISIBLE)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_INVISIBLE_MOST"));
}
for (iI = 0; iI < pUnit->getNumSeeInvisibleTypes(); ++iI)
{
if (pUnit->getSeeInvisibleType(iI) != pUnit->getInvisibleType())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_SEE_INVISIBLE", GC.getInvisibleInfo(pUnit->getSeeInvisibleType(iI)).getTextKeyWide()));
}
}
if (pUnit->canMoveImpassable())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_CAN_MOVE_IMPASSABLE"));
}
}
if (pUnit->maxFirstStrikes() > 0)
{
if (pUnit->firstStrikes() == pUnit->maxFirstStrikes())
{
if (pUnit->firstStrikes() == 1)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", pUnit->firstStrikes()));
}
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", pUnit->firstStrikes(), pUnit->maxFirstStrikes()));
}
}
if (pUnit->immuneToFirstStrikes())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_IMMUNE_FIRST_STRIKES"));
}
if (!bShort)
{
if (pUnit->noDefensiveBonus())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_NO_DEFENSE_BONUSES"));
}
if (pUnit->flatMovementCost())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_FLAT_MOVEMENT"));
}
if (pUnit->ignoreTerrainCost())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_IGNORE_TERRAIN"));
}
if (pUnit->isBlitz())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_BLITZ_TEXT"));
}
if (pUnit->isAmphib())
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_RADIATION_TEXT_SPY"));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_AMPHIB_TEXT"));
}
//szString.append(NEWLINE);
//szString.append(gDLL->getText("TXT_KEY_PROMOTION_AMPHIB_TEXT"));
//TSHEEP
}
if (pUnit->isRiver())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_RIVER_ATTACK_TEXT"));
}
if (pUnit->isEnemyRoute())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_ENEMY_ROADS_TEXT"));
}
if (pUnit->isAlwaysHeal())
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_LOYALTY_TEXT_SPY"));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_ALWAYS_HEAL_TEXT"));
}
//szString.append(NEWLINE);
//szString.append(gDLL->getText("TXT_KEY_PROMOTION_ALWAYS_HEAL_TEXT"));
//TSHEEP End
}
if (pUnit->isHillsDoubleMove())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_HILLS_MOVE_TEXT"));
}
/************************************************************************************************/
/* Afforess Mountaineering Promotion 10/13/09 */
/* */
/* */
/************************************************************************************************/
if (pUnit->isCanMovePeaks())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_CAN_MOVE_PEAKS_TEXT"));
}
// Koshling - enhanced mountaineering mode to differentiate between ability to move through
// mountains, and ability to lead a stack through mountains
if (pUnit->isCanLeadThroughPeaks())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_CAN_LEAD_THROUGH_PEAKS_TEXT"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
for (iI = 0; iI < GC.getNumTerrainInfos(); ++iI)
{
if (pUnit->isTerrainDoubleMove((TerrainTypes)iI))
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_DOUBLE_MOVE_TEXT", GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < GC.getNumFeatureInfos(); ++iI)
{
if (pUnit->isFeatureDoubleMove((FeatureTypes)iI))
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_DOUBLE_MOVE_TEXT", GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
}
if (pUnit->getExtraVisibilityRange() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_VISIBILITY_TEXT", pUnit->getExtraVisibilityRange()));
}
if (pUnit->getExtraMoveDiscount() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_MOVE_DISCOUNT_TEXT", -(pUnit->getExtraMoveDiscount())));
}
if (pUnit->getExtraEnemyHeal() != 0)
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_INSTIGATE_TEXT_SPY", pUnit->getExtraEnemyHeal()));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", pUnit->getExtraEnemyHeal()) + gDLL->getText("TXT_KEY_PROMOTION_ENEMY_LANDS_TEXT"));
}
//szString.append(NEWLINE);
//szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", pUnit->getExtraEnemyHeal()) + gDLL->getText("TXT_KEY_PROMOTION_ENEMY_LANDS_TEXT"));
//TSHEEP End
}
if (pUnit->getExtraNeutralHeal() != 0)
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_INSTIGATE2_TEXT_SPY", pUnit->getExtraNeutralHeal()));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", pUnit->getExtraNeutralHeal()) + gDLL->getText("TXT_KEY_PROMOTION_NEUTRAL_LANDS_TEXT"));
}
//szString.append(NEWLINE);
//szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", pUnit->getExtraNeutralHeal()) + gDLL->getText("TXT_KEY_PROMOTION_NEUTRAL_LANDS_TEXT"));
//TSHEEP End
}
if (pUnit->getExtraFriendlyHeal() != 0)
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_POISON_TEXT_SPY", pUnit->getExtraFriendlyHeal()));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", pUnit->getExtraFriendlyHeal()) + gDLL->getText("TXT_KEY_PROMOTION_FRIENDLY_LANDS_TEXT"));
}
//szString.append(NEWLINE);
//szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", pUnit->getExtraFriendlyHeal()) + gDLL->getText("TXT_KEY_PROMOTION_FRIENDLY_LANDS_TEXT"));
//TSHEEP End
}
if (pUnit->getSameTileHeal() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_SAME_TEXT", pUnit->getSameTileHeal()) + gDLL->getText("TXT_KEY_PROMOTION_DAMAGE_TURN_TEXT"));
}
if (pUnit->getAdjacentTileHeal() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_ADJACENT_TEXT", pUnit->getAdjacentTileHeal()) + gDLL->getText("TXT_KEY_PROMOTION_DAMAGE_TURN_TEXT"));
}
}
if (pUnit->isOneUp())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ONEUP_TEXT", pUnit->getOneUpCount()));
}
if (pUnit->currInterceptionProbability() > 0)
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT_SPY", pUnit->currInterceptionProbability()));
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT_SPY_COUNTER", pUnit->currInterceptionProbability() * 5));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT", pUnit->currInterceptionProbability()));
}
//szString.append(NEWLINE);
//szString.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT", pUnit->currInterceptionProbability()));
//TSHEEP End
}
if (pUnit->evasionProbability() > 0)
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_EVADE_INTERCEPTION_SPY", pUnit->evasionProbability()));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_EVADE_INTERCEPTION", pUnit->evasionProbability()));
}
//szString.append(NEWLINE);
//szString.append(gDLL->getText("TXT_KEY_UNIT_EVADE_INTERCEPTION", pUnit->evasionProbability()));
//TSHEEP End
}
if (pUnit->withdrawalProbability() > 0)
{
//TSHEEP Display Spy Messages Differently
if(pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ESCAPE_SPY", pUnit->withdrawalProbability()));
}
else
{
if (bShort)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_WITHDRAWL_PROBABILITY_SHORT", pUnit->withdrawalProbability()));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_WITHDRAWL_PROBABILITY", pUnit->withdrawalProbability()));
}
}
/*if (bShort)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_WITHDRAWL_PROBABILITY_SHORT", pUnit->withdrawalProbability()));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_WITHDRAWL_PROBABILITY", pUnit->withdrawalProbability()));
}*/
//TSHEEP End
}
if (pUnit->combatLimit() < GC.getMAX_HIT_POINTS() && pUnit->canAttack())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_COMBAT_LIMIT", (100 * pUnit->combatLimit()) / GC.getMAX_HIT_POINTS()));
}
if (pUnit->collateralDamage() > 0)
{
szString.append(NEWLINE);
if (pUnit->getExtraCollateralDamage() == 0)
{
//RevDCM Max Damage to collateral
szString.append(gDLL->getText("TXT_KEY_UNIT_COLLATERAL_DAMAGE_REVDCM", 100 * pUnit->getUnitInfo().getCollateralDamageLimit() / GC.getMAX_HIT_POINTS(), pUnit->getUnitInfo().getCollateralDamageMaxUnits()));
//RevDCM end
}
else
{
szString.append(gDLL->getText("TXT_KEY_UNIT_COLLATERAL_DAMAGE_EXTRA", pUnit->getExtraCollateralDamage()));
}
}
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (pUnit->getUnitInfo().getUnitCombatCollateralImmune(iI))
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_COLLATERAL_IMMUNE", GC.getUnitCombatInfo((UnitCombatTypes)iI).getTextKeyWide()));
}
}
if (pUnit->getCollateralDamageProtection() > 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_COLLATERAL_PROTECTION_TEXT", pUnit->getCollateralDamageProtection()));
}
if (pUnit->getExtraCombatPercent() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_STRENGTH_TEXT", pUnit->getExtraCombatPercent()));
}
if (pUnit->cityAttackModifier() == pUnit->cityDefenseModifier())
{
if (pUnit->cityAttackModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_CITY_STRENGTH_MOD", pUnit->cityAttackModifier()));
}
}
else
{
if (pUnit->cityAttackModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_CITY_ATTACK_TEXT", pUnit->cityAttackModifier()));
}
if (pUnit->cityDefenseModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PROMOTION_CITY_DEFENSE_TEXT", pUnit->cityDefenseModifier()));
}
}
if (pUnit->animalCombatModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ANIMAL_COMBAT_MOD", pUnit->animalCombatModifier()));
}
if (pUnit->getDropRange() > 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_PARADROP_RANGE", pUnit->getDropRange()));
}
if (pUnit->hillsAttackModifier() == pUnit->hillsDefenseModifier())
{
if (pUnit->hillsAttackModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_HILLS_STRENGTH", pUnit->hillsAttackModifier()));
}
}
else
{
if (pUnit->hillsAttackModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_HILLS_ATTACK", pUnit->hillsAttackModifier()));
}
if (pUnit->hillsDefenseModifier() != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_HILLS_DEFENSE", pUnit->hillsDefenseModifier()));
}
}
for (iI = 0; iI < GC.getNumTerrainInfos(); ++iI)
{
if (pUnit->terrainAttackModifier((TerrainTypes)iI) == pUnit->terrainDefenseModifier((TerrainTypes)iI))
{
if (pUnit->terrainAttackModifier((TerrainTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_STRENGTH", pUnit->terrainAttackModifier((TerrainTypes)iI), GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
}
else
{
if (pUnit->terrainAttackModifier((TerrainTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ATTACK", pUnit->terrainAttackModifier((TerrainTypes)iI), GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
if (pUnit->terrainDefenseModifier((TerrainTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_DEFENSE", pUnit->terrainDefenseModifier((TerrainTypes)iI), GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
}
}
for (iI = 0; iI < GC.getNumFeatureInfos(); ++iI)
{
if (pUnit->featureAttackModifier((FeatureTypes)iI) == pUnit->featureDefenseModifier((FeatureTypes)iI))
{
if (pUnit->featureAttackModifier((FeatureTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_STRENGTH", pUnit->featureAttackModifier((FeatureTypes)iI), GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
}
else
{
if (pUnit->featureAttackModifier((FeatureTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ATTACK", pUnit->featureAttackModifier((FeatureTypes)iI), GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
if (pUnit->featureDefenseModifier((FeatureTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_DEFENSE", pUnit->featureDefenseModifier((FeatureTypes)iI), GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
}
}
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (pUnit->getUnitInfo().getUnitClassAttackModifier(iI) == GC.getUnitInfo(pUnit->getUnitType()).getUnitClassDefenseModifier(iI))
{
if (pUnit->getUnitInfo().getUnitClassAttackModifier(iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_MOD_VS_TYPE", pUnit->getUnitInfo().getUnitClassAttackModifier(iI), GC.getUnitClassInfo((UnitClassTypes)iI).getTextKeyWide()));
}
}
else
{
if (pUnit->getUnitInfo().getUnitClassAttackModifier(iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ATTACK_MOD_VS_CLASS", pUnit->getUnitInfo().getUnitClassAttackModifier(iI), GC.getUnitClassInfo((UnitClassTypes)iI).getTextKeyWide()));
}
if (pUnit->getUnitInfo().getUnitClassDefenseModifier(iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_DEFENSE_MOD_VS_CLASS", pUnit->getUnitInfo().getUnitClassDefenseModifier(iI), GC.getUnitClassInfo((UnitClassTypes) iI).getTextKeyWide()));
}
}
}
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (pUnit->unitCombatModifier((UnitCombatTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_MOD_VS_TYPE", pUnit->unitCombatModifier((UnitCombatTypes)iI), GC.getUnitCombatInfo((UnitCombatTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < NUM_DOMAIN_TYPES; ++iI)
{
if (pUnit->domainModifier((DomainTypes)iI) != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_MOD_VS_TYPE", pUnit->domainModifier((DomainTypes)iI), GC.getDomainInfo((DomainTypes)iI).getTextKeyWide()));
}
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (pUnit->getUnitInfo().getTargetUnitClass(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitClassInfo((UnitClassTypes)iI).getDescription());
}
}
if (!bFirst)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_TARGETS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (pUnit->getUnitInfo().getDefenderUnitClass(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitClassInfo((UnitClassTypes)iI).getDescription());
}
}
if (!bFirst)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_DEFENDS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (pUnit->getUnitInfo().getTargetUnitCombat(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
}
}
if (!bFirst)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_TARGETS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (pUnit->getUnitInfo().getDefenderUnitCombat(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
}
}
if (!bFirst)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_DEFENDS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (pUnit->getUnitInfo().getFlankingStrikeUnitClass(iI) > 0)
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitClassInfo((UnitClassTypes)iI).getDescription());
}
}
if (!bFirst)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_FLANKING_STRIKES", szTempBuffer.GetCString()));
}
/************************************************************************************************/
/* DCM 04/19/09 Johny Smith */
/************************************************************************************************/
// Dale - RB: Field Bombard START
if(GC.isDCM_RANGE_BOMBARD())
{
if (pUnit->getDCMBombRange() > 0 || pUnit->getDCMBombAccuracy() > 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_IS_DCM_BOMBARD"));
}
if (pUnit->getDCMBombRange() > 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_IS_RANGE_BOMBARD", pUnit->getDCMBombRange()));
}
if (pUnit->getDCMBombAccuracy() > 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_IS_ACCURACY_BOMBARD", pUnit->getDCMBombAccuracy()));
}
}
/************************************************************************************************/
/* DCM END */
/************************************************************************************************/
if (pUnit->bombardRate() > 0)
{
if (bShort)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_BOMBARD_RATE_SHORT", ((pUnit->bombardRate() * 100) / GC.getMAX_CITY_DEFENSE_DAMAGE())));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_BOMBARD_RATE", ((pUnit->bombardRate() * 100) / GC.getMAX_CITY_DEFENSE_DAMAGE())));
}
}
// < M.A.D. Nukes Start >
if(pUnit->isMADEnabled() && pUnit->getMADTargetPlot() != NULL)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_NUKE_TARGET_CITY", pUnit->getMADTargetPlot()->getPlotCity()->getNameKey()));
}
// < M.A.D. Nukes End >
/************************************************************************************************/
/* Afforess Route Restricter Start 08/03/09 */
/* */
/* */
/************************************************************************************************/
szTempBuffer.clear();
szTempBuffer.Format(L"%s%s ", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CAN_ONLY_TRAVERSE").GetCString());
for (iI = 0; iI < GC.getNumRouteInfos(); ++iI)
{
if (pUnit->getUnitInfo().getPassableRouteNeeded(iI))
{
CvWString szRoute;
szRoute.Format(L"<link=literal>%s</link>", GC.getRouteInfo((RouteTypes)iI).getDescription());
setListHelp(szString, szTempBuffer, szRoute, L", ", bFirst);
bFirst = false;
}
}
/************************************************************************************************/
/* Afforess Route Restricter End END */
/************************************************************************************************/
/************************************************************************************************/
/* DCM 04/19/09 Johny Smith */
/************************************************************************************************/
// Dale - RB: Field Bombard END
// Dale - FE: Fighters START
if (GC.isDCM_FIGHTER_ENGAGE())
{
if (GC.getUnitInfo(pUnit->getUnitType()).getDCMFighterEngage())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_IS_FIGHTER_ENGAGE"));
}
}
// Dale - FE: Fighters END
/************************************************************************************************/
/* DCM END */
/************************************************************************************************/
if (pUnit->isSpy())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_IS_SPY"));
}
if (pUnit->getUnitInfo().isNoRevealMap())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_VISIBILITY_MOVE_RANGE"));
}
pUnit->getPropertiesConst()->buildDisplayString(szString);
pUnit->getUnitInfo().getPropertyManipulators()->buildDisplayString(szString);
CvOutcomeList* pOutcomeList = pUnit->getUnitInfo().getKillOutcomeList();
if (pOutcomeList)
{
if (gDLL->getInterfaceIFace()->headSelectionListNode())
{
CvUnit* pSelectedUnit = ::getUnit(gDLL->getInterfaceIFace()->headSelectionListNode()->m_data);
if (pSelectedUnit)
{
if (pOutcomeList->isPossible(*pSelectedUnit))
{
szString.append(NEWLINE);
szString.append(L"On kill:");
pOutcomeList->buildDisplayString(szString, *pSelectedUnit);
}
}
}
}
if (!CvWString(pUnit->getUnitInfo().getHelp()).empty())
{
szString.append(NEWLINE);
szString.append(pUnit->getUnitInfo().getHelp());
}
if (bShift && (gDLL->getChtLvl() > 0))
{
szTempBuffer.Format(L"\nUnitAI Type = %s.", GC.getUnitAIInfo(pUnit->AI_getUnitAIType()).getDescription());
szString.append(szTempBuffer);
szTempBuffer.Format(L"\nSacrifice Value = %d.", pUnit->AI_sacrificeValue(NULL));
szString.append(szTempBuffer);
}
}
}
void CvGameTextMgr::setPlotListHelp(CvWStringBuffer &szString, CvPlot* pPlot, bool bOneLine, bool bShort)
{
PROFILE_FUNC();
int numPromotionInfos = GC.getNumPromotionInfos();
// if cheatmode and ctrl, display grouping info instead
if ((gDLL->getChtLvl() > 0) && gDLL->ctrlKey())
{
if (pPlot->isVisible(GC.getGameINLINE().getActiveTeam(), GC.getGameINLINE().isDebugMode()))
{
CvWString szTempString;
CLLNode<IDInfo>* pUnitNode = pPlot->headUnitNode();
while(pUnitNode != NULL)
{
CvUnit* pHeadUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = pPlot->nextUnitNode(pUnitNode);
// is this unit the head of a group, not cargo, and visible?
if (pHeadUnit && pHeadUnit->isGroupHead() && !pHeadUnit->isCargo() && !pHeadUnit->isInvisible(GC.getGameINLINE().getActiveTeam(), GC.getGameINLINE().isDebugMode()))
{
// head unit name and unitai
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR, 255,190,0,255, pHeadUnit->getName().GetCString()));
szString.append(CvWString::format(L" (%d)", shortenID(pHeadUnit->getID())));
getUnitAIString(szTempString, pHeadUnit->AI_getUnitAIType());
szString.append(CvWString::format(SETCOLR L" %s " ENDCOLR, GET_PLAYER(pHeadUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pHeadUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pHeadUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pHeadUnit->getOwnerINLINE()).getPlayerTextColorA(), szTempString.GetCString()));
// promotion icons
for (int iPromotionIndex = 0; iPromotionIndex < numPromotionInfos; iPromotionIndex++)
{
PromotionTypes ePromotion = (PromotionTypes)iPromotionIndex;
if (pHeadUnit->isHasPromotion(ePromotion))
{
szString.append(CvWString::format(L"<img=%S size=16></img>", GC.getPromotionInfo(ePromotion).getButton()));
}
}
// group
CvSelectionGroup* pHeadGroup = pHeadUnit->getGroup();
FAssertMsg(pHeadGroup != NULL, "unit has NULL group");
szString.append(CvWString::format(L"\nGroup:%d [%d units", shortenID(pHeadGroup->getID()), pHeadGroup->getNumUnits()));
if (pHeadGroup->getNumUnits() > 1)
{
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 07/17/09 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
if( pHeadGroup->getCargo() > 0 )
{
szString.append(CvWString::format(L" + %d cargo", pHeadGroup->getCargo()));
}
szString.append(CvWString::format(L"]"));
// get average damage
int iAverageDamage = 0;
CLLNode<IDInfo>* pUnitNode = pHeadGroup->headUnitNode();
while (pUnitNode != NULL)
{
CvUnit* pLoopUnit = ::getUnit(pUnitNode->m_data);
pUnitNode = pHeadGroup->nextUnitNode(pUnitNode);
iAverageDamage += (pLoopUnit->getDamage() * pLoopUnit->maxHitPoints()) / 100;
}
iAverageDamage /= pHeadGroup->getNumUnits();
if (iAverageDamage > 0)
{
szString.append(CvWString::format(L" %d%%", 100 - iAverageDamage));
}
}
if( pHeadGroup->isStranded() )
{
szString.append(CvWString::format(SETCOLR L"\n***STRANDED***" ENDCOLR, TEXT_COLOR("COLOR_RED")));
}
if( !gDLL->altKey() )
{
// mission ai
MissionAITypes eMissionAI = pHeadGroup->AI_getMissionAIType();
if (eMissionAI != NO_MISSIONAI)
{
getMissionAIString(szTempString, eMissionAI);
szString.append(CvWString::format(SETCOLR L"\n%s" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), szTempString.GetCString()));
}
// mission
MissionTypes eMissionType = (MissionTypes) pHeadGroup->getMissionType(0);
if (eMissionType != NO_MISSION)
{
getMissionTypeString(szTempString, eMissionType);
szString.append(CvWString::format(SETCOLR L"\n%s" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), szTempString.GetCString()));
}
// mission unit
CvUnit* pMissionUnit = pHeadGroup->AI_getMissionAIUnit();
if (pMissionUnit != NULL && (eMissionAI != NO_MISSIONAI || eMissionType != NO_MISSION))
{
// mission unit
szString.append(L"\n to ");
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR, GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorA(), pMissionUnit->getName().GetCString()));
szString.append(CvWString::format(L"(%d) G:%d", shortenID(pMissionUnit->getID()), shortenID(pMissionUnit->getGroupID())));
getUnitAIString(szTempString, pMissionUnit->AI_getUnitAIType());
szString.append(CvWString::format(SETCOLR L" %s" ENDCOLR, GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pMissionUnit->getOwnerINLINE()).getPlayerTextColorA(), szTempString.GetCString()));
}
// mission plot
if (eMissionAI != NO_MISSIONAI || eMissionType != NO_MISSION)
{
// first try the plot from the missionAI
CvPlot* pMissionPlot = pHeadGroup->AI_getMissionAIPlot();
// if MissionAI does not have a plot, get one from the mission itself
if (pMissionPlot == NULL && eMissionType != NO_MISSION)
{
switch (eMissionType)
{
case MISSION_MOVE_TO:
case MISSION_ROUTE_TO:
pMissionPlot = GC.getMapINLINE().plotINLINE(pHeadGroup->getMissionData1(0), pHeadGroup->getMissionData2(0));
break;
case MISSION_MOVE_TO_UNIT:
if (pMissionUnit != NULL)
{
pMissionPlot = pMissionUnit->plot();
}
break;
}
}
if (pMissionPlot != NULL)
{
szString.append(CvWString::format(L"\n [%d,%d]", pMissionPlot->getX_INLINE(), pMissionPlot->getY_INLINE()));
CvCity* pCity = pMissionPlot->getWorkingCity();
if (pCity != NULL)
{
szString.append(L" (");
if (!pMissionPlot->isCity())
{
DirectionTypes eDirection = estimateDirection(dxWrap(pMissionPlot->getX_INLINE() - pCity->plot()->getX_INLINE()), dyWrap(pMissionPlot->getY_INLINE() - pCity->plot()->getY_INLINE()));
getDirectionTypeString(szTempString, eDirection);
szString.append(CvWString::format(L"%s of ", szTempString.GetCString()));
}
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR L")", GET_PLAYER(pCity->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pCity->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pCity->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pCity->getOwnerINLINE()).getPlayerTextColorA(), pCity->getName().GetCString()));
}
else
{
if (pMissionPlot != pPlot)
{
DirectionTypes eDirection = estimateDirection(dxWrap(pMissionPlot->getX_INLINE() - pPlot->getX_INLINE()), dyWrap(pMissionPlot->getY_INLINE() - pPlot->getY_INLINE()));
getDirectionTypeString(szTempString, eDirection);
szString.append(CvWString::format(L" (%s)", szTempString.GetCString()));
}
PlayerTypes eMissionPlotOwner = pMissionPlot->getOwnerINLINE();
if (eMissionPlotOwner != NO_PLAYER)
{
szString.append(CvWString::format(L", " SETCOLR L"%s" ENDCOLR, GET_PLAYER(eMissionPlotOwner).getPlayerTextColorR(), GET_PLAYER(eMissionPlotOwner).getPlayerTextColorG(), GET_PLAYER(eMissionPlotOwner).getPlayerTextColorB(), GET_PLAYER(eMissionPlotOwner).getPlayerTextColorA(), GET_PLAYER(eMissionPlotOwner).getName()));
}
}
}
}
// activity
ActivityTypes eActivityType = (ActivityTypes) pHeadGroup->getActivityType();
if (eActivityType != NO_ACTIVITY)
{
getActivityTypeString(szTempString, eActivityType);
szString.append(CvWString::format(SETCOLR L"\n%s" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), szTempString.GetCString()));
}
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 06/10/08 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
if( !gDLL->altKey() && !gDLL->shiftKey() )
{
// display cargo for head unit
std::vector<CvUnit*> aCargoUnits;
pHeadUnit->getCargoUnits(aCargoUnits);
for (uint i = 0; i < aCargoUnits.size(); ++i)
{
CvUnit* pCargoUnit = aCargoUnits[i];
if (!pCargoUnit->isInvisible(GC.getGameINLINE().getActiveTeam(), GC.getGameINLINE().isDebugMode()))
{
// name and unitai
szString.append(CvWString::format(SETCOLR L"\n %s" ENDCOLR, TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT"), pCargoUnit->getName().GetCString()));
szString.append(CvWString::format(L"(%d)", shortenID(pCargoUnit->getID())));
getUnitAIString(szTempString, pCargoUnit->AI_getUnitAIType());
szString.append(CvWString::format(SETCOLR L" %s " ENDCOLR, GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorA(), szTempString.GetCString()));
// promotion icons
for (int iPromotionIndex = 0; iPromotionIndex < numPromotionInfos; iPromotionIndex++)
{
PromotionTypes ePromotion = (PromotionTypes)iPromotionIndex;
if (pCargoUnit->isHasPromotion(ePromotion))
{
szString.append(CvWString::format(L"<img=%S size=16></img>", GC.getPromotionInfo(ePromotion).getButton()));
}
}
}
}
// display grouped units
CLLNode<IDInfo>* pUnitNode3 = pPlot->headUnitNode();
while(pUnitNode3 != NULL)
{
CvUnit* pUnit = ::getUnit(pUnitNode3->m_data);
pUnitNode3 = pPlot->nextUnitNode(pUnitNode3);
// is this unit not head, in head's group and visible?
if (pUnit && (pUnit != pHeadUnit) && (pUnit->getGroupID() == pHeadUnit->getGroupID()) && !pUnit->isInvisible(GC.getGameINLINE().getActiveTeam(), GC.getGameINLINE().isDebugMode()))
{
FAssertMsg(!pUnit->isCargo(), "unit is cargo but head unit is not cargo");
// name and unitai
szString.append(CvWString::format(SETCOLR L"\n-%s" ENDCOLR, TEXT_COLOR("COLOR_UNIT_TEXT"), pUnit->getName().GetCString()));
szString.append(CvWString::format(L" (%d)", shortenID(pUnit->getID())));
getUnitAIString(szTempString, pUnit->AI_getUnitAIType());
szString.append(CvWString::format(SETCOLR L" %s " ENDCOLR, GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pUnit->getOwnerINLINE()).getPlayerTextColorA(), szTempString.GetCString()));
// promotion icons
for (int iPromotionIndex = 0; iPromotionIndex < numPromotionInfos; iPromotionIndex++)
{
PromotionTypes ePromotion = (PromotionTypes)iPromotionIndex;
if (pUnit->isHasPromotion(ePromotion))
{
szString.append(CvWString::format(L"<img=%S size=16></img>", GC.getPromotionInfo(ePromotion).getButton()));
}
}
// display cargo for loop unit
std::vector<CvUnit*> aLoopCargoUnits;
pUnit->getCargoUnits(aLoopCargoUnits);
for (uint i = 0; i < aLoopCargoUnits.size(); ++i)
{
CvUnit* pCargoUnit = aLoopCargoUnits[i];
if (!pCargoUnit->isInvisible(GC.getGameINLINE().getActiveTeam(), GC.getGameINLINE().isDebugMode()))
{
// name and unitai
szString.append(CvWString::format(SETCOLR L"\n %s" ENDCOLR, TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT"), pCargoUnit->getName().GetCString()));
szString.append(CvWString::format(L"(%d)", shortenID(pCargoUnit->getID())));
getUnitAIString(szTempString, pCargoUnit->AI_getUnitAIType());
szString.append(CvWString::format(SETCOLR L" %s " ENDCOLR, GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorR(), GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorG(), GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorB(), GET_PLAYER(pCargoUnit->getOwnerINLINE()).getPlayerTextColorA(), szTempString.GetCString()));
// promotion icons
for (int iPromotionIndex = 0; iPromotionIndex < numPromotionInfos; iPromotionIndex++)
{
PromotionTypes ePromotion = (PromotionTypes)iPromotionIndex;
if (pCargoUnit->isHasPromotion(ePromotion))
{
szString.append(CvWString::format(L"<img=%S size=16></img>", GC.getPromotionInfo(ePromotion).getButton()));
}
}
}
}
}
}
}
if( !gDLL->altKey() )
{
if( pPlot->getTeam() == NO_TEAM || GET_TEAM(pHeadGroup->getTeam()).isAtWar(pPlot->getTeam()) )
{
szString.append(NEWLINE);
CvWString szTempBuffer;
//AI strategies
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_DAGGER))
{
szTempBuffer.Format(L"Dagger, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_CRUSH))
{
szTempBuffer.Format(L"Crush, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_ALERT1))
{
szTempBuffer.Format(L"Alert1, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_ALERT2))
{
szTempBuffer.Format(L"Alert2, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_TURTLE))
{
szTempBuffer.Format(L"Turtle, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_LAST_STAND))
{
szTempBuffer.Format(L"Last Stand, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_FINAL_WAR))
{
szTempBuffer.Format(L"FinalWar, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_GET_BETTER_UNITS))
{
szTempBuffer.Format(L"GetBetterUnits, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_FASTMOVERS))
{
szTempBuffer.Format(L"FastMovers, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_LAND_BLITZ))
{
szTempBuffer.Format(L"LandBlitz, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_AIR_BLITZ))
{
szTempBuffer.Format(L"AirBlitz, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_OWABWNW))
{
szTempBuffer.Format(L"OWABWNW, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_PRODUCTION))
{
szTempBuffer.Format(L"Production, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_MISSIONARY))
{
szTempBuffer.Format(L"Missionary, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).AI_isDoStrategy(AI_STRATEGY_BIG_ESPIONAGE))
{
szTempBuffer.Format(L"BigEspionage, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pHeadGroup->getOwner()).isPushReligiousVictory())
{
szTempBuffer.Format(L"Religious Victory, ");
szString.append(szTempBuffer);
}
else if (GET_PLAYER(pHeadGroup->getOwner()).isConsiderReligiousVictory())
{
szTempBuffer.Format(L"Considers Religious Victory, ");
szString.append(szTempBuffer);
}
//Area battle plans.
if (pPlot->area()->getAreaAIType(pHeadGroup->getTeam()) == AREAAI_OFFENSIVE)
{
szTempBuffer.Format(L"\n Area AI = OFFENSIVE");
}
else if (pPlot->area()->getAreaAIType(pHeadGroup->getTeam()) == AREAAI_DEFENSIVE)
{
szTempBuffer.Format(L"\n Area AI = DEFENSIVE");
}
else if (pPlot->area()->getAreaAIType(pHeadGroup->getTeam()) == AREAAI_MASSING)
{
szTempBuffer.Format(L"\n Area AI = MASSING");
}
else if (pPlot->area()->getAreaAIType(pHeadGroup->getTeam()) == AREAAI_ASSAULT)
{
szTempBuffer.Format(L"\n Area AI = ASSAULT");
}
else if (pPlot->area()->getAreaAIType(pHeadGroup->getTeam()) == AREAAI_ASSAULT_MASSING)
{
szTempBuffer.Format(L"\n Area AI = ASSAULT_MASSING");
}
else if (pPlot->area()->getAreaAIType(pHeadGroup->getTeam()) == AREAAI_NEUTRAL)
{
szTempBuffer.Format(L"\n Area AI = NEUTRAL");
}
CvCity* pTargetCity = pPlot->area()->getTargetCity(pHeadGroup->getOwner());
if( pTargetCity )
{
szString.append(CvWString::format(L"\nTarget City: %s (%d)", pTargetCity->getName().c_str(), pTargetCity->getOwner()));
}
else
{
szString.append(CvWString::format(L"\nTarget City: None"));
}
if( gDLL->shiftKey() )
{
CvCity* pLoopCity;
int iLoop = 0;
//int iBestTargetValue = (pTargetCity != NULL ? GET_PLAYER(pHeadGroup->getOwner()).AI_targetCityValue(pTargetCity,false,true) : 0);
int iTargetValue = 0;
szString.append(CvWString::format(L"\n\nTarget City values:\n"));
for( int iPlayer = 0; iPlayer < MAX_PLAYERS; iPlayer++ )
{
if( GET_TEAM(pHeadGroup->getTeam()).AI_getWarPlan(GET_PLAYER((PlayerTypes)iPlayer).getTeam()) != NO_WARPLAN )
{
if( pPlot->area()->getCitiesPerPlayer((PlayerTypes)iPlayer) > 0 )
{
for (pLoopCity = GET_PLAYER((PlayerTypes)iPlayer).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER((PlayerTypes)iPlayer).nextCity(&iLoop))
{
if( pLoopCity->area() == pPlot->area() )
{
iTargetValue = GET_PLAYER(pHeadGroup->getOwner()).AI_targetCityValue(pLoopCity,false,true);
if( (GC.getMapINLINE().calculatePathDistance(pPlot, pLoopCity->plot()) < 20))
{
szString.append(CvWString::format(L"\n%s : %d + rand %d", pLoopCity->getName().c_str(), iTargetValue, (pLoopCity->getPopulation() / 2)));
}
}
}
}
}
}
}
}
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
// double space non-empty groups
if (pHeadGroup->getNumUnits() > 1 || pHeadUnit->hasCargo())
{
szString.append(NEWLINE);
}
szString.append(NEWLINE);
}
}
}
return;
}
CvUnit* pLoopUnit;
static const uint iMaxNumUnits = 15;
std::vector<CvUnit*> apUnits;
std::vector<int> aiUnitNumbers;
std::vector<int> aiUnitStrength;
std::vector<int> aiUnitMaxStrength;
std::vector<CvUnit *> plotUnits;
GC.getGameINLINE().getPlotUnits(pPlot, plotUnits);
int iNumVisibleUnits = 0;
if (pPlot->isVisible(GC.getGameINLINE().getActiveTeam(), GC.getGameINLINE().isDebugMode()))
{
CLLNode<IDInfo>* pUnitNode5 = pPlot->headUnitNode();
while(pUnitNode5 != NULL)
{
CvUnit* pUnit = ::getUnit(pUnitNode5->m_data);
pUnitNode5 = pPlot->nextUnitNode(pUnitNode5);
if (pUnit && !pUnit->isInvisible(GC.getGameINLINE().getActiveTeam(), GC.getGameINLINE().isDebugMode()))
{
++iNumVisibleUnits;
}
}
}
apUnits.erase(apUnits.begin(), apUnits.end());
if (iNumVisibleUnits > iMaxNumUnits)
{
aiUnitNumbers.erase(aiUnitNumbers.begin(), aiUnitNumbers.end());
aiUnitStrength.erase(aiUnitStrength.begin(), aiUnitStrength.end());
aiUnitMaxStrength.erase(aiUnitMaxStrength.begin(), aiUnitMaxStrength.end());
if (m_apbPromotion.size() == 0)
{
for (int iI = 0; iI < (GC.getNumUnitInfos() * MAX_PLAYERS); ++iI)
{
m_apbPromotion.push_back(new int[numPromotionInfos]);
}
}
for (int iI = 0; iI < (GC.getNumUnitInfos() * MAX_PLAYERS); ++iI)
{
aiUnitNumbers.push_back(0);
aiUnitStrength.push_back(0);
aiUnitMaxStrength.push_back(0);
for (int iJ = 0; iJ < numPromotionInfos; iJ++)
{
m_apbPromotion[iI][iJ] = 0;
}
}
}
int iCount = 0;
for (int iI = iMaxNumUnits; iI < iNumVisibleUnits && iI < (int) plotUnits.size(); ++iI)
{
pLoopUnit = plotUnits[iI];
if (pLoopUnit != NULL && pLoopUnit != pPlot->getCenterUnit())
{
apUnits.push_back(pLoopUnit);
if (iNumVisibleUnits > iMaxNumUnits)
{
int iIndex = pLoopUnit->getUnitType() * MAX_PLAYERS + pLoopUnit->getOwner();
if (aiUnitNumbers[iIndex] == 0)
{
++iCount;
}
++aiUnitNumbers[iIndex];
int iBase = (DOMAIN_AIR == pLoopUnit->getDomainType() ? pLoopUnit->airBaseCombatStr() : pLoopUnit->baseCombatStr());
if (iBase > 0 && pLoopUnit->maxHitPoints() > 0)
{
aiUnitMaxStrength[iIndex] += 100 * iBase;
aiUnitStrength[iIndex] += (100 * iBase * pLoopUnit->currHitPoints()) / pLoopUnit->maxHitPoints();
}
for (int iJ = 0; iJ < numPromotionInfos; iJ++)
{
if (pLoopUnit->isHasPromotion((PromotionTypes)iJ))
{
++m_apbPromotion[iIndex][iJ];
}
}
}
}
}
if (iNumVisibleUnits > 0)
{
if (pPlot->getCenterUnit())
{
setUnitHelp(szString, pPlot->getCenterUnit(), iNumVisibleUnits > iMaxNumUnits, true);
}
uint iNumShown = std::min<uint>(iMaxNumUnits, iNumVisibleUnits);
for (uint iI = 0; iI < iNumShown && iI < (int) plotUnits.size(); ++iI)
{
CvUnit* pLoopUnit = plotUnits[iI];
if (pLoopUnit != pPlot->getCenterUnit())
{
szString.append(NEWLINE);
setUnitHelp(szString, pLoopUnit, true, true);
}
}
bool bFirst = true;
if (iNumVisibleUnits > iMaxNumUnits)
{
for (int iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
for (int iJ = 0; iJ < MAX_PLAYERS; iJ++)
{
int iIndex = iI * MAX_PLAYERS + iJ;
if (aiUnitNumbers[iIndex] > 0)
{
if (iCount < 5 || bFirst)
{
szString.append(NEWLINE);
bFirst = false;
}
else
{
szString.append(L", ");
}
/************************************************************************************************/
/* Afforess Start 08/25/10 */
/* */
/* */
/************************************************************************************************/
/*
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription()));
*/
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription(GET_PLAYER((PlayerTypes)iJ).getCivilizationType())));
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szString.append(CvWString::format(L" (%d)", aiUnitNumbers[iIndex]));
if (aiUnitMaxStrength[iIndex] > 0)
{
int iBase = (aiUnitMaxStrength[iIndex] / aiUnitNumbers[iIndex]) / 100;
int iCurrent = (aiUnitStrength[iIndex] / aiUnitNumbers[iIndex]) / 100;
int iCurrent100 = (aiUnitStrength[iIndex] / aiUnitNumbers[iIndex]) % 100;
if (0 == iCurrent100)
{
if (iBase == iCurrent)
{
szString.append(CvWString::format(L" %d", iBase));
}
else
{
szString.append(CvWString::format(L" %d/%d", iCurrent, iBase));
}
}
else
{
szString.append(CvWString::format(L" %d.%02d/%d", iCurrent, iCurrent100, iBase));
}
szString.append(CvWString::format(L"%c", gDLL->getSymbolID(STRENGTH_CHAR)));
}
for (int iK = 0; iK < numPromotionInfos; iK++)
{
if (m_apbPromotion[iIndex][iK] > 0)
{
szString.append(CvWString::format(L"%d<img=%S size=16></img>", m_apbPromotion[iIndex][iK], GC.getPromotionInfo((PromotionTypes)iK).getButton()));
}
}
if (iJ != GC.getGameINLINE().getActivePlayer() && !GC.getUnitInfo((UnitTypes)iI).isAnimal() && !GC.getUnitInfo((UnitTypes)iI).isHiddenNationality())
{
szString.append(L", ");
/************************************************************************************************/
/* REVOLUTION_MOD 02/01/08 jdog5000 */
/* */
/* For BarbarianCiv and minor civs */
/************************************************************************************************/
/* original code
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR, GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorR(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorG(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorB(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorA(), GET_PLAYER((PlayerTypes)iJ).getName()));
*/
// For minor civs, display civ name instead of player name ... to differentiate
// and help human recognize why they can't contact that player
if( GET_PLAYER((PlayerTypes)iJ).isMinorCiv() )
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR, GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorR(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorG(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorB(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorA(), GET_PLAYER((PlayerTypes)iJ).getCivilizationDescription()));
else
szString.append(CvWString::format(SETCOLR L"%s" ENDCOLR, GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorR(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorG(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorB(), GET_PLAYER((PlayerTypes)iJ).getPlayerTextColorA(), GET_PLAYER((PlayerTypes)iJ).getName()));
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
}
}
}
}
}
}
}
// Returns true if help was given...
bool CvGameTextMgr::setCombatPlotHelp(CvWStringBuffer &szString, CvPlot* pPlot)
{
PROFILE_FUNC();
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 05/22/08 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
if (gDLL->altKey() && (gDLL->getChtLvl() > 0))
{
setPlotHelp( szString, pPlot );
return true;
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** BEGIN v2.0 */
/*************************************************************************************************/
/*
Note that due to the large amount of extra content added to this function (setCombatPlotHelp), this should never be used in any function that needs to be called repeatedly (e.g. hundreds of times) quickly.
It is fine for a human player mouse-over (which is what it is used for).
*/
/* New Code */
bool ACO_enabled = getBugOptionBOOL("ACO__Enabled", true, "ACO_ENABLED");
bool bShift = gDLL->shiftKey();
int iView = bShift ? 2 : 1;
if (getBugOptionBOOL("ACO__SwapViews", false, "ACO_SWAP_VIEWS"))
{
iView = 3 - iView; //swaps 1 and 2.
}
CvWString szTempBuffer2;
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** END v2.0 */
/*************************************************************************************************/
CvUnit* pAttacker;
CvUnit* pDefender;
CvWString szTempBuffer;
CvWString szOffenseOdds;
CvWString szDefenseOdds;
bool bValid;
int iModifier;
if (gDLL->getInterfaceIFace()->getLengthSelectionList() == 0)
{
return false;
}
bValid = false;
switch (gDLL->getInterfaceIFace()->getSelectionList()->getDomainType())
{
case DOMAIN_SEA:
bValid = pPlot->isWater();
break;
case DOMAIN_AIR:
bValid = true;
break;
case DOMAIN_LAND:
bValid = !(pPlot->isWater());
break;
case DOMAIN_IMMOBILE:
break;
default:
FAssert(false);
break;
}
if (!bValid)
{
return false;
}
int iOdds;
pAttacker = gDLL->getInterfaceIFace()->getSelectionList()->AI_getBestGroupAttacker(pPlot, false, iOdds);
if (pAttacker == NULL)
{
pAttacker = gDLL->getInterfaceIFace()->getSelectionList()->AI_getBestGroupAttacker(pPlot, false, iOdds, true);
}
if (pAttacker != NULL)
{
// BUG - Combat Odds for Friendlies - start
pDefender = pPlot->getBestDefender(NO_PLAYER, pAttacker->getOwnerINLINE(), pAttacker, !gDLL->altKey(), NO_TEAM == pAttacker->getDeclareWarMove(pPlot));
// BUG - Combat Odds for Friendlies - end
if (pDefender != NULL && pDefender != pAttacker && pDefender->canDefend(pPlot) && pAttacker->canAttack(*pDefender))
{
if (pAttacker->getDomainType() != DOMAIN_AIR)
{
int iCombatOdds = getCombatOdds(pAttacker, pDefender);
if (pAttacker->combatLimit() >= GC.getMAX_HIT_POINTS())
{
if (iCombatOdds > 999)
{
szTempBuffer = L"> 99.9";
}
else if (iCombatOdds < 1)
{
szTempBuffer = L"< 0.1";
}
else
{
szTempBuffer.Format(L"%.1f", ((float)iCombatOdds) / 10.0f);
}
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** BEGIN v2.0 */
/*************************************************************************************************/
/* Old Code */
/*
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS", szTempBuffer.GetCString()));
*/
/* New Code */
if ((!ACO_enabled) || (getBugOptionBOOL("ACO__ForceOriginalOdds", false, "ACO_FORCE_ORIGINAL_ODDS")))
{
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS", szTempBuffer.GetCString()));
}
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** END v2.0 */
/*************************************************************************************************/
}
int iWithdrawal = 0;
if (pAttacker->combatLimit() < GC.getMAX_HIT_POINTS())
{
iWithdrawal += 100 * iCombatOdds;
}
iWithdrawal += std::min(100, pAttacker->withdrawalProbability()) * (1000 - iCombatOdds);
if (iWithdrawal > 0 || pAttacker->combatLimit() < GC.getMAX_HIT_POINTS())
{
if (iWithdrawal > 99900)
{
szTempBuffer = L"> 99.9";
}
else if (iWithdrawal < 100)
{
szTempBuffer = L"< 0.1";
}
else
{
szTempBuffer.Format(L"%.1f", iWithdrawal / 1000.0f);
}
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** BEGIN v2.0 */
/*************************************************************************************************/
/* Old Code */
/*
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS_RETREAT", szTempBuffer.GetCString()));
*/
/* New Code */
if ((!ACO_enabled) || (getBugOptionBOOL("ACO__ForceOriginalOdds", false, "ACO_FORCE_ORIGINAL_ODDS")))
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS_RETREAT", szTempBuffer.GetCString()));
if (ACO_enabled)
{
szString.append(NEWLINE);
}
}
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** END v2.0 */
/*************************************************************************************************/
}
//szTempBuffer.Format(L"AI odds: %d%%", iOdds);
//szString += NEWLINE + szTempBuffer;
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** BEGIN v2.0 */
/*************************************************************************************************/
/* New Code */
if (ACO_enabled)
{
//Change this to true when you need to spot errors, particular in the expected hit points calculations
bool ACO_debug = getBugOptionBOOL("ACO__Debug", false, "ACO_DEBUG");
/** phungus sart **/
// bool bctrl; bctrl = gDLL->ctrlKey();
// if (bctrl)
// {//SWITCHAROO IS DISABLED IN V1.0. Hopefully it will be available in the next version. At the moment is has issues when modifiers are present.
// CvUnit* swap = pAttacker;
// pAttacker = pDefender;
// pDefender = swap;
//
// CvPlot* pAttackerPlot = pAttacker->plot();
// CvPlot* pDefenderPlot = pDefender->plot();
// }
int iAttackerExperienceModifier = 0;
int iDefenderExperienceModifier = 0;
for (int ePromotion = 0; ePromotion < GC.getNumPromotionInfos(); ++ePromotion)
{
if (pAttacker->isHasPromotion((PromotionTypes)ePromotion) && GC.getPromotionInfo((PromotionTypes)ePromotion).getExperiencePercent() != 0)
{
iAttackerExperienceModifier += GC.getPromotionInfo((PromotionTypes)ePromotion).getExperiencePercent();
}
}
for (int ePromotion = 0; ePromotion < GC.getNumPromotionInfos(); ++ePromotion)
{
if (pDefender->isHasPromotion((PromotionTypes)ePromotion) && GC.getPromotionInfo((PromotionTypes)ePromotion).getExperiencePercent() != 0)
{
iDefenderExperienceModifier += GC.getPromotionInfo((PromotionTypes)ePromotion).getExperiencePercent();
}
}
/** phungus end **/ //thanks to phungus420
/** Many thanks to DanF5771 for some of these calculations! **/
int iAttackerStrength = pAttacker->currCombatStr(NULL, NULL);
int iAttackerFirepower = pAttacker->currFirepower(NULL, NULL);
int iDefenderStrength = pDefender->currCombatStr(pPlot, pAttacker);
int iDefenderFirepower = pDefender->currFirepower(pPlot, pAttacker);
FAssert((iAttackerStrength + iDefenderStrength)*(iAttackerFirepower + iDefenderFirepower) > 0);
int iStrengthFactor = ((iAttackerFirepower + iDefenderFirepower + 1) / 2);
int iDamageToAttacker = std::max(1,((GC.getDefineINT("COMBAT_DAMAGE") * (iDefenderFirepower + iStrengthFactor)) / (iAttackerFirepower + iStrengthFactor)));
int iDamageToDefender = std::max(1,((GC.getDefineINT("COMBAT_DAMAGE") * (iAttackerFirepower + iStrengthFactor)) / (iDefenderFirepower + iStrengthFactor)));
int iFlankAmount = iDamageToAttacker;
int iDefenderOdds = ((GC.getDefineINT("COMBAT_DIE_SIDES") * iDefenderStrength) / (iAttackerStrength + iDefenderStrength));
int iAttackerOdds = GC.getDefineINT("COMBAT_DIE_SIDES") - iDefenderOdds;
// Barbarian related code.
if (getBugOptionBOOL("ACO__IgnoreBarbFreeWins", false, "ACO_IGNORE_BARB_FREE_WINS"))//Are we not going to ignore barb free wins? If not, skip this section...
{
if (pDefender->isBarbarian())
{
//defender is barbarian
if (!GET_PLAYER(pAttacker->getOwnerINLINE()).isBarbarian() && GET_PLAYER(pAttacker->getOwnerINLINE()).getWinsVsBarbs() < GC.getHandicapInfo(GET_PLAYER(pAttacker->getOwnerINLINE()).getHandicapType()).getFreeWinsVsBarbs())
{
//attacker is not barb and attacker player has free wins left
//I have assumed in the following code only one of the units (attacker and defender) can be a barbarian
iDefenderOdds = std::min((10 * GC.getDefineINT("COMBAT_DIE_SIDES")) / 100, iDefenderOdds);
iAttackerOdds = std::max((90 * GC.getDefineINT("COMBAT_DIE_SIDES")) / 100, iAttackerOdds);
szTempBuffer.Format(SETCOLR L"%d\n" ENDCOLR,
TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),GC.getHandicapInfo(GET_PLAYER(pAttacker->getOwnerINLINE()).getHandicapType()).getFreeWinsVsBarbs()-GET_PLAYER(pAttacker->getOwnerINLINE()).getWinsVsBarbs());
szString.append(gDLL->getText("TXT_ACO_BarbFreeWinsLeft"));
szString.append(szTempBuffer.GetCString());
}
}
else
{
//defender is not barbarian
if (pAttacker->isBarbarian())
{
//attacker is barbarian
if (!GET_PLAYER(pDefender->getOwnerINLINE()).isBarbarian() && GET_PLAYER(pDefender->getOwnerINLINE()).getWinsVsBarbs() < GC.getHandicapInfo(GET_PLAYER(pDefender->getOwnerINLINE()).getHandicapType()).getFreeWinsVsBarbs())
{
//defender is not barbarian and defender has free wins left and attacker is barbarian
iAttackerOdds = std::min((10 * GC.getDefineINT("COMBAT_DIE_SIDES")) / 100, iAttackerOdds);
iDefenderOdds = std::max((90 * GC.getDefineINT("COMBAT_DIE_SIDES")) / 100, iDefenderOdds);
szTempBuffer.Format(SETCOLR L"%d\n" ENDCOLR,
TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),GC.getHandicapInfo(GET_PLAYER(pDefender->getOwnerINLINE()).getHandicapType()).getFreeWinsVsBarbs()-GET_PLAYER(pDefender->getOwnerINLINE()).getWinsVsBarbs());
szString.append(gDLL->getText("TXT_ACO_BarbFreeWinsLeft"));
szString.append(szTempBuffer.GetCString());
}
}
}
}
//XP calculations
int iExperience;
int iWithdrawXP;//thanks to phungus420
iWithdrawXP = GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL");//thanks to phungus420
if (pAttacker->combatLimit() < 100)
{
iExperience = GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL");
}
else
{
iExperience = (pDefender->attackXPValue() * iDefenderStrength) / iAttackerStrength;
iExperience = range(iExperience, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
}
int iDefExperienceKill;
iDefExperienceKill = (pAttacker->defenseXPValue() * iAttackerStrength) / iDefenderStrength;
iDefExperienceKill = range(iDefExperienceKill, GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT"), GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
int iBonusAttackerXP = (iExperience * iAttackerExperienceModifier) / 100;
int iBonusDefenderXP = (iDefExperienceKill * iDefenderExperienceModifier) / 100;
int iBonusWithdrawXP = (GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL") * iAttackerExperienceModifier) / 100;
//The following code adjusts the XP for barbarian encounters. In standard game, barb and animal xp cap is 10,5 respectively.
/**Thanks to phungus420 for the following block of code! **/
if(pDefender->isBarbarian())
{
if (pDefender->isAnimal())
{
//animal
iExperience = range(iExperience,0,GC.getDefineINT("ANIMAL_MAX_XP_VALUE")-(pAttacker->getExperience()));
if (iExperience < 0 )
{
iExperience = 0;
}
iWithdrawXP = range(iWithdrawXP,0,GC.getDefineINT("ANIMAL_MAX_XP_VALUE")-(pAttacker->getExperience()));
if (iWithdrawXP < 0 )
{
iWithdrawXP = 0;
}
iBonusAttackerXP = range(iBonusAttackerXP,0,GC.getDefineINT("ANIMAL_MAX_XP_VALUE")-(pAttacker->getExperience() + iExperience));
if (iBonusAttackerXP < 0 )
{
iBonusAttackerXP = 0;
}
iBonusWithdrawXP = range(iBonusWithdrawXP,0,GC.getDefineINT("ANIMAL_MAX_XP_VALUE")-(pAttacker->getExperience() + iWithdrawXP));
if (iBonusWithdrawXP < 0 )
{
iBonusWithdrawXP = 0;
}
}
else
{
//normal barbarian
iExperience = range(iExperience,0,GC.getDefineINT("BARBARIAN_MAX_XP_VALUE")-pAttacker->getExperience());
if (iExperience < 0 )
{
iExperience = 0;
}
iWithdrawXP = range(iWithdrawXP,0,GC.getDefineINT("BARBARIAN_MAX_XP_VALUE")-(pAttacker->getExperience()));
if (iWithdrawXP < 0 )
{
iWithdrawXP = 0;
}
iBonusAttackerXP = range(iBonusAttackerXP,0,GC.getDefineINT("BARBARIAN_MAX_XP_VALUE")-(pAttacker->getExperience() + iExperience));
if (iBonusAttackerXP < 0 )
{
iBonusAttackerXP = 0;
}
iBonusWithdrawXP = range(iBonusWithdrawXP,0,GC.getDefineINT("BARBARIAN_MAX_XP_VALUE")-(pAttacker->getExperience() + iWithdrawXP));
if (iBonusWithdrawXP < 0 )
{
iBonusWithdrawXP = 0;
}
}
}
int iNeededRoundsAttacker = (pDefender->currHitPoints() - pDefender->maxHitPoints() + pAttacker->combatLimit() - (((pAttacker->combatLimit())==pDefender->maxHitPoints())?1:0))/iDamageToDefender + 1;
//The extra term introduced here was to account for the incorrect way it treated units that had combatLimits.
//A catapult that deals 25HP per round, and has a combatLimit of 75HP must deal four successful hits before it kills the warrior -not 3. This is proved in the way CvUnit::resolvecombat works
// The old formula (with just a plain -1 instead of a conditional -1 or 0) was incorrectly saying three.
// int iNeededRoundsDefender = (pAttacker->currHitPoints() + iDamageToAttacker - 1 ) / iDamageToAttacker; //this is idential to the following line
int iNeededRoundsDefender = (pAttacker->currHitPoints() - 1)/iDamageToAttacker + 1;
//szTempBuffer.Format(L"iNeededRoundsAttacker = %d\niNeededRoundsDefender = %d",iNeededRoundsAttacker,iNeededRoundsDefender);
//szString.append(NEWLINE);szString.append(szTempBuffer.GetCString());
//szTempBuffer.Format(L"pDefender->currHitPoints = %d\n-pDefender->maxHitPOints = %d\n + pAttacker->combatLimit = %d\n - 1 if\npAttackercomBatlimit equals pDefender->maxHitpoints\n=(%d == %d)\nall over iDamageToDefender = %d\n+1 = ...",
//pDefender->currHitPoints(),pDefender->maxHitPoints(),pAttacker->combatLimit(),pAttacker->combatLimit(),pDefender->maxHitPoints(),iDamageToDefender);
//szString.append(NEWLINE);szString.append(szTempBuffer.GetCString());
int iDefenderHitLimit = pDefender->maxHitPoints() - pAttacker->combatLimit();
//NOW WE CALCULATE SOME INTERESTING STUFF :)
float E_HP_Att = 0.0f;//expected damage dealt to attacker
float E_HP_Def = 0.0f;
float E_HP_Att_Withdraw; //Expected hitpoints for attacker if attacker withdraws (not the same as retreat)
float E_HP_Att_Victory; //Expected hitpoints for attacker if attacker kills defender
int E_HP_Att_Retreat = (pAttacker->currHitPoints()) - (iNeededRoundsDefender-1)*iDamageToAttacker;//this one is predetermined easily
float E_HP_Def_Withdraw;
float E_HP_Def_Defeat; // if attacker dies
//Note E_HP_Def is the same for if the attacker withdraws or dies
float AttackerUnharmed;
float DefenderUnharmed;
AttackerUnharmed = getCombatOddsSpecific(pAttacker,pDefender,0,iNeededRoundsAttacker);
DefenderUnharmed = getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,0);
DefenderUnharmed += getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,0);//attacker withdraws or retreats
float prob_bottom_Att_HP; // The probability the attacker exits combat with min HP
float prob_bottom_Def_HP; // The probability the defender exits combat with min HP
if (ACO_debug)
{
szTempBuffer.Format(L"E[HP ATTACKER]");
//szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
// already covers both possibility of defender not being killed AND being killed
for (int n_A = 0; n_A < iNeededRoundsDefender; n_A++)
{
//prob_attack[n_A] = getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
E_HP_Att += ( (pAttacker->currHitPoints()) - n_A*iDamageToAttacker) * getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
if (ACO_debug)
{
szTempBuffer.Format(L"+%d * %.2f%% (Def %d) (%d:%d)",
((pAttacker->currHitPoints()) - n_A*iDamageToAttacker),100.0f*getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker),iDefenderHitLimit,n_A,iNeededRoundsAttacker);
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
}
E_HP_Att_Victory = E_HP_Att;//NOT YET NORMALISED
E_HP_Att_Withdraw = E_HP_Att;//NOT YET NORMALIZED
prob_bottom_Att_HP = getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,iNeededRoundsAttacker);
if((pAttacker->withdrawalProbability()) > 0)
{
// if withdraw odds involved
if (ACO_debug)
{
szTempBuffer.Format(L"Attacker retreat odds");
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
for (int n_D = 0; n_D < iNeededRoundsAttacker; n_D++)
{
E_HP_Att += ( (pAttacker->currHitPoints()) - (iNeededRoundsDefender-1)*iDamageToAttacker) * getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D);
prob_bottom_Att_HP += getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D);
if (ACO_debug)
{
szTempBuffer.Format(L"+%d * %.2f%% (Def %d) (%d:%d)",
( (pAttacker->currHitPoints()) - (iNeededRoundsDefender-1)*iDamageToAttacker),100.0f*getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D),(pDefender->currHitPoints())-n_D*iDamageToDefender,iNeededRoundsDefender-1,n_D);
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
}
}
// finished with the attacker HP I think.
if (ACO_debug)
{
szTempBuffer.Format(L"E[HP DEFENDER]\nOdds that attacker dies or retreats");
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
for (int n_D = 0; n_D < iNeededRoundsAttacker; n_D++)
{
//prob_defend[n_D] = getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,n_D);//attacker dies
//prob_defend[n_D] += getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D);//attacker retreats
E_HP_Def += ( (pDefender->currHitPoints()) - n_D*iDamageToDefender) * (getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,n_D)+getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D));
if (ACO_debug)
{
szTempBuffer.Format(L"+%d * %.2f%% (Att 0 or %d) (%d:%d)",
( (pDefender->currHitPoints()) - n_D*iDamageToDefender),100.0f*(getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,n_D)+getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D)),(pAttacker->currHitPoints())-(iNeededRoundsDefender-1)*iDamageToAttacker,iNeededRoundsDefender,n_D);
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
}
prob_bottom_Def_HP = getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,iNeededRoundsAttacker-1);
//prob_bottom_Def_HP += getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,iNeededRoundsAttacker-1);
E_HP_Def_Defeat = E_HP_Def;
E_HP_Def_Withdraw = 0.0f;
if (pAttacker->combatLimit() < (pDefender->maxHitPoints() ))//if attacker has a combatLimit (eg. catapult)
{
if (pAttacker->combatLimit() == iDamageToDefender*(iNeededRoundsAttacker-1) )
{
//Then we have an odd situation because the last successful hit by an attacker will do 0 damage, and doing either iNeededRoundsAttacker or iNeededRoundsAttacker-1 will cause the same damage
if (ACO_debug)
{
szTempBuffer.Format(L"Odds that attacker withdraws at combatLimit (abnormal)");
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
for (int n_A = 0; n_A < iNeededRoundsDefender; n_A++)
{
//prob_defend[iNeededRoundsAttacker-1] += getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);//this is the defender at the combatLimit
E_HP_Def += (float)iDefenderHitLimit * getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
//should be the same as
//E_HP_Def += ( (pDefender->currHitPoints()) - (iNeededRoundsAttacker-1)*iDamageToDefender) * getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
E_HP_Def_Withdraw += (float)iDefenderHitLimit * getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
prob_bottom_Def_HP += getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
if (ACO_debug)
{
szTempBuffer.Format(L"+%d * %.2f%% (Att %d) (%d:%d)",
iDefenderHitLimit,100.0f*getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker),100-n_A*iDamageToAttacker,n_A,iNeededRoundsAttacker);
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
}
}
else // normal situation
{
if (ACO_debug)
{
szTempBuffer.Format(L"Odds that attacker withdraws at combatLimit (normal)",pAttacker->combatLimit());
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
for (int n_A = 0; n_A < iNeededRoundsDefender; n_A++)
{
E_HP_Def += (float)iDefenderHitLimit * getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
E_HP_Def_Withdraw += (float)iDefenderHitLimit * getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
prob_bottom_Def_HP += getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
if (ACO_debug)
{
szTempBuffer.Format(L"+%d * %.2f%% (Att %d) (%d:%d)",
iDefenderHitLimit,100.0f*getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker),GC.getMAX_HIT_POINTS()-n_A*iDamageToAttacker,n_A,iNeededRoundsAttacker);
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
}
}//for
}//else
}
if (ACO_debug)
{
szString.append(NEWLINE);
}
float Scaling_Factor = 1.6f;//how many pixels per 1% of odds
float AttackerKillOdds = 0.0f;
float PullOutOdds = 0.0f;//Withdraw odds
float RetreatOdds = 0.0f;
float DefenderKillOdds = 0.0f;
float CombatRatio = ((float)(pAttacker->currCombatStr(NULL, NULL))) / ((float)(pDefender->currCombatStr(pPlot, pAttacker)));
// THE ALL-IMPORTANT COMBATRATIO
float AttXP = (pDefender->attackXPValue())/CombatRatio;
float DefXP = (pAttacker->defenseXPValue())*CombatRatio;// These two values are simply for the Unrounded XP display
// General odds
if (pAttacker->combatLimit() == (pDefender->maxHitPoints() )) //ie. we can kill the defender... I hope this is the most general form
{
//float AttackerKillOdds = 0.0f;
for (int n_A = 0; n_A < iNeededRoundsDefender; n_A++)
{
AttackerKillOdds += getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
}//for
}
else
{
// else we cannot kill the defender (eg. catapults attacking)
for (int n_A = 0; n_A < iNeededRoundsDefender; n_A++)
{
PullOutOdds += getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
}//for
}
if ((pAttacker->withdrawalProbability()) > 0)
{
for (int n_D = 0; n_D < iNeededRoundsAttacker; n_D++)
{
RetreatOdds += getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D);
}//for
}
for (int n_D = 0; n_D < iNeededRoundsAttacker; n_D++)
{
DefenderKillOdds += getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,n_D);
}//for
//DefenderKillOdds = 1.0f - (AttackerKillOdds + RetreatOdds + PullOutOdds);//this gives slight negative numbers sometimes, I think
if (iView & getBugOptionINT("ACO__ShowSurvivalOdds", 3, "ACO_SHOW_SURVIVAL_ODDS"))
{
szTempBuffer.Format(L"%.2f%%",100.0f*(AttackerKillOdds+RetreatOdds+PullOutOdds));
szTempBuffer2.Format(L"%.2f%%", 100.0f*(RetreatOdds+PullOutOdds+DefenderKillOdds));
szString.append(gDLL->getText("TXT_ACO_SurvivalOdds"));
szString.append(gDLL->getText("TXT_ACO_VS", szTempBuffer.GetCString(), szTempBuffer2.GetCString()));
szString.append(NEWLINE);
}
if (pAttacker->withdrawalProbability()>=100)
{
// a rare situation indeed
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_ACO_SurvivalGuaranteed"));
}
//CvWString szTempBuffer2; // moved to elsewhere in the code (earlier)
//CvWString szBuffer; // duplicate
float prob1 = 100.0f*(AttackerKillOdds + PullOutOdds);//up to win odds
float prob2 = prob1 + 100.0f*RetreatOdds;//up to retreat odds
float prob = 100.0f*(AttackerKillOdds+RetreatOdds+PullOutOdds);
int pixels_left = 199;// 1 less than 200 to account for right end bar
int pixels;
int fullBlocks;
int lastBlock;
pixels = (2 * ((int)(prob1 + 0.5)))-1; // 1% per pixel // subtracting one to account for left end bar
fullBlocks = pixels / 10;
lastBlock = pixels % 10;
szString.append(L"<img=Art/ACO/green_bar_left_end.dds>");
for (int i = 0; i < fullBlocks; ++i)
{
szString.append(L"<img=Art/ACO/green_bar_10.dds>");
pixels_left -= 10;
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/green_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
pixels_left-= lastBlock;
}
pixels = 2 * ((int)(prob2 + 0.5)) - (pixels+1);//the number up to the next one...
fullBlocks = pixels / 10;
lastBlock = pixels % 10;
for (int i = 0; i < fullBlocks; ++i)
{
szString.append(L"<img=Art/ACO/yellow_bar_10.dds>");
pixels_left -= 10;
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/yellow_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
pixels_left-= lastBlock;
}
fullBlocks = pixels_left / 10;
lastBlock = pixels_left % 10;
for (int i = 0; i < fullBlocks; ++i)
{
szString.append(L"<img=Art/ACO/red_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/red_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/red_bar_right_end.dds> ");
szString.append(NEWLINE);
if (pAttacker->combatLimit() == (pDefender->maxHitPoints() ))
{
szTempBuffer.Format(L": " SETCOLR L"%.2f%% " L"%d" ENDCOLR,
TEXT_COLOR("COLOR_POSITIVE_TEXT"),100.0f*AttackerKillOdds,iExperience);
szString.append(gDLL->getText("TXT_ACO_Victory"));
szString.append(szTempBuffer.GetCString());
if (iAttackerExperienceModifier > 0)
{
szTempBuffer.Format(SETCOLR L"+%d" ENDCOLR,TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),iBonusAttackerXP);
szString.append(szTempBuffer.GetCString());
}
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szString.append(gDLL->getText("TXT_ACO_XP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(" (");
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szTempBuffer.Format(L"%.1f",
E_HP_Att_Victory/AttackerKillOdds);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
}
else
{
szTempBuffer.Format(L": " SETCOLR L"%.2f%% " L"%d" ENDCOLR,
TEXT_COLOR("COLOR_POSITIVE_TEXT"),100.0f*PullOutOdds,GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL"));
//iExperience,TEXT_COLOR("COLOR_POSITIVE_TEXT"), E_HP_Att_Victory/AttackerKillOdds);
szString.append(gDLL->getText("TXT_ACO_Withdraw"));
szString.append(szTempBuffer.GetCString());
if (iAttackerExperienceModifier > 0)
{
szTempBuffer.Format(SETCOLR L"+%d" ENDCOLR,TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),iBonusWithdrawXP);
szString.append(szTempBuffer.GetCString());
}
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szString.append(gDLL->getText("TXT_ACO_XP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(" (");
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szTempBuffer.Format(L"%.1f",E_HP_Att_Withdraw/PullOutOdds);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(",");
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szTempBuffer.Format(L"%d",iDefenderHitLimit);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
}
szString.append(")");
if (iDefenderOdds == 0)
{
szString.append(gDLL->getText("TXT_ACO_GuaranteedNoDefenderHit"));
DefenderKillOdds = 0.0f;
}
if ((pAttacker->withdrawalProbability()) > 0)//if there are retreat odds
{
szString.append(NEWLINE);
szTempBuffer.Format(L": " SETCOLR L"%.2f%% " ENDCOLR SETCOLR L"%d" ENDCOLR,
TEXT_COLOR("COLOR_UNIT_TEXT"),100.0f*RetreatOdds,TEXT_COLOR("COLOR_POSITIVE_TEXT"),GC.getDefineINT("EXPERIENCE_FROM_WITHDRAWL"));
szString.append(gDLL->getText("TXT_ACO_Retreat"));
szString.append(szTempBuffer.GetCString());
if (iAttackerExperienceModifier > 0)
{
szTempBuffer.Format(SETCOLR L"+%d" ENDCOLR,TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),iBonusWithdrawXP);
szString.append(szTempBuffer.GetCString());
}
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szString.append(gDLL->getText("TXT_ACO_XP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(" (");
szTempBuffer.Format(SETCOLR L"%d" ENDCOLR ,
TEXT_COLOR("COLOR_UNIT_TEXT"),E_HP_Att_Retreat);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP_NEUTRAL"));
szString.append(")");
//szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
}
szString.append(NEWLINE);
szTempBuffer.Format(L": " SETCOLR L"%.2f%% " L"%d" ENDCOLR,
TEXT_COLOR("COLOR_NEGATIVE_TEXT"),100.0f*DefenderKillOdds,iDefExperienceKill);
szString.append(gDLL->getText("TXT_ACO_Defeat"));
szString.append(szTempBuffer.GetCString());
if (iDefenderExperienceModifier > 0)
{
szTempBuffer.Format(SETCOLR L"+%d" ENDCOLR,TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),iBonusDefenderXP);
szString.append(szTempBuffer.GetCString());
}
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szString.append(gDLL->getText("TXT_ACO_XP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(" (");
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szTempBuffer.Format(L"%.1f",
(iDefenderOdds != 0 ? E_HP_Def_Defeat/(RetreatOdds+DefenderKillOdds):0.0));
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(")");
float HP_percent_cutoff = 0.5f; // Probabilities lower than this (in percent) will not be shown individually for the HP detail section.
if (!getBugOptionBOOL("ACO__MergeShortBars", true, "ACO_MERGE_SHORT_BARS"))
{
HP_percent_cutoff = 0.0f;
}
int first_combined_HP_Att = 0;
int first_combined_HP_Def = 0;
int last_combined_HP;
float combined_HP_sum = 0.0f;
BOOL bIsCondensed = false;
//START ATTACKER DETAIL HP HERE
// Individual bars for each attacker HP outcome.
if (iView & getBugOptionINT("ACO__ShowAttackerHealthBars", 2, "ACO_SHOW_ATTACKER_HEALTH_BARS"))
{
for (int n_A = 0; n_A < iNeededRoundsDefender-1; n_A++)
{
float prob = 100.0f*getCombatOddsSpecific(pAttacker,pDefender,n_A,iNeededRoundsAttacker);
if (prob > HP_percent_cutoff || n_A==0)
{
if (bIsCondensed) // then we need to print the prev ones
{
int pixels = (int)(Scaling_Factor*combined_HP_sum + 0.5); // 1% per pixel
int fullBlocks = (pixels) / 10;
int lastBlock = (pixels) % 10;
//if(pixels>=2) {szString.append(L"<img=Art/ACO/green_bar_left_end.dds>");}
szString.append(NEWLINE);
szString.append(L"<img=Art/ACO/green_bar_left_end.dds>");
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/green_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/green_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/green_bar_right_end.dds>");
szString.append(L" ");
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
if (last_combined_HP!=first_combined_HP_Att)
{
szTempBuffer.Format(L"%d",last_combined_HP);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("-"));
}
szTempBuffer.Format(L"%d",first_combined_HP_Att);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",combined_HP_sum);
szString.append(szTempBuffer.GetCString());
bIsCondensed = false;//resetting
combined_HP_sum = 0.0f;//resetting this variable
last_combined_HP = 0;
}
szString.append(NEWLINE);
int pixels = (int)(Scaling_Factor*prob + 0.5); // 1% per pixel
int fullBlocks = (pixels) / 10;
int lastBlock = (pixels) % 10;
szString.append(L"<img=Art/ACO/green_bar_left_end.dds>");
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/green_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/green_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/green_bar_right_end.dds>");
szString.append(L" ");
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szTempBuffer.Format(L"%d",
((pAttacker->currHitPoints()) - n_A*iDamageToAttacker));
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",
prob);
szString.append(szTempBuffer.GetCString());
}
else // we add to the condensed list
{
bIsCondensed = true;
first_combined_HP_Att = std::max(first_combined_HP_Att,((pAttacker->currHitPoints()) - n_A*iDamageToAttacker));
last_combined_HP = ((pAttacker->currHitPoints()) - n_A*iDamageToAttacker);
combined_HP_sum += prob;
}
}
if (bIsCondensed) // then we need to print the prev ones
{
szString.append(NEWLINE);
int pixels = (int)(Scaling_Factor*combined_HP_sum + 0.5); // 1% per pixel
int fullBlocks = (pixels) / 10;
int lastBlock = (pixels) % 10;
szString.append(L"<img=Art/ACO/green_bar_left_end.dds>");
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/green_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/green_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/green_bar_right_end.dds>");
szString.append(L" ");
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
if (last_combined_HP!=first_combined_HP_Att)
{
szTempBuffer.Format(L"%d",last_combined_HP);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("-"));
}
szTempBuffer.Format(L"%d",first_combined_HP_Att);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",combined_HP_sum);
szString.append(szTempBuffer.GetCString());
bIsCondensed = false;//resetting
combined_HP_sum = 0.0f;//resetting this variable
last_combined_HP = 0;
}
// At the moment I am not allowing the lowest Attacker HP value to be condensed, as it would be confusing if it includes retreat odds
// I may include this in the future though, but probably only if retreat odds are zero.
float prob_victory = 100.0f*getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,iNeededRoundsAttacker);
float prob_retreat = 100.0f*RetreatOdds;
szString.append(NEWLINE);
int green_pixels = (int)(Scaling_Factor*prob_victory + 0.5);
int yellow_pixels = (int)(Scaling_Factor*(prob_retreat+prob_victory) + 0.5) - green_pixels;//makes the total length of the bar more accurate - more important than the length of the pieces
green_pixels+=1;//we put an extra 2 on every one of the bar pixel counts
if (yellow_pixels>=1)
{
yellow_pixels+=1;
}
else
{
green_pixels+=1;
}
szString.append(L"<img=Art/ACO/green_bar_left_end.dds>");
green_pixels--;
green_pixels--;//subtracting off the right end
int fullBlocks = green_pixels / 10;
int lastBlock = green_pixels % 10;
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/green_bar_10.dds>");
}//for
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/green_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}//if
if (yellow_pixels>=1)// then there will at least be a right end yellow pixel
{
yellow_pixels--;//subtracting off right end
fullBlocks = yellow_pixels / 10;
lastBlock = yellow_pixels % 10;
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/yellow_bar_10.dds>");
}//for
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/yellow_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/yellow_bar_right_end.dds>");
//finished
}
else
{
szString.append(L"<img=Art/ACO/green_bar_right_end.dds>");
//finished
}//else if
szString.append(L" ");
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szTempBuffer.Format(L"%d",((pAttacker->currHitPoints()) - (iNeededRoundsDefender-1)*iDamageToAttacker));
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",prob_victory+prob_retreat);
szString.append(szTempBuffer.GetCString());
}
//END ATTACKER DETAIL HP HERE
//START DEFENDER DETAIL HP HERE
first_combined_HP_Def = pDefender->currHitPoints();
if (iView & getBugOptionINT("ACO__ShowDefenderHealthBars", 2, "ACO_SHOW_DEFENDER_HEALTH_BARS"))
{
float prob = 0.0f;
int def_HP;
for (int n_D = iNeededRoundsAttacker; n_D >= 1; n_D--)//
{
if (pAttacker->combatLimit() >= pDefender->maxHitPoints())// a unit with a combat limit
{
if (n_D == iNeededRoundsAttacker)
{
n_D--;//we don't need to do HP for when the unit is dead.
}
}
def_HP = std::max((pDefender->currHitPoints()) - n_D*iDamageToDefender,(pDefender->maxHitPoints() - pAttacker->combatLimit()));
if ( (pDefender->maxHitPoints() - pAttacker->combatLimit() ) == pDefender->currHitPoints() - (n_D-1)*iDamageToDefender)
{
// if abnormal
if (n_D == iNeededRoundsAttacker)
{
n_D--;
def_HP = (pDefender->maxHitPoints() - pAttacker->combatLimit());
prob += 100.0f*PullOutOdds;
prob += 100.0f*(getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,n_D)+(getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D)));
}
}
else
{
//not abnormal
if (n_D == iNeededRoundsAttacker)
{
prob += 100.0f*PullOutOdds;
}
else
{
prob += 100.0f*(getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,n_D)+(getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,n_D)));
}
}
if (prob > HP_percent_cutoff || (pAttacker->combatLimit()<pDefender->maxHitPoints() && (n_D==iNeededRoundsAttacker)))
{
if (bIsCondensed) // then we need to print the prev ones
{
szString.append(NEWLINE);
int pixels = (int)(Scaling_Factor*combined_HP_sum + 0.5); // 1% per pixel
int fullBlocks = (pixels) / 10;
int lastBlock = (pixels) % 10;
szString.append(L"<img=Art/ACO/red_bar_left_end.dds>");
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/red_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/red_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/red_bar_right_end.dds>");
szString.append(L" ");
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szTempBuffer.Format(L"%dHP",first_combined_HP_Def);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
if (first_combined_HP_Def!=last_combined_HP)
{
szString.append("-");
szTempBuffer.Format(L"%d",last_combined_HP);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
}
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",
combined_HP_sum);
szString.append(szTempBuffer.GetCString());
bIsCondensed = false;//resetting
combined_HP_sum = 0.0f;//resetting this variable
}
szString.append(NEWLINE);
int pixels = (int)(Scaling_Factor*prob + 0.5); // 1% per pixel
int fullBlocks = (pixels) / 10;
int lastBlock = (pixels) % 10;
//if(pixels>=2) // this is now guaranteed by the way we define number of pixels
//{
szString.append(L"<img=Art/ACO/red_bar_left_end.dds>");
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/red_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/red_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/red_bar_right_end.dds>");
//}
szString.append(L" ");
szTempBuffer.Format(SETCOLR L"%d" ENDCOLR,
TEXT_COLOR("COLOR_NEGATIVE_TEXT"),def_HP);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",prob);
szString.append(szTempBuffer.GetCString());
}
else
{
bIsCondensed = true;
first_combined_HP_Def = (std::min(first_combined_HP_Def,def_HP));
last_combined_HP = std::max(((pDefender->currHitPoints()) - n_D*iDamageToDefender),pDefender->maxHitPoints()-pAttacker->combatLimit());
combined_HP_sum += prob;
}
prob = 0.0f;
}//for n_D
if (bIsCondensed && iNeededRoundsAttacker>1) // then we need to print the prev ones
// the reason we need iNeededRoundsAttacker to be greater than 1 is that if it's equal to 1 then we end up with the defender detailed HP bar show up twice, because it will also get printed below
{
szString.append(NEWLINE);
int pixels = (int)(Scaling_Factor*combined_HP_sum + 0.5); // 1% per pixel
int fullBlocks = (pixels) / 10;
int lastBlock = (pixels) % 10;
//if(pixels>=2) {szString.append(L"<img=Art/ACO/green_bar_left_end.dds>");}
szString.append(L"<img=Art/ACO/red_bar_left_end.dds>");
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/red_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/red_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/red_bar_right_end.dds>");
szString.append(L" ");
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szTempBuffer.Format(L"%d",first_combined_HP_Def);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
if (first_combined_HP_Def != last_combined_HP)
{
szTempBuffer.Format(L"-%d",last_combined_HP);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
}
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",combined_HP_sum);
szString.append(szTempBuffer.GetCString());
bIsCondensed = false;//resetting
combined_HP_sum = 0.0f;//resetting this variable
}
//print the unhurt value...always
prob = 100.0f*(getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender,0)+(getCombatOddsSpecific(pAttacker,pDefender,iNeededRoundsDefender-1,0)));
int pixels = (int)(Scaling_Factor*prob + 0.5); // 1% per pixel
int fullBlocks = (pixels) / 10;
int lastBlock = (pixels) % 10;
szString.append(NEWLINE);
szString.append(L"<img=Art/ACO/red_bar_left_end.dds>");
for (int iI = 0; iI < fullBlocks; ++iI)
{
szString.append(L"<img=Art/ACO/red_bar_10.dds>");
}
if (lastBlock > 0)
{
szTempBuffer2.Format(L"<img=Art/ACO/red_bar_%d.dds>", lastBlock);
szString.append(szTempBuffer2);
}
szString.append(L"<img=Art/ACO/red_bar_right_end.dds>");
szString.append(L" ");
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szTempBuffer.Format(L"%d",pDefender->currHitPoints());
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szTempBuffer.Format(L" %.2f%%",prob);
szString.append(szTempBuffer.GetCString());
}
//END DEFENDER DETAIL HP HERE
szString.append(NEWLINE);
if (iView & getBugOptionINT("ACO__ShowBasicInfo", 3, "ACO_SHOW_BASIC_INFO"))
{
szTempBuffer.Format(SETCOLR L"%d" ENDCOLR L", " SETCOLR L"%d " ENDCOLR,
TEXT_COLOR("COLOR_POSITIVE_TEXT"), iDamageToDefender, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), iDamageToAttacker);
szString.append(NEWLINE);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HP"));
szString.append(" ");
szString.append(gDLL->getText("TXT_ACO_MULTIPLY"));
szTempBuffer.Format(L" " SETCOLR L"%d" ENDCOLR L", " SETCOLR L"%d " ENDCOLR,
TEXT_COLOR("COLOR_POSITIVE_TEXT"),iNeededRoundsAttacker,TEXT_COLOR("COLOR_NEGATIVE_TEXT"),
iNeededRoundsDefender);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_HitsAt"));
szTempBuffer.Format(SETCOLR L" %.1f%%" ENDCOLR,
TEXT_COLOR("COLOR_POSITIVE_TEXT"),float(iAttackerOdds)*100.0f / float(GC.getDefineINT("COMBAT_DIE_SIDES")));
szString.append(szTempBuffer.GetCString());
}
if (!(iView & getBugOptionINT("ACO__ShowExperienceRange", 2, "ACO_SHOW_EXPERIENCE_RANGE")) || (pAttacker->combatLimit() < (pDefender->maxHitPoints() ))) //medium and high only
{
if (iView & getBugOptionINT("ACO__ShowBasicInfo", 3, "ACO_SHOW_BASIC_INFO"))
{
szTempBuffer.Format(L". R=" SETCOLR L"%.2f" ENDCOLR,
TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),CombatRatio);
szString.append(szTempBuffer.GetCString());
}
}
else
{
//we do an XP range display
//This should hopefully now work for any max and min XP values.
if (pAttacker->combatLimit() == (pDefender->maxHitPoints() ))
{
FAssert(GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT") > GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT")); //ensuring the differences is at least 1
int size = GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT") - GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT");
float* CombatRatioThresholds = new float[size];
for (int i = 0; i < size; i++) //setup the array
{
CombatRatioThresholds[i] = ((float)(pDefender->attackXPValue()))/((float)(GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")-i));
//For standard game, this is the list created:
// {4/10, 4/9, 4/8,
// 4/7, 4/6, 4/5,
// 4/4, 4/3, 4/2}
}
for (int i = size-1; i >= 0; i--) // find which range we are in
{
//starting at i = 8, going through to i = 0
if (CombatRatio>CombatRatioThresholds[i])
{
if (i== (size-1) )//highest XP value already
{
szString.append(NEWLINE);
szTempBuffer.Format(L"(%.2f:%d",
CombatRatioThresholds[i],GC.getDefineINT("MIN_EXPERIENCE_PER_COMBAT")+1);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_XP"));
szTempBuffer.Format(L"), (R=" SETCOLR L"%.2f" ENDCOLR L":%d",
TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),CombatRatio,iExperience);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_XP"));
szString.append(")");
}
else // normal situation
{
szString.append(NEWLINE);
szTempBuffer.Format(L"(%.2f:%d",
CombatRatioThresholds[i],GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")-i);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_XP"));
szTempBuffer.Format(L"), (R=" SETCOLR L"%.2f" ENDCOLR L":%d",
TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"),CombatRatio,GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")-(i+1));
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_XP"));
szTempBuffer.Format(L"), (>%.2f:%d",
CombatRatioThresholds[i+1],GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")-(i+2));
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_XP"));
szString.append(")");
}
break;
}
else//very rare (ratio less than or equal to 0.4)
{
if (i==0)//maximum XP
{
szString.append(NEWLINE);
szTempBuffer.Format(L"(R=" SETCOLR L"%.2f" ENDCOLR L":%d",
TEXT_COLOR("COLOR_POSITIVE_TEXT"),CombatRatio,GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT"));
szString.append(szTempBuffer.GetCString());
szTempBuffer.Format(L"), (>%.2f:%d",
CombatRatioThresholds[i],GC.getDefineINT("MAX_EXPERIENCE_PER_COMBAT")-1);
szString.append(szTempBuffer.GetCString());
szString.append(gDLL->getText("TXT_ACO_XP"));
szString.append(")");
break;
}//if
}// else if
}//for
delete[] CombatRatioThresholds;
//throw away the array
}//if
} // else if
//Finished Showing XP range display
if (iView & getBugOptionINT("ACO__ShowAverageHealth", 2, "ACO_SHOW_AVERAGE_HEALTH"))
{
szTempBuffer.Format(L"%.1f",E_HP_Att);
szTempBuffer2.Format(L"%.1f",E_HP_Def);
szString.append(gDLL->getText("TXT_ACO_AverageHP"));
szString.append(gDLL->getText("TXT_ACO_VS", szTempBuffer.GetCString(), szTempBuffer2.GetCString()));
}
if (iView & getBugOptionINT("ACO__ShowUnharmedOdds", 2, "ACO_SHOW_UNHARMED_ODDS"))
{
szTempBuffer.Format(L"%.2f%%",100.0f*AttackerUnharmed);
szTempBuffer2.Format(L"%.2f%%",100.0f*DefenderUnharmed);
szString.append(gDLL->getText("TXT_ACO_Unharmed"));
szString.append(gDLL->getText("TXT_ACO_VS", szTempBuffer.GetCString(), szTempBuffer2.GetCString()));
}
if (iView & getBugOptionINT("ACO__ShowUnroundedExperience", 0, "ACO_SHOW_UNROUNDED_EXPERIENCE"))
{
szTempBuffer.Format(L"%.2f", AttXP);
szTempBuffer2.Format(L"%.2f", DefXP);
szString.append(gDLL->getText("TXT_ACO_UnroundedXP"));
szString.append(gDLL->getText("TXT_ACO_VS", szTempBuffer.GetCString(), szTempBuffer2.GetCString()));
}
szString.append(NEWLINE);
if (iView & getBugOptionINT("ACO__ShowShiftInstructions", 1, "ACO_SHOW_SHIFT_INSTRUCTIONS"))
{
szString.append(gDLL->getText("TXT_ACO_PressSHIFT"));
szString.append(NEWLINE);
}
}//if ACO_enabled
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** END v2.0 */
/*************************************************************************************************/
}
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** BEGIN v2.0 */
/*************************************************************************************************/
/* Old Code */
/*
*/
/* New Code */
if (ACO_enabled)
{
szString.append(NEWLINE);
szTempBuffer.Format(L"%.2f",
((pAttacker->getDomainType() == DOMAIN_AIR) ? pAttacker->airCurrCombatStrFloat(pDefender) : pAttacker->currCombatStrFloat(NULL, NULL)));
if (pAttacker->isHurt())
{
szTempBuffer.append(L" (");
szTempBuffer.append(gDLL->getText("TXT_ACO_INJURED_HP",
pAttacker->currHitPoints(),
pAttacker->maxHitPoints()));
szTempBuffer.append(L")");
}
szTempBuffer2.Format(L"%.2f",
pDefender->currCombatStrFloat(pPlot, pAttacker)
);
if (pDefender->isHurt())
{
szTempBuffer2.append(L" (");
szTempBuffer2.append(gDLL->getText("TXT_ACO_INJURED_HP",
pDefender->currHitPoints(),
pDefender->maxHitPoints()));
szTempBuffer2.append(L")");
}
szString.append(gDLL->getText("TXT_ACO_VS", szTempBuffer.GetCString(), szTempBuffer2.GetCString()));
if (((!(pDefender->immuneToFirstStrikes())) && (pAttacker->maxFirstStrikes() > 0)) || (pAttacker->maxCombatStr(NULL,NULL)!=pAttacker->baseCombatStr()*100))
{
//if attacker uninjured strength is not the same as base strength (i.e. modifiers are in effect) or first strikes exist, then
if (getBugOptionBOOL("ACO__ShowModifierLabels", false, "ACO_SHOW_MODIFIER_LABELS"))
{
szString.append(gDLL->getText("TXT_ACO_AttackModifiers"));
}
}//if
if ((iView & getBugOptionINT("ACO__ShowAttackerInfo", 0, "ACO_SHOW_ATTACKER_INFO")))
{
szString.append(NEWLINE);
setUnitHelp(szString, pAttacker, true, true);
}
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szString.append(L' ');//XXX
if (!(pDefender->immuneToFirstStrikes()))
{
if (pAttacker->maxFirstStrikes() > 0)
{
if (pAttacker->firstStrikes() == pAttacker->maxFirstStrikes())
{
if (pAttacker->firstStrikes() == 1)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", pAttacker->firstStrikes()));
}
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", pAttacker->firstStrikes(), pAttacker->maxFirstStrikes()));
}
}
}
iModifier = pAttacker->getExtraCombatPercent();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_EXTRA_STRENGTH", iModifier));
}
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(L' ');//XXX
if (((!(pAttacker->immuneToFirstStrikes())) && (pDefender->maxFirstStrikes() > 0)) || (pDefender->maxCombatStr(pPlot,pAttacker)!=pDefender->baseCombatStr()*100))
{
//if attacker uninjured strength is not the same as base strength (i.e. modifiers are in effect) or first strikes exist, then
if (getBugOptionBOOL("ACO__ShowModifierLabels", false, "ACO_SHOW_MODIFIER_LABELS"))
{
szString.append(gDLL->getText("TXT_ACO_DefenseModifiers"));
}
}//if
if (iView & getBugOptionINT("ACO__ShowDefenderInfo", 3, "ACO_SHOW_DEFENDER_INFO"))
{
szString.append(NEWLINE);
setUnitHelp(szString, pDefender, true, true);
}
if (iView & getBugOptionINT("ACO__ShowDefenseModifiers", 3, "ACO_SHOW_DEFENSE_MODIFIERS"))
{
//if defense modifiers are enabled - recommend leaving this on unless Total defense Modifier is enabled
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szString.append(L' ');//XXX
if (!(pAttacker->immuneToFirstStrikes()))
{
if (pDefender->maxFirstStrikes() > 0)
{
if (pDefender->firstStrikes() == pDefender->maxFirstStrikes())
{
if (pDefender->firstStrikes() == 1)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", pDefender->firstStrikes()));
}
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", pDefender->firstStrikes(), pDefender->maxFirstStrikes()));
}
}
}
if (!(pAttacker->isRiver()))
{
if (pAttacker->plot()->isRiverCrossing(directionXY(pAttacker->plot(), pPlot)))
{
iModifier = GC.getRIVER_ATTACK_MODIFIER();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_RIVER_MOD", -(iModifier)));
}
}
}
if (!(pAttacker->isAmphib()))
{
if (!(pPlot->isWater()) && pAttacker->plot()->isWater())
{
iModifier = GC.getAMPHIB_ATTACK_MODIFIER();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_AMPHIB_MOD", -(iModifier)));
}
}
}
iModifier = pDefender->getExtraCombatPercent();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_EXTRA_STRENGTH", iModifier));
}
iModifier = pDefender->unitClassDefenseModifier(pAttacker->getUnitClassType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitClassInfo(pAttacker->getUnitClassType()).getTextKeyWide()));
}
if (pAttacker->getUnitCombatType() != NO_UNITCOMBAT)
{
iModifier = pDefender->unitCombatModifier(pAttacker->getUnitCombatType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitCombatInfo(pAttacker->getUnitCombatType()).getTextKeyWide()));
}
}
iModifier = pDefender->domainModifier(pAttacker->getDomainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getDomainInfo(pAttacker->getDomainType()).getTextKeyWide()));
}
if (!(pDefender->noDefensiveBonus()))
{
iModifier = pPlot->defenseModifier(pDefender->getTeam(), (pAttacker != NULL) ? pAttacker->ignoreBuildingDefense() : true);
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_TILE_MOD", iModifier));
}
}
iModifier = pDefender->fortifyModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_FORTIFY_MOD", iModifier));
}
if (pPlot->isCity(true, pDefender->getTeam()))
{
iModifier = pDefender->cityDefenseModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_CITY_MOD", iModifier));
}
}
if (pPlot->isHills())
{
iModifier = pDefender->hillsDefenseModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HILLS_MOD", iModifier));
}
}
if (pPlot->getFeatureType() != NO_FEATURE)
{
iModifier = pDefender->featureDefenseModifier(pPlot->getFeatureType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getFeatureInfo(pPlot->getFeatureType()).getTextKeyWide()));
}
}
iModifier = pDefender->terrainDefenseModifier(pPlot->getTerrainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getTerrainInfo(pPlot->getTerrainType()).getTextKeyWide()));
}
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(L' ');//XXX
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szString.append(L' ');//XXX
iModifier = pAttacker->unitClassAttackModifier(pDefender->getUnitClassType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", -iModifier, GC.getUnitClassInfo(pDefender->getUnitClassType()).getTextKeyWide()));
}
if (pDefender->getUnitCombatType() != NO_UNITCOMBAT)
{
iModifier = pAttacker->unitCombatModifier(pDefender->getUnitCombatType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", -iModifier, GC.getUnitCombatInfo(pDefender->getUnitCombatType()).getTextKeyWide()));
}
}
iModifier = pAttacker->domainModifier(pDefender->getDomainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", -iModifier, GC.getDomainInfo(pDefender->getDomainType()).getTextKeyWide()));
}
if (pPlot->isCity(true, pDefender->getTeam()))
{
iModifier = pAttacker->cityAttackModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_CITY_MOD", -iModifier));
}
}
if (pPlot->isHills())
{
iModifier = pAttacker->hillsAttackModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HILLS_MOD", -iModifier));
}
}
if (pPlot->getFeatureType() != NO_FEATURE)
{
iModifier = pAttacker->featureAttackModifier(pPlot->getFeatureType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", -iModifier, GC.getFeatureInfo(pPlot->getFeatureType()).getTextKeyWide()));
}
}
else
{
iModifier = pAttacker->terrainAttackModifier(pPlot->getTerrainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", -iModifier, GC.getTerrainInfo(pPlot->getTerrainType()).getTextKeyWide()));
}
}
iModifier = pAttacker->getKamikazePercent();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_KAMIKAZE_MOD", -iModifier));
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getGameINLINE().isOption(GAMEOPTION_SAD))
{
iModifier = pAttacker->surroundedDefenseModifier(pPlot, pDefender);
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_SURROUNDED_DEFENSE_MOD", -iModifier));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (pDefender->isAnimal())
{
iModifier = -GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getAnimalCombatModifier();
iModifier += pAttacker->getUnitInfo().getAnimalCombatModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ANIMAL_COMBAT_MOD", -iModifier));
}
}
if (pDefender->isBarbarian())
{
iModifier = -GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getBarbarianCombatModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_BARBARIAN_COMBAT_MOD", -iModifier));
}
}
}//if
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(L' ');//XXX
if (iView & getBugOptionINT("ACO__ShowTotalDefenseModifier", 2, "ACO_SHOW_TOTAL_DEFENSE_MODIFIER"))
{
//szString.append(L' ');//XXX
if (pDefender->maxCombatStr(pPlot,pAttacker)>pDefender->baseCombatStr()*100) // modifier is positive
{
szTempBuffer.Format(SETCOLR L"%d%%" ENDCOLR,
TEXT_COLOR("COLOR_NEGATIVE_TEXT"),(((pDefender->maxCombatStr(pPlot,pAttacker)))/pDefender->baseCombatStr())-100);
}
else // modifier is negative
{
szTempBuffer.Format(SETCOLR L"%d%%" ENDCOLR,
TEXT_COLOR("COLOR_POSITIVE_TEXT"),(100-((pDefender->baseCombatStr()*10000)/(pDefender->maxCombatStr(pPlot,pAttacker)))));
}
szString.append(gDLL->getText("TXT_ACO_TotalDefenseModifier"));
szString.append(szTempBuffer.GetCString());
}
}//if
/** What follows in the "else" block, is the original code **/
else
{
//ACO is not enabled
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** END v2.0 */
/*************************************************************************************************/
szOffenseOdds.Format(L"%.2f", ((pAttacker->getDomainType() == DOMAIN_AIR) ? pAttacker->airCurrCombatStrFloat(pDefender) : pAttacker->currCombatStrFloat(NULL, NULL)));
szDefenseOdds.Format(L"%.2f", pDefender->currCombatStrFloat(pPlot, pAttacker));
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS_VS", szOffenseOdds.GetCString(), szDefenseOdds.GetCString()));
szString.append(L' ');//XXX
szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
szString.append(L' ');//XXX
iModifier = pAttacker->getExtraCombatPercent();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_EXTRA_STRENGTH", iModifier));
}
iModifier = pAttacker->unitClassAttackModifier(pDefender->getUnitClassType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitClassInfo(pDefender->getUnitClassType()).getTextKeyWide()));
}
if (pDefender->getUnitCombatType() != NO_UNITCOMBAT)
{
iModifier = pAttacker->unitCombatModifier(pDefender->getUnitCombatType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitCombatInfo(pDefender->getUnitCombatType()).getTextKeyWide()));
}
}
iModifier = pAttacker->domainModifier(pDefender->getDomainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getDomainInfo(pDefender->getDomainType()).getTextKeyWide()));
}
if (pPlot->isCity(true, pDefender->getTeam()))
{
iModifier = pAttacker->cityAttackModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_CITY_MOD", iModifier));
}
}
if (pPlot->isHills())
{
iModifier = pAttacker->hillsAttackModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HILLS_MOD", iModifier));
}
}
if (pPlot->getFeatureType() != NO_FEATURE)
{
iModifier = pAttacker->featureAttackModifier(pPlot->getFeatureType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getFeatureInfo(pPlot->getFeatureType()).getTextKeyWide()));
}
}
else
{
iModifier = pAttacker->terrainAttackModifier(pPlot->getTerrainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getTerrainInfo(pPlot->getTerrainType()).getTextKeyWide()));
}
}
iModifier = pAttacker->getKamikazePercent();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_KAMIKAZE_MOD", iModifier));
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getGameINLINE().isOption(GAMEOPTION_SAD))
{
iModifier = pAttacker->surroundedDefenseModifier(pPlot, pDefender);
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_SURROUNDED_DEFENSE_MOD", iModifier));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (pDefender->isAnimal())
{
iModifier = -GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getAnimalCombatModifier();
iModifier += pAttacker->getUnitInfo().getAnimalCombatModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ANIMAL_COMBAT_MOD", iModifier));
}
}
if (pDefender->isBarbarian())
{
iModifier = -GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getBarbarianCombatModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_BARBARIAN_COMBAT_MOD", iModifier));
}
}
if (!(pDefender->immuneToFirstStrikes()))
{
if (pAttacker->maxFirstStrikes() > 0)
{
if (pAttacker->firstStrikes() == pAttacker->maxFirstStrikes())
{
if (pAttacker->firstStrikes() == 1)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", pAttacker->firstStrikes()));
}
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", pAttacker->firstStrikes(), pAttacker->maxFirstStrikes()));
}
}
}
if (pAttacker->isHurt())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HP", pAttacker->currHitPoints(), pAttacker->maxHitPoints()));
}
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
szString.append(L' ');//XXX
szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
szString.append(L' ');//XXX
if (!(pAttacker->isRiver()))
{
if (pAttacker->plot()->isRiverCrossing(directionXY(pAttacker->plot(), pPlot)))
{
iModifier = GC.getRIVER_ATTACK_MODIFIER();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_RIVER_MOD", -(iModifier)));
}
}
}
if (!(pAttacker->isAmphib()))
{
if (!(pPlot->isWater()) && pAttacker->plot()->isWater())
{
iModifier = GC.getAMPHIB_ATTACK_MODIFIER();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_AMPHIB_MOD", -(iModifier)));
}
}
}
iModifier = pDefender->getExtraCombatPercent();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_EXTRA_STRENGTH", iModifier));
}
iModifier = pDefender->unitClassDefenseModifier(pAttacker->getUnitClassType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitClassInfo(pAttacker->getUnitClassType()).getTextKeyWide()));
}
if (pAttacker->getUnitCombatType() != NO_UNITCOMBAT)
{
iModifier = pDefender->unitCombatModifier(pAttacker->getUnitCombatType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitCombatInfo(pAttacker->getUnitCombatType()).getTextKeyWide()));
}
}
iModifier = pDefender->domainModifier(pAttacker->getDomainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getDomainInfo(pAttacker->getDomainType()).getTextKeyWide()));
}
if (!(pDefender->noDefensiveBonus()))
{
iModifier = pPlot->defenseModifier(pDefender->getTeam(), (pAttacker != NULL) ? pAttacker->ignoreBuildingDefense() : true);
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_TILE_MOD", iModifier));
}
}
iModifier = pDefender->fortifyModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_FORTIFY_MOD", iModifier));
}
if (pPlot->isCity(true, pDefender->getTeam()))
{
iModifier = pDefender->cityDefenseModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_CITY_MOD", iModifier));
}
}
if (pPlot->isHills())
{
iModifier = pDefender->hillsDefenseModifier();
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HILLS_MOD", iModifier));
}
}
if (pPlot->getFeatureType() != NO_FEATURE)
{
iModifier = pDefender->featureDefenseModifier(pPlot->getFeatureType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getFeatureInfo(pPlot->getFeatureType()).getTextKeyWide()));
}
}
else
{
iModifier = pDefender->terrainDefenseModifier(pPlot->getTerrainType());
if (iModifier != 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getTerrainInfo(pPlot->getTerrainType()).getTextKeyWide()));
}
}
if (!(pAttacker->immuneToFirstStrikes()))
{
if (pDefender->maxFirstStrikes() > 0)
{
if (pDefender->firstStrikes() == pDefender->maxFirstStrikes())
{
if (pDefender->firstStrikes() == 1)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", pDefender->firstStrikes()));
}
}
else
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", pDefender->firstStrikes(), pDefender->maxFirstStrikes()));
}
}
}
if (pDefender->isHurt())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HP", pDefender->currHitPoints(), pDefender->maxHitPoints()));
}
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** BEGIN v2.0 */
/*************************************************************************************************/
/* New Code */
}
/*************************************************************************************************/
/** ADVANCED COMBAT ODDS 3/11/09 PieceOfMind */
/** END v2.0 */
/*************************************************************************************************/
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 06/20/08 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
/* original code
if ((gDLL->getChtLvl() > 0))
*/
// Only display this info in debug mode so game can be played with cheat code entered
if( GC.getGameINLINE().isDebugMode() )
{
szTempBuffer.Format(L"\nStack Compare Value = %d",
gDLL->getInterfaceIFace()->getSelectionList()->AI_compareStacks(pPlot, false));
szString.append(szTempBuffer);
if( pPlot->getPlotCity() != NULL )
{
szTempBuffer.Format(L"\nBombard turns = %d",
gDLL->getInterfaceIFace()->getSelectionList()->getBombardTurns(pPlot->getPlotCity()));
szString.append(szTempBuffer);
}
int iOurStrengthDefense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getOurPlotStrength(pPlot, 1, true, false);
int iOurStrengthOffense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getOurPlotStrength(pPlot, 1, false, false);
szTempBuffer.Format(L"\nPlot Strength(Ours)= d%d, o%d", iOurStrengthDefense, iOurStrengthOffense);
szString.append(szTempBuffer);
int iEnemyStrengthDefense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getEnemyPlotStrength(pPlot, 1, true, false);
int iEnemyStrengthOffense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getEnemyPlotStrength(pPlot, 1, false, false);
szTempBuffer.Format(L"\nPlot Strength(Enemy)= d%d, o%d", iEnemyStrengthDefense, iEnemyStrengthOffense);
szString.append(szTempBuffer);
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
return true;
}
}
return false;
}
// DO NOT REMOVE - needed for font testing - Moose
void createTestFontString(CvWStringBuffer& szString)
{
int iI;
for (iI=0;iI<NUM_YIELD_TYPES;++iI)
szString.append(CvWString::format(L"%c", GC.getYieldInfo((YieldTypes) iI).getChar()));
szString.append(L"\n");
for (iI=0;iI<NUM_COMMERCE_TYPES;++iI)
szString.append(CvWString::format(L"%c", GC.getCommerceInfo((CommerceTypes) iI).getChar()));
szString.append(L"\n");
for (iI = 0; iI < GC.getNumReligionInfos(); ++iI)
{
szString.append(CvWString::format(L"%c", GC.getReligionInfo((ReligionTypes) iI).getChar()));
szString.append(CvWString::format(L"%c", GC.getReligionInfo((ReligionTypes) iI).getHolyCityChar()));
}
szString.append(L"\n");
for (iI = 0; iI < GC.getNumCorporationInfos(); ++iI)
{
szString.append(CvWString::format(L"%c%d", GC.getCorporationInfo((CorporationTypes) iI).getChar(), GC.getCorporationInfo((CorporationTypes) iI).getChar()));
szString.append(CvWString::format(L"%c%d", GC.getCorporationInfo((CorporationTypes) iI).getHeadquarterChar(), GC.getCorporationInfo((CorporationTypes) iI).getHeadquarterChar()));
}
szString.append(L"\n");
for (iI = 0; iI < GC.getNumPropertyInfos(); ++iI)
{
szString.append(CvWString::format(L"%c%d", GC.getPropertyInfo((PropertyTypes) iI).getChar(), GC.getPropertyInfo((PropertyTypes) iI).getChar()));
}
szString.append(L"\n");
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
szString.append(CvWString::format(L"%c%d", GC.getBonusInfo((BonusTypes) iI).getChar(), GC.getBonusInfo((BonusTypes) iI).getChar()));
szString.append(L"\n");
for (iI=0; iI<MAX_NUM_SYMBOLS; ++iI)
szString.append(CvWString::format(L"%c%d", gDLL->getSymbolID(iI), gDLL->getSymbolID(iI)));
}
void CvGameTextMgr::setPlotHelp(CvWStringBuffer& szString, CvPlot* pPlot)
{
PROFILE_FUNC();
int iI;
CvWString szTempBuffer;
ImprovementTypes eImprovement;
PlayerTypes eRevealOwner;
BonusTypes eBonus;
bool bShift;
bool bAlt;
bool bCtrl;
bool bFound;
int iDefenseModifier;
int iYield;
int iTurns;
bShift = gDLL->shiftKey();
bAlt = gDLL->altKey();
bCtrl = gDLL->ctrlKey();
if (GC.getDefineINT("TEST_GAMEFONTS"))
{
createTestFontString(szString);
return;
}
if (bCtrl && (gDLL->getChtLvl() > 0))
{
if (pPlot->getOwnerINLINE() != NO_PLAYER)
{
int iPlotDanger = GET_PLAYER(pPlot->getOwnerINLINE()).AI_getPlotDanger(pPlot, 2);
if (iPlotDanger > 0)
{
szString.append(CvWString::format(L"\nPlot Danger = %d", iPlotDanger));
}
}
CvCity* pPlotCity = pPlot->getPlotCity();
if (pPlotCity != NULL)
{
PlayerTypes ePlayer = pPlot->getOwnerINLINE();
CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);
/************************************************************************************************/
/* REVOLUTION_MOD 06/11/08 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
szString.append(CvWString::format(L"\n\nRevIndex:%d, ", pPlotCity->getRevolutionIndex()));
szString.append(CvWString::format(L"Avg:%d, ", pPlotCity->getRevIndexAverage()));
szString.append(CvWString::format(L"Local:%d, ", pPlotCity->getLocalRevIndex()));
szString.append(CvWString::format(L"Reinf:%d", pPlotCity->getReinforcementCounter()));
szString.append(CvWString::format(L"\nRevIdxAnger:%d, ", pPlotCity->getRevIndexPercentAnger()));
szString.append(CvWString::format(L"ReqAnger:%d, ", pPlotCity->getRevRequestPercentAnger()));
szString.append(CvWString::format(L"RevSucHappy:%d\n", pPlotCity->getRevSuccessHappiness()));
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
int iCityDefenders = pPlot->plotCount(PUF_canDefendGroupHead, -1, -1, ePlayer, NO_TEAM, PUF_isCityAIType);
int iAttackGroups = pPlot->plotCount(PUF_isUnitAIType, UNITAI_ATTACK, -1, ePlayer);
szString.append(CvWString::format(L"\nDefenders [D+A]/N ([%d + %d] / %d)", iCityDefenders, iAttackGroups, pPlotCity->AI_neededDefenders()));
szString.append(CvWString::format(L"\nFloating Defenders H/N (%d / %d)", kPlayer.AI_getTotalFloatingDefenders(pPlotCity->area()), kPlayer.AI_getTotalFloatingDefendersNeeded(pPlotCity->area())));
szString.append(CvWString::format(L"\nAir Defenders H/N (%d / %d)", pPlotCity->plot()->plotCount(PUF_canAirDefend, -1, -1, pPlotCity->getOwnerINLINE(), NO_TEAM, PUF_isDomainType, DOMAIN_AIR), pPlotCity->AI_neededAirDefenders()));
// int iHostileUnits = kPlayer.AI_countNumAreaHostileUnits(pPlotCity->area());
// if (iHostileUnits > 0)
// {
// szString+=CvWString::format(L"\nHostiles = %d", iHostileUnits);
// }
szString.append(CvWString::format(L"\nThreat C/P (%d / %d)", pPlotCity->AI_cityThreat(), kPlayer.AI_getTotalAreaCityThreat(pPlotCity->area())));
bool bFirst = true;
for (int iI = 0; iI < MAX_PLAYERS; ++iI)
{
PlayerTypes eLoopPlayer = (PlayerTypes) iI;
CvPlayerAI& kLoopPlayer = GET_PLAYER(eLoopPlayer);
if ((eLoopPlayer != ePlayer) && kLoopPlayer.isAlive())
{
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 06/16/08 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
/* original code
int iCloseness = pPlotCity->AI_playerCloseness(eLoopPlayer, 7);
if (iCloseness != 0)
{
if (bFirst)
{
bFirst = false;
szString.append(CvWString::format(L"\n\nCloseness:"));
}
szString.append(CvWString::format(L"\n%s(7) : %d", kLoopPlayer.getName(), iCloseness));
szString.append(CvWString::format(L" (%d, ", kPlayer.AI_playerCloseness(eLoopPlayer, 7)));
if (kPlayer.getTeam() != kLoopPlayer.getTeam())
{
szString.append(CvWString::format(L"%d)", GET_TEAM(kPlayer.getTeam()).AI_teamCloseness(kLoopPlayer.getTeam(), 7)));
}
else
{
szString.append(CvWString::format(L"-)"));
}
}
*/
if( pPlotCity->isCapital() )
{
if( true )
{
int iCloseness = pPlotCity->AI_playerCloseness(eLoopPlayer, DEFAULT_PLAYER_CLOSENESS);
int iPlayerCloseness = kPlayer.AI_playerCloseness(eLoopPlayer, DEFAULT_PLAYER_CLOSENESS);
if( GET_TEAM(kPlayer.getTeam()).isHasMet(kLoopPlayer.getTeam()) || iPlayerCloseness != 0 )
{
if (bFirst)
{
bFirst = false;
szString.append(CvWString::format(L"\n\nCloseness + War: (in %d wars)", GET_TEAM(kPlayer.getTeam()).getAtWarCount(true)));
}
szString.append(CvWString::format(L"\n%s(%d) : %d ", kLoopPlayer.getName(), DEFAULT_PLAYER_CLOSENESS, iCloseness));
szString.append(CvWString::format(L" [%d, ", iPlayerCloseness));
if (kPlayer.getTeam() != kLoopPlayer.getTeam())
{
szString.append(CvWString::format(L"%d]", GET_TEAM(kPlayer.getTeam()).AI_teamCloseness(kLoopPlayer.getTeam(), DEFAULT_PLAYER_CLOSENESS)));
if( GET_TEAM(kPlayer.getTeam()).isHasMet(kLoopPlayer.getTeam()) && GET_TEAM(kPlayer.getTeam()).AI_getAttitude(kLoopPlayer.getTeam()) != ATTITUDE_FRIENDLY )
{
int iStartWarVal = GET_TEAM(kPlayer.getTeam()).AI_startWarVal(kLoopPlayer.getTeam());
if( GET_TEAM(kPlayer.getTeam()).isAtWar(kLoopPlayer.getTeam()) )
{
szString.append(CvWString::format(L"\n At War: "));
}
else if( GET_TEAM(kPlayer.getTeam()).AI_getWarPlan(kLoopPlayer.getTeam()) != NO_WARPLAN )
{
szString.append(CvWString::format(L"\n Plan. War:"));
}
else if( !GET_TEAM(kPlayer.getTeam()).canDeclareWar(kLoopPlayer.getTeam()) )
{
szString.append(CvWString::format(L"\n Can't War:"));
}
else
{
szString.append(CvWString::format(L"\n No War: "));
}
if( iStartWarVal > 1200 )
{
szString.append(CvWString::format(SETCOLR L" %d" ENDCOLR, TEXT_COLOR("COLOR_RED"), iStartWarVal));
}
else if( iStartWarVal > 600 )
{
szString.append(CvWString::format(SETCOLR L" %d" ENDCOLR, TEXT_COLOR("COLOR_YELLOW"), iStartWarVal));
}
else
{
szString.append(CvWString::format(L" %d", iStartWarVal));
}
szString.append(CvWString::format(L" (%d", GET_TEAM(kPlayer.getTeam()).AI_calculatePlotWarValue(kLoopPlayer.getTeam())));
szString.append(CvWString::format(L", %d", GET_TEAM(kPlayer.getTeam()).AI_calculateBonusWarValue(kLoopPlayer.getTeam())));
szString.append(CvWString::format(L", %d", GET_TEAM(kPlayer.getTeam()).AI_calculateCapitalProximity(kLoopPlayer.getTeam())));
szString.append(CvWString::format(L", %4s", GC.getAttitudeInfo(GET_TEAM(kPlayer.getTeam()).AI_getAttitude(kLoopPlayer.getTeam())).getDescription(0)));
szString.append(CvWString::format(L", %d%%)", 100-GET_TEAM(kPlayer.getTeam()).AI_noWarAttitudeProb(GET_TEAM(kPlayer.getTeam()).AI_getAttitude(kLoopPlayer.getTeam()))));
}
}
else
{
szString.append(CvWString::format(L"-]"));
}
}
}
}
else
{
int iCloseness = pPlotCity->AI_playerCloseness(eLoopPlayer, DEFAULT_PLAYER_CLOSENESS);
if (iCloseness != 0)
{
if (bFirst)
{
bFirst = false;
szString.append(CvWString::format(L"\n\nCloseness:"));
}
szString.append(CvWString::format(L"\n%s(%d) : %d ", kLoopPlayer.getName(), DEFAULT_PLAYER_CLOSENESS, iCloseness));
szString.append(CvWString::format(L" [%d, ", kPlayer.AI_playerCloseness(eLoopPlayer, DEFAULT_PLAYER_CLOSENESS)));
if (kPlayer.getTeam() != kLoopPlayer.getTeam())
{
szString.append(CvWString::format(L"%d]", GET_TEAM(kPlayer.getTeam()).AI_teamCloseness(kLoopPlayer.getTeam(), DEFAULT_PLAYER_CLOSENESS)));
}
else
{
szString.append(CvWString::format(L"-]"));
}
}
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
}
}
int iWorkersHave = pPlotCity->AI_getWorkersHave();
int iWorkersNeeded = pPlotCity->AI_getWorkersNeeded();
szString.append(CvWString::format(L"\n\nWorkers H/N (%d , %d)", iWorkersHave, iWorkersNeeded));
int iWorkBoatsNeeded = pPlotCity->AI_neededSeaWorkers();
szString.append(CvWString::format(L"\n\nWorkboats Needed = %d", iWorkBoatsNeeded));
int iAreaSiteBestValue = 0;
int iNumAreaCitySites = kPlayer.AI_getNumAreaCitySites(pPlot->getArea(), iAreaSiteBestValue);
int iOtherSiteBestValue = 0;
int iNumOtherCitySites = (pPlot->waterArea() == NULL) ? 0 : kPlayer.AI_getNumAdjacentAreaCitySites(pPlot->waterArea()->getID(), pPlot->getArea(), iOtherSiteBestValue);
szString.append(CvWString::format(L"\n\nArea Sites = %d (%d)", iNumAreaCitySites, iAreaSiteBestValue));
szString.append(CvWString::format(L"\nOther Sites = %d (%d)", iNumOtherCitySites, iOtherSiteBestValue));
}
else if (pPlot->getOwner() != NO_PLAYER)
{
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 11/30/08 jdog5000 */
/* */
/* Debug */
/************************************************************************************************/
/* original code
for (int iI = 0; iI < GC.getNumCivicInfos(); iI++)
{
szString.append(CvWString::format(L"\n %s = %d", GC.getCivicInfo((CivicTypes)iI).getDescription(), GET_PLAYER(pPlot->getOwner()).AI_civicValue((CivicTypes)iI)));
}
*/
if( bShift && !bAlt && pPlot->headUnitNode() != NULL)
{
int* paiBonusClassRevealed;
int* paiBonusClassUnrevealed;
int* paiBonusClassHave;
paiBonusClassRevealed = new int[GC.getNumBonusClassInfos()];
paiBonusClassUnrevealed = new int[GC.getNumBonusClassInfos()];
paiBonusClassHave = new int[GC.getNumBonusClassInfos()];
for (int iI = 0; iI < GC.getNumBonusClassInfos(); iI++)
{
paiBonusClassRevealed[iI] = 0;
paiBonusClassUnrevealed[iI] = 0;
paiBonusClassHave[iI] = 0;
}
for (int iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
TechTypes eRevealTech = (TechTypes)GC.getBonusInfo((BonusTypes)iI).getTechReveal();
BonusClassTypes eBonusClass = (BonusClassTypes)GC.getBonusInfo((BonusTypes)iI).getBonusClassType();
if (eRevealTech != NO_TECH)
{
if ((GET_TEAM(pPlot->getTeam()).isHasTech(eRevealTech)))
{
paiBonusClassRevealed[eBonusClass]++;
}
else
{
paiBonusClassUnrevealed[eBonusClass]++;
}
if (GET_PLAYER(pPlot->getOwner()).getNumAvailableBonuses((BonusTypes)iI) > 0)
{
paiBonusClassHave[eBonusClass]++;
}
else if (GET_PLAYER(pPlot->getOwner()).countOwnedBonuses((BonusTypes)iI) > 0)
{
paiBonusClassHave[eBonusClass]++;
}
}
}
int iPathLength;
bool bDummy;
for (int iI = 0; iI < GC.getNumTechInfos(); iI++)
{
if (GC.getTechInfo((TechTypes)iI).getEra() <= GET_PLAYER(pPlot->getOwnerINLINE()).getCurrentEra() + 1)
{
iPathLength = GET_PLAYER(pPlot->getOwner()).findPathLength(((TechTypes)iI), false);
if( iPathLength <= 3 && !GET_TEAM(pPlot->getTeam()).isHasTech((TechTypes)iI) )
{
szString.append(CvWString::format(L"\n%s(%d)=%7d", GC.getTechInfo((TechTypes)iI).getDescription(), iPathLength, GET_PLAYER(pPlot->getOwner()).AI_techValue((TechTypes)iI, 1, false, false, paiBonusClassRevealed, paiBonusClassUnrevealed, paiBonusClassHave)));
szString.append(CvWString::format(L" (bld:%5d, ", GET_PLAYER(pPlot->getOwner()).AI_techBuildingValue((TechTypes)iI, 1, bDummy)));
szString.append(CvWString::format(L"unt:%5d)", GET_PLAYER(pPlot->getOwner()).AI_techUnitValue((TechTypes)iI, 1, bDummy)));
}
}
}
}
else if( bAlt && !bShift )
{
if( pPlot->isHasPathToEnemyCity(pPlot->getTeam()) )
{
szString.append(CvWString::format(L"\nCan reach an enemy city\n\n"));
}
else
{
szString.append(CvWString::format(L"\nNo reachable enemy cities\n\n"));
}
for (int iI = 0; iI < MAX_PLAYERS; ++iI)
{
if( GET_PLAYER((PlayerTypes)iI).isAlive() )
{
if( pPlot->isHasPathToPlayerCity(pPlot->getTeam(),(PlayerTypes)iI) )
{
szString.append(CvWString::format(SETCOLR L"Can reach %s city" ENDCOLR, TEXT_COLOR("COLOR_GREEN"), GET_PLAYER((PlayerTypes)iI).getName()));
}
else
{
szString.append(CvWString::format(SETCOLR L"Cannot reach any %s city" ENDCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), GET_PLAYER((PlayerTypes)iI).getName()));
}
if( GET_TEAM(pPlot->getTeam()).isAtWar(GET_PLAYER((PlayerTypes)iI).getTeam()) )
{
szString.append(CvWString::format(L" (enemy)"));
}
szString.append(CvWString::format(L"\n"));
}
}
}
else if( bShift && bAlt )
{
// Koshling - removed civic valuation from plot help - doesn't belong here
//for (iI = 0; iI < GC.getNumCivicInfos(); iI++)
//{
// if (GET_PLAYER(pPlot->getOwner()).canDoCivics((CivicTypes)iI))
// szString.append(CvWString::format(L"\n %s = %d", GC.getCivicInfo((CivicTypes)iI).getDescription(), GET_PLAYER(pPlot->getOwner()).AI_civicValue((CivicTypes)iI)));
//}
bool bFirst = true;
for (iI = 0; iI < MAX_PLAYERS; ++iI)
{
PlayerTypes ePlayer = (PlayerTypes)iI;
CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);
if (kPlayer.isAlive())
{
int iActualFoundValue = pPlot->getFoundValue(ePlayer);
int iCalcFoundValue = kPlayer.AI_foundValue(pPlot->getX_INLINE(), pPlot->getY_INLINE(), -1, false);
int iStartingFoundValue = kPlayer.AI_foundValue(pPlot->getX_INLINE(), pPlot->getY_INLINE(), -1, true);
int iBestAreaFoundValue = pPlot->area()->getBestFoundValue(ePlayer);
int iCitySiteBestValue;
int iNumAreaCitySites = kPlayer.AI_getNumAreaCitySites(pPlot->getArea(), iCitySiteBestValue);
if ((iActualFoundValue > 0 || iCalcFoundValue > 0 || iStartingFoundValue > 0)
|| ((pPlot->getOwner() == iI) && (iBestAreaFoundValue > 0)))
{
if (bFirst)
{
szString.append(CvWString::format(SETCOLR L"\nFound Values:" ENDCOLR, TEXT_COLOR("COLOR_UNIT_TEXT")));
bFirst = false;
}
szString.append(NEWLINE);
bool bIsRevealed = pPlot->isRevealed(kPlayer.getTeam(), false);
szString.append(CvWString::format(SETCOLR, TEXT_COLOR(bIsRevealed ? (((iActualFoundValue > 0) && (iActualFoundValue == iBestAreaFoundValue)) ? "COLOR_UNIT_TEXT" : "COLOR_ALT_HIGHLIGHT_TEXT") : "COLOR_HIGHLIGHT_TEXT")));
if (!bIsRevealed)
{
szString.append(CvWString::format(L"("));
}
szString.append(CvWString::format(L"%s: %d", kPlayer.getName(), iActualFoundValue));
if (!bIsRevealed)
{
szString.append(CvWString::format(L")"));
}
szString.append(CvWString::format(ENDCOLR));
if (iCalcFoundValue > 0 || iStartingFoundValue > 0)
{
szTempBuffer.Format(L" (%d,%ds)", iCalcFoundValue, iStartingFoundValue);
szString.append(szTempBuffer);
}
int iDeadlockCount = kPlayer.AI_countDeadlockedBonuses(pPlot);
if (iDeadlockCount > 0)
{
szTempBuffer.Format(L", " SETCOLR L"d=%d" ENDCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), iDeadlockCount);
szString.append(szTempBuffer);
}
if (kPlayer.AI_isPlotCitySite(pPlot))
{
szTempBuffer.Format(L", " SETCOLR L"X" ENDCOLR, TEXT_COLOR("COLOR_UNIT_TEXT"));
szString.append(szTempBuffer);
}
if ((iBestAreaFoundValue > 0) || (iNumAreaCitySites > 0))
{
int iBestFoundValue = kPlayer.findBestFoundValue();
szTempBuffer.Format(L"\n Area Best = %d, Best = %d, Sites = %d", iBestAreaFoundValue, iBestFoundValue, iNumAreaCitySites);
szString.append(szTempBuffer);
}
}
}
}
}
else if( pPlot->headUnitNode() == NULL )
{
std::vector<UnitAITypes> vecUnitAIs;
if( pPlot->getFeatureType() != NO_FEATURE )
{
szString.append(CvWString::format(L"Defense unit AIs:\n"));
vecUnitAIs.push_back(UNITAI_CITY_DEFENSE);
vecUnitAIs.push_back(UNITAI_COUNTER);
vecUnitAIs.push_back(UNITAI_CITY_COUNTER);
}
else
{
szString.append(CvWString::format(L"Attack unit AIs:\n"));
vecUnitAIs.push_back(UNITAI_ATTACK);
vecUnitAIs.push_back(UNITAI_ATTACK_CITY);
vecUnitAIs.push_back(UNITAI_COUNTER);
}
CvCity* pCloseCity = GC.getMapINLINE().findCity(pPlot->getX_INLINE(), pPlot->getY_INLINE(), pPlot->getOwner(), NO_TEAM, true);
if( pCloseCity != NULL )
{
for( uint iI = 0; iI < vecUnitAIs.size(); iI++ )
{
CvWString szTempString;
getUnitAIString(szTempString, vecUnitAIs[iI]);
szString.append(CvWString::format(L"\n %s ", szTempString.GetCString()));
for( int iJ = 0; iJ < GC.getNumUnitClassInfos(); iJ++ )
{
UnitTypes eUnit = (UnitTypes)GC.getCivilizationInfo(GET_PLAYER(pPlot->getOwner()).getCivilizationType()).getCivilizationUnits((UnitClassTypes)iJ);
if( eUnit != NO_UNIT && pCloseCity->canTrain(eUnit) )
{
int iValue = GET_PLAYER(pPlot->getOwner()).AI_unitValue(eUnit, vecUnitAIs[iI], pPlot->area());
if( iValue > 0 )
{
szString.append(CvWString::format(L"\n %s = %d", GC.getUnitInfo(eUnit).getDescription(), iValue));
}
}
}
}
}
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
}
return;
}
else if (bShift && !bAlt && (gDLL->getChtLvl() > 0))
{
szString.append(GC.getTerrainInfo(pPlot->getTerrainType()).getDescription());
FAssert((0 < GC.getNumBonusInfos()) && "GC.getNumBonusInfos() is not greater than zero but an array is being allocated in CvInterface::updateHelpStrings");
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (pPlot->isPlotGroupConnectedBonus(GC.getGameINLINE().getActivePlayer(), ((BonusTypes)iI)))
{
szString.append(NEWLINE);
szString.append(GC.getBonusInfo((BonusTypes)iI).getDescription());
szString.append(CvWString::format(L" (%d)", GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_bonusVal((BonusTypes)iI)));
}
}
if (pPlot->getPlotGroup(GC.getGameINLINE().getActivePlayer()) != NULL)
{
szTempBuffer.Format(L"\n(%d, %d) group: %d", pPlot->getX_INLINE(), pPlot->getY_INLINE(), pPlot->getPlotGroup(GC.getGameINLINE().getActivePlayer())->getID());
}
else
{
szTempBuffer.Format(L"\n(%d, %d) group: (-1, -1)", pPlot->getX_INLINE(), pPlot->getY_INLINE());
}
szString.append(szTempBuffer);
szTempBuffer.Format(L"\nArea: %d", pPlot->getArea());
szString.append(szTempBuffer);
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 07/13/09 jdog5000 */
/* */
/* Debug */
/************************************************************************************************/
szTempBuffer.Format(L"\nLatitude: %d", pPlot->getLatitude());
szString.append(szTempBuffer);
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
char tempChar = 'x';
if(pPlot->getRiverNSDirection() == CARDINALDIRECTION_NORTH)
{
tempChar = 'N';
}
else if(pPlot->getRiverNSDirection() == CARDINALDIRECTION_SOUTH)
{
tempChar = 'S';
}
szTempBuffer.Format(L"\nNSRiverFlow: %c", tempChar);
szString.append(szTempBuffer);
tempChar = 'x';
if(pPlot->getRiverWEDirection() == CARDINALDIRECTION_WEST)
{
tempChar = 'W';
}
else if(pPlot->getRiverWEDirection() == CARDINALDIRECTION_EAST)
{
tempChar = 'E';
}
szTempBuffer.Format(L"\nWERiverFlow: %c", tempChar);
szString.append(szTempBuffer);
if(pPlot->getRouteType() != NO_ROUTE)
{
szTempBuffer.Format(L"\nRoute: %s", GC.getRouteInfo(pPlot->getRouteType()).getDescription());
szString.append(szTempBuffer);
}
if(pPlot->getRouteSymbol() != NULL)
{
szTempBuffer.Format(L"\nConnection: %i", gDLL->getRouteIFace()->getConnectionMask(pPlot->getRouteSymbol()));
szString.append(szTempBuffer);
}
for (iI = 0; iI < MAX_PLAYERS; ++iI)
{
if (GET_PLAYER((PlayerTypes)iI).isAlive())
{
if (pPlot->getCulture((PlayerTypes)iI) > 0)
{
szTempBuffer.Format(L"\n%s Culture: %d", GET_PLAYER((PlayerTypes)iI).getName(), pPlot->getCulture((PlayerTypes)iI));
szString.append(szTempBuffer);
}
if (pPlot->getDangerCount((PlayerTypes)iI) > 0)
{
szTempBuffer.Format(L"\n%s Danger: %d", GET_PLAYER((PlayerTypes)iI).getName(), pPlot->getDangerCount((PlayerTypes)iI));
szString.append(szTempBuffer);
}
}
}
PlayerTypes eActivePlayer = GC.getGameINLINE().getActivePlayer();
int iActualFoundValue = pPlot->getFoundValue(eActivePlayer);
int iCalcFoundValue = GET_PLAYER(eActivePlayer).AI_foundValue(pPlot->getX_INLINE(), pPlot->getY_INLINE(), -1, false);
int iStartingFoundValue = GET_PLAYER(eActivePlayer).AI_foundValue(pPlot->getX_INLINE(), pPlot->getY_INLINE(), -1, true);
szTempBuffer.Format(L"\nFound Value: %d, (%d, %d)", iActualFoundValue, iCalcFoundValue, iStartingFoundValue);
szString.append(szTempBuffer);
CvCity* pWorkingCity = pPlot->getWorkingCity();
if (NULL != pWorkingCity)
{
int iPlotIndex = pWorkingCity->getCityPlotIndex(pPlot);
int iBuildValue = pWorkingCity->AI_getBestBuildValue(iPlotIndex);
BuildTypes eBestBuild = pWorkingCity->AI_getBestBuild(iPlotIndex);
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 06/25/09 jdog5000 */
/* */
/* Debug */
/************************************************************************************************/
szString.append(NEWLINE);
int iFoodMultiplier, iProductionMultiplier, iCommerceMultiplier, iDesiredFoodChange;
pWorkingCity->AI_getYieldMultipliers( iFoodMultiplier, iProductionMultiplier, iCommerceMultiplier, iDesiredFoodChange );
szTempBuffer.Format(L"\n%s yield multipliers: ", pWorkingCity->getName().c_str() );
szString.append(szTempBuffer);
szTempBuffer.Format(L"\n Food %d, Prod %d, Com %d, DesFoodChange %d", iFoodMultiplier, iProductionMultiplier, iCommerceMultiplier, iDesiredFoodChange );
szString.append(szTempBuffer);
szTempBuffer.Format(L"\nTarget pop: %d, (%d good tiles)", pWorkingCity->AI_getTargetSize(), pWorkingCity->AI_getGoodTileCount() );
szString.append(szTempBuffer);
ImprovementTypes eImprovement = pPlot->getImprovementType();
if (NO_BUILD != eBestBuild)
{
if( GC.getBuildInfo(eBestBuild).getImprovement() != NO_IMPROVEMENT && eImprovement != NO_IMPROVEMENT && eImprovement != GC.getBuildInfo(eBestBuild).getImprovement() )
{
szTempBuffer.Format(SETCOLR L"\nBest Build: %s (%d) replacing %s" ENDCOLR, TEXT_COLOR("COLOR_RED"), GC.getBuildInfo(eBestBuild).getDescription(), iBuildValue, GC.getImprovementInfo(eImprovement).getDescription());
}
else
{
szTempBuffer.Format(SETCOLR L"\nBest Build: %s (%d)" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBuildInfo(eBestBuild).getDescription(), iBuildValue);
}
szString.append(szTempBuffer);
}
szTempBuffer.Format(L"\nActual Build Values: ");
szString.append(szTempBuffer);
for (iI = 0; iI < GC.getNumImprovementInfos(); iI++)
{
if( pPlot->canHaveImprovement((ImprovementTypes)iI, pWorkingCity->getTeam()) && GET_PLAYER(pWorkingCity->getOwnerINLINE()).canBuild(pPlot, (ImprovementTypes)iI, false, false))
{
int iOtherBuildValue = pWorkingCity->AI_getImprovementValue( pPlot, (ImprovementTypes)iI, iFoodMultiplier, iProductionMultiplier, iCommerceMultiplier, iDesiredFoodChange);
int iOldValue = pWorkingCity->AI_getImprovementValue( pPlot, (ImprovementTypes)iI, iFoodMultiplier, iProductionMultiplier, iCommerceMultiplier, iDesiredFoodChange, true);
szTempBuffer.Format(L"\n %s : %d (old %d)", GC.getImprovementInfo((ImprovementTypes)iI).getDescription(), iOtherBuildValue, iOldValue );
szString.append(szTempBuffer);
}
}
szTempBuffer.Format(L"\nStandard Build Values: ");
szString.append(szTempBuffer);
for (iI = 0; iI < GC.getNumImprovementInfos(); iI++)
{
int iOtherBuildValue = pWorkingCity->AI_getImprovementValue( pPlot, (ImprovementTypes)iI, 100, 100, 100, 0);
if( iOtherBuildValue > 0 )
{
szTempBuffer.Format(L"\n %s : %d", GC.getImprovementInfo((ImprovementTypes)iI).getDescription(), iOtherBuildValue);
szString.append(szTempBuffer);
}
}
szString.append(NEWLINE);
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
}
{
szTempBuffer.Format(L"\nStack Str: land=%d(%d), sea=%d(%d), air=%d(%d)",
pPlot->AI_sumStrength(NO_PLAYER, NO_PLAYER, DOMAIN_LAND, false, false, false),
pPlot->AI_sumStrength(NO_PLAYER, NO_PLAYER, DOMAIN_LAND, true, false, false),
pPlot->AI_sumStrength(NO_PLAYER, NO_PLAYER, DOMAIN_SEA, false, false, false),
pPlot->AI_sumStrength(NO_PLAYER, NO_PLAYER, DOMAIN_SEA, true, false, false),
pPlot->AI_sumStrength(NO_PLAYER, NO_PLAYER, DOMAIN_AIR, false, false, false),
pPlot->AI_sumStrength(NO_PLAYER, NO_PLAYER, DOMAIN_AIR, true, false, false));
szString.append(szTempBuffer);
}
if (false /*pPlot->getPlotCity() != NULL*/)
{
PlayerTypes ePlayer = pPlot->getOwnerINLINE();
CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);
szString.append(CvWString::format(L"\n\nAI unit class weights ..."));
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (kPlayer.AI_getUnitClassWeight((UnitClassTypes)iI) != 0)
{
szString.append(CvWString::format(L"\n%s = %d", GC.getUnitClassInfo((UnitClassTypes)iI).getDescription(), kPlayer.AI_getUnitClassWeight((UnitClassTypes)iI)));
}
}
szString.append(CvWString::format(L"\n\nalso unit combat type weights..."));
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (kPlayer.AI_getUnitCombatWeight((UnitCombatTypes)iI) != 0)
{
szString.append(CvWString::format(L"\n%s = % d", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription(), kPlayer.AI_getUnitCombatWeight((UnitCombatTypes)iI)));
}
}
}
}
else if (!bShift && bAlt && (gDLL->getChtLvl() > 0))
{
if (pPlot->isOwned())
{
szTempBuffer.Format(L"\nThis player has %d area cities", pPlot->area()->getCitiesPerPlayer(pPlot->getOwnerINLINE()));
szString.append(szTempBuffer);
for (int iI = 0; iI < GC.getNumReligionInfos(); ++iI)
{
int iNeededMissionaries = GET_PLAYER(pPlot->getOwnerINLINE()).AI_neededMissionaries(pPlot->area(), ((ReligionTypes)iI));
if (iNeededMissionaries > 0)
{
szTempBuffer.Format(L"\nNeeded %c missionaries = %d", GC.getReligionInfo((ReligionTypes)iI).getChar(), iNeededMissionaries);
szString.append(szTempBuffer);
}
}
int iNeededExplorers = GET_PLAYER(pPlot->getOwnerINLINE()).AI_neededExplorers(pPlot->area());
int iHasExplorers = GET_PLAYER(pPlot->getOwnerINLINE()).AI_totalAreaUnitAIs(pPlot->area(), UNITAI_EXPLORE);
if (iNeededExplorers > 0)
{
szTempBuffer.Format(L"\nNeeded explorers = %d (has %d)", iNeededExplorers, iHasExplorers);
szString.append(szTempBuffer);
}
int iNeededHunters = GET_PLAYER(pPlot->getOwnerINLINE()).AI_neededHunters(pPlot->area());
int iHasHunters = GET_PLAYER(pPlot->getOwnerINLINE()).AI_totalAreaUnitAIs(pPlot->area(), UNITAI_HUNTER);
if (iNeededHunters > 0)
{
szTempBuffer.Format(L"\nNeeded hunters = %d (has %d)", iNeededHunters, iHasHunters);
szString.append(szTempBuffer);
}
int iOurDefense = GET_PLAYER(pPlot->getOwnerINLINE()).AI_getOurPlotStrength(pPlot, 0, true, false);
int iEnemyOffense = GET_PLAYER(pPlot->getOwnerINLINE()).AI_getEnemyPlotStrength(pPlot, 2, false, false);
if (iEnemyOffense > 0)
{
szString.append(CvWString::format(SETCOLR L"\nDanger: %.2f (%d/%d)" ENDCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT"),
(iEnemyOffense * 1.0f) / std::max(1, iOurDefense), iEnemyOffense, iOurDefense));
}
CvCity* pCity = pPlot->getPlotCity();
if (pCity != NULL)
{
szTempBuffer.Format(L"\n\nCulture Pressure Value = %d", pCity->AI_calculateCulturePressure());
szString.append(szTempBuffer);
szTempBuffer.Format(L"\nWater World Percent = %d", pCity->AI_calculateWaterWorldPercent());
szString.append(szTempBuffer);
CvPlayerAI& kPlayer = GET_PLAYER(pCity->getOwnerINLINE());
int iUnitCost = kPlayer.calculateUnitCost();
int iTotalCosts = kPlayer.calculatePreInflatedCosts();
int iUnitCostPercentage = (iUnitCost * 100) / std::max(1, iTotalCosts);
szString.append(CvWString::format(L"\nUnit cost percentage: %d (%d / %d)", iUnitCostPercentage, iUnitCost, iTotalCosts));
szString.append(CvWString::format(L"\nUpgrade all units: %d gold", kPlayer.AI_goldToUpgradeAllUnits()));
szString.append(CvWString::format(L"\n\nRanks:"));
szString.append(CvWString::format(L"\nPopulation:%d", pCity->findPopulationRank()));
szString.append(CvWString::format(L"\nFood:%d(%d), ", pCity->findYieldRateRank(YIELD_FOOD), pCity->findBaseYieldRateRank(YIELD_FOOD)));
szString.append(CvWString::format(L"Prod:%d(%d), ", pCity->findYieldRateRank(YIELD_PRODUCTION), pCity->findBaseYieldRateRank(YIELD_PRODUCTION)));
szString.append(CvWString::format(L"Commerce:%d(%d)", pCity->findYieldRateRank(YIELD_COMMERCE), pCity->findBaseYieldRateRank(YIELD_COMMERCE)));
szString.append(CvWString::format(L"\nGold:%d, ", pCity->findCommerceRateRank(COMMERCE_GOLD)));
szString.append(CvWString::format(L"Research:%d, ", pCity->findCommerceRateRank(COMMERCE_RESEARCH)));
szString.append(CvWString::format(L"Culture:%d", pCity->findCommerceRateRank(COMMERCE_CULTURE)));
/************************************************************************************************/
/* Afforess Start 10/31/10 */
/* */
/* */
/************************************************************************************************/
szString.append(CvWString::format(L"\nMilitary Rank:%d", pCity->AI_getMilitaryProductionRateRank()));
if (pCity->AI_isMilitaryProductionCity())
szString.append(CvWString::format(L"\nIs Military Production City"));
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
szString.append(NEWLINE);
/************************************************************************************************/
/* REVOLUTION_MOD 06/11/08 jdog5000 */
/* */
/* Debug */
/************************************************************************************************/
szTempBuffer.Format(L"Stability Index: %d, Trend: %d",GET_PLAYER(pPlot->getOwner()).getStabilityIndex(),GET_PLAYER(pPlot->getOwner()).getStabilityIndex()-GET_PLAYER(pPlot->getOwner()).getStabilityIndexAverage());
szString.append(szTempBuffer);
szString.append(NEWLINE);
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
//AI strategies
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_DAGGER))
{
szTempBuffer.Format(L"Dagger, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_CRUSH))
{
szTempBuffer.Format(L"Crush, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_ALERT1))
{
szTempBuffer.Format(L"Alert1, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_ALERT2))
{
szTempBuffer.Format(L"Alert2, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_TURTLE))
{
szTempBuffer.Format(L"Turtle, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_LAST_STAND))
{
szTempBuffer.Format(L"LastStand, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_FINAL_WAR))
{
szTempBuffer.Format(L"FinalWar, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_GET_BETTER_UNITS))
{
szTempBuffer.Format(L"GetBetterUnits, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_FASTMOVERS))
{
szTempBuffer.Format(L"FastMovers, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_LAND_BLITZ))
{
szTempBuffer.Format(L"LandBlitz, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_AIR_BLITZ))
{
szTempBuffer.Format(L"AirBlitz, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_OWABWNW))
{
szTempBuffer.Format(L"OWABWNW, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_PRODUCTION))
{
szTempBuffer.Format(L"Production, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_MISSIONARY))
{
szTempBuffer.Format(L"Missionary, ");
szString.append(szTempBuffer);
}
if (GET_PLAYER(pPlot->getOwner()).AI_isDoStrategy(AI_STRATEGY_BIG_ESPIONAGE))
{
szTempBuffer.Format(L"BigEspionage, ");
szString.append(szTempBuffer);
}
//Area battle plans.
if (pPlot->area()->getAreaAIType(pPlot->getTeam()) == AREAAI_OFFENSIVE)
{
szTempBuffer.Format(L"\n Area AI = OFFENSIVE");
}
else if (pPlot->area()->getAreaAIType(pPlot->getTeam()) == AREAAI_DEFENSIVE)
{
szTempBuffer.Format(L"\n Area AI = DEFENSIVE");
}
else if (pPlot->area()->getAreaAIType(pPlot->getTeam()) == AREAAI_MASSING)
{
szTempBuffer.Format(L"\n Area AI = MASSING");
}
else if (pPlot->area()->getAreaAIType(pPlot->getTeam()) == AREAAI_ASSAULT)
{
szTempBuffer.Format(L"\n Area AI = ASSAULT");
}
else if (pPlot->area()->getAreaAIType(pPlot->getTeam()) == AREAAI_ASSAULT_MASSING)
{
szTempBuffer.Format(L"\n Area AI = ASSAULT_MASSING");
}
else if (pPlot->area()->getAreaAIType(pPlot->getTeam()) == AREAAI_NEUTRAL)
{
szTempBuffer.Format(L"\n Area AI = NEUTRAL");
}
szString.append(szTempBuffer);
szString.append(CvWString::format(L"\n\nNum Wars: %d + %d minor", GET_TEAM(pPlot->getTeam()).getAtWarCount(true), GET_TEAM(pPlot->getTeam()).getAtWarCount(false) - GET_TEAM(pPlot->getTeam()).getAtWarCount(true)));
szString.append(CvWString::format(L"\nWarplans:"));
for (int iK = 0; iK < MAX_TEAMS; ++iK)
{
TeamTypes eTeam = (TeamTypes)iK;
if( GET_TEAM(eTeam).isAlive() || GET_TEAM(eTeam).isBarbarian() )
{
if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == WARPLAN_ATTACKED )
{
szString.append(CvWString::format(L"\n%s: ATTACKED", GET_TEAM(eTeam).getName().c_str()));
}
else if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == WARPLAN_ATTACKED_RECENT )
{
szString.append(CvWString::format(L"\n%s: ATTACKED_RECENT", GET_TEAM(eTeam).getName().c_str()));
}
else if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == WARPLAN_PREPARING_LIMITED )
{
szString.append(CvWString::format(L"\n%s: PREP_LIM", GET_TEAM(eTeam).getName().c_str()));
}
else if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == WARPLAN_PREPARING_TOTAL )
{
szString.append(CvWString::format(L"\n%s: PREP_TOTAL", GET_TEAM(eTeam).getName().c_str()));
}
else if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == WARPLAN_LIMITED )
{
szString.append(CvWString::format(L"\n%s: LIMITED", GET_TEAM(eTeam).getName().c_str()));
}
else if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == WARPLAN_TOTAL )
{
szString.append(CvWString::format(L"\n%s: TOTAL", GET_TEAM(eTeam).getName().c_str()));
}
else if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == WARPLAN_DOGPILE )
{
szString.append(CvWString::format(L"\n%s: DOGPILE", GET_TEAM(eTeam).getName().c_str()));
}
else if( GET_TEAM(pPlot->getTeam()).AI_getWarPlan(eTeam) == NO_WARPLAN )
{
if( GET_TEAM(pPlot->getTeam()).isAtWar(eTeam) )
{
szString.append(CvWString::format(SETCOLR L"\n%s: NO_WARPLAN!" ENDCOLR, TEXT_COLOR("COLOR_WARNING_TEXT"), GET_TEAM(eTeam).getName().c_str()));
}
}
}
if( GET_TEAM(pPlot->getTeam()).isMinorCiv() || GET_TEAM(pPlot->getTeam()).isBarbarian() )
{
if( pPlot->getTeam() != eTeam && !GET_TEAM(pPlot->getTeam()).isAtWar(eTeam) )
{
szString.append(CvWString::format(SETCOLR L"\n%s: minor/barb not at war!" ENDCOLR, TEXT_COLOR("COLOR_WARNING_TEXT"), GET_TEAM(eTeam).getName().c_str()));
}
}
}
CvCity* pTargetCity = pPlot->area()->getTargetCity(pPlot->getOwner());
if( pTargetCity )
{
szString.append(CvWString::format(L"\nTarget City: %s", pTargetCity->getName().c_str()));
}
else
{
szString.append(CvWString::format(L"\nTarget City: None"));
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
}
}
else if (bShift && bAlt && (gDLL->getChtLvl() > 0))
{
CvCity* pCity = pPlot->getWorkingCity();
if (pCity != NULL)
{
// some functions we want to call are not in CvCity, worse some are protected, so made us a friend
CvCityAI* pCityAI = static_cast<CvCityAI*>(pCity);
bool bAvoidGrowth = pCity->AI_avoidGrowth();
bool bIgnoreGrowth = pCityAI->AI_ignoreGrowth();
// if we over the city, then do an array of all the plots
if (pPlot->getPlotCity() != NULL)
{
/************************************************************************************************/
/* Afforess Start 02/19/10 */
/* */
/* Fixed Borders */
/************************************************************************************************/
szTempBuffer.Format(L"Max culture level = %d ", pCity->getMaxCultureLevelAmongPlayers());
szString.append(szTempBuffer);
szString.append(NEWLINE);
szTempBuffer.Format(L"Occupation culture level = %d ", pCity->getOccupationCultureLevel());
szString.append(szTempBuffer);
szString.append(NEWLINE);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// check avoid growth
if (bAvoidGrowth || bIgnoreGrowth)
{
// red color
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT")));
if (bAvoidGrowth)
{
szString.append(CvWString::format(L"AvoidGrowth"));
if (bIgnoreGrowth)
szString.append(CvWString::format(L", "));
}
if (bIgnoreGrowth)
szString.append(CvWString::format(L"IgnoreGrowth"));
// end color
szString.append(CvWString::format( ENDCOLR L"\n" ));
}
// if control key is down, ignore food
bool bIgnoreFood = gDLL->ctrlKey();
// line one is: blank, 20, 9, 10, blank
setCityPlotYieldValueString(szString, pCity, -1, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 20, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 9, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 10, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
szString.append(L"\n");
// line two is: 19, 8, 1, 2, 11
setCityPlotYieldValueString(szString, pCity, 19, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 8, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 1, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 2, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 11, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
szString.append(L"\n");
// line three is: 18, 7, 0, 3, 12
setCityPlotYieldValueString(szString, pCity, 18, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 7, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 0, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 3, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 12, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
szString.append(L"\n");
// line four is: 17, 6, 5, 4, 13
setCityPlotYieldValueString(szString, pCity, 17, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 6, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 5, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 4, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 13, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
szString.append(L"\n");
// line five is: blank, 16, 15, 14, blank
setCityPlotYieldValueString(szString, pCity, -1, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 16, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 15, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
setCityPlotYieldValueString(szString, pCity, 14, bAvoidGrowth, bIgnoreGrowth, bIgnoreFood);
// show specialist values too
for (int iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
int iMaxThisSpecialist = pCity->getMaxSpecialistCount((SpecialistTypes) iI);
int iSpecialistCount = pCity->getSpecialistCount((SpecialistTypes) iI);
bool bUsingSpecialist = (iSpecialistCount > 0);
bool bIsDefaultSpecialist = (iI == GC.getDefineINT("DEFAULT_SPECIALIST"));
// can this city have any of this specialist?
if (iMaxThisSpecialist > 0 || bIsDefaultSpecialist)
{
// start color
if (pCity->getForceSpecialistCount((SpecialistTypes) iI) > 0)
szString.append(CvWString::format(L"\n" SETCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT")));
else if (bUsingSpecialist)
szString.append(CvWString::format(L"\n" SETCOLR, TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT")));
else
szString.append(CvWString::format(L"\n" SETCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT")));
// add name
szString.append(GC.getSpecialistInfo((SpecialistTypes) iI).getDescription());
// end color
szString.append(CvWString::format( ENDCOLR ));
// add usage
szString.append(CvWString::format(L": (%d/%d) ", iSpecialistCount, iMaxThisSpecialist));
// add value
int iValue = pCityAI->AI_specialistValue(((SpecialistTypes) iI), bAvoidGrowth, /*bRemove*/ bUsingSpecialist);
setYieldValueString(szString, iValue, /*bActive*/ bUsingSpecialist);
}
}
{
int iFood = GET_PLAYER(pCity->getOwnerINLINE()).AI_averageYieldMultiplier(YIELD_FOOD);
int iHammer = GET_PLAYER(pCity->getOwnerINLINE()).AI_averageYieldMultiplier(YIELD_PRODUCTION);
int iCommerce = GET_PLAYER(pCity->getOwnerINLINE()).AI_averageYieldMultiplier(YIELD_COMMERCE);
szString.append(CvWString::format(L"\nPlayer avg: (f%d, h%d, c%d)", iFood, iHammer, iCommerce));
iFood = pCity->AI_yieldMultiplier(YIELD_FOOD);
iHammer = pCity->AI_yieldMultiplier(YIELD_PRODUCTION);
iCommerce = pCity->AI_yieldMultiplier(YIELD_COMMERCE);
szString.append(CvWString::format(L"\nCity yield mults: (f%d, h%d, c%d)", iFood, iHammer, iCommerce));
iFood = pCityAI->AI_specialYieldMultiplier(YIELD_FOOD);
iHammer = pCityAI->AI_specialYieldMultiplier(YIELD_PRODUCTION);
iCommerce = pCityAI->AI_specialYieldMultiplier(YIELD_COMMERCE);
szString.append(CvWString::format(L"\nCity spec mults: (f%d, h%d, c%d)", iFood, iHammer, iCommerce));
szString.append(CvWString::format(L"\nExchange"));
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
iCommerce = GET_PLAYER(pCity->getOwnerINLINE()).AI_averageCommerceExchange((CommerceTypes)iI);
szTempBuffer.Format(L", %d%c", iCommerce, GC.getCommerceInfo((CommerceTypes) iI).getChar());
szString.append(szTempBuffer);
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 07/08/09 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
szString.append(CvWString::format(L"\nAvg mults"));
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
iCommerce = GET_PLAYER(pCity->getOwnerINLINE()).AI_averageCommerceMultiplier((CommerceTypes)iI);
szTempBuffer.Format(L", %d%c", iCommerce, GC.getCommerceInfo((CommerceTypes) iI).getChar());
szString.append(szTempBuffer);
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
if (GET_PLAYER(pCity->getOwnerINLINE()).AI_isFinancialTrouble())
{
szTempBuffer.Format(L"$$$!!!");
szString.append(szTempBuffer);
}
}
}
else
{
bool bWorkingPlot = pCity->isWorkingPlot(pPlot);
if (bWorkingPlot)
szTempBuffer.Format( SETCOLR L"%s is working" ENDCOLR, TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT"), pCity->getName().GetCString());
else
szTempBuffer.Format( SETCOLR L"%s not working" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), pCity->getName().GetCString());
szString.append(szTempBuffer);
int iValue = pCityAI->AI_plotValue(pPlot, bAvoidGrowth, /*bRemove*/ bWorkingPlot, /*bIgnoreFood*/ false, bIgnoreGrowth);
int iJuggleValue = pCityAI->AI_plotValue(pPlot, bAvoidGrowth, /*bRemove*/ bWorkingPlot, false, bIgnoreGrowth, true);
int iMagicValue = pCityAI->AI_getPlotMagicValue(pPlot, pCityAI->healthRate() == 0);
szTempBuffer.Format(L"\nvalue = %d\njuggle value = %d\nmagic value = %d", iValue, iJuggleValue, iMagicValue);
szString.append(szTempBuffer);
}
}
// calc some bonus info
if (GC.getGameINLINE().isDebugMode())
{
eBonus = pPlot->getBonusType();
}
else
{
eBonus = pPlot->getBonusType(GC.getGameINLINE().getActiveTeam());
}
if (eBonus != NO_BONUS)
{
szString.append(CvWString::format(L"\n%s values:", GC.getBonusInfo(eBonus).getDescription()));
for (int iPlayerIndex = 0; iPlayerIndex < MAX_PLAYERS; iPlayerIndex++)
{
CvPlayerAI& kLoopPlayer = GET_PLAYER((PlayerTypes) iPlayerIndex);
if (kLoopPlayer.isAlive())
{
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 07/11/08 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
/* original code
szString.append(CvWString::format(L"\n %s: %d", kLoopPlayer.getName(), kLoopPlayer.AI_bonusVal(eBonus)));
*/
BonusTypes eNonObsBonus = pPlot->getNonObsoleteBonusType(kLoopPlayer.getTeam());
if( eNonObsBonus != NO_BONUS )
{
szString.append(CvWString::format(L"\n %s: %d", kLoopPlayer.getName(), kLoopPlayer.AI_bonusVal(eNonObsBonus)));
}
else
{
szString.append(CvWString::format(L"\n %s: unknown (%d)", kLoopPlayer.getName(), kLoopPlayer.AI_bonusVal(eBonus)));
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
}
}
}
}
else
{
eRevealOwner = pPlot->getRevealedOwner(GC.getGameINLINE().getActiveTeam(), true);
if (eRevealOwner != NO_PLAYER)
{
if (pPlot->isActiveVisible(true))
{
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
szTempBuffer.Format(SETCOLR L"%s: %s" ENDCOLR, GET_PLAYER(eRevealOwner).getPlayerTextColorR(), GET_PLAYER(eRevealOwner).getPlayerTextColorG(), GET_PLAYER(eRevealOwner).getPlayerTextColorB(), GET_PLAYER(eRevealOwner).getPlayerTextColorA(), gDLL->getText("TXT_KEY_MISC_OWNER").GetCString(), GET_PLAYER(eRevealOwner).getCivilizationShortDescription());
szString.append(szTempBuffer);
szString.append(NEWLINE);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szTempBuffer.Format(L"%d%% " SETCOLR L"%s" ENDCOLR, pPlot->calculateCulturePercent(eRevealOwner), GET_PLAYER(eRevealOwner).getPlayerTextColorR(), GET_PLAYER(eRevealOwner).getPlayerTextColorG(), GET_PLAYER(eRevealOwner).getPlayerTextColorB(), GET_PLAYER(eRevealOwner).getPlayerTextColorA(), GET_PLAYER(eRevealOwner).getCivilizationAdjective());
// BUG - City Controlled Plots - start
if (getBugOptionBOOL("MiscHover__PlotWorkingCity", true, "BUG_PLOT_HOVER_WORKING_CITY"))
{
CvCity* pWorkingCity = pPlot->getWorkingCity();
if (pWorkingCity != NULL && pWorkingCity->getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
szTempBuffer.append(L", ");
if (pWorkingCity->isWorkingPlot(pPlot))
{
szTempBuffer.append(CvWString::format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), pWorkingCity->getName().GetCString()));
}
else
{
szTempBuffer.append(CvWString::format(L"%s", pWorkingCity->getName().GetCString()));
}
}
}
// BUG - City Controlled Plots - end
szString.append(szTempBuffer);
szString.append(NEWLINE);
for (int iPlayer = 0; iPlayer < MAX_PLAYERS; ++iPlayer)
{
if (iPlayer != eRevealOwner)
{
CvPlayer& kPlayer = GET_PLAYER((PlayerTypes)iPlayer);
if (kPlayer.isAlive() && pPlot->getCulture((PlayerTypes)iPlayer) > 0)
{
szTempBuffer.Format(L"%d%% " SETCOLR L"%s" ENDCOLR, pPlot->calculateCulturePercent((PlayerTypes)iPlayer), kPlayer.getPlayerTextColorR(), kPlayer.getPlayerTextColorG(), kPlayer.getPlayerTextColorB(), kPlayer.getPlayerTextColorA(), kPlayer.getCivilizationAdjective());
szString.append(szTempBuffer);
szString.append(NEWLINE);
}
}
}
}
else
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, GET_PLAYER(eRevealOwner).getPlayerTextColorR(), GET_PLAYER(eRevealOwner).getPlayerTextColorG(), GET_PLAYER(eRevealOwner).getPlayerTextColorB(), GET_PLAYER(eRevealOwner).getPlayerTextColorA(), GET_PLAYER(eRevealOwner).getCivilizationDescription());
szString.append(szTempBuffer);
szString.append(NEWLINE);
}
}
iDefenseModifier = pPlot->defenseModifier((eRevealOwner != NO_PLAYER ? GET_PLAYER(eRevealOwner).getTeam() : NO_TEAM), true, true);
if (iDefenseModifier != 0)
{
szString.append(gDLL->getText("TXT_KEY_PLOT_BONUS", iDefenseModifier));
szString.append(NEWLINE);
}
if (pPlot->getTerrainType() != NO_TERRAIN)
{
if (pPlot->isPeak())
{
szString.append(gDLL->getText("TXT_KEY_PLOT_PEAK"));
}
else
{
if (pPlot->isWater())
{
szTempBuffer.Format(SETCOLR, TEXT_COLOR("COLOR_WATER_TEXT"));
szString.append(szTempBuffer);
}
if (pPlot->isHills())
{
szString.append(gDLL->getText("TXT_KEY_PLOT_HILLS"));
}
if (pPlot->getFeatureType() != NO_FEATURE)
{
szTempBuffer.Format(L"%s/", GC.getFeatureInfo(pPlot->getFeatureType()).getDescription());
szString.append(szTempBuffer);
}
szString.append(GC.getTerrainInfo(pPlot->getTerrainType()).getDescription());
if (pPlot->isWater())
{
szString.append(ENDCOLR);
}
}
}
if (pPlot->hasYield())
{
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
iYield = pPlot->calculateYield(((YieldTypes)iI), true);
if (iYield != 0)
{
szTempBuffer.Format(L", %d%c", iYield, GC.getYieldInfo((YieldTypes) iI).getChar());
szString.append(szTempBuffer);
}
}
}
if (pPlot->isFreshWater())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PLOT_FRESH_WATER"));
}
if (pPlot->isLake())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PLOT_FRESH_WATER_LAKE"));
}
/************************************************************************************************/
/* Afforess Mountains Start 09/18/09 */
/* */
/* */
/************************************************************************************************/
if (pPlot->isImpassable(GC.getGameINLINE().getActiveTeam())) //added GC.getGameINLINE().getActiveTeam()
/************************************************************************************************/
/* Afforess Mountains End END */
/************************************************************************************************/
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PLOT_IMPASSABLE"));
}
if (GC.getGameINLINE().isDebugMode())
{
eBonus = pPlot->getBonusType();
}
else
{
eBonus = pPlot->getBonusType(GC.getGameINLINE().getActiveTeam());
}
if (eBonus != NO_BONUS)
{
szTempBuffer.Format(L"%c " SETCOLR L"%s" ENDCOLR, GC.getBonusInfo(eBonus).getChar(), TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBonusInfo(eBonus).getDescription());
szString.append(NEWLINE);
szString.append(szTempBuffer);
if (GC.getBonusInfo(eBonus).getHealth() != 0)
{
szTempBuffer.Format(L", +%d%c", abs(GC.getBonusInfo(eBonus).getHealth()), ((GC.getBonusInfo(eBonus).getHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR)));
szString.append(szTempBuffer);
}
if (GC.getBonusInfo(eBonus).getHappiness() != 0)
{
szTempBuffer.Format(L", +%d%c", abs(GC.getBonusInfo(eBonus).getHappiness()), ((GC.getBonusInfo(eBonus).getHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR): gDLL->getSymbolID(UNHAPPY_CHAR)));
szString.append(szTempBuffer);
}
if ((pPlot->getImprovementType() == NO_IMPROVEMENT) || !(GC.getImprovementInfo(pPlot->getImprovementType()).isImprovementBonusTrade(eBonus)))
{
if (!(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isHasTech((TechTypes)GC.getBonusInfo(eBonus).getTechCityTrade())))
{
szString.append(gDLL->getText("TXT_KEY_PLOT_RESEARCH", GC.getTechInfo((TechTypes) GC.getBonusInfo(eBonus).getTechCityTrade()).getTextKeyWide()));
}
if (!pPlot->isCity())
{
for (iI = 0; iI < GC.getNumBuildInfos(); ++iI)
{
if (GC.getBuildInfo((BuildTypes) iI).getImprovement() != NO_IMPROVEMENT)
{
CvImprovementInfo& kImprovementInfo = GC.getImprovementInfo((ImprovementTypes) GC.getBuildInfo((BuildTypes) iI).getImprovement());
if (kImprovementInfo.isImprovementBonusTrade(eBonus))
{
if (pPlot->canHaveImprovement(((ImprovementTypes)(GC.getBuildInfo((BuildTypes) iI).getImprovement())), GC.getGameINLINE().getActiveTeam(), true))
{
if (GET_TEAM(GC.getGameINLINE().getActiveTeam()).isHasTech((TechTypes)GC.getBuildInfo((BuildTypes) iI).getTechPrereq()))
{
szString.append(gDLL->getText("TXT_KEY_PLOT_REQUIRES", kImprovementInfo.getTextKeyWide()));
}
else if (GC.getBonusInfo(eBonus).getTechCityTrade() != GC.getBuildInfo((BuildTypes) iI).getTechPrereq())
{
szString.append(gDLL->getText("TXT_KEY_PLOT_RESEARCH", GC.getTechInfo((TechTypes) GC.getBuildInfo((BuildTypes) iI).getTechPrereq()).getTextKeyWide()));
}
bool bFirst = true;
for (int k = 0; k < NUM_YIELD_TYPES; k++)
{
int iYieldChange = kImprovementInfo.getImprovementBonusYield(eBonus, k) + kImprovementInfo.getYieldChange(k);
if (iYieldChange != 0)
{
if (iYieldChange > 0)
{
szTempBuffer.Format(L"+%d%c", iYieldChange, GC.getYieldInfo((YieldTypes)k).getChar());
}
else
{
szTempBuffer.Format(L"%d%c", iYieldChange, GC.getYieldInfo((YieldTypes)k).getChar());
}
setListHelp(szString, L"\n", szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
if (!bFirst)
{
szString.append(gDLL->getText("TXT_KEY_BONUS_WITH_IMPROVEMENT", kImprovementInfo.getTextKeyWide()));
}
break;
}
}
}
}
}
}
else if (!(pPlot->isBonusNetwork(GC.getGameINLINE().getActiveTeam())))
{
szString.append(gDLL->getText("TXT_KEY_PLOT_REQUIRES_ROUTE"));
}
GC.getBonusInfo(eBonus).getPropertyManipulators()->buildDisplayString(szString);
if (!CvWString(GC.getBonusInfo(eBonus).getHelp()).empty())
{
szString.append(NEWLINE);
szString.append(GC.getBonusInfo(eBonus).getHelp());
}
}
eImprovement = pPlot->getRevealedImprovementType(GC.getGameINLINE().getActiveTeam(), true);
if (eImprovement != NO_IMPROVEMENT)
{
szString.append(NEWLINE);
/************************************************************************************************/
/* Afforess Start 06/24/10 */
/* */
/* */
/************************************************************************************************/
if (pPlot->isOvergrown())
{
szString.append(gDLL->getText("TXT_KEY_PLOT_OVERGROWN"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szString.append(GC.getImprovementInfo(eImprovement).getDescription());
bFound = false;
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
if (GC.getImprovementInfo(eImprovement).getIrrigatedYieldChange(iI) != 0)
{
bFound = true;
break;
}
}
if (bFound)
{
if (pPlot->isIrrigationAvailable())
{
szString.append(gDLL->getText("TXT_KEY_PLOT_IRRIGATED"));
}
else
{
szString.append(gDLL->getText("TXT_KEY_PLOT_NOT_IRRIGATED"));
}
}
/************************************************************************************************/
/* Afforess Start 05/23/10 */
/* */
/* */
/************************************************************************************************/
/*
if (GC.getImprovementInfo(eImprovement).getImprovementUpgrade() != NO_IMPROVEMENT)
*/
if (pPlot->getTeam() != NO_TEAM && GET_TEAM(pPlot->getTeam()).getImprovementUpgrade(eImprovement) != NO_IMPROVEMENT)
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
if ((pPlot->getUpgradeProgressHundredths() > 0) || pPlot->isBeingWorked())
{
iTurns = pPlot->getUpgradeTimeLeft(eImprovement, eRevealOwner);
szString.append(gDLL->getText("TXT_KEY_PLOT_IMP_UPGRADE", iTurns, GC.getImprovementInfo((ImprovementTypes) GC.getImprovementInfo(eImprovement).getImprovementUpgrade()).getTextKeyWide()));
}
else
{
szString.append(gDLL->getText("TXT_KEY_PLOT_WORK_TO_UPGRADE", GC.getImprovementInfo((ImprovementTypes) GC.getImprovementInfo(eImprovement).getImprovementUpgrade()).getTextKeyWide()));
}
}
/************************************************************************************************/
/* Afforess Start 07/22/10 */
/* */
/* */
/************************************************************************************************/
else if (pPlot->getTeam() != NO_TEAM && (GC.getImprovementInfo(eImprovement).getImprovementUpgrade() != GET_TEAM(pPlot->getTeam()).getImprovementUpgrade(eImprovement)))
{
TechTypes ePrereqTech = (TechTypes)GC.getImprovementInfo((ImprovementTypes) GC.getImprovementInfo(eImprovement).getImprovementUpgrade()).getPrereqTech();
if (ePrereqTech != NO_TECH)
{
szString.append(gDLL->getText("TXT_KEY_PLOT_TECH_TO_UPGRADE", GC.getTechInfo(ePrereqTech).getTextKeyWide()));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
if (pPlot->getRevealedRouteType(GC.getGameINLINE().getActiveTeam(), true) != NO_ROUTE)
{
szString.append(NEWLINE);
szString.append(GC.getRouteInfo(pPlot->getRevealedRouteType(GC.getGameINLINE().getActiveTeam(), true)).getDescription());
}
// BUG - Lat/Long Coordinates - start
if (GET_TEAM(GC.getGameINLINE().getActiveTeam()).isMapCentering() && getBugOptionBOOL("MiscHover__LatLongCoords", true, "BUG_PLOT_HOVER_LAT_LONG"))
{
int iLong = pPlot->getLongitudeMinutes();
bool bWest = false;
if (iLong < 0)
{
iLong = abs(iLong);
bWest = true;
}
int iLongDeg = iLong / 60;
int iLongMin = iLong % 60;
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_LATLONG", iLongDeg, iLongMin));
if (bWest)
{
szString.append(gDLL->getText("TXT_KEY_LATLONG_WEST"));
}
else
{
szString.append(gDLL->getText("TXT_KEY_LATLONG_EAST"));
}
int iLat = pPlot->getLatitudeMinutes();
bool bSouth = false;
if (iLat < 0)
{
iLat = abs(iLat);
bSouth = true;
}
int iLatDeg = iLat / 60;
int iLatMin = iLat % 60;
szString.append(L", ");
szString.append(gDLL->getText("TXT_KEY_LATLONG", iLatDeg, iLatMin));
if (bSouth)
{
szString.append(gDLL->getText("TXT_KEY_LATLONG_SOUTH"));
}
else
{
szString.append(gDLL->getText("TXT_KEY_LATLONG_NORTH"));
}
}
// BUG - Lat/Long Coordinates - end
/************************************************************************************************/
/* Afforess Start 04/15/10 */
/* */
/* */
/************************************************************************************************/
if (pPlot->isDepletedMine())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_IMPROVEMENT_DEPLETED_MINE"));
}
if (pPlot->getLandmarkType() != NO_LANDMARK && GC.getGameINLINE().isOption(GAMEOPTION_PERSONALIZED_MAP))
{
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT")));
szString.append(NEWLINE);
szString.append(pPlot->getLandmarkMessage());
szString.append(CvWString::format( ENDCOLR));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// BUG - Recommended Build - start
BuildTypes eBestBuild = NO_BUILD;
bool bBestPartiallyBuilt = false;
if (getBugOptionBOOL("MiscHover__PlotRecommendedBuild", true, "BUG_PLOT_HOVER_RECOMMENDED_BUILD"))
{
CvCity* pWorkingCity = pPlot->getWorkingCity();
if (pWorkingCity != NULL && pWorkingCity->getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
eBestBuild = pWorkingCity->AI_getBestBuild(pWorkingCity->getCityPlotIndex(pPlot));
if (eBestBuild != NO_BUILD)
{
CvBuildInfo& kBestBuild = GC.getBuildInfo(eBestBuild);
ImprovementTypes ePlotImprovement = pPlot->getImprovementType();
if (ePlotImprovement != NO_IMPROVEMENT && ePlotImprovement == kBestBuild.getImprovement())
{
eBestBuild = NO_BUILD;
}
else if (kBestBuild.getRoute() != NO_ROUTE && (pPlot->isWater() || kBestBuild.getRoute() == pPlot->getRouteType()))
{
eBestBuild = NO_BUILD;
}
}
}
}
// BUG - Recommended Build - end
// BUG - Partial Builds - start
if (pPlot->hasAnyBuildProgress() && getBugOptionBOOL("MiscHover__PartialBuilds", true, "BUG_PLOT_HOVER_PARTIAL_BUILDS"))
{
PlayerTypes ePlayer = GC.getGameINLINE().getActivePlayer();
for (int iI = 0; iI < GC.getNumBuildInfos(); iI++)
{
if (pPlot->getBuildProgress((BuildTypes)iI) > 0 && pPlot->canBuild((BuildTypes)iI, ePlayer))
{
int iTurns = pPlot->getBuildTurnsLeft((BuildTypes)iI, GC.getGame().getActivePlayer());
if (iTurns > 0 && iTurns < MAX_INT)
{
szString.append(NEWLINE);
szString.append(GC.getBuildInfo((BuildTypes)iI).getDescription());
szString.append(L": ");
szString.append(gDLL->getText("TXT_KEY_ACTION_NUM_TURNS", iTurns));
}
}
}
}
// BUG - Partial Builds - end
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 07/11/08 jdog5000 */
/* */
/* DEBUG */
/************************************************************************************************/
/* original code
if (pPlot->getBlockadedCount(GC.getGameINLINE().getActiveTeam()) > 0)
*/
if( GC.getGameINLINE().isDebugMode() )
{
bool bFirst = true;
for (int iK = 0; iK < MAX_TEAMS; ++iK)
{
TeamTypes eTeam = (TeamTypes)iK;
if( pPlot->getBlockadedCount(eTeam) > 0 && GET_TEAM(eTeam).isAlive() )
{
if( bFirst )
{
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT")));
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PLOT_BLOCKADED"));
szString.append(CvWString::format( ENDCOLR));
szString.append(CvWString::format(L"Teams:"));
bFirst = false;
}
szString.append(CvWString::format(L" %s,", GET_TEAM(eTeam).getName().c_str()));
}
}
}
else if (pPlot->getBlockadedCount(GC.getGameINLINE().getActiveTeam()) > 0)
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
{
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT")));
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PLOT_BLOCKADED"));
szString.append(CvWString::format( ENDCOLR));
}
}
/************************************************************************************************/
/* Afforess Start 06/14/10 */
/* */
/* */
/************************************************************************************************/
/*
if (pPlot->getFeatureType() != NO_FEATURE)
{
int iDamage = GC.getFeatureInfo(pPlot->getFeatureType()).getTurnDamage();
*/
int iDamage = 0;
#ifdef MULTI_FEATURE_MOD
for (int i=0; i<pPlot->getNumFeatures(); i++)
{
iDamage += GC.getFeatureInfo(pPlot->getFeatureByIndex(i)).getTurnDamage();
}
#else
if (pPlot->getFeatureType() != NO_FEATURE)
{
iDamage += GC.getFeatureInfo(pPlot->getFeatureType()).getTurnDamage();
}
#endif
iDamage += pPlot->getTerrainTurnDamage();
if (iDamage > 0)
{
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT")));
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PLOT_DAMAGE", iDamage));
//TB Combat Mod begin
/* if (GC.getTerrainInfo(pPlot->getTerrainType()).isColdDamage())
{
szString.append(gDLL->getText("TXT_KEY_PLOT_DAMAGE_IS_COLD"));
}
*/ //TB Combat Mod end
szString.append(CvWString::format( ENDCOLR));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
/*************************************************************************************************/
/* UNOFFICIAL_PATCH 06/02/10 LunarMongoose */
/* */
/* User interface */
/*************************************************************************************************/
// Mongoose FeatureDamageFix
else if (iDamage < 0)
{
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_POSITIVE_TEXT")));
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_PLOT_DAMAGE", iDamage));
szString.append(CvWString::format( ENDCOLR));
}
/*************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/*************************************************************************************************/
pPlot->getProperties()->buildDisplayString(szString);
}
void CvGameTextMgr::setCityPlotYieldValueString(CvWStringBuffer &szString, CvCity* pCity, int iIndex, bool bAvoidGrowth, bool bIgnoreGrowth, bool bIgnoreFood)
{
PROFILE_FUNC();
CvPlot* pPlot = NULL;
if (iIndex >= 0 && iIndex < NUM_CITY_PLOTS)
pPlot = pCity->getCityIndexPlot(iIndex);
if (pPlot != NULL && pPlot->getWorkingCity() == pCity)
{
CvCityAI* pCityAI = static_cast<CvCityAI*>(pCity);
bool bWorkingPlot = pCity->isWorkingPlot(iIndex);
int iValue = pCityAI->AI_plotValue(pPlot, bAvoidGrowth, /*bRemove*/ bWorkingPlot, bIgnoreFood, bIgnoreGrowth);
setYieldValueString(szString, iValue, /*bActive*/ bWorkingPlot);
}
else
setYieldValueString(szString, 0, /*bActive*/ false, /*bMakeWhitespace*/ true);
}
void CvGameTextMgr::setYieldValueString(CvWStringBuffer &szString, int iValue, bool bActive, bool bMakeWhitespace)
{
PROFILE_FUNC();
static bool bUseFloats = false;
if (bActive)
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT")));
else
szString.append(CvWString::format(SETCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT")));
if (!bMakeWhitespace)
{
if (bUseFloats)
{
float fValue = ((float) iValue) / 10000;
szString.append(CvWString::format(L"%2.3f " ENDCOLR, fValue));
}
else
szString.append(CvWString::format(L"%05d " ENDCOLR, iValue/10));
}
else
szString.append(CvWString::format(L" " ENDCOLR));
}
void CvGameTextMgr::setCityBarHelp(CvWStringBuffer &szString, CvCity* pCity)
{
PROFILE_FUNC();
CvWString szTempBuffer;
bool bFirst;
int iFoodDifference;
int iProductionDiffNoFood;
int iProductionDiffJustFood;
int iRate;
int iI;
// BUG - Base Production and Commerce - start
bool bBaseValues = (gDLL->ctrlKey() && getBugOptionBOOL("CityBar__BaseValues", true, "BUG_CITYBAR_BASE_VALUES"));
// BUG - Base Production and Commerce - end
FAssert(pCity->isInViewport());
iFoodDifference = pCity->foodDifference();
szString.append(pCity->getName());
// BUG - Health - start
if (getBugOptionBOOL("CityBar__Health", true, "BUG_CITYBAR_HEALTH"))
{
iRate = pCity->goodHealth() - pCity->badHealth();
if (iRate > 0)
{
szTempBuffer.Format(L", %d %c", iRate, gDLL->getSymbolID(HEALTHY_CHAR));
szString.append(szTempBuffer);
}
else if (iRate < 0)
{
szTempBuffer.Format(L", %d %c", -iRate, gDLL->getSymbolID(UNHEALTHY_CHAR));
szString.append(szTempBuffer);
}
}
// BUG - Health - end
// BUG - Happiness - start
if (getBugOptionBOOL("CityBar__Happiness", true, "BUG_CITYBAR_HAPPINESS"))
{
if (pCity->isDisorder())
{
int iAngryPop = pCity->angryPopulation();
if (iAngryPop > 0)
{
szTempBuffer.Format(L", %d %c", iAngryPop, gDLL->getSymbolID(ANGRY_POP_CHAR));
szString.append(szTempBuffer);
}
}
else
{
iRate = pCity->happyLevel() - pCity->unhappyLevel();
if (iRate > 0)
{
szTempBuffer.Format(L", %d %c", iRate, gDLL->getSymbolID(HAPPY_CHAR));
szString.append(szTempBuffer);
}
else if (iRate < 0)
{
szTempBuffer.Format(L", %d %c", -iRate, gDLL->getSymbolID(UNHAPPY_CHAR));
szString.append(szTempBuffer);
}
}
}
// BUG - Happiness - end
// BUG - Hurry Anger Turns - start
if (getBugOptionBOOL("CityBar__HurryAnger", true, "BUG_CITYBAR_HURRY_ANGER") && pCity->getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
iRate = pCity->getHurryAngerTimer();
if (iRate > 0)
{
int iPop = ((iRate - 1) / pCity->flatHurryAngerLength() + 1) * GC.getDefineINT("HURRY_POP_ANGER");
szTempBuffer.Format(L" (%d %c %d)", iPop, gDLL->getSymbolID(ANGRY_POP_CHAR), iRate);
szString.append(szTempBuffer);
}
}
// BUG - Anger Anger Turns - end
// BUG - Draft Anger Turns - start
if (getBugOptionBOOL("CityBar__DraftAnger", true, "BUG_CITYBAR_DRAFT_ANGER") && pCity->getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
iRate = pCity->getConscriptAngerTimer();
if (iRate > 0)
{
int iPop = ((iRate - 1) / pCity->flatConscriptAngerLength() + 1) * GC.getDefineINT("CONSCRIPT_POP_ANGER");
szTempBuffer.Format(L" (%d %c %d)", iPop, gDLL->getSymbolID(CITIZEN_CHAR), iRate);
szString.append(szTempBuffer);
}
}
// BUG - Draft Anger Turns - end
// BUG - Food Assist - start
if ((iFoodDifference != 0 || !pCity->isFoodProduction()) && getBugOptionBOOL("CityBar__FoodAssist", true, "BUG_CITYBAR_FOOD_ASSIST"))
{
if (iFoodDifference > 0)
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_FOOD_GROW", iFoodDifference, pCity->getFood(), pCity->growthThreshold(), pCity->getFoodTurnsLeft()));
}
else if (iFoodDifference == 0)
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_FOOD_STAGNATE", pCity->getFood(), pCity->growthThreshold()));
}
else if (pCity->getFood() + iFoodDifference >= 0)
{
int iTurnsToStarve = pCity->getFood() / -iFoodDifference + 1;
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_FOOD_SHRINK", iFoodDifference, pCity->getFood(), pCity->growthThreshold(), iTurnsToStarve));
}
else
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_FOOD_STARVE", iFoodDifference, pCity->getFood(), pCity->growthThreshold()));
}
}
else
{
// unchanged
if (iFoodDifference <= 0)
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_GROWTH", pCity->getFood(), pCity->growthThreshold()));
}
else
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_FOOD_GROWTH", iFoodDifference, pCity->getFood(), pCity->growthThreshold(), pCity->getFoodTurnsLeft()));
}
}
// BUG - Food Assist - end
if (pCity->getProductionNeeded() != MAX_INT)
{
// BUG - Base Production - start
int iBaseProductionDiffNoFood;
if (bBaseValues)
{
iBaseProductionDiffNoFood = pCity->getBaseYieldRate(YIELD_PRODUCTION);
}
else
{
iBaseProductionDiffNoFood = pCity->getCurrentProductionDifference(true, false);
}
// BUG - Base Production - end
iProductionDiffNoFood = pCity->getCurrentProductionDifference(true, true);
iProductionDiffJustFood = (pCity->getCurrentProductionDifference(false, true) - iProductionDiffNoFood);
if (iProductionDiffJustFood > 0)
{
// BUG - Base Production - start
if ((iProductionDiffNoFood != iBaseProductionDiffNoFood) && getBugOptionBOOL("CityBar__BaseProduction", true, "BUG_CITYBAR_BASE_PRODUCTION"))
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_FOOD_HAMMER_PRODUCTION_WITH_BASE", iProductionDiffJustFood, iProductionDiffNoFood, pCity->getProductionName(), pCity->getProduction(), pCity->getProductionNeeded(), pCity->getProductionTurnsLeft(), iBaseProductionDiffNoFood));
}
else
{
// unchanged
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_FOOD_HAMMER_PRODUCTION", iProductionDiffJustFood, iProductionDiffNoFood, pCity->getProductionName(), pCity->getProduction(), pCity->getProductionNeeded(), pCity->getProductionTurnsLeft()));
}
// BUG - Base Production - end
}
else if (iProductionDiffNoFood > 0)
{
// BUG - Base Production - start
if ((iProductionDiffNoFood != iBaseProductionDiffNoFood) && getBugOptionBOOL("CityBar__BaseProduction", true, "BUG_CITYBAR_BASE_PRODUCTION"))
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_HAMMER_PRODUCTION_WITH_BASE", iProductionDiffNoFood, pCity->getProductionName(), pCity->getProduction(), pCity->getProductionNeeded(), pCity->getProductionTurnsLeft(), iBaseProductionDiffNoFood));
}
else
{
// unchanged
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_HAMMER_PRODUCTION", iProductionDiffNoFood, pCity->getProductionName(), pCity->getProduction(), pCity->getProductionNeeded(), pCity->getProductionTurnsLeft()));
}
// BUG - Base Production - end
}
else
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_PRODUCTION", pCity->getProductionName(), pCity->getProduction(), pCity->getProductionNeeded()));
}
// BUG - Building Actual Effects - start
if (pCity->getOwnerINLINE() == GC.getGame().getActivePlayer() && getBugOptionBOOL("CityBar__BuildingActualEffects", true, "BUG_CITYBAR_BUILDING_ACTUAL_EFFECTS"))
{
if (pCity->isProductionBuilding())
{
BuildingTypes eBuilding = pCity->getProductionBuilding();
CvWString szStart;
szStart.Format(NEWLINE L"<img=%S size=24></img>", GC.getBuildingInfo(eBuilding).getButton());
setBuildingActualEffects(szString, szStart, eBuilding, pCity, false);
}
}
// BUG - Building Actual Effects - end
}
// BUG - Base Production - start
else if (getBugOptionBOOL("CityBar__BaseProduction", true, "BUG_CITYBAR_BASE_PRODUCTION"))
{
int iOverflow = pCity->getOverflowProduction();
int iBaseProductionDiffNoFood;
if (bBaseValues)
{
iBaseProductionDiffNoFood = pCity->getBaseYieldRate(YIELD_PRODUCTION);
}
else
{
iBaseProductionDiffNoFood = pCity->getCurrentProductionDifference(true, false);
}
if (iOverflow > 0 || iBaseProductionDiffNoFood > 0)
{
if (iOverflow > 0)
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_BASE_PRODUCTION_WITH_OVERFLOW", iOverflow, iBaseProductionDiffNoFood));
}
else
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_BASE_PRODUCTION", iBaseProductionDiffNoFood));
}
}
}
// BUG - Base Production - end
// BUG - Hurry Assist - start
if (getBugOptionBOOL("CityBar__HurryAssist", true, "BUG_CITYBAR_HURRY_ASSIST") && pCity->getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
bool bFirstHurry = true;
for (iI = 0; iI < GC.getNumHurryInfos(); iI++)
{
if (pCity->canHurry((HurryTypes)iI))
{
if (bFirstHurry)
{
szString.append(NEWLINE);
szString.append("Hurry:");
bFirstHurry = false;
}
bFirst = true;
szString.append(L" (");
int iPopulation = pCity->hurryPopulation((HurryTypes)iI);
if (iPopulation > 0)
{
szTempBuffer.Format(L"%d %c", -iPopulation, gDLL->getSymbolID(CITIZEN_CHAR));
setListHelp(szString, NULL, szTempBuffer, L", ", bFirst);
bFirst = false;
}
int iGold = pCity->hurryGold((HurryTypes)iI);
if (iGold > 0)
{
szTempBuffer.Format(L"%d %c", -iGold, GC.getCommerceInfo(COMMERCE_GOLD).getChar());
setListHelp(szString, NULL, szTempBuffer, L", ", bFirst);
bFirst = false;
}
int iOverflowProduction = 0;
int iOverflowGold = 0;
if (pCity->hurryOverflow((HurryTypes)iI, &iOverflowProduction, &iOverflowGold, getBugOptionBOOL("CityBar__HurryAssistIncludeCurrent", false, "BUG_CITYBAR_HURRY_ASSIST_INCLUDE_CURRENT")))
{
if (iOverflowProduction > 0)
{
szTempBuffer.Format(L"%d %c", iOverflowProduction, GC.getYieldInfo(YIELD_PRODUCTION).getChar());
setListHelp(szString, NULL, szTempBuffer, L", ", bFirst);
bFirst = false;
}
if (iOverflowGold > 0)
{
szTempBuffer.Format(L"%d %c", iOverflowGold, GC.getCommerceInfo(COMMERCE_GOLD).getChar());
setListHelp(szString, NULL, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
szString.append(L")");
}
}
}
// BUG - Hurry Assist - end
// BUG - Trade Detail - start
if (getBugOptionBOOL("CityBar__TradeDetail", true, "BUG_CITYBAR_TRADE_DETAIL"))
{
int iTotalTrade = 0;
int iDomesticTrade = 0;
int iDomesticRoutes = 0;
int iForeignTrade = 0;
int iForeignRoutes = 0;
// BUG - Fractional Trade Routes - start
#ifdef _MOD_FRACTRADE
bool bFractions = true;
#else
bool bFractions = bBaseValues;
#endif
// BUG - Fractional Trade Routes - end
/*pCity->updateTradeRoutes();*/
pCity->calculateTradeTotals(YIELD_COMMERCE, iDomesticTrade, iDomesticRoutes, iForeignTrade, iForeignRoutes, NO_PLAYER, !bFractions, bBaseValues);
iTotalTrade = iDomesticTrade + iForeignTrade;
bFirst = true;
if (iTotalTrade != 0)
{
if (bFractions)
{
szTempBuffer.Format(L"%c: %d.%02d %c", gDLL->getSymbolID(TRADE_CHAR), iTotalTrade / 100, iTotalTrade % 100, GC.getYieldInfo(YIELD_COMMERCE).getChar());
}
else
{
szTempBuffer.Format(L"%c: %d %c", gDLL->getSymbolID(TRADE_CHAR), iTotalTrade, GC.getYieldInfo(YIELD_COMMERCE).getChar());
}
setListHelp(szString, NEWLINE, szTempBuffer, L", ", bFirst);
bFirst = false;
}
if (iDomesticTrade != 0)
{
if (bFractions)
{
szTempBuffer.Format(L"%c: %d.%02d %c", gDLL->getSymbolID(STAR_CHAR), iDomesticTrade / 100, iDomesticTrade % 100, GC.getYieldInfo(YIELD_COMMERCE).getChar());
}
else
{
szTempBuffer.Format(L"%c: %d %c", gDLL->getSymbolID(STAR_CHAR), iDomesticTrade, GC.getYieldInfo(YIELD_COMMERCE).getChar());
}
setListHelp(szString, NEWLINE, szTempBuffer, L", ", bFirst);
bFirst = false;
}
if (iForeignTrade != 0)
{
if (bFractions)
{
szTempBuffer.Format(L"%c: %d.%02d %c", gDLL->getSymbolID(SILVER_STAR_CHAR), iForeignTrade / 100, iForeignTrade % 100, GC.getYieldInfo(YIELD_COMMERCE).getChar());
}
else
{
szTempBuffer.Format(L"%c: %d %c", gDLL->getSymbolID(SILVER_STAR_CHAR), iForeignTrade, GC.getYieldInfo(YIELD_COMMERCE).getChar());
}
setListHelp(szString, NEWLINE, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
// BUG - Trade Detail - end
bFirst = true;
// BUG - Commerce - start
if (getBugOptionBOOL("CityBar__Commerce", true, "BUG_CITYBAR_COMMERCE"))
{
if (bBaseValues)
{
iRate = pCity->getBaseYieldRate(YIELD_COMMERCE);
}
else
{
iRate = pCity->getYieldRate(YIELD_COMMERCE);
}
if (iRate != 0)
{
szTempBuffer.Format(L"%d %c", iRate, GC.getYieldInfo(YIELD_COMMERCE).getChar());
setListHelp(szString, NEWLINE, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
// BUG - Commerce - end
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
// BUG - Base Values - start
if (bBaseValues)
{
iRate = pCity->getBaseCommerceRateTimes100((CommerceTypes)iI);
}
else
{
// unchanged
iRate = pCity->getCommerceRateTimes100((CommerceTypes)iI);
}
// BUG - Base Values - end
if (iRate != 0)
{
szTempBuffer.Format(L"%d.%02d %c", iRate/100, iRate%100, GC.getCommerceInfo((CommerceTypes)iI).getChar());
setListHelp(szString, NEWLINE, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
// BUG - Base Values - start
if (bBaseValues)
{
iRate = pCity->getBaseGreatPeopleRate();
}
else
{
// unchanged
iRate = pCity->getGreatPeopleRate();
}
// BUG - Base Values - end
if (iRate != 0)
{
szTempBuffer.Format(L"%d%c", iRate, gDLL->getSymbolID(GREAT_PEOPLE_CHAR));
setListHelp(szString, NEWLINE, szTempBuffer, L", ", bFirst);
bFirst = false;
}
if (!bFirst)
{
szString.append(gDLL->getText("TXT_KEY_PER_TURN"));
}
szString.append(NEWLINE);
szString.append(gDLL->getText("INTERFACE_CITY_MAINTENANCE"));
// BUG - Base Values - start
int iMaintenance;
if (bBaseValues)
{
iMaintenance = pCity->calculateBaseMaintenanceTimes100();
}
else
{
// unchanged
iMaintenance = pCity->getMaintenanceTimes100();
}
// BUG - Base Values - end
szString.append(CvWString::format(L" -%d.%02d %c", iMaintenance/100, iMaintenance%100, GC.getCommerceInfo(COMMERCE_GOLD).getChar()));
// BUG - Building Icons - start
// AIAndy: Changed to show only national and world wonders
if (getBugOptionBOOL("CityBar__BuildingIcons", true, "BUG_CITYBAR_BUILDING_ICONS"))
{
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingInfos(); ++iI)
{
CvBuildingInfo& kInfo = GC.getBuildingInfo((BuildingTypes)iI);
if (isWorldWonderClass((BuildingClassTypes)kInfo.getBuildingClassType()) || isNationalWonderClass((BuildingClassTypes)kInfo.getBuildingClassType()))
{
if (pCity->getNumRealBuilding((BuildingTypes)iI) > 0)
{
if (bFirst)
{
szString.append(NEWLINE);
bFirst = false;
}
szTempBuffer.Format(L"<img=%S size=24></img>", kInfo.getButton());
szString.append(szTempBuffer);
}
}
}
}
else
{
// unchanged
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingInfos(); ++iI)
{
CvBuildingInfo& kInfo = GC.getBuildingInfo((BuildingTypes)iI);
if (isWorldWonderClass((BuildingClassTypes)kInfo.getBuildingClassType()) || isNationalWonderClass((BuildingClassTypes)kInfo.getBuildingClassType()))
{
if (pCity->getNumRealBuilding((BuildingTypes)iI) > 0)
{
setListHelp(szString, NEWLINE, kInfo.getDescription(), L", ", bFirst);
bFirst = false;
}
}
}
}
// BUG - Building Icons - end
// BUG - Culture Turns - start
int iCultureRate = pCity->getCommerceRateTimes100(COMMERCE_CULTURE);
if (iCultureRate > 0 && getBugOptionBOOL("CityBar__CultureTurns", true, "BUG_CITYBAR_CULTURE_TURNS"))
{
if (pCity->getCultureLevel() != NO_CULTURELEVEL)
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_CULTURE", pCity->getCulture(pCity->getOwnerINLINE()), pCity->getCultureThreshold(), GC.getCultureLevelInfo(pCity->getCultureLevel()).getTextKeyWide()));
}
else
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_CULTURE_NO_LEVEL", pCity->getCulture(pCity->getOwnerINLINE()), pCity->getCultureThreshold()));
}
// all values are *100
int iCulture = pCity->getCultureTimes100(pCity->getOwnerINLINE());
int iCultureLeft = 100 * pCity->getCultureThreshold() - iCulture;
int iCultureTurns = (iCultureLeft + iCultureRate - 1) / iCultureRate;
szString.append(L" ");
szString.append(gDLL->getText("INTERFACE_CITY_TURNS", iCultureTurns));
}
else
{
// unchanged
if (pCity->getCultureLevel() != NO_CULTURELEVEL)
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_CULTURE", pCity->getCulture(pCity->getOwnerINLINE()), pCity->getCultureThreshold(), GC.getCultureLevelInfo(pCity->getCultureLevel()).getTextKeyWide()));
}
}
// BUG - Culture Turns - end
// BUG - Great Person Turns - start
int iGppRate = pCity->getGreatPeopleRate();
if (iGppRate > 0 && getBugOptionBOOL("CityBar__GreatPersonTurns", true, "BUG_CITYBAR_GREAT_PERSON_TURNS"))
{
int iGpp = pCity->getGreatPeopleProgress();
int iGppTotal = GET_PLAYER(pCity->getOwnerINLINE()).greatPeopleThreshold(false);
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_GREAT_PEOPLE", iGpp, iGppTotal));
int iGppLeft = iGppTotal - iGpp;
int iGppTurns = (iGppLeft + iGppRate - 1) / iGppRate;
szString.append(L" ");
szString.append(gDLL->getText("INTERFACE_CITY_TURNS", iGppTurns));
}
else
{
// unchanged
if (pCity->getGreatPeopleProgress() > 0)
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_GREAT_PEOPLE", pCity->getGreatPeopleProgress(), GET_PLAYER(pCity->getOwnerINLINE()).greatPeopleThreshold(false)));
}
}
// BUG - Great Person Turns - end
// BUG - Specialists - start
if (getBugOptionBOOL("CityBar__Specialists", true, "BUG_CITYBAR_SPECIALISTS"))
{
// regular specialists
bFirst = true;
for (int iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
int iCount = pCity->getSpecialistCount((SpecialistTypes)iI);
if (iCount > 0)
{
if (bFirst)
{
szString.append(NEWLINE);
bFirst = false;
}
CvSpecialistInfo& kSpecialistInfo = GC.getSpecialistInfo((SpecialistTypes)iI);
for (int iJ = 0; iJ < iCount; ++iJ)
{
szTempBuffer.Format(L"<img=%S size=24></img>", kSpecialistInfo.getButton());
szString.append(szTempBuffer);
}
}
}
// free specialists (ToA, GL) and settled great people
bFirst = true;
for (int iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
int iCount = pCity->getFreeSpecialistCount((SpecialistTypes)iI);
if (iCount > 0)
{
if (bFirst)
{
szString.append(NEWLINE);
bFirst = false;
}
CvSpecialistInfo& kSpecialistInfo = GC.getSpecialistInfo((SpecialistTypes)iI);
for (int iJ = 0; iJ < iCount; ++iJ)
{
szTempBuffer.Format(L"<img=%S size=24></img>", kSpecialistInfo.getButton());
szString.append(szTempBuffer);
}
}
}
}
// BUG - Specialists - end
int iNumUnits = pCity->plot()->countNumAirUnits(GC.getGameINLINE().getActiveTeam());
if (pCity->getAirUnitCapacity(GC.getGameINLINE().getActiveTeam()) > 0 && iNumUnits > 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_AIR_UNIT_CAPACITY", iNumUnits, pCity->getAirUnitCapacity(GC.getGameINLINE().getActiveTeam())));
}
// BUG - Revolt Chance - start
if (getBugOptionBOOL("CityBar__RevoltChance", true, "BUG_CITYBAR_REVOLT_CHANCE"))
{
PlayerTypes eCulturalOwner = pCity->plot()->calculateCulturalOwner();
if (eCulturalOwner != NO_PLAYER)
{
if (GET_PLAYER(eCulturalOwner).getTeam() != pCity->getTeam())
{
int iCityStrength = pCity->cultureStrength(eCulturalOwner);
int iGarrison = pCity->cultureGarrison(eCulturalOwner);
if (iCityStrength > iGarrison)
{
szTempBuffer.Format(L"%.2f", std::max(0.0f, (1.0f - (float)iGarrison / (float)iCityStrength)) * std::min(100.0f, (float)pCity->getRevoltTestProbability()));
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_MISC_CHANCE_OF_REVOLT", szTempBuffer.GetCString()));
}
}
}
}
// BUG - Revolt Chance - end
/************************************************************************************************/
/* REVOLUTIONDCM_MOD 08/09/09 Glider1 */
/* */
/* */
/************************************************************************************************/
// RevolutionDCM start - Citybar revolution info
if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_REVOLUTION))
{
szString.append(NEWLINE);
szString.append(L"<img=Art/Interface/Buttons/revbtn.dds size=23></img>");
szString.append(CvWString::format(L":%d", pCity->getRevolutionIndex()));
szString.append(NEWLINE);
}
// RevolutionDCM end
/************************************************************************************************/
/* REVOLUTIONDCM_MOD END Glider1 */
/****/
/************************************************************************************************/
/* Afforess Start 02/10/10 */
/* */
/* */
/************************************************************************************************/
if (pCity->getExtraYieldTurns() > 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_MISC_EXTRA_HAMMERS_TURNS", pCity->getExtraYieldTurns()));
}
else if (pCity->getExtraYieldTurns() < 0)
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_MISC_EXTRA_FOOD_TURNS", -pCity->getExtraYieldTurns()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
pCity->getProperties()->buildDisplayString(szString);
// BUG - Hide UI Instructions - start
if (!getBugOptionBOOL("CityBar__HideInstructions", true, "BUG_CITYBAR_HIDE_INSTRUCTIONS"))
{
if (getBugOptionBOOL("CityBar__BaseValues", true, "BUG_CITYBAR_BASE_VALUES"))
{
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_CTRL_BASE_VALUES"));
}
// unchanged
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_SELECT", pCity->getNameKey()));
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_SELECT_CTRL"));
szString.append(gDLL->getText("TXT_KEY_CITY_BAR_SELECT_ALT"));
}
// BUG - Hide UI Instructions - end
}
/************************************************************************************************/
/* Afforess Start 08/26/10 */
/* */
/* */
/************************************************************************************************/
void CvGameTextMgr::parseTraits(CvWStringBuffer &szHelpString, TraitTypes eTrait, CivilizationTypes eCivilization, bool bDawnOfMan, bool bEffectsOnly)
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
PROFILE_FUNC();
CvWString szTempBuffer;
BuildingTypes eLoopBuilding;
UnitTypes eLoopUnit;
int iLast;
int iI, iJ;
CvWString szText;
// Trait Name
szText = GC.getTraitInfo(eTrait).getDescription();
if (bDawnOfMan)
{
szTempBuffer.Format(L"%s", szText.GetCString());
}
else
{
szTempBuffer.Format(NEWLINE SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT"), szText.GetCString());
}
/************************************************************************************************/
/* Afforess Start 08/26/10 */
/* */
/* */
/************************************************************************************************/
if (!bEffectsOnly)
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szHelpString.append(szTempBuffer);
if (!bDawnOfMan)
{
if (!CvWString(GC.getTraitInfo(eTrait).getHelp()).empty())
{
szHelpString.append(GC.getTraitInfo(eTrait).getHelp());
}
// iHealth
if (GC.getTraitInfo(eTrait).getHealth() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_HEALTH", GC.getTraitInfo(eTrait).getHealth()));
}
// iHappiness
if (GC.getTraitInfo(eTrait).getHappiness() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_HAPPINESS", GC.getTraitInfo(eTrait).getHappiness()));
}
// iMaxAnarchy
if (GC.getTraitInfo(eTrait).getMaxAnarchy() != -1)
{
if (GC.getTraitInfo(eTrait).getMaxAnarchy() == 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_NO_ANARCHY"));
}
else
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_MAX_ANARCHY", GC.getTraitInfo(eTrait).getMaxAnarchy()));
}
}
// iUpkeepModifier
if (GC.getTraitInfo(eTrait).getUpkeepModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_CIVIC_UPKEEP_MODIFIER", GC.getTraitInfo(eTrait).getUpkeepModifier()));
}
// iLevelExperienceModifier
if (GC.getTraitInfo(eTrait).getLevelExperienceModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_CIVIC_LEVEL_MODIFIER", GC.getTraitInfo(eTrait).getLevelExperienceModifier()));
}
// iGreatPeopleRateModifier
if (GC.getTraitInfo(eTrait).getGreatPeopleRateModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_GREAT_PEOPLE_MODIFIER", GC.getTraitInfo(eTrait).getGreatPeopleRateModifier()));
}
// iGreatGeneralRateModifier
if (GC.getTraitInfo(eTrait).getGreatGeneralRateModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_GREAT_GENERAL_MODIFIER", GC.getTraitInfo(eTrait).getGreatGeneralRateModifier()));
}
if (GC.getTraitInfo(eTrait).getDomesticGreatGeneralRateModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_DOMESTIC_GREAT_GENERAL_MODIFIER", GC.getTraitInfo(eTrait).getDomesticGreatGeneralRateModifier()));
}
// Wonder Production Effects
if ((GC.getTraitInfo(eTrait).getMaxGlobalBuildingProductionModifier() != 0)
|| (GC.getTraitInfo(eTrait).getMaxTeamBuildingProductionModifier() != 0)
|| (GC.getTraitInfo(eTrait).getMaxPlayerBuildingProductionModifier() != 0))
{
if ((GC.getTraitInfo(eTrait).getMaxGlobalBuildingProductionModifier() == GC.getTraitInfo(eTrait).getMaxTeamBuildingProductionModifier())
&& (GC.getTraitInfo(eTrait).getMaxGlobalBuildingProductionModifier() == GC.getTraitInfo(eTrait).getMaxPlayerBuildingProductionModifier()))
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_WONDER_PRODUCTION_MODIFIER", GC.getTraitInfo(eTrait).getMaxGlobalBuildingProductionModifier()));
}
else
{
if (GC.getTraitInfo(eTrait).getMaxGlobalBuildingProductionModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_WORLD_WONDER_PRODUCTION_MODIFIER", GC.getTraitInfo(eTrait).getMaxGlobalBuildingProductionModifier()));
}
if (GC.getTraitInfo(eTrait).getMaxTeamBuildingProductionModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_TEAM_WONDER_PRODUCTION_MODIFIER", GC.getTraitInfo(eTrait).getMaxTeamBuildingProductionModifier()));
}
if (GC.getTraitInfo(eTrait).getMaxPlayerBuildingProductionModifier() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_NATIONAL_WONDER_PRODUCTION_MODIFIER", GC.getTraitInfo(eTrait).getMaxPlayerBuildingProductionModifier()));
}
}
}
/************************************************************************************************/
/* REVDCM 02/16/10 phungus420 */
/* */
/* RevTrait Effects */
/************************************************************************************************/
if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_REVOLUTION))
{
if (GC.getTraitInfo(eTrait).getRevIdxLocal() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_REVIDX_LOCAL", GC.getTraitInfo(eTrait).getRevIdxLocal()));
}
if (GC.getTraitInfo(eTrait).getRevIdxNational() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_REVIDX_NATIONAL", GC.getTraitInfo(eTrait).getRevIdxNational()));
}
if (GC.getTraitInfo(eTrait).getRevIdxDistanceModifier() < 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_DISTANCE_MOD", GC.getTraitInfo(eTrait).getRevIdxDistanceModifier()));
}
if (GC.getTraitInfo(eTrait).getRevIdxHolyCityGood() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_REV_GOOD_HOLY_CITY", GC.getTraitInfo(eTrait).getRevIdxHolyCityGood()));
}
if (GC.getTraitInfo(eTrait).getRevIdxHolyCityBad() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_REV_BAD_HOLY_CITY", GC.getTraitInfo(eTrait).getRevIdxHolyCityBad()));
}
if (GC.getTraitInfo(eTrait).getRevIdxNationalityMod() != 0)
{
CvWString szTempBuffer;
szTempBuffer.Format(L"%.0f", 100 * GC.getTraitInfo(eTrait).getRevIdxNationalityMod() );
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_REV_NATIONALITY_MOD", szTempBuffer.GetCString()));
}
if (GC.getTraitInfo(eTrait).getRevIdxBadReligionMod() != 0)
{
CvWString szTempBuffer;
szTempBuffer.Format(L"%.0f", 100 * GC.getTraitInfo(eTrait).getRevIdxBadReligionMod() );
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_BAD_RELIGION_MOD", szTempBuffer.GetCString()));
}
if (GC.getTraitInfo(eTrait).getRevIdxGoodReligionMod() != 0)
{
CvWString szTempBuffer;
szTempBuffer.Format(L"%.0f", 100 * GC.getTraitInfo(eTrait).getRevIdxGoodReligionMod() );
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_GOOD_RELIGION_MOD", szTempBuffer.GetCString()));
}
}
if (GC.getTraitInfo(eTrait).isNonStateReligionCommerce() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_NONSTATE_RELIGIOUS_COMMERCE"));
}
if (GC.getTraitInfo(eTrait).isUpgradeAnywhere() != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_CAN_UPGRADE_ANYWHERE"));
}
/************************************************************************************************/
/* REVDCM END */
/************************************************************************************************/
// ExtraYieldThresholds
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
if (GC.getTraitInfo(eTrait).getExtraYieldThreshold(iI) > 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_EXTRA_YIELD_THRESHOLDS", GC.getYieldInfo((YieldTypes) iI).getChar(), GC.getTraitInfo(eTrait).getExtraYieldThreshold(iI), GC.getYieldInfo((YieldTypes) iI).getChar()));
}
// Trade Yield Modifiers
if (GC.getTraitInfo(eTrait).getTradeYieldModifier(iI) != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_TRADE_YIELD_MODIFIERS", GC.getTraitInfo(eTrait).getTradeYieldModifier(iI), GC.getYieldInfo((YieldTypes) iI).getChar(), "YIELD"));
}
}
// CommerceChanges
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
if (GC.getTraitInfo(eTrait).getCommerceChange(iI) != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_COMMERCE_CHANGES", GC.getTraitInfo(eTrait).getCommerceChange(iI), GC.getCommerceInfo((CommerceTypes) iI).getChar(), "COMMERCE"));
}
if (GC.getTraitInfo(eTrait).getCommerceModifier(iI) != 0)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_COMMERCE_MODIFIERS", GC.getTraitInfo(eTrait).getCommerceModifier(iI), GC.getCommerceInfo((CommerceTypes) iI).getChar(), "COMMERCE"));
}
}
/************************************************************************************************/
/* Afforess Start 08/26/10 */
/* */
/* */
/************************************************************************************************/
CvWString szFirstBuffer;
CvWString szImprovement;
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
iLast = 0;
for (int iJ = 0; iJ < GC.getNumImprovementInfos(); iJ++)
{
if (GC.getImprovementInfo((ImprovementTypes)iJ).getTraitYieldChanges(eTrait, iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_YIELD_CHANGE", GC.getImprovementInfo((ImprovementTypes)iJ).getTraitYieldChanges(eTrait, iI), GC.getYieldInfo((YieldTypes)iI).getChar()).c_str());
szImprovement.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iJ).getDescription());
setListHelp(szHelpString, szFirstBuffer.GetCString(), szImprovement.GetCString(), L", ", (GC.getImprovementInfo((ImprovementTypes)iJ).getTraitYieldChanges(eTrait, iI) != iLast));
iLast = GC.getImprovementInfo((ImprovementTypes)iJ).getTraitYieldChanges(eTrait, iI);
}
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (GC.getTraitInfo(eTrait).getBonusHappinessChanges(iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_HEALTH_HAPPINESS_CHANGE", abs(GC.getTraitInfo(eTrait).getBonusHappinessChanges(iI)), ((GC.getTraitInfo(eTrait).getBonusHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBonusInfo((BonusTypes)iI).getDescription());
setListHelp(szHelpString, szFirstBuffer, szTempBuffer, L", ", (GC.getTraitInfo(eTrait).getBonusHappinessChanges(iI) != iLast));
iLast = GC.getTraitInfo(eTrait).getBonusHappinessChanges(iI);
}
}
for (iI = 0; iI < GC.getNumPromotionInfos(); ++iI)
{
for (iJ = 0; iJ < GC.getNumUnitCombatInfos(); iJ++)
{
if (GC.getTraitInfo(eTrait).isFreePromotionUnitCombats(iI, iJ))
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_TRAIT_FREE_PROMOTION_UNITCOMBAT", GC.getPromotionInfo((PromotionTypes)iI).getDescription()).c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iJ).getDescription());
setListHelp(szHelpString, szFirstBuffer, szTempBuffer, L", ", iI != iLast);
iLast = iI;
}
}
}
/*
// Free Promotions
bool bFoundPromotion = false;
szTempBuffer.clear();
for (iI = 0; iI < GC.getNumPromotionInfos(); ++iI)
{
if (GC.getTraitInfo(eTrait).isFreePromotion(iI))
{
if (bFoundPromotion)
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getPromotionInfo((PromotionTypes) iI).getDescription());
bFoundPromotion = true;
}
}
if (bFoundPromotion)
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_FREE_PROMOTIONS", szTempBuffer.GetCString()));
for (iJ = 0; iJ < GC.getNumUnitCombatInfos(); iJ++)
{
if (GC.getTraitInfo(eTrait).isFreePromotionUnitCombat(iJ))
{
szTempBuffer.Format(L"\n %c<link=literal>%s</link>", gDLL->getSymbolID(BULLET_CHAR), GC.getUnitCombatInfo((UnitCombatTypes)iJ).getDescription());
szHelpString.append(szTempBuffer);
}
}
}
*/
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// No Civic Maintenance
for (iI = 0; iI < GC.getNumCivicOptionInfos(); ++iI)
{
if (GC.getCivicOptionInfo((CivicOptionTypes) iI).getTraitNoUpkeep(eTrait))
{
szHelpString.append(gDLL->getText("TXT_KEY_TRAIT_NO_UPKEEP", GC.getCivicOptionInfo((CivicOptionTypes)iI).getTextKeyWide()));
}
}
// Increase Building/Unit Production Speeds
iLast = 0;
for (iI = 0; iI < GC.getNumSpecialUnitInfos(); ++iI)
{
if (GC.getSpecialUnitInfo((SpecialUnitTypes) iI).getProductionTraits(eTrait) != 0)
{
if (GC.getSpecialUnitInfo((SpecialUnitTypes) iI).getProductionTraits(eTrait) == 100)
{
szText = gDLL->getText("TXT_KEY_TRAIT_DOUBLE_SPEED");
}
else
{
szText = gDLL->getText("TXT_KEY_TRAIT_PRODUCTION_MODIFIER", GC.getSpecialUnitInfo((SpecialUnitTypes) iI).getProductionTraits(eTrait));
}
setListHelp(szHelpString, szText.GetCString(), GC.getSpecialUnitInfo((SpecialUnitTypes) iI).getDescription(), L", ", (GC.getSpecialUnitInfo((SpecialUnitTypes) iI).getProductionTraits(eTrait) != iLast));
iLast = GC.getSpecialUnitInfo((SpecialUnitTypes) iI).getProductionTraits(eTrait);
}
}
// Unit Classes
iLast = 0;
for (iI = 0; iI < GC.getNumUnitClassInfos();++iI)
{
if (eCivilization == NO_CIVILIZATION)
{
eLoopUnit = ((UnitTypes)(GC.getUnitClassInfo((UnitClassTypes)iI).getDefaultUnitIndex()));
}
else
{
eLoopUnit = ((UnitTypes)(GC.getCivilizationInfo(eCivilization).getCivilizationUnits(iI)));
}
if (eLoopUnit != NO_UNIT && !isWorldUnitClass((UnitClassTypes)iI))
{
if (GC.getUnitInfo(eLoopUnit).getProductionTraits(eTrait) != 0)
{
if (GC.getUnitInfo(eLoopUnit).getProductionTraits(eTrait) == 100)
{
szText = gDLL->getText("TXT_KEY_TRAIT_DOUBLE_SPEED");
}
else
{
szText = gDLL->getText("TXT_KEY_TRAIT_PRODUCTION_MODIFIER", GC.getUnitInfo(eLoopUnit).getProductionTraits(eTrait));
}
CvWString szUnit;
szUnit.Format(L"<link=literal>%s</link>", GC.getUnitInfo(eLoopUnit).getDescription());
setListHelp(szHelpString, szText.GetCString(), szUnit, L", ", (GC.getUnitInfo(eLoopUnit).getProductionTraits(eTrait) != iLast));
iLast = GC.getUnitInfo(eLoopUnit).getProductionTraits(eTrait);
}
}
}
// SpecialBuildings
iLast = 0;
for (iI = 0; iI < GC.getNumSpecialBuildingInfos(); ++iI)
{
if (GC.getSpecialBuildingInfo((SpecialBuildingTypes) iI).getProductionTraits(eTrait) != 0)
{
if (GC.getSpecialBuildingInfo((SpecialBuildingTypes) iI).getProductionTraits(eTrait) == 100)
{
szText = gDLL->getText("TXT_KEY_TRAIT_DOUBLE_SPEED");
}
else
{
szText = gDLL->getText("TXT_KEY_TRAIT_PRODUCTION_MODIFIER", GC.getSpecialBuildingInfo((SpecialBuildingTypes) iI).getProductionTraits(eTrait));
}
setListHelp(szHelpString, szText.GetCString(), GC.getSpecialBuildingInfo((SpecialBuildingTypes) iI).getDescription(), L", ", (GC.getSpecialBuildingInfo((SpecialBuildingTypes) iI).getProductionTraits(eTrait) != iLast));
iLast = GC.getSpecialBuildingInfo((SpecialBuildingTypes) iI).getProductionTraits(eTrait);
}
}
// Buildings
iLast = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (eCivilization == NO_CIVILIZATION)
{
eLoopBuilding = ((BuildingTypes)(GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex()));
}
else
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(eCivilization).getCivilizationBuildings(iI)));
}
if (eLoopBuilding != NO_BUILDING && !isWorldWonderClass((BuildingClassTypes)iI))
{
if (GC.getBuildingInfo(eLoopBuilding).getProductionTraits(eTrait) != 0)
{
if (GC.getBuildingInfo(eLoopBuilding).getProductionTraits(eTrait) == 100)
{
szText = gDLL->getText("TXT_KEY_TRAIT_DOUBLE_SPEED");
}
else
{
szText = gDLL->getText("TXT_KEY_TRAIT_PRODUCTION_MODIFIER", GC.getBuildingInfo(eLoopBuilding).getProductionTraits(eTrait));
}
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szHelpString, szText.GetCString(), szBuilding, L", ", (GC.getBuildingInfo(eLoopBuilding).getProductionTraits(eTrait) != iLast));
iLast = GC.getBuildingInfo(eLoopBuilding).getProductionTraits(eTrait);
}
}
}
// Buildings
iLast = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (eCivilization == NO_CIVILIZATION)
{
eLoopBuilding = ((BuildingTypes)(GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex()));
}
else
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(eCivilization).getCivilizationBuildings(iI)));
}
if (eLoopBuilding != NO_BUILDING && !isWorldWonderClass((BuildingClassTypes)iI))
{
int iHappiness = GC.getBuildingInfo(eLoopBuilding).getHappinessTraits(eTrait);
if (iHappiness != 0)
{
if (iHappiness > 0)
{
szText = gDLL->getText("TXT_KEY_TRAIT_BUILDING_HAPPINESS", iHappiness, gDLL->getSymbolID(HAPPY_CHAR));
}
else
{
szText = gDLL->getText("TXT_KEY_TRAIT_BUILDING_HAPPINESS", -iHappiness, gDLL->getSymbolID(UNHAPPY_CHAR));
}
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szHelpString, szText.GetCString(), szBuilding, L", ", (iHappiness != iLast));
iLast = iHappiness;
}
}
}
}
// return szHelpString;
}
//
// parseLeaderTraits - SimpleCivPicker // LOCALIZATION READY
//
void CvGameTextMgr::parseLeaderTraits(CvWStringBuffer &szHelpString, LeaderHeadTypes eLeader, CivilizationTypes eCivilization, bool bDawnOfMan, bool bCivilopediaText)
{
PROFILE_FUNC();
CvWString szTempBuffer; // Formatting
int iI;
// Build help string
if (eLeader != NO_LEADER)
{
if (!bDawnOfMan && !bCivilopediaText)
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getLeaderHeadInfo(eLeader).getDescription());
szHelpString.append(szTempBuffer);
}
FAssert((GC.getNumTraitInfos() > 0) &&
"GC.getNumTraitInfos() is less than or equal to zero but is expected to be larger than zero in CvSimpleCivPicker::setLeaderText");
bool bFirst = true;
for (iI = 0; iI < GC.getNumTraitInfos(); ++iI)
{
if (GC.getLeaderHeadInfo(eLeader).hasTrait(iI))
{
if (!bFirst)
{
if (bDawnOfMan)
{
szHelpString.append(L", ");
}
}
else
{
bFirst = false;
}
parseTraits(szHelpString, ((TraitTypes)iI), eCivilization, bDawnOfMan);
}
}
}
else
{
// Random leader
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), gDLL->getText("TXT_KEY_TRAIT_PLAYER_UNKNOWN").c_str());
szHelpString.append(szTempBuffer);
}
// return szHelpString;
}
//
// parseLeaderTraits - SimpleCivPicker // LOCALIZATION READY
//
void CvGameTextMgr::parseLeaderShortTraits(CvWStringBuffer &szHelpString, LeaderHeadTypes eLeader)
{
PROFILE_FUNC();
int iI;
// Build help string
if (eLeader != NO_LEADER)
{
FAssert((GC.getNumTraitInfos() > 0) &&
"GC.getNumTraitInfos() is less than or equal to zero but is expected to be larger than zero in CvSimpleCivPicker::setLeaderText");
bool bFirst = true;
for (iI = 0; iI < GC.getNumTraitInfos(); ++iI)
{
if (GC.getLeaderHeadInfo(eLeader).hasTrait(iI))
{
if (!bFirst)
{
szHelpString.append(L"/");
}
szHelpString.append(gDLL->getText(GC.getTraitInfo((TraitTypes)iI).getShortDescription()));
bFirst = false;
}
}
}
else
{
// Random leader
szHelpString.append(CvWString("???/???"));
}
// return szHelpString;
}
//
// Build Civilization Info Help Text
//
void CvGameTextMgr::parseCivInfos(CvWStringBuffer &szInfoText, CivilizationTypes eCivilization, bool bDawnOfMan, bool bLinks)
{
PROFILE_FUNC();
CvWString szBuffer;
CvWString szTempString;
CvWString szText;
UnitTypes eDefaultUnit;
UnitTypes eUniqueUnit;
BuildingTypes eDefaultBuilding;
BuildingTypes eUniqueBuilding;
if (eCivilization != NO_CIVILIZATION)
{
if (!bDawnOfMan)
{
// Civ Name
szBuffer.Format(SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getCivilizationInfo(eCivilization).getDescription());
szInfoText.append(szBuffer);
// Free Techs
szBuffer.Format(NEWLINE SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT"), gDLL->getText("TXT_KEY_FREE_TECHS").GetCString());
szInfoText.append(szBuffer);
bool bFound = false;
for (int iI = 0; iI < GC.getNumTechInfos(); ++iI)
{
if (GC.getCivilizationInfo(eCivilization).isCivilizationFreeTechs(iI))
{
bFound = true;
// Add Tech
szText.Format((bLinks ? L"<link=literal>%s</link>" : L"%s"), GC.getTechInfo((TechTypes)iI).getDescription());
szBuffer.Format(L"%s %c%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), szText.GetCString());
szInfoText.append(szBuffer);
}
}
if (!bFound)
{
szBuffer.Format(L"%s %s", NEWLINE, gDLL->getText("TXT_KEY_FREE_TECHS_NO").GetCString());
szInfoText.append(szBuffer);
}
}
// Free Units
szText = gDLL->getText("TXT_KEY_FREE_UNITS");
if (bDawnOfMan)
{
szTempString.Format(L"%s: ", szText.GetCString());
}
else
{
szTempString.Format(NEWLINE SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT"), szText.GetCString());
}
szInfoText.append(szTempString);
bool bFound = false;
for (int iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
eDefaultUnit = ((UnitTypes)(GC.getCivilizationInfo(eCivilization).getCivilizationUnits(iI)));
eUniqueUnit = ((UnitTypes)(GC.getUnitClassInfo((UnitClassTypes) iI).getDefaultUnitIndex()));
if ((eDefaultUnit != NO_UNIT) && (eUniqueUnit != NO_UNIT))
{
if (eDefaultUnit != eUniqueUnit)
{
// Add Unit
if (bDawnOfMan)
{
if (bFound)
{
szInfoText.append(L", ");
}
szBuffer.Format((bLinks ? L"<link=literal>%s</link> - (<link=literal>%s</link>)" : L"%s - (%s)"),
GC.getUnitInfo(eDefaultUnit).getDescription(),
GC.getUnitInfo(eUniqueUnit).getDescription());
}
else
{
szBuffer.Format(L"\n %c%s - (%s)", gDLL->getSymbolID(BULLET_CHAR),
GC.getUnitInfo(eDefaultUnit).getDescription(),
GC.getUnitInfo(eUniqueUnit).getDescription());
}
szInfoText.append(szBuffer);
bFound = true;
}
}
}
if (!bFound)
{
szText = gDLL->getText("TXT_KEY_FREE_UNITS_NO");
if (bDawnOfMan)
{
szTempString.Format(L"%s", szText.GetCString());
}
else
{
szTempString.Format(L"%s %s", NEWLINE, szText.GetCString());
}
szInfoText.append(szTempString);
bFound = true;
}
// Free Buildings
szText = gDLL->getText("TXT_KEY_UNIQUE_BUILDINGS");
if (bDawnOfMan)
{
if (bFound)
{
szInfoText.append(NEWLINE);
}
szTempString.Format(L"%s: ", szText.GetCString());
}
else
{
szTempString.Format(NEWLINE SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_ALT_HIGHLIGHT_TEXT"), szText.GetCString());
}
szInfoText.append(szTempString);
bFound = false;
for (int iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
eDefaultBuilding = ((BuildingTypes)(GC.getCivilizationInfo(eCivilization).getCivilizationBuildings(iI)));
eUniqueBuilding = ((BuildingTypes)(GC.getBuildingClassInfo((BuildingClassTypes) iI).getDefaultBuildingIndex()));
if ((eDefaultBuilding != NO_BUILDING) && (eUniqueBuilding != NO_BUILDING))
{
if (eDefaultBuilding != eUniqueBuilding)
{
// Add Building
if (bDawnOfMan)
{
if (bFound)
{
szInfoText.append(L", ");
}
szBuffer.Format((bLinks ? L"<link=literal>%s</link> - (<link=literal>%s</link>)" : L"%s - (%s)"),
GC.getBuildingInfo(eDefaultBuilding).getDescription(),
GC.getBuildingInfo(eUniqueBuilding).getDescription());
}
else
{
szBuffer.Format(L"\n %c%s - (%s)", gDLL->getSymbolID(BULLET_CHAR),
GC.getBuildingInfo(eDefaultBuilding).getDescription(),
GC.getBuildingInfo(eUniqueBuilding).getDescription());
}
szInfoText.append(szBuffer);
bFound = true;
}
}
}
if (!bFound)
{
szText = gDLL->getText("TXT_KEY_UNIQUE_BUILDINGS_NO");
if (bDawnOfMan)
{
szTempString.Format(L"%s", szText.GetCString());
}
else
{
szTempString.Format(L"%s %s", NEWLINE, szText.GetCString());
}
szInfoText.append(szTempString);
}
}
else
{
// This is a random civ, let us know here...
szInfoText.append(gDLL->getText("TXT_KEY_CIV_UNKNOWN"));
}
// return szInfoText;
}
// BUG - Specialist Actual Effects - start
void CvGameTextMgr::parseSpecialistHelp(CvWStringBuffer &szHelpString, SpecialistTypes eSpecialist, CvCity* pCity, bool bCivilopediaText)
{
parseSpecialistHelpActual(szHelpString, eSpecialist, pCity, bCivilopediaText, 0);
}
void CvGameTextMgr::parseSpecialistHelpActual(CvWStringBuffer &szHelpString, SpecialistTypes eSpecialist, CvCity* pCity, bool bCivilopediaText, int iChange)
// BUG - Specialist Actual Effects - end
{
PROFILE_FUNC();
CvWString szText;
int aiYields[NUM_YIELD_TYPES];
int aiCommerces[NUM_COMMERCE_TYPES];
int iI;
if (eSpecialist != NO_SPECIALIST)
{
if (!bCivilopediaText)
{
szHelpString.append(GC.getSpecialistInfo(eSpecialist).getDescription());
}
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
if (GC.getGameINLINE().getActivePlayer() == NO_PLAYER)
{
aiYields[iI] = GC.getSpecialistInfo(eSpecialist).getYieldChange(iI);
}
else
{
aiYields[iI] = GET_PLAYER((pCity != NULL) ? pCity->getOwnerINLINE() : GC.getGameINLINE().getActivePlayer()).specialistYield(eSpecialist, ((YieldTypes)iI));
}
}
setYieldChangeHelp(szHelpString, L"", L"", L"", aiYields);
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
if (GC.getGameINLINE().getActivePlayer() == NO_PLAYER)
{
aiCommerces[iI] = GC.getSpecialistInfo(eSpecialist).getCommerceChange(iI);
}
else
{
aiCommerces[iI] = GET_PLAYER((pCity != NULL) ? pCity->getOwnerINLINE() : GC.getGameINLINE().getActivePlayer()).specialistCommerce(((SpecialistTypes)eSpecialist), ((CommerceTypes)iI));
}
}
setCommerceChangeHelp(szHelpString, L"", L"", L"", aiCommerces);
if (GC.getSpecialistInfo(eSpecialist).getExperience() > 0)
{
szHelpString.append(NEWLINE);
szHelpString.append(gDLL->getText("TXT_KEY_SPECIALIST_EXPERIENCE", GC.getSpecialistInfo(eSpecialist).getExperience()));
}
if (GC.getSpecialistInfo(eSpecialist).getGreatPeopleRateChange() != 0)
{
szHelpString.append(NEWLINE);
szHelpString.append(gDLL->getText("TXT_KEY_SPECIALIST_BIRTH_RATE", GC.getSpecialistInfo(eSpecialist).getGreatPeopleRateChange()));
}
/************************************************************************************************/
/* Specialists Enhancements, by Supercheese 10/9/09 */
/* */
/* */
/************************************************************************************************/
CvWString szTempBuffer;
CvWString szFirstBuffer;
if (GC.getSpecialistInfo(eSpecialist).getHealthPercent() != 0)
{
float fValue = (float)abs(GC.getSpecialistInfo(eSpecialist).getHealthPercent());
if (fmod(fValue,100) == 0)
{
szTempBuffer.Format(L"%.0f", fValue/100);
}
else if (fmod(fValue,10) == 0)
{
szTempBuffer.Format(L"%.1f", fValue/100);
}
else
{
szTempBuffer.Format(L"%.2f", fValue/100);
}
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_SPECIALIST_PERCENT", szTempBuffer.GetCString(), (GC.getSpecialistInfo(eSpecialist).getHealthPercent() > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR))).c_str());
szHelpString.append(szFirstBuffer);
}
if (GC.getSpecialistInfo(eSpecialist).getHappinessPercent() != 0)
{
float fValue = (float)abs(GC.getSpecialistInfo(eSpecialist).getHappinessPercent());
if (fmod(fValue,100) == 0)
{
szTempBuffer.Format(L"%.0f", fValue/100);
}
else if (fmod(fValue,10) == 0)
{
szTempBuffer.Format(L"%.1f", fValue/100);
}
else
{
szTempBuffer.Format(L"%.2f", fValue/100);
}
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_SPECIALIST_PERCENT", szTempBuffer.GetCString(), (GC.getSpecialistInfo(eSpecialist).getHappinessPercent() > 0 ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
szHelpString.append(szFirstBuffer);
}
/************************************************************************************************/
/* Specialists Enhancements END */
/************************************************************************************************/
// BUG - Specialist Actual Effects - start
if (iChange != 0 && NULL != pCity && pCity->getOwnerINLINE() == GC.getGame().getActivePlayer() && getBugOptionBOOL("MiscHover__SpecialistActualEffects", true, "BUG_MISC_SPECIALIST_HOVER_ACTUAL_EFFECTS"))
{
bool bStarted = false;
CvWString szStart = gDLL->getText("TXT_KEY_ACTUAL_EFFECTS");
// Yield
int aiYields[NUM_YIELD_TYPES];
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = pCity->getAdditionalYieldBySpecialist((YieldTypes)iI, eSpecialist, iChange);
}
bStarted = setResumableYieldChangeHelp(szHelpString, szStart, L": ", L"", aiYields, false, true, bStarted);
// Commerce
int aiCommerces[NUM_COMMERCE_TYPES];
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
aiCommerces[iI] = pCity->getAdditionalCommerceTimes100BySpecialist((CommerceTypes)iI, eSpecialist, iChange);
}
bStarted = setResumableCommerceTimes100ChangeHelp(szHelpString, szStart, L": ", L"", aiCommerces, true, bStarted);
// Great People
int iGreatPeopleRate = pCity->getAdditionalGreatPeopleRateBySpecialist(eSpecialist, iChange);
bStarted = setResumableValueChangeHelp(szHelpString, szStart, L": ", L"", iGreatPeopleRate, gDLL->getSymbolID(GREAT_PEOPLE_CHAR), false, true, bStarted);
}
// BUG - Specialist Actual Effects - end
GC.getSpecialistInfo(eSpecialist).getPropertyManipulators()->buildDisplayString(szHelpString);
if (!CvWString(GC.getSpecialistInfo(eSpecialist).getHelp()).empty() && !bCivilopediaText)
{
szHelpString.append(NEWLINE);
szHelpString.append(GC.getSpecialistInfo(eSpecialist).getHelp());
}
}
}
void CvGameTextMgr::parseFreeSpecialistHelp(CvWStringBuffer &szHelpString, const CvCity& kCity)
{
PROFILE_FUNC();
for (int iLoopSpecialist = 0; iLoopSpecialist < GC.getNumSpecialistInfos(); iLoopSpecialist++)
{
SpecialistTypes eSpecialist = (SpecialistTypes)iLoopSpecialist;
int iNumSpecialists = kCity.getFreeSpecialistCount(eSpecialist);
if (iNumSpecialists > 0)
{
int aiYields[NUM_YIELD_TYPES];
int aiCommerces[NUM_COMMERCE_TYPES];
int iI;
szHelpString.append(NEWLINE);
szHelpString.append(CvWString::format(L"%s (%d): ", GC.getSpecialistInfo(eSpecialist).getDescription(), iNumSpecialists));
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = iNumSpecialists * GET_PLAYER(kCity.getOwnerINLINE()).specialistYield(eSpecialist, ((YieldTypes)iI));
}
CvWStringBuffer szYield;
setYieldChangeHelp(szYield, L"", L"", L"", aiYields, false, false);
szHelpString.append(szYield);
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
aiCommerces[iI] = iNumSpecialists * GET_PLAYER(kCity.getOwnerINLINE()).specialistCommerce(eSpecialist, ((CommerceTypes)iI));
}
CvWStringBuffer szCommerceString;
setCommerceChangeHelp(szCommerceString, L"", L"", L"", aiCommerces, false, false);
if (!szYield.isEmpty() && !szCommerceString.isEmpty())
{
szHelpString.append(L", ");
}
szHelpString.append(szCommerceString);
if (GC.getSpecialistInfo(eSpecialist).getExperience() > 0)
{
if (!szYield.isEmpty() || !szCommerceString.isEmpty())
{
szHelpString.append(L", ");
}
szHelpString.append(gDLL->getText("TXT_KEY_SPECIALIST_EXPERIENCE_SHORT", iNumSpecialists * GC.getSpecialistInfo(eSpecialist).getExperience()));
}
}
}
}
//
// Promotion Help
//
void CvGameTextMgr::parsePromotionHelp(CvWStringBuffer &szBuffer, PromotionTypes ePromotion, const wchar* pcNewline)
{
PROFILE_FUNC();
CvWString szText, szText2;
int iI;
if (NO_PROMOTION == ePromotion)
{
return;
}
if (GC.getPromotionInfo(ePromotion).isBlitz())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_BLITZ_TEXT"));
}
if (GC.getPromotionInfo(ePromotion).isAmphib())
{
//TSHEEP Display Spy Messages Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_RADIATION_TEXT_SPY"));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_AMPHIB_TEXT"));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_AMPHIB_TEXT"));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).isRiver())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_RIVER_ATTACK_TEXT"));
}
if (GC.getPromotionInfo(ePromotion).isEnemyRoute())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_ENEMY_ROADS_TEXT"));
}
if (GC.getPromotionInfo(ePromotion).isAlwaysHeal())
{
//TSHEEP Display Spy Messages Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_LOYALTY_TEXT_SPY"));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_ALWAYS_HEAL_TEXT"));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_ALWAYS_HEAL_TEXT"));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).isHillsDoubleMove())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HILLS_MOVE_TEXT"));
}
/************************************************************************************************/
/* Afforess Start 02/27/10 */
/* */
/* */
/************************************************************************************************/
CvPromotionInfo &kPromotion = GC.getPromotionInfo(ePromotion);
if (kPromotion.isCanMovePeaks())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_CAN_MOVE_PEAKS_TEXT"));
}
// Koshling - enhanced mountaineering mode to differentiate between ability to move through
// mountains, and ability to lead a stack through mountains
if (kPromotion.isCanLeadThroughPeaks())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_CAN_LEAD_THROUGH_PEAKS_TEXT"));
}
if (kPromotion.getControlPoints() != 0) //Control
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_CONTROL_POINTS_TEXT", kPromotion.getControlPoints()));
}
if (kPromotion.getCommandRange() != 0) //Command Range
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_COMMAND_RANGE_TEXT", kPromotion.getCommandRange()));
}
if (kPromotion.isOnslaught()) //Onslaught
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_ONSLAUGHT_TEXT"));
}
if (GC.getGameINLINE().isModderGameOption(MODDERGAMEOPTION_TERRAIN_DAMAGE))
{
if (kPromotion.getIgnoreTerrainDamage() != NO_TERRAIN)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_IGNORE_TERRAIN_DAMAGE", GC.getTerrainInfo((TerrainTypes)kPromotion.getIgnoreTerrainDamage()).getDescription()));
}
}
if (kPromotion.isZoneOfControl())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ZONE_OF_CONTROL"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (GC.getPromotionInfo(ePromotion).isImmuneToFirstStrikes())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_IMMUNE_FIRST_STRIKES_TEXT"));
}
for (iI = 0; iI < GC.getNumTerrainInfos(); ++iI)
{
if (GC.getPromotionInfo(ePromotion).getTerrainDoubleMove(iI))
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_DOUBLE_MOVE_TEXT", GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < GC.getNumFeatureInfos(); ++iI)
{
if (GC.getPromotionInfo(ePromotion).getFeatureDoubleMove(iI))
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_DOUBLE_MOVE_TEXT", GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
}
if (GC.getPromotionInfo(ePromotion).getVisibilityChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_VISIBILITY_TEXT", GC.getPromotionInfo(ePromotion).getVisibilityChange()));
}
if (GC.getPromotionInfo(ePromotion).getMovesChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_MOVE_TEXT", GC.getPromotionInfo(ePromotion).getMovesChange()));
}
if (GC.getPromotionInfo(ePromotion).getMoveDiscountChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_MOVE_DISCOUNT_TEXT", -(GC.getPromotionInfo(ePromotion).getMoveDiscountChange())));
}
if (GC.getPromotionInfo(ePromotion).getAirRangeChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_AIR_RANGE_TEXT", GC.getPromotionInfo(ePromotion).getAirRangeChange()));
}
if (GC.getPromotionInfo(ePromotion).getInterceptChange() != 0)
{
//TSHEEP Display Spy Promotions Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_INTERCEPT_TEXT_SPY", GC.getPromotionInfo(ePromotion).getInterceptChange()));
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_INTERCEPT_TEXT_SPY_COUNTER", GC.getPromotionInfo(ePromotion).getInterceptChange() * 5));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_INTERCEPT_TEXT", GC.getPromotionInfo(ePromotion).getInterceptChange()));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_INTERCEPT_TEXT", GC.getPromotionInfo(ePromotion).getInterceptChange()));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).getEvasionChange() != 0)
{
//TSHEEP Display Spy Promotions Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_EVASION_TEXT_SPY", GC.getPromotionInfo(ePromotion).getEvasionChange()));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_EVASION_TEXT", GC.getPromotionInfo(ePromotion).getEvasionChange()));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_EVASION_TEXT", GC.getPromotionInfo(ePromotion).getEvasionChange()));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).getWithdrawalChange() != 0)
{
//TSHEEP Display Spy Promotions Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_ESCAPE_TEXT_SPY", GC.getPromotionInfo(ePromotion).getWithdrawalChange()));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_WITHDRAWAL_TEXT", GC.getPromotionInfo(ePromotion).getWithdrawalChange()));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_WITHDRAWAL_TEXT", GC.getPromotionInfo(ePromotion).getWithdrawalChange()));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).getCargoChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_CARGO_TEXT", GC.getPromotionInfo(ePromotion).getCargoChange()));
}
if (GC.getPromotionInfo(ePromotion).getCollateralDamageChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_COLLATERAL_DAMAGE_TEXT", GC.getPromotionInfo(ePromotion).getCollateralDamageChange()));
}
if (GC.getPromotionInfo(ePromotion).getBombardRateChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_BOMBARD_TEXT", GC.getPromotionInfo(ePromotion).getBombardRateChange()));
}
if (GC.getPromotionInfo(ePromotion).getFirstStrikesChange() != 0)
{
if (GC.getPromotionInfo(ePromotion).getFirstStrikesChange() == 1)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_FIRST_STRIKE_TEXT", GC.getPromotionInfo(ePromotion).getFirstStrikesChange()));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_FIRST_STRIKES_TEXT", GC.getPromotionInfo(ePromotion).getFirstStrikesChange()));
}
}
if (GC.getPromotionInfo(ePromotion).getChanceFirstStrikesChange() != 0)
{
if (GC.getPromotionInfo(ePromotion).getChanceFirstStrikesChange() == 1)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_FIRST_STRIKE_CHANCE_TEXT", GC.getPromotionInfo(ePromotion).getChanceFirstStrikesChange()));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_FIRST_STRIKES_CHANCE_TEXT", GC.getPromotionInfo(ePromotion).getChanceFirstStrikesChange()));
}
}
if (GC.getPromotionInfo(ePromotion).getEnemyHealChange() != 0)
{
//TSHEEP Display Spy Promotions Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_INSTIGATE_TEXT_SPY", GC.getPromotionInfo(ePromotion).getEnemyHealChange()));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", GC.getPromotionInfo(ePromotion).getEnemyHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_ENEMY_LANDS_TEXT"));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", GC.getPromotionInfo(ePromotion).getEnemyHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_ENEMY_LANDS_TEXT"));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).getNeutralHealChange() != 0)
{
//TSHEEP Display Spy Promotions Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_INSTIGATE2_TEXT_SPY", GC.getPromotionInfo(ePromotion).getNeutralHealChange()));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", GC.getPromotionInfo(ePromotion).getNeutralHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_NEUTRAL_LANDS_TEXT"));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", GC.getPromotionInfo(ePromotion).getNeutralHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_NEUTRAL_LANDS_TEXT"));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).getFriendlyHealChange() != 0)
{
//TSHEEP Display Spy Promotions Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_POISON_TEXT_SPY", GC.getPromotionInfo(ePromotion).getFriendlyHealChange()));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", GC.getPromotionInfo(ePromotion).getFriendlyHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_FRIENDLY_LANDS_TEXT"));
}
//szBuffer.append(pcNewline);
//szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_EXTRA_TEXT", GC.getPromotionInfo(ePromotion).getFriendlyHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_FRIENDLY_LANDS_TEXT"));
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).getSameTileHealChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_SAME_TEXT", GC.getPromotionInfo(ePromotion).getSameTileHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_DAMAGE_TURN_TEXT"));
}
if (GC.getPromotionInfo(ePromotion).getAdjacentTileHealChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HEALS_ADJACENT_TEXT", GC.getPromotionInfo(ePromotion).getAdjacentTileHealChange()) + gDLL->getText("TXT_KEY_PROMOTION_DAMAGE_TURN_TEXT"));
}
if (GC.getPromotionInfo(ePromotion).getCombatPercent() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_STRENGTH_TEXT", GC.getPromotionInfo(ePromotion).getCombatPercent()));
}
if (GC.getPromotionInfo(ePromotion).getCityAttackPercent() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_CITY_ATTACK_TEXT", GC.getPromotionInfo(ePromotion).getCityAttackPercent()));
}
if (GC.getPromotionInfo(ePromotion).getCityDefensePercent() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_CITY_DEFENSE_TEXT", GC.getPromotionInfo(ePromotion).getCityDefensePercent()));
}
if (GC.getPromotionInfo(ePromotion).getHillsAttackPercent() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HILLS_ATTACK", GC.getPromotionInfo(ePromotion).getHillsAttackPercent()));
}
if (GC.getPromotionInfo(ePromotion).getHillsDefensePercent() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_HILLS_DEFENSE_TEXT", GC.getPromotionInfo(ePromotion).getHillsDefensePercent()));
}
if (GC.getPromotionInfo(ePromotion).getRevoltProtection() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_REVOLT_PROTECTION_TEXT", GC.getPromotionInfo(ePromotion).getRevoltProtection()));
}
if (GC.getPromotionInfo(ePromotion).getCollateralDamageProtection() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_COLLATERAL_PROTECTION_TEXT", GC.getPromotionInfo(ePromotion).getCollateralDamageProtection()));
}
if (GC.getPromotionInfo(ePromotion).getPillageChange() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_PILLAGE_CHANGE_TEXT", GC.getPromotionInfo(ePromotion).getPillageChange()));
}
if (GC.getPromotionInfo(ePromotion).getUpgradeDiscount() != 0)
{
//TSHEEP Display Spy Promotions Differently
if(GC.getPromotionInfo(ePromotion).getSound()[5] == 'P')
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_UPGRADE_DISCOUNT_TEXT_SPY", GC.getPromotionInfo(ePromotion).getUpgradeDiscount()));
}
else if (100 == GC.getPromotionInfo(ePromotion).getUpgradeDiscount())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_UPGRADE_DISCOUNT_FREE_TEXT"));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_UPGRADE_DISCOUNT_TEXT", GC.getPromotionInfo(ePromotion).getUpgradeDiscount()));
}
/*if (100 == GC.getPromotionInfo(ePromotion).getUpgradeDiscount())
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_UPGRADE_DISCOUNT_FREE_TEXT"));
}
else
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_UPGRADE_DISCOUNT_TEXT", GC.getPromotionInfo(ePromotion).getUpgradeDiscount()));
}*/
//TSHEEP End
}
if (GC.getPromotionInfo(ePromotion).getExperiencePercent() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_FASTER_EXPERIENCE_TEXT", GC.getPromotionInfo(ePromotion).getExperiencePercent()));
}
if (GC.getPromotionInfo(ePromotion).getKamikazePercent() != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_KAMIKAZE_TEXT", GC.getPromotionInfo(ePromotion).getKamikazePercent()));
}
for (iI = 0; iI < GC.getNumTerrainInfos(); ++iI)
{
if (GC.getPromotionInfo(ePromotion).getTerrainAttackPercent(iI) != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_ATTACK_TEXT", GC.getPromotionInfo(ePromotion).getTerrainAttackPercent(iI), GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
if (GC.getPromotionInfo(ePromotion).getTerrainDefensePercent(iI) != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_DEFENSE_TEXT", GC.getPromotionInfo(ePromotion).getTerrainDefensePercent(iI), GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < GC.getNumFeatureInfos(); ++iI)
{
if (GC.getPromotionInfo(ePromotion).getFeatureAttackPercent(iI) != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_ATTACK_TEXT", GC.getPromotionInfo(ePromotion).getFeatureAttackPercent(iI), GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
if (GC.getPromotionInfo(ePromotion).getFeatureDefensePercent(iI) != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_DEFENSE_TEXT", GC.getPromotionInfo(ePromotion).getFeatureDefensePercent(iI), GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (GC.getPromotionInfo(ePromotion).getUnitCombatModifierPercent(iI) != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_VERSUS_TEXT", GC.getPromotionInfo(ePromotion).getUnitCombatModifierPercent(iI), GC.getUnitCombatInfo((UnitCombatTypes)iI).getTextKeyWide()));
}
}
for (iI = 0; iI < NUM_DOMAIN_TYPES; ++iI)
{
if (GC.getPromotionInfo(ePromotion).getDomainModifierPercent(iI) != 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_VERSUS_TEXT", GC.getPromotionInfo(ePromotion).getDomainModifierPercent(iI), GC.getDomainInfo((DomainTypes)iI).getTextKeyWide()));
}
}
/************************************************************************************************/
/* Afforess Promotion Changes 12/5/09 */
/* */
/* */
/************************************************************************************************/
int iNumPromotions = GC.getPromotionInfo(ePromotion).getNumPromotionOverwrites();
bool bFirst = true;
if (iNumPromotions > 0)
{
szBuffer.append(pcNewline);
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_OVERWRITES_PRE"));
for (iI = 0; iI < iNumPromotions; iI++)
{
if (!bFirst)
{
szBuffer.append(gDLL->getText("TXT_KEY_AND"));
}
szBuffer.append(CvWString::format(L"<link=literal>%s</link>", GC.getPromotionInfo((PromotionTypes)GC.getPromotionInfo(ePromotion).getPromotionOverwrites(iI)).getDescription()));
bFirst = false;
}
szBuffer.append(gDLL->getText("TXT_KEY_PROMOTION_OVERWRITES_POST"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
kPromotion.getPropertyManipulators()->buildDisplayString(szBuffer);
if (wcslen(GC.getPromotionInfo(ePromotion).getHelp()) > 0)
{
szBuffer.append(pcNewline);
szBuffer.append(GC.getPromotionInfo(ePromotion).getHelp());
}
}
// Function: parseCivicInfo()
// Description: Will parse the civic info help
// Parameters: szHelpText -- the text to put it into
// civicInfo - what to parse
// Returns: nothing
void CvGameTextMgr::parseCivicInfo(CvWStringBuffer &szHelpText, CivicTypes eCivic, bool bCivilopediaText, bool bPlayerContext, bool bSkipName)
{
PROFILE_FUNC();
CvWString szFirstBuffer;
bool bFound;
bool bFirst;
int iLast;
int iI, iJ;
if (NO_CIVIC == eCivic)
{
return;
}
szHelpText.clear();
FAssert(GC.getGameINLINE().getActivePlayer() != NO_PLAYER || !bPlayerContext);
if (!bSkipName)
{
szHelpText.append(GC.getCivicInfo(eCivic).getDescription());
}
if (!bCivilopediaText)
{
if (!bPlayerContext || !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canDoCivics(eCivic)))
{
if (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isHasTech((TechTypes)(GC.getCivicInfo(eCivic).getTechPrereq()))))
{
if (GC.getCivicInfo(eCivic).getTechPrereq() != NO_TECH)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REQUIRES", GC.getTechInfo((TechTypes)GC.getCivicInfo(eCivic).getTechPrereq()).getTextKeyWide()));
}
}
}
}
// Special Building Not Required...
for (iI = 0; iI < GC.getNumSpecialBuildingInfos(); ++iI)
{
if (GC.getCivicInfo(eCivic).isSpecialBuildingNotRequired(iI))
{
// XXX "Missionaries"??? - Now in XML
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_BUILD_MISSIONARIES", GC.getSpecialBuildingInfo((SpecialBuildingTypes)iI).getTextKeyWide()));
}
}
/************************************************************************************************/
/* Afforess Start 12/18/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getCivicInfo(eCivic).IsFixedBorders() && !GC.getGameINLINE().isOption(GAMEOPTION_NO_FIXED_BORDERS))
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_FIXED_BORDERS_CIVIC"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Valid Specialists...
bFirst = true;
for (iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
if (GC.getCivicInfo(eCivic).isSpecialistValid(iI))
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_UNLIMTED").c_str());
CvWString szSpecialist;
szSpecialist.Format(L"<link=literal>%s</link>", GC.getSpecialistInfo((SpecialistTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szSpecialist, L", ", bFirst);
bFirst = false;
}
}
// Great People Modifier...
if (GC.getCivicInfo(eCivic).getGreatPeopleRateModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_GREAT_PEOPLE_MOD", GC.getCivicInfo(eCivic).getGreatPeopleRateModifier()));
}
// Great General Modifier...
if (GC.getCivicInfo(eCivic).getGreatGeneralRateModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_GREAT_GENERAL_MOD", GC.getCivicInfo(eCivic).getGreatGeneralRateModifier()));
}
if (GC.getCivicInfo(eCivic).getDomesticGreatGeneralRateModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_DOMESTIC_GREAT_GENERAL_MODIFIER", GC.getCivicInfo(eCivic).getDomesticGreatGeneralRateModifier()));
}
// State Religion Great People Modifier...
if (GC.getCivicInfo(eCivic).getStateReligionGreatPeopleRateModifier() != 0)
{
if (bPlayerContext && (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion() != NO_RELIGION))
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_GREAT_PEOPLE_MOD_RELIGION", GC.getCivicInfo(eCivic).getStateReligionGreatPeopleRateModifier(), GC.getReligionInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion()).getChar()));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_GREAT_PEOPLE_MOD_STATE_RELIGION", GC.getCivicInfo(eCivic).getStateReligionGreatPeopleRateModifier(), gDLL->getSymbolID(RELIGION_CHAR)));
}
}
// Distance Maintenance Modifer...
if (GC.getCivicInfo(eCivic).getDistanceMaintenanceModifier() != 0)
{
if (GC.getCivicInfo(eCivic).getDistanceMaintenanceModifier() <= -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_DISTANCE_MAINT"));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_DISTANCE_MAINT_MOD", GC.getCivicInfo(eCivic).getDistanceMaintenanceModifier()));
}
}
// Num Cities Maintenance Modifer...
if (GC.getCivicInfo(eCivic).getNumCitiesMaintenanceModifier() != 0)
{
if (GC.getCivicInfo(eCivic).getNumCitiesMaintenanceModifier() <= -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_MAINT_NUM_CITIES"));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_MAINT_NUM_CITIES_MOD", GC.getCivicInfo(eCivic).getNumCitiesMaintenanceModifier()));
}
}
/************************************************************************************************/
/* Afforess Start 06/17/10 */
/* */
/* */
/************************************************************************************************/
if (GC.getGameINLINE().isOption(GAMEOPTION_REALISTIC_CORPORATIONS))
{
if (GC.getCivicInfo(eCivic).getRealCorporationMaintenanceModifier() < -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_CORPORATION_TAXES", abs( 100 + GC.getCivicInfo(eCivic).getRealCorporationMaintenanceModifier())));
}
else if (GC.getCivicInfo(eCivic).getRealCorporationMaintenanceModifier() > -100 && GC.getCivicInfo(eCivic).getRealCorporationMaintenanceModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_SUBSIDY", 100 + GC.getCivicInfo(eCivic).getRealCorporationMaintenanceModifier()));
}
}
else
{
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Corporations Maintenance Modifer...
if (GC.getCivicInfo(eCivic).getCorporationMaintenanceModifier() != 0)
{
if (GC.getCivicInfo(eCivic).getCorporationMaintenanceModifier() <= -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_MAINT_CORPORATION"));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_MAINT_CORPORATION_MOD", GC.getCivicInfo(eCivic).getCorporationMaintenanceModifier()));
}
}
/************************************************************************************************/
/* Afforess Start 06/17/10 */
/* */
/* */
/************************************************************************************************/
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
//DPII < Maintenance Modifiers >
if (GC.getCivicInfo(eCivic).getHomeAreaMaintenanceModifier() != 0)
{
szHelpText.append(NEWLINE);
if (GC.getCivicInfo(eCivic).getHomeAreaMaintenanceModifier() <= -100)
{
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_HOME_AREA_MAINT"));
}
else
{
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_HOME_AREA_MAINT_MOD", GC.getCivicInfo(eCivic).getHomeAreaMaintenanceModifier()));
}
}
if (GC.getCivicInfo(eCivic).getOtherAreaMaintenanceModifier() != 0)
{
szHelpText.append(NEWLINE);
if (GC.getCivicInfo(eCivic).getOtherAreaMaintenanceModifier() <= -100)
{
szHelpText.append(gDLL->getText("TXT_KEY_OVERSEAS_CITY_MAINT"));
}
else
{
szHelpText.append(gDLL->getText("TXT_KEY_OVERSEAS_CITY_MAINT_MOD", GC.getCivicInfo(eCivic).getOtherAreaMaintenanceModifier()));
}
}
//DPII < Maintenance Modifiers >
// Extra Health
if (GC.getCivicInfo(eCivic).getExtraHealth() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_EXTRA_HEALTH", abs(GC.getCivicInfo(eCivic).getExtraHealth()), ((GC.getCivicInfo(eCivic).getExtraHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))));
}
// Free Experience
if (GC.getCivicInfo(eCivic).getFreeExperience() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FREE_XP", GC.getCivicInfo(eCivic).getFreeExperience()));
}
// Worker speed modifier
if (GC.getCivicInfo(eCivic).getWorkerSpeedModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_WORKER_SPEED", GC.getCivicInfo(eCivic).getWorkerSpeedModifier()));
}
// Improvement upgrade rate modifier
if (GC.getCivicInfo(eCivic).getImprovementUpgradeRateModifier() != 0)
{
bFirst = true;
for (iI = 0; iI < GC.getNumImprovementInfos(); ++iI)
{
if (GC.getImprovementInfo((ImprovementTypes)iI).getImprovementUpgrade() != NO_IMPROVEMENT)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_UPGRADE", GC.getCivicInfo(eCivic).getImprovementUpgradeRateModifier()).c_str());
CvWString szImprovement;
szImprovement.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szImprovement, L", ", bFirst);
bFirst = false;
}
}
}
// Military unit production modifier
if (GC.getCivicInfo(eCivic).getMilitaryProductionModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_MILITARY_PRODUCTION", GC.getCivicInfo(eCivic).getMilitaryProductionModifier()));
}
/************************************************************************************************/
/* Afforess Start 09/09/10 */
/* */
/* M.A.D Nukes */
/************************************************************************************************/
if (GC.getCivicInfo(eCivic).isEnablesMAD())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_BUILDING_ENABLES_MAD"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Free units population percent
if ((GC.getCivicInfo(eCivic).getBaseFreeUnits() != 0) || (GC.getCivicInfo(eCivic).getFreeUnitsPopulationPercent() != 0))
{
if (bPlayerContext)
{
int iFreeUnits = (GC.getCivicInfo(eCivic).getBaseFreeUnits() + ((GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getTotalPopulation() * GC.getCivicInfo(eCivic).getFreeUnitsPopulationPercent()) / 100));
if (iFreeUnits > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FREE_UNITS", iFreeUnits));
}
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_UNIT_SUPPORT"));
}
}
// Free military units population percent
if ((GC.getCivicInfo(eCivic).getBaseFreeMilitaryUnits() != 0) || (GC.getCivicInfo(eCivic).getFreeMilitaryUnitsPopulationPercent() != 0))
{
if (bPlayerContext)
{
int iFreeUnits = (GC.getCivicInfo(eCivic).getBaseFreeMilitaryUnits() + ((GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getTotalPopulation() * GC.getCivicInfo(eCivic).getFreeMilitaryUnitsPopulationPercent()) / 100));
if (iFreeUnits > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FREE_MILITARY_UNITS", iFreeUnits));
}
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_MILITARY_UNIT_SUPPORT"));
}
}
// Happiness per military unit
if (GC.getCivicInfo(eCivic).getHappyPerMilitaryUnit() != 0)
{
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_UNIT_HAPPINESS", GC.getCivicInfo(eCivic).getHappyPerMilitaryUnit(), ((GC.getCivicInfo(eCivic).getHappyPerMilitaryUnit() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
*/
// Use absolute value with unhappy face
//RevolutionDCM - reintroduce new line
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_UNIT_HAPPINESS", abs(GC.getCivicInfo(eCivic).getHappyPerMilitaryUnit()), ((GC.getCivicInfo(eCivic).getHappyPerMilitaryUnit() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
// Military units produced with food
if (GC.getCivicInfo(eCivic).isMilitaryFoodProduction())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_MILITARY_FOOD"));
}
// Conscription
if (getWorldSizeMaxConscript(eCivic) != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_CONSCRIPTION", getWorldSizeMaxConscript(eCivic)));
}
// Population Unhealthiness
if (GC.getCivicInfo(eCivic).isNoUnhealthyPopulation())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_POP_UNHEALTHY"));
}
// Building Unhealthiness
if (GC.getCivicInfo(eCivic).isBuildingOnlyHealthy())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_BUILDING_UNHEALTHY"));
}
// Population Unhealthiness
if (0 != GC.getCivicInfo(eCivic).getExpInBorderModifier())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_EXPERIENCE_IN_BORDERS", GC.getCivicInfo(eCivic).getExpInBorderModifier()));
}
/************************************************************************************************/
/* REVDCM 02/16/10 phungus420 */
/* */
/* RevCivic Effects */
/************************************************************************************************/
if (GC.getCivicInfo(eCivic).isUpgradeAnywhere())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CAN_UPGRADE_ANYWHERE"));
}
if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_INQUISITIONS))
{
if (GC.getCivicInfo(eCivic).isAllowInquisitions())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_ALLOW_INQUISITONS"));
}
}
if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_INQUISITIONS))
{
if (GC.getCivicInfo(eCivic).isDisallowInquisitions())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_DISALLOW_INQUISITONS"));
}
}
if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_REVOLUTION))
{
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER && GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isModderOption(MODDEROPTION_SHOW_REV_EFFECTS))
{
// Revolution Local Civic Index Modifiers
if (0 != GC.getCivicInfo(eCivic).getRevIdxLocal())
{
if ( GC.getCivicInfo(eCivic).getRevIdxLocal() > 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_LOCAL_PENALTY", GC.getCivicInfo(eCivic).getRevIdxLocal()));
}
if ( GC.getCivicInfo(eCivic).getRevIdxLocal() < 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_LOCAL_BONUS", abs(GC.getCivicInfo(eCivic).getRevIdxLocal())));
}
}
// Revolution National Civic Index Modifiers
if (0 != GC.getCivicInfo(eCivic).getRevIdxNational())
{
if ( GC.getCivicInfo(eCivic).getRevIdxNational() > 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_NATIONAL_PENALTY", GC.getCivicInfo(eCivic).getRevIdxNational()));
}
if ( GC.getCivicInfo(eCivic).getRevIdxNational() < 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_NATIONAL_BONUS", abs(GC.getCivicInfo(eCivic).getRevIdxNational())));
}
}
// Revolution Good Holy City Modifier
if (0 != GC.getCivicInfo(eCivic).getRevIdxHolyCityGood())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_GOOD_HOLY_CITY", GC.getCivicInfo(eCivic).getRevIdxHolyCityGood()));
}
// Revolution Bad Holy City Modifier
if (0 != GC.getCivicInfo(eCivic).getRevIdxHolyCityBad())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_BAD_HOLY_CITY", GC.getCivicInfo(eCivic).getRevIdxHolyCityBad()));
}
// Revolution Switch to Modifier
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if (0 != GC.getCivicInfo(eCivic).getRevIdxSwitchTo())
{
if (GC.getCivicInfo(eCivic).getRevIdxSwitchTo() < 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_SWITCH_TO_BONUS", abs(GC.getCivicInfo(eCivic).getRevIdxSwitchTo())));
}
if (GC.getCivicInfo(eCivic).getRevIdxSwitchTo() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_SWITCH_TO_PENALTY", GC.getCivicInfo(eCivic).getRevIdxSwitchTo()));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Revolution Nationality Modifier
if (0 != GC.getCivicInfo(eCivic).getRevIdxNationalityMod())
{
if ( GC.getCivicInfo(eCivic).getRevIdxNationalityMod() < 0)
{
szHelpText.append(NEWLINE);
CvWString szTempBuffer;
szTempBuffer.Format(L"%.0f", 100 * GC.getCivicInfo(eCivic).getRevIdxNationalityMod());
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_NATIONALITY_REDUCTION_MOD", szTempBuffer.GetCString()));
}
if ( GC.getCivicInfo(eCivic).getRevIdxNationalityMod() > 0)
{
szHelpText.append(NEWLINE);
CvWString szTempBuffer;
szTempBuffer.Format(L"%.0f", 100 * GC.getCivicInfo(eCivic).getRevIdxNationalityMod());
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_NATIONALITY_INCREASE_MOD", szTempBuffer.GetCString()));
}
}
// Revolution Bad Religion Modifier
if (0 != GC.getCivicInfo(eCivic).getRevIdxBadReligionMod())
{
szHelpText.append(NEWLINE);
CvWString szTempBuffer;
szTempBuffer.Format(L"%.0f", 100 * GC.getCivicInfo(eCivic).getRevIdxBadReligionMod());
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_BAD_RELIGION_MOD", szTempBuffer.GetCString()));
}
// Revolution Good Religion Modifier
if (0 != GC.getCivicInfo(eCivic).getRevIdxGoodReligionMod())
{
szHelpText.append(NEWLINE);
CvWString szTempBuffer;
szTempBuffer.Format(L"%.0f", 100 * GC.getCivicInfo(eCivic).getRevIdxGoodReligionMod());
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_GOOD_RELIGION_MOD", szTempBuffer.GetCString()));
}
// Revolution City Distance Modifier
if (0 != GC.getCivicInfo(eCivic).getRevIdxDistanceModifier())
{
if ( GC.getCivicInfo(eCivic).getRevIdxDistanceModifier() < 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_CITY_DISTANCE_GOOD_MOD", GC.getCivicInfo(eCivic).getRevIdxDistanceModifier()));
}
if ( GC.getCivicInfo(eCivic).getRevIdxDistanceModifier() > 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_CITY_DISTANCE_BAD_MOD", abs(GC.getCivicInfo(eCivic).getRevIdxDistanceModifier())));
}
}
if (0 != GC.getCivicInfo(eCivic).getRevReligiousFreedom())
{
if ( GC.getCivicInfo(eCivic).getRevReligiousFreedom() < 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_RELIGION_OPRESSION", GC.getCivicInfo(eCivic).getRevReligiousFreedom()));
}
if ( GC.getCivicInfo(eCivic).getRevReligiousFreedom() > 0 )
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_RELIGION_FREEDOM", GC.getCivicInfo(eCivic).getRevReligiousFreedom()));
}
}
// Revolution Labor Modifier
if (0 != GC.getCivicInfo(eCivic).getRevLaborFreedom())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_LABOR", GC.getCivicInfo(eCivic).getRevLaborFreedom()));
}
// Revolution Environment Modifier
if (0 != GC.getCivicInfo(eCivic).getRevEnvironmentalProtection())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_ENVIRONMENT", GC.getCivicInfo(eCivic).getRevEnvironmentalProtection()));
}
// Revolution Democracy Modifier
if (0 != GC.getCivicInfo(eCivic).getRevDemocracyLevel())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REV_DEMOCRACY", GC.getCivicInfo(eCivic).getRevDemocracyLevel()));
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
}
else
{
if ( GC.getCivicInfo(eCivic).getRevIdxLocal() > 0 )
{
//szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_INCREASE_LOCAL_REBELS", GC.getCivicInfo(eCivic).getRevIdxLocal()));
}
else if (GC.getCivicInfo(eCivic).getRevIdxLocal() < 0 )
{
//szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_DECREASE_LOCAL_REBELS", GC.getCivicInfo(eCivic).getRevIdxLocal()));
}
if ( GC.getCivicInfo(eCivic).getRevIdxNational() > 0 )
{
//szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_INCREASE_NATIONAL_REBELS", GC.getCivicInfo(eCivic).getRevIdxNational()));
}
else if ( GC.getCivicInfo(eCivic).getRevIdxNational() < 0 )
{
//szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_DECREASE_NATIONAL_REBELS", GC.getCivicInfo(eCivic).getRevIdxNational()));
}
if ( GC.getCivicInfo(eCivic).getRevIdxHolyCityGood() > 0 )
{
//szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_STATE_RELIGION_WITH_HOLY_CITY", GC.getCivicInfo(eCivic).getRevIdxHolyCityGood()));
}
if ( GC.getCivicInfo(eCivic).getRevIdxHolyCityBad() > 0 )
{
//szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_STATE_RELIGION_WITHOUT_HOLY_CITY", GC.getCivicInfo(eCivic).getRevIdxHolyCityBad()));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
// RevolutionDCM - End Revolution Civic Expose
// War Weariness
if (GC.getCivicInfo(eCivic).getWarWearinessModifier() != 0)
{
if (GC.getCivicInfo(eCivic).getWarWearinessModifier() <= -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_WAR_WEARINESS"));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_EXTRA_WAR_WEARINESS", GC.getCivicInfo(eCivic).getWarWearinessModifier()));
}
}
// Free specialists
if (GC.getCivicInfo(eCivic).getFreeSpecialist() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FREE_SPECIALISTS", GC.getCivicInfo(eCivic).getFreeSpecialist()));
}
// Trade routes
if (GC.getCivicInfo(eCivic).getTradeRoutes() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_TRADE_ROUTES", GC.getCivicInfo(eCivic).getTradeRoutes()));
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getCivicInfo(eCivic).getForeignTradeRouteModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FOREIGN_TRADE_ROUTE_MOD", GC.getCivicInfo(eCivic).getForeignTradeRouteModifier()));
}
if (GC.getCivicInfo(eCivic).getDistantUnitSupportCostModifier() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_DISTANT_UNIT_SUPPLY_COST_MOD", GC.getCivicInfo(eCivic).getDistantUnitSupportCostModifier()));
}
else if (GC.getCivicInfo(eCivic).getDistantUnitSupportCostModifier() < 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_DISTANT_UNIT_SUPPLY_COST_MOD_DECREASE", GC.getCivicInfo(eCivic).getDistantUnitSupportCostModifier()));
}
if (GC.getCivicInfo(eCivic).getExtraCityDefense() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_CITY_DEFENSE_MOD", GC.getCivicInfo(eCivic).getExtraCityDefense()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// No Foreign Trade
if (GC.getCivicInfo(eCivic).isNoForeignTrade())
{
szHelpText.append(NEWLINE);
//Afforess: connectedness
if (GC.getMAX_TRADE_ROUTES() > 0)
{
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_FOREIGN_TRADE"));
}
else
{
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_FOREIGN_CONNECTIONS"));
}
}
// No Corporations
if (GC.getCivicInfo(eCivic).isNoCorporations())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_CORPORATIONS"));
}
// No Foreign Corporations
if (GC.getCivicInfo(eCivic).isNoForeignCorporations())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_FOREIGN_CORPORATIONS"));
/************************************************************************************************/
/* Afforess Start 06/17/10 */
/* */
/* */
/************************************************************************************************/
if (GC.getGameINLINE().isOption(GAMEOPTION_REALISTIC_CORPORATIONS))
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_ALLOWS_USE_OF_EXECUTIVES"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
// Freedom Anger
if (GC.getCivicInfo(eCivic).getCivicPercentAnger() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FREEDOM_ANGER", GC.getCivicInfo(eCivic).getTextKeyWide()));
}
//Afforess Bug Fix
else if (GC.getCivicInfo(eCivic).getCivicPercentAnger() < 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FREEDOM_HAPPINESS", GC.getCivicInfo(eCivic).getTextKeyWide()));
}
if (!(GC.getCivicInfo(eCivic).isStateReligion()))
{
bFound = false;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
if ((GC.getCivicInfo((CivicTypes) iI).getCivicOptionType() == GC.getCivicInfo(eCivic).getCivicOptionType()) && (GC.getCivicInfo((CivicTypes) iI).isStateReligion()))
{
bFound = true;
}
}
if (bFound)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_STATE_RELIGION"));
}
}
if (GC.getCivicInfo(eCivic).getStateReligionHappiness() != 0)
{
if (bPlayerContext && (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion() != NO_RELIGION))
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_STATE_RELIGION_HAPPINESS", abs(GC.getCivicInfo(eCivic).getStateReligionHappiness()), ((GC.getCivicInfo(eCivic).getStateReligionHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), GC.getReligionInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion()).getChar()));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_RELIGION_HAPPINESS", abs(GC.getCivicInfo(eCivic).getStateReligionHappiness()), ((GC.getCivicInfo(eCivic).getStateReligionHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
}
if (GC.getCivicInfo(eCivic).getNonStateReligionHappiness() != 0)
{
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 EmperorFool & jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
if (GC.getCivicInfo(eCivic).isStateReligion())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NON_STATE_REL_HAPPINESS_NO_STATE"));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NON_STATE_REL_HAPPINESS_WITH_STATE", abs(GC.getCivicInfo(eCivic).getNonStateReligionHappiness()), ((GC.getCivicInfo(eCivic).getNonStateReligionHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
*/
if (!GC.getCivicInfo(eCivic).isStateReligion())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NON_STATE_REL_HAPPINESS_NO_STATE", abs(GC.getCivicInfo(eCivic).getNonStateReligionHappiness()), ((GC.getCivicInfo(eCivic).getNonStateReligionHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NON_STATE_REL_HAPPINESS_WITH_STATE", abs(GC.getCivicInfo(eCivic).getNonStateReligionHappiness()), ((GC.getCivicInfo(eCivic).getNonStateReligionHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
// State Religion Unit Production Modifier
if (GC.getCivicInfo(eCivic).getStateReligionUnitProductionModifier() != 0)
{
if (bPlayerContext && (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion() != NO_RELIGION))
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REL_TRAIN_BONUS", GC.getReligionInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion()).getChar(), GC.getCivicInfo(eCivic).getStateReligionUnitProductionModifier()));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_STATE_REL_TRAIN_BONUS", GC.getCivicInfo(eCivic).getStateReligionUnitProductionModifier()));
}
}
// State Religion Building Production Modifier
if (GC.getCivicInfo(eCivic).getStateReligionBuildingProductionModifier() != 0)
{
if (bPlayerContext && (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion() != NO_RELIGION))
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REL_BUILDING_BONUS", GC.getReligionInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion()).getChar(), GC.getCivicInfo(eCivic).getStateReligionBuildingProductionModifier()));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_STATE_REL_BUILDING_BONUS", GC.getCivicInfo(eCivic).getStateReligionBuildingProductionModifier()));
}
}
// State Religion Free Experience
if (GC.getCivicInfo(eCivic).getStateReligionFreeExperience() != 0)
{
if (bPlayerContext && (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion() != NO_RELIGION))
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_REL_FREE_XP", GC.getCivicInfo(eCivic).getStateReligionFreeExperience(), GC.getReligionInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getStateReligion()).getChar()));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_STATE_REL_FREE_XP", GC.getCivicInfo(eCivic).getStateReligionFreeExperience()));
}
}
if (GC.getCivicInfo(eCivic).isNoNonStateReligionSpread())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_NON_STATE_SPREAD"));
}
/************************************************************************************************/
/* Afforess Religous Civic Modifier 11/11/09 */
/* */
/* */
/************************************************************************************************/
CvCivicInfo& kCivic = GC.getCivicInfo(eCivic);
if (kCivic.getReligionSpreadRate() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_RELIGION_SPREAD_RATE_FAST", kCivic.getReligionSpreadRate()));
}
else if (kCivic.getReligionSpreadRate() < 0 && kCivic.getReligionSpreadRate() > -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_RELIGION_SPREAD_RATE_SLOW", (100 + kCivic.getReligionSpreadRate())));
}
else if (kCivic.getReligionSpreadRate() < -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_RELIGION_NO_SPREAD"));
}
if (kCivic.getPopulationgrowthratepercentage() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_BUILDING_CITY_SLOW_GROWTH_SPEED", kCivic.getPopulationgrowthratepercentage()));
}
else if (kCivic.getPopulationgrowthratepercentage() < 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_BUILDING_CITY_FAST_GROWTH_SPEED", kCivic.getPopulationgrowthratepercentage()));
}
if (kCivic.isNoCapitalUnhappiness())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_CAPITAL_ANGER"));
}
if (kCivic.getTaxRateUnhappiness() > 0)
{
//This is to round it to the nearest 5%.
int iTaxRate = abs((100 / kCivic.getTaxRateUnhappiness()));
if ((iTaxRate % 5) > 2)
iTaxRate += 5 - (iTaxRate % 5);
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_TAXATION_ANGER", iTaxRate));
}
if (kCivic.getCivicHappiness() != 0)
{
if (kCivic.getCivicHappiness() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_HAPPINESS", abs(kCivic.getCivicHappiness()), ((kCivic.getCivicHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_UNHAPPINESS", abs(kCivic.getCivicHappiness()), ((kCivic.getCivicHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
}
if (kCivic.getFractionalXPEarnedInCity() > 0)
{
szHelpText.append(NEWLINE);
float fXP = (float)kCivic.getFractionalXPEarnedInCity();
int iNormal = GC.getInfoTypeForString("GAMESPEED_NORMAL");
fXP *= (iNormal == -1 ? 100 : GC.getGameSpeedInfo((GameSpeedTypes)iNormal).getTrainPercent());
fXP /= GC.getGameSpeedInfo((GameSpeedTypes)GC.getGameINLINE().getGameSpeedType()).getTrainPercent();
CvWString szTempBuffer;
szTempBuffer.Format(L"%.2f", ((float)std::max(1, (int)fXP)) / 100);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_XP_EARNED_IN_CITY", szTempBuffer.GetCString()));
}
if (kCivic.getCityLimit() > 0)
{
szHelpText.append(NEWLINE);
if (kCivic.getCityOverLimitUnhappy() > 0)
{
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_SOFT_CITY_LIMIT", kCivic.getCityLimit(), kCivic.getCityOverLimitUnhappy()));
}
else
{
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_CITY_LIMIT", kCivic.getCityLimit()));
}
}
if (kCivic.getForeignerUnhappyPercent() > 0) {
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_FOREIGNER_ANGER", 1, (100 / kCivic.getForeignerUnhappyPercent())));
}
if (bCivilopediaText || GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_ECONOMY))
{
if (kCivic.getInflationModifier() != 0)
{
if (kCivic.getInflationModifier() == -100)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_NO_INFLATION"));
}
else
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_ADJUSTS_INFLATION", kCivic.getInflationModifier()));
}
}
/* if (kCivic.isChooseCurrency() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_CHOOSE_CURRENCY"));
} */
if (kCivic.getHurryCostModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_BUILDING_HURRY_MOD", kCivic.getHurryCostModifier()));
}
if (kCivic.getHurryInflationModifier() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_HURRY_INFLATION_MOD_MORE", kCivic.getHurryInflationModifier()));
}
else if (kCivic.getHurryInflationModifier() < 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_HURRY_INFLATION_MOD_LESS", kCivic.getHurryInflationModifier()));
}
if (kCivic.getSharedCivicTradeRouteModifier() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_SHARED_CIVIC_TRADE_MOD", kCivic.getSharedCivicTradeRouteModifier()));
}
}
if (bCivilopediaText || GC.getGameINLINE().isOption(GAMEOPTION_PERSONALIZED_MAP))
{
if (kCivic.getLandmarkHappiness() > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_LANDMARK_HAPPINESS", kCivic.getLandmarkHappiness()));
}
if (kCivic.getLandmarkHappiness() < 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_LANDMARK_UNHAPPINESS", -kCivic.getLandmarkHappiness()));
}
if (kCivic.isNoLandmarkAnger())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_NO_LANDMARK_ANGER"));
}
}
//+1 gold per turn from each city with access to Gold.
iLast = 0;
CvWString szBonusName;
CvWString szBonusList;
szBonusList.Format(L"");
bool bFoundAnyBonus = false;
for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
if (kCivic.getBonusMintedPercent(iI) > 0)
{
szBonusName.Format(L"<link=literal>%s</link> (%c)", gDLL->getText(GC.getBonusInfo((BonusTypes)iI).getTextKeyWide()).c_str(), GC.getBonusInfo((BonusTypes)iI).getChar());
if (bFoundAnyBonus)
{
szBonusList.append(L", ");
}
szBonusList.append(szBonusName);
bFoundAnyBonus = true;
CvWString szTempBuffer;
float fValue = (float)kCivic.getBonusMintedPercent(iI);
if (fmod(fValue,100) == 0)
{
if (fValue > 0)
{
szTempBuffer.Format(L"+%.0f", fValue/100);
}
else
{
szTempBuffer.Format(L"%.0f", fValue/100);
}
}
else
{
if (fValue > 0)
{
szTempBuffer.Format(L"+%.2f", fValue/100);
}
else
{
szTempBuffer.Format(L"%.2f", fValue/100);
}
}
szFirstBuffer.Format(L"%s%s ", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BONUS_MINTED", szTempBuffer.GetCString()).c_str());
setListHelp(szHelpText, szFirstBuffer, szBonusName, L", ", (kCivic.getBonusMintedPercent(iI) != iLast));
iLast = kCivic.getBonusMintedPercent(iI);
}
}
if (bFoundAnyBonus)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CONSUMES_BONUSES_CIVIC", szBonusList.GetCString()));
}
iLast = 0;
int iCount = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
for (iJ = 0; iJ < NUM_COMMERCE_TYPES; iJ++)
{
BuildingTypes eBuilding;
if (bPlayerContext && NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
eBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
}
else
{
eBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eBuilding != NO_BUILDING && kCivic.getBuildingCommerceModifier(eBuilding, iJ) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BUILDING_COMMERCE_MODIFIER", kCivic.getBuildingCommerceModifier(eBuilding, iJ), GC.getCommerceInfo((CommerceTypes)iJ).getChar()).c_str());
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", (kCivic.getBuildingCommerceModifier(eBuilding, iJ) != iLast));
if (iLast == kCivic.getBuildingCommerceModifier(eBuilding, iJ)) iCount++;
iLast = kCivic.getBuildingCommerceModifier(eBuilding, iJ);
if (iCount > 3) iCount = iLast = 0;
}
}
}
iLast = 0;
iCount = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
for (iJ = 0; iJ < NUM_COMMERCE_TYPES; iJ++)
{
BuildingTypes eBuilding;
if (bPlayerContext && NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
eBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
}
else
{
eBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eBuilding != NO_BUILDING && kCivic.getBuildingClassCommerceChange(iI, iJ) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BUILDING_COMMERCE_CHANGE", kCivic.getBuildingClassCommerceChange(iI, iJ), GC.getCommerceInfo((CommerceTypes)iJ).getChar()).c_str());
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", (kCivic.getBuildingClassCommerceChange(iI, iJ) != iLast));
if (iLast == kCivic.getBuildingClassCommerceChange(iI, iJ)) iCount++;
iLast = kCivic.getBuildingClassCommerceChange(iI, iJ);
if (iCount > 3) iCount = iLast = 0;
}
}
}
// +0.35 gold for scientists
//if (kCivic.m_bAnySpecialistCommerceChanges)
{
for (iJ = 0; iJ < NUM_COMMERCE_TYPES; iJ++)
{
iLast = 0;
for (iI = 0; iI < GC.getNumSpecialistInfos(); iI++)
{
if (kCivic.getSpecialistCommercePercentChanges(iI, iJ) != 0)
{
CvWString szTempBuffer;
float fValue = (float)kCivic.getSpecialistCommercePercentChanges(iI, iJ);
if (fmod(fValue,100) == 0)
{
szTempBuffer.Format(L"%+.0f", fValue/100);
}
else
{
szTempBuffer.Format(L"%+.2f", fValue/100);
}
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_SPECIALIST_COMMERCE_CHANGE", szTempBuffer.GetCString(), GC.getCommerceInfo((CommerceTypes)iJ).getChar()).c_str());
CvWString szSpecialist;
szSpecialist.Format(L"<link=literal>%s</link>", GC.getSpecialistInfo((SpecialistTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szSpecialist, L", ", (kCivic.getSpecialistCommercePercentChanges(iI, iJ) != iLast));
iLast = kCivic.getSpecialistCommercePercentChanges(iI, iJ);
}
}
}
}
//if (kCivic.m_bAnySpecialistYieldChanges)
{
for (iJ = 0; iJ < NUM_YIELD_TYPES; iJ++)
{
iLast = 0;
for (iI = 0; iI < GC.getNumSpecialistInfos(); iI++)
{
if (kCivic.getSpecialistYieldPercentChanges(iI, iJ) != 0)
{
CvWString szTempBuffer;
float fValue = (float)kCivic.getSpecialistYieldPercentChanges(iI, iJ);
if (fmod(fValue,100) == 0)
{
szTempBuffer.Format(L"%.0f", fValue/100);
}
else
{
szTempBuffer.Format(L"%.2f", fValue/100);
}
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_HEALTHPERCENT", szTempBuffer.GetCString(), GC.getYieldInfo((YieldTypes)iJ).getChar()).c_str());
CvWString szSpecialist;
szSpecialist.Format(L"<link=literal>%s</link>", GC.getSpecialistInfo((SpecialistTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szSpecialist, L", ", (kCivic.getSpecialistYieldPercentChanges(iI, iJ) != iLast));
iLast = kCivic.getSpecialistYieldPercentChanges(iI, iJ);
}
}
}
}
CvWString szImprovement;
iLast = 0;
for (iI = 0; iI < GC.getNumImprovementInfos(); iI++)
{
if (kCivic.getImprovementHappinessChanges(iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE ,gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_HAPPINESS", kCivic.getImprovementHappinessChanges(iI), (kCivic.getImprovementHappinessChanges(iI) > 0 ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
szImprovement.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szImprovement, L", ", (kCivic.getImprovementHappinessChanges(iI) != iLast));
iLast = kCivic.getImprovementHappinessChanges(iI);
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumImprovementInfos(); iI++)
{
if (kCivic.getImprovementHealthPercentChanges(iI) != 0)
{
CvWString szTempBuffer;
float fValue = (float)kCivic.getImprovementHealthPercentChanges(iI);
if (fmod(fValue,100) == 0)
{
szTempBuffer.Format(L"%.0f", fValue/100);
}
else if (fmod(fValue,10) == 0)
{
szTempBuffer.Format(L"%.1f", fValue/100);
}
else
{
szTempBuffer.Format(L"%.2f", fValue/100);
}
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_HEALTHPERCENT", szTempBuffer.GetCString(), (kCivic.getImprovementHealthPercentChanges(iI) > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR))).c_str());
//szFirstBuffer.Format(L"%s%s %s", NEWLINE, szTempBuffer, /*(kCivic.getImprovementHealthPercentChanges(iI) > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)),*/ gDLL->getText("TXT_KEY_MISC_FROM"));
szImprovement.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szImprovement, L", ", (kCivic.getImprovementHealthPercentChanges(iI) != iLast));
iLast = kCivic.getImprovementHealthPercentChanges(iI);
}
}
for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_WITH_BONUS", GC.getBonusInfo((BonusTypes) iI).getTextKeyWide());
setCommerceChangeHelp(szHelpText, L"", L"", szFirstBuffer, kCivic.getBonusCommerceModifierArray(iI), true);
}
if (bCivilopediaText || GC.getGameINLINE().isOption(GAMEOPTION_PERSONALIZED_MAP))
{
setYieldChangeHelp(szHelpText, L"", L"", gDLL->getText("TXT_KEY_CIVIC_FROM_LANDMARK").GetCString(), kCivic.getLandmarkYieldChangesArray(), false);
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Yield Modifiers
setYieldChangeHelp(szHelpText, L"", L"", gDLL->getText("TXT_KEY_CIVIC_IN_ALL_CITIES").GetCString(), GC.getCivicInfo(eCivic).getYieldModifierArray(), true);
// Capital Yield Modifiers
setYieldChangeHelp(szHelpText, L"", L"", gDLL->getText("TXT_KEY_CIVIC_IN_CAPITAL").GetCString(), GC.getCivicInfo(eCivic).getCapitalYieldModifierArray(), true);
// Trade Yield Modifiers
setYieldChangeHelp(szHelpText, L"", L"", gDLL->getText("TXT_KEY_CIVIC_FROM_TRADE_ROUTES").GetCString(), GC.getCivicInfo(eCivic).getTradeYieldModifierArray(), true);
// Commerce Modifier
setCommerceChangeHelp(szHelpText, L"", L"", gDLL->getText("TXT_KEY_CIVIC_IN_ALL_CITIES").GetCString(), GC.getCivicInfo(eCivic).getCommerceModifierArray(), true);
// Capital Commerce Modifiers
setCommerceChangeHelp(szHelpText, L"", L"", gDLL->getText("TXT_KEY_CIVIC_IN_CAPITAL").GetCString(), GC.getCivicInfo(eCivic).getCapitalCommerceModifierArray(), true);
// Specialist Commerce
setCommerceChangeHelp(szHelpText, L"", L"", gDLL->getText("TXT_KEY_CIVIC_PER_SPECIALIST").GetCString(), GC.getCivicInfo(eCivic).getSpecialistExtraCommerceArray());
// Largest City Happiness
if (GC.getCivicInfo(eCivic).getLargestCityHappiness() != 0)
{
szHelpText.append(NEWLINE);
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_LARGEST_CITIES_HAPPINESS", GC.getCivicInfo(eCivic).getLargestCityHappiness(), ((GC.getCivicInfo(eCivic).getLargestCityHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getTargetNumCities()));
*/
// Use absolute value with unhappy face
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_LARGEST_CITIES_HAPPINESS", abs(GC.getCivicInfo(eCivic).getLargestCityHappiness()), ((GC.getCivicInfo(eCivic).getLargestCityHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getTargetNumCities()));
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
// Improvement Yields
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
iLast = 0;
for (iJ = 0; iJ < GC.getNumImprovementInfos(); iJ++)
{
if (GC.getCivicInfo(eCivic).getImprovementYieldChanges(iJ, iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_YIELD_CHANGE", GC.getCivicInfo(eCivic).getImprovementYieldChanges(iJ, iI), GC.getYieldInfo((YieldTypes)iI).getChar()).c_str());
CvWString szImprovement;
szImprovement.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iJ).getDescription());
setListHelp(szHelpText, szFirstBuffer, szImprovement, L", ", (GC.getCivicInfo(eCivic).getImprovementYieldChanges(iJ, iI) != iLast));
iLast = GC.getCivicInfo(eCivic).getImprovementYieldChanges(iJ, iI);
}
}
}
/************************************************************************************************/
/* Afforess Terrain Yield Modifier 12/4/09 */
/* */
/* */
/************************************************************************************************/
// Terrain Yields
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
iLast = 0;
for (iJ = 0; iJ < GC.getNumTerrainInfos(); iJ++)
{
if (kCivic.getTerrainYieldChanges(iJ, iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_TERRAIN_YIELD_CHANGE", kCivic.getTerrainYieldChanges(iJ, iI), GC.getYieldInfo((YieldTypes)iI).getChar()).c_str());
CvWString szTerrain;
szTerrain.Format(L"<link=literal>%s</link>", GC.getTerrainInfo((TerrainTypes)iJ).getDescription());
setListHelp(szHelpText, szFirstBuffer, szTerrain, L", ", (kCivic.getTerrainYieldChanges(iJ, iI) != iLast));
iLast = kCivic.getTerrainYieldChanges(iJ, iI);
}
}
}
// Building Happiness
int CounterHappy = -1; //Dummy Value
int CounterHealthy = -1; //Dummy Value
int XResolution = GC.getGameINLINE().getXResolution();
iLast = 0;
iCount = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (kCivic.getBuildingHappinessChanges(iI) != 0)
{
if (bPlayerContext && NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
if (NO_BUILDING != eBuilding)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BUILDING_HAPPINESS_PREFIX", abs(kCivic.getBuildingHappinessChanges(iI)), ((kCivic.getBuildingHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", (kCivic.getBuildingHappinessChanges(iI) != iLast));
if (iLast == kCivic.getBuildingHappinessChanges(iI)) iCount++;
iLast = kCivic.getBuildingHappinessChanges(iI);
if (iCount > 3) iCount = iLast = 0;
}
}
else
{
szHelpText.append(NEWLINE); // abs() below added by Supercheese 10/13/09 to fix "-1 Angry" issue
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_BUILDING_HAPPINESS", abs(kCivic.getBuildingHappinessChanges(iI)), ((kCivic.getBuildingHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), GC.getBuildingClassInfo((BuildingClassTypes)iI).getTextKeyWide()));
}
}
}
iLast = 0;
iCount = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (kCivic.getBuildingHealthChanges(iI) != 0)
{
if (bPlayerContext && NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
if (NO_BUILDING != eBuilding)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BUILDING_HAPPINESS_PREFIX", abs(kCivic.getBuildingHealthChanges(iI)), ((kCivic.getBuildingHealthChanges(iI) > 0) ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR))).c_str());
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", (kCivic.getBuildingHealthChanges(iI) != iLast));
if (iLast == kCivic.getBuildingHealthChanges(iI)) iCount++;
iLast = kCivic.getBuildingHealthChanges(iI);
if (iCount > 3) iCount = iLast = 0;
}
}
else
{
szHelpText.append(NEWLINE); // abs() below added by Supercheese 10/13/09 to fix "-1 Unhealthy" issue
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_BUILDING_HAPPINESS", abs(kCivic.getBuildingHealthChanges(iI)), ((kCivic.getBuildingHealthChanges(iI) > 0) ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)), GC.getBuildingClassInfo((BuildingClassTypes)iI).getTextKeyWide()));
}
}
}
if (kCivic.getEnslavementChance() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_UNIT_ENSLAVEMENT_CHANCE", kCivic.getEnslavementChance()));
}
for (iI = 0; iI < GC.getNumUnitCombatInfos(); iI++)
{
if (kCivic.getUnitCombatProductionModifier(iI) != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(CvWString::format(L"%c<link=literal>%s</link>", gDLL->getSymbolID(BULLET_CHAR), (GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription())));
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_UNIT_COMBAT_PRODUCTION_MOD", kCivic.getUnitCombatProductionModifier(iI)));
}
}
int CounterMod = 0;
CvWString szUnit;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
UnitTypes eLoopUnit;
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eLoopUnit = ((UnitTypes)(GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationUnits(iI)));
}
else
{
eLoopUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)iI).getDefaultUnitIndex();
}
if (GC.getGameINLINE().canEverTrain(eLoopUnit))
{
if (kCivic.getUnitClassProductionModifier(iI) != 0)
{
szFirstBuffer.Format(L"%s%c%d%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(kCivic.getUnitClassProductionModifier(iI)), (kCivic.getUnitClassProductionModifier(iI) > 0 ? gDLL->getText("TXT_KEY_UNIT_CLASS_PRODUCTION_FAST_MOD") : gDLL->getText("TXT_KEY_UNIT_CLASS_PRODUCTION_SLOW_MOD")).c_str());
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
szUnit.Format(L"<link=literal>%s</link>", GC.getUnitInfo(eLoopUnit).getDescription(GC.getGameINLINE().getActiveCivilizationType()));
}
else
{
szUnit.Format(L"<link=literal>%s</link>", GC.getUnitInfo(eLoopUnit).getDescription());
}
setListHelp(szHelpText, szFirstBuffer, szUnit, L", ", (kCivic.getUnitClassProductionModifier(iI) != iLast));
iLast = kCivic.getUnitClassProductionModifier(iI);
if (iLast == kCivic.getUnitClassProductionModifier(iI))
{
CounterMod++;
}
if (XResolution <= 1024 && CounterMod >= 3)
{
CounterMod = 0;
iLast = 0;
}
else if (XResolution > 1024 && XResolution < 1600 && CounterMod >= 4)
{
CounterMod = 0;
iLast = 0;
}
else if (XResolution > 1024 && XResolution < 2000 && CounterMod >= 6)
{
CounterMod = 0;
iLast = 0;
}
}
}
}
CvWString szBuilding;
CounterMod = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
if (kCivic.getBuildingClassProductionModifier(iI) != 0)
{
szFirstBuffer.Format(L"%s%c%d%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(kCivic.getBuildingClassProductionModifier(iI)), (kCivic.getBuildingClassProductionModifier(iI) > 0 ? gDLL->getText("TXT_KEY_CIVIC_BUILDING_CLASS_PRODUCTION_MOD") : gDLL->getText("TXT_KEY_CIVIC_BUILDING_CLASS_PRODUCTION_SLOW")).c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingClassInfo((BuildingClassTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", (kCivic.getBuildingClassProductionModifier(iI) != iLast));
iLast = kCivic.getBuildingClassProductionModifier(iI);
if (iLast == kCivic.getBuildingClassProductionModifier(iI))
{
CounterMod++;
}
if (XResolution <= 1024 && CounterMod >= 3)
{
CounterMod = 0;
iLast = 0;
}
else if (XResolution > 1024 && XResolution < 1600 && CounterMod >= 4)
{
CounterMod = 0;
iLast = 0;
}
else if (XResolution > 1024 && XResolution < 2000 && CounterMod >= 6)
{
CounterMod = 0;
iLast = 0;
}
}
}
CivicTypes eTargetCivic;
bool bEnemiesFirst = true;
if (bPlayerContext || GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
CvPlayer& kPlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CivicTypes eCurrentCivic = kPlayer.getCivics((CivicOptionTypes)kCivic.getCivicOptionType());
int aiPlayerDiplomacyChanges[MAX_CIV_PLAYERS];
for (int iK = 0; iK < MAX_CIV_PLAYERS; iK++)
{
aiPlayerDiplomacyChanges[iK] = 0;
if (GET_PLAYER((PlayerTypes)iK).isAlive())
{
if (!GET_PLAYER((PlayerTypes)iK).isHuman())
{
if (GET_TEAM(kPlayer.getTeam()).isHasMet(GET_PLAYER((PlayerTypes)iK).getTeam()))
{
for (int iL = 0; iL < GC.getNumCivicOptionInfos(); iL++)
{
eTargetCivic = GET_PLAYER((PlayerTypes)iK).getCivics((CivicOptionTypes)iL);
aiPlayerDiplomacyChanges[iK] += GC.getCivicInfo(eTargetCivic).getCivicAttitudeChange(eCivic) - GC.getCivicInfo(eTargetCivic).getCivicAttitudeChange(eCurrentCivic);
}
}
}
}
}
bFirst = true;
int iPlayerCount = 0;
int iEnemyCount = 0;
CvWString szPlayers;
CvWString szEnemies;
szEnemies.Format(L"");
szPlayers.Format(L"");
for (int iJ = 0; iJ < MAX_CIV_PLAYERS; iJ++)
{
if (aiPlayerDiplomacyChanges[iJ] > 0)
{
if (!bFirst)
szPlayers.append(CvWString::format(L", "));
szPlayers.append(CvWString::format(L"<link=literal>%s</link> (+%d)", GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)iJ).getCivilizationType()).getShortDescription(), aiPlayerDiplomacyChanges[iJ]));
bFirst = false;
//Resolution Scaling
iPlayerCount++;
if (iEnemyCount > XResolution / 10)
{
szPlayers.append(NEWLINE);
iEnemyCount = 0;
}
}
else if (aiPlayerDiplomacyChanges[iJ] < 0)
{
if (!bEnemiesFirst)
szEnemies.append(CvWString::format(L", "));
szEnemies.append(CvWString::format(L"<link=literal>%s</link> (%d)", GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)iJ).getCivilizationType()).getShortDescription(), aiPlayerDiplomacyChanges[iJ]));
bEnemiesFirst = false;
//Resolution Scaling
iEnemyCount++;
if (iEnemyCount > XResolution / 10)
{
szEnemies.append(NEWLINE);
iEnemyCount = 0;
}
}
}
if (!bFirst)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getSymbolID(BULLET_CHAR));
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_BOOSTS_DIPLOMACY"));
szHelpText.append(szPlayers);
}
if (!bEnemiesFirst)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getSymbolID(BULLET_CHAR));
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_HURTS_DIPLOMACY"));
szHelpText.append(szEnemies);
}
}
else
{
//Civilopedia Text
bFirst = true;
bEnemiesFirst = true;
int iAttitudeChange;
for (int iJ = 0; iJ < GC.getNumCivicInfos(); iJ++)
{
eTargetCivic = CivicTypes(iJ);
iAttitudeChange = GC.getCivicInfo(eTargetCivic).getCivicAttitudeChange(eCivic);
if (iAttitudeChange < 0)
{
if (bEnemiesFirst)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getSymbolID(BULLET_CHAR));
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_HURTS_DIPLOMACY_WITH_PLAYERS"));
}
else
szHelpText.append(CvWString::format(L", "));
szHelpText.append(CvWString::format(L"<link=literal>%s</link> (%d)", GC.getCivicInfo(eTargetCivic).getDescription(), iAttitudeChange));
bEnemiesFirst = false;
}
else if (iAttitudeChange > 0)
{
if (bFirst)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getSymbolID(BULLET_CHAR));
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_BOOSTS_DIPLOMACY_WITH_PLAYERS"));
}
else
szHelpText.append(CvWString::format(L", "));
szHelpText.append(CvWString::format(L"<link=literal>%s</link> (%d)", GC.getCivicInfo(eTargetCivic).getDescription(), iAttitudeChange));
bFirst = false;
}
}
}
if (kCivic.isTaxationAnger())
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_RAISING_TAXATION_ANGER"));
}
for (iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
if (kCivic.getFreeSpecialistCount(iI) > 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_BUILDING_FREE_SPECIALIST", kCivic.getFreeSpecialistCount(iI), GC.getSpecialistInfo((SpecialistTypes)iI).getTextKeyWide()));
szHelpText.append(gDLL->getText("TXT_KEY_BUILDING_GLOBAL"));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Feature Happiness
iLast = 0;
for (iI = 0; iI < GC.getNumFeatureInfos(); ++iI)
{
if (GC.getCivicInfo(eCivic).getFeatureHappinessChanges(iI) != 0)
{
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_FEATURE_HAPPINESS", GC.getCivicInfo(eCivic).getFeatureHappinessChanges(iI), ((GC.getCivicInfo(eCivic).getFeatureHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
*/
// Use absolute value with unhappy face
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_FEATURE_HAPPINESS", abs(GC.getCivicInfo(eCivic).getFeatureHappinessChanges(iI)), ((GC.getCivicInfo(eCivic).getFeatureHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
CvWString szFeature;
szFeature.Format(L"<link=literal>%s</link>", GC.getFeatureInfo((FeatureTypes)iI).getDescription());
setListHelp(szHelpText, szFirstBuffer, szFeature, L", ", (GC.getCivicInfo(eCivic).getFeatureHappinessChanges(iI) != iLast));
iLast = GC.getCivicInfo(eCivic).getFeatureHappinessChanges(iI);
}
}
// Hurry types
for (iI = 0; iI < GC.getNumHurryInfos(); ++iI)
{
if (GC.getCivicInfo(eCivic).isHurry(iI))
{
szHelpText.append(CvWString::format(L"%s%c%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), GC.getHurryInfo((HurryTypes)iI).getDescription()));
}
}
// Gold cost per unit
if (GC.getCivicInfo(eCivic).getGoldPerUnit() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_SUPPORT_COSTS", (GC.getCivicInfo(eCivic).getGoldPerUnit() > 0), GC.getCommerceInfo(COMMERCE_GOLD).getChar()));
}
// Gold cost per military unit
if (GC.getCivicInfo(eCivic).getGoldPerMilitaryUnit() != 0)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_MILITARY_SUPPORT_COSTS", (GC.getCivicInfo(eCivic).getGoldPerMilitaryUnit() > 0), GC.getCommerceInfo(COMMERCE_GOLD).getChar()));
}
/************************************************************************************************/
/* Afforess Start 02/01/10 */
/* */
/* */
/************************************************************************************************/
BuildingTypes eLoopBuilding;
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (bPlayerContext && NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING)
{
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
{
if ((GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCivic) || GC.getBuildingInfo(eLoopBuilding).isPrereqAndCivics(eCivic)))
{
CvWString szBuilding;
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_UNLOCKS_BUILDING").c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", bFirst);
bFirst = false;
}
}
}
}
bFirst = true;
if (NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
if (!GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic(eCivic))
{
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
if (eLoopBuilding != NO_BUILDING)
{
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
{
bool bObsolete = false;
CivicTypes eCurCivic = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCivics((CivicOptionTypes)GC.getCivicInfo(eCivic).getCivicOptionType());
if (GC.getBuildingInfo(eLoopBuilding).isPrereqAndCivics(eCurCivic))
{
bObsolete = true;
}
else if (GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCurCivic) && !GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics(eCivic))
{
bObsolete = true;
for (int iJ = 0; iJ < GC.getNumCivicInfos(); iJ++)
{
if (iJ != eCurCivic && iJ != eCivic)
{
if (GC.getBuildingInfo(eLoopBuilding).isPrereqOrCivics((CivicTypes)iJ))
{
if (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic((CivicTypes)iJ))
{
bObsolete = false;
break;
}
}
}
}
}
if (bObsolete)
{
CvWString szBuilding;
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BLOCKS_BUILDING").c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szHelpText, szFirstBuffer, szBuilding, L", ", bFirst);
bFirst = false;
}
}
}
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
kCivic.getPropertyManipulators()->buildDisplayString(szHelpText);
if (!CvWString(GC.getCivicInfo(eCivic).getHelp()).empty())
{
szHelpText.append(CvWString::format(L"%s%s", NEWLINE, GC.getCivicInfo(eCivic).getHelp()).c_str());
}
}
// BUG - Trade Denial - start
void CvGameTextMgr::setTechHelp(CvWStringBuffer &szBuffer, TechTypes eTech, bool bCivilopediaText, bool bPlayerContext, bool bStrategyText, bool bTreeInfo, TechTypes eFromTech)
{
setTechTradeHelp(szBuffer, eTech, NO_PLAYER, bCivilopediaText, bPlayerContext, bStrategyText, bTreeInfo, eFromTech);
}
void CvGameTextMgr::setTechTradeHelp(CvWStringBuffer &szBuffer, TechTypes eTech, PlayerTypes eTradePlayer, bool bCivilopediaText, bool bPlayerContext, bool bStrategyText, bool bTreeInfo, TechTypes eFromTech)
// BUG - Trade Denial - end
{
PROFILE_FUNC();
CvWString szTempBuffer;
CvWString szFirstBuffer;
BuildingTypes eLoopBuilding;
UnitTypes eLoopUnit;
bool bFirst;
int iI;
// show debug info if cheat level > 0 and alt down
bool bAlt = gDLL->altKey();
if (bAlt && (gDLL->getChtLvl() > 0))
{
szBuffer.clear();
for (int iI = 0; iI < MAX_PLAYERS; ++iI)
{
CvPlayerAI* playerI = &GET_PLAYER((PlayerTypes)iI);
CvTeamAI* teamI = &GET_TEAM(playerI->getTeam());
if (playerI->isAlive())
{
szTempBuffer.Format(L"%s: ", playerI->getName());
szBuffer.append(szTempBuffer);
TechTypes ePlayerTech = playerI->getCurrentResearch();
if (ePlayerTech == NO_TECH)
szTempBuffer.Format(L"-\n");
else
szTempBuffer.Format(L"%s (%d->%dt)(%d/%d)\n", GC.getTechInfo(ePlayerTech).getDescription(), playerI->calculateResearchRate(ePlayerTech), playerI->getResearchTurnsLeft(ePlayerTech, true), teamI->getResearchProgress(ePlayerTech), teamI->getResearchCost(ePlayerTech));
szBuffer.append(szTempBuffer);
}
}
return;
}
if (NO_TECH == eTech)
{
return;
}
// Tech Name
if (!bCivilopediaText && (!bTreeInfo || (NO_TECH == eFromTech)))
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_TECH_TEXT"), GC.getTechInfo(eTech).getDescription());
szBuffer.append(szTempBuffer);
}
FAssert(GC.getGameINLINE().getActivePlayer() != NO_PLAYER || !bPlayerContext);
if (bTreeInfo && (NO_TECH != eFromTech))
{
buildTechTreeString(szBuffer, eTech, bPlayerContext, eFromTech);
}
// Obsolete Buildings
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (!bPlayerContext || (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getBuildingClassCount((BuildingClassTypes)iI) > 0))
{
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
/************************************************************************************************/
/* Afforess Start 07/22/10 */
/* */
/* */
/************************************************************************************************/
/*
if (eLoopBuilding != NO_BUILDING)
*/
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
// Obsolete Buildings Check...
if (GC.getBuildingInfo(eLoopBuilding).getObsoleteTech() == eTech)
{
buildObsoleteString(szBuffer, eLoopBuilding, true);
}
}
}
}
// Obsolete Bonuses
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (GC.getBonusInfo((BonusTypes)iI).getTechObsolete() == eTech)
{
buildObsoleteBonusString(szBuffer, iI, true);
}
}
for (iI = 0; iI < GC.getNumSpecialBuildingInfos(); ++iI)
{
if (GC.getSpecialBuildingInfo((SpecialBuildingTypes) iI).getObsoleteTech() == eTech)
{
buildObsoleteSpecialString(szBuffer, iI, true);
}
}
// Route movement change...
buildMoveString(szBuffer, eTech, true, bPlayerContext);
// Creates a free unit...
buildFreeUnitString(szBuffer, eTech, true, bPlayerContext);
// Increases feature production...
buildFeatureProductionString(szBuffer, eTech, true, bPlayerContext);
// Increases worker build rate...
buildWorkerRateString(szBuffer, eTech, true, bPlayerContext);
//DPII < Maintenance Modifiers >
// Decreases maintenance costs...
buildMaintenanceModifiersString(szBuffer, eTech, true, bPlayerContext);
//DPII < Maintenance Modifiers >
// Trade Routed per city change...
buildTradeRouteString(szBuffer, eTech, true, bPlayerContext);
// Health increase...
buildHealthRateString(szBuffer, eTech, true, bPlayerContext);
// Happiness increase...
buildHappinessRateString(szBuffer, eTech, true, bPlayerContext);
// Free Techs...
buildFreeTechString(szBuffer, eTech, true, bPlayerContext);
// Line of Sight Bonus across water...
buildLOSString(szBuffer, eTech, true, bPlayerContext);
// Centers world map...
buildMapCenterString(szBuffer, eTech, true, bPlayerContext);
// Reveals World Map...
buildMapRevealString(szBuffer, eTech, true);
// Enables map trading...
buildMapTradeString(szBuffer, eTech, true, bPlayerContext);
// Enables tech trading...
buildTechTradeString(szBuffer, eTech, true, bPlayerContext);
// Enables gold trading...
buildGoldTradeString(szBuffer, eTech, true, bPlayerContext);
// Enables open borders...
buildOpenBordersString(szBuffer, eTech, true, bPlayerContext);
// Enables defensive pacts...
buildDefensivePactString(szBuffer, eTech, true, bPlayerContext);
// Enables permanent alliances...
buildPermanentAllianceString(szBuffer, eTech, true, bPlayerContext);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
CvTechInfo& kTech = GC.getTechInfo(eTech);
// Enables Embassies...
buildEmbassyString(szBuffer, eTech, true, bPlayerContext);
// Peak passability...
buildCanPassPeaksString(szBuffer, eTech, true, bPlayerContext);
// If it Removes Movement slowdown...
buildMoveFastPeaksString(szBuffer, eTech, true, bPlayerContext);
// Can found cities on peak...
buildCanFoundOnPeaksString(szBuffer, eTech, true, bPlayerContext);
// Removes Airlift Restriction...
buildCanRebaseAnywhereString(szBuffer, eTech, true, bPlayerContext);
if (kTech.getInflationModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ADJUSTS_INFLATION", kTech.getInflationModifier()));
}
if (kTech.getGlobalTradeModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_INCOME", kTech.getGlobalTradeModifier()));
}
if (kTech.getGlobalForeignTradeModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FOREIGN_TRADE_INCOME", kTech.getGlobalForeignTradeModifier()));
}
if (kTech.getTradeMissionModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_MISSION_INCOME", kTech.getTradeMissionModifier()));
}
if (kTech.getCorporationRevenueModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATIONS_REVENUE", kTech.getCorporationRevenueModifier()));
}
if (kTech.getCorporationMaintenanceModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_CORPORATION_MAINTENANCE", kTech.getCorporationMaintenanceModifier()));
}
if (kTech.isEnablesDesertFarming())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_ENABLES_DESERT_FARMING"));
}
CvWString szUnitName;
bool bFound = false;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
bFound = false;
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eLoopUnit = (UnitTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationUnits(iI);
if (eLoopUnit != NO_UNIT)
{
if (GC.getUnitInfo(eLoopUnit).getCivilizationName(GC.getGameINLINE().getActiveCivilizationType()) != NULL)
{
if (!CvWString(GC.getUnitInfo(eLoopUnit).getCivilizationName(GC.getGameINLINE().getActiveCivilizationType())).empty())
{
bFound = true;
szUnitName = gDLL->getText(GC.getUnitInfo(eLoopUnit).getCivilizationName(GC.getGameINLINE().getActiveCivilizationType()));
}
}
}
}
else
{
eLoopUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)iI).getDefaultUnitIndex();
}
if (!bFound)
{
if (eLoopUnit != NO_UNIT)
szUnitName = GC.getUnitInfo(eLoopUnit).getDescription();
}
if (eLoopUnit != NO_UNIT && kTech.getUnitClassStrengthChange(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_UNIT_STRENGTH_CHANGE", kTech.getUnitClassStrengthChange(iI), szUnitName.c_str()));
}
}
for (iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
if (kTech.getFreeSpecialistCount(iI) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_SPECIALIST", kTech.getFreeSpecialistCount(iI), GC.getSpecialistInfo((SpecialistTypes) iI).getTextKeyWide()));
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GLOBAL"));
}
}
for (iI = 0; iI < GC.getNumImprovementInfos(); ++iI)
{
if (GC.getImprovementInfo((ImprovementTypes)iI).getPrereqTech() == eTech && GC.getImprovementInfo((ImprovementTypes)iI).getImprovementPillage() != NO_IMPROVEMENT)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_ALLOWS_IMPROVEMENT_UPGRADE", GC.getImprovementInfo((ImprovementTypes)GC.getImprovementInfo((ImprovementTypes)iI).getImprovementPillage()).getTextKeyWide(), GC.getImprovementInfo((ImprovementTypes)iI).getTextKeyWide()));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Enables bridge building...
buildBridgeString(szBuffer, eTech, true, bPlayerContext);
// Can spread irrigation...
buildIrrigationString(szBuffer, eTech, true, bPlayerContext);
// Ignore irrigation...
buildIgnoreIrrigationString(szBuffer, eTech, true, bPlayerContext);
// Coastal work...
buildWaterWorkString(szBuffer, eTech, true, bPlayerContext);
// Enables permanent alliances...
buildVassalStateString(szBuffer, eTech, true, bPlayerContext);
// Build farm, irrigation, etc...
for (iI = 0; iI < GC.getNumBuildInfos(); ++iI)
{
buildImprovementString(szBuffer, eTech, iI, true, bPlayerContext);
}
// Extra moves for certain domains...
for (iI = 0; iI < NUM_DOMAIN_TYPES; ++iI)
{
buildDomainExtraMovesString(szBuffer, eTech, iI, true, bPlayerContext);
}
// Adjusting culture, science, etc
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
buildAdjustString(szBuffer, eTech, iI, true, bPlayerContext);
}
// Enabling trade routes on water...?
for (iI = 0; iI < GC.getNumTerrainInfos(); ++iI)
{
buildTerrainTradeString(szBuffer, eTech, iI, true, bPlayerContext);
}
//ls612: Tech Commerce Modifiers
setCommerceChangeHelp(szBuffer, szTempBuffer, L": ", L"", GC.getTechInfo(eTech).getCommerceModifierArray(), true, true);
buildRiverTradeString(szBuffer, eTech, true, bPlayerContext);
// Special Buildings
for (iI = 0; iI < GC.getNumSpecialBuildingInfos(); ++iI)
{
buildSpecialBuildingString(szBuffer, eTech, iI, true, bPlayerContext);
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
for (iI = 0; iI < GC.getNumBuildingInfos(); ++iI)
{
CvBuildingInfo& kBuilding = GC.getBuildingInfo((BuildingTypes)iI);
if (GC.getGameINLINE().canEverConstruct((BuildingTypes)iI))
{
// Building commerce changes
if (kBuilding.m_bAnyTechCommerceChanges)
buildBuildingTechCommerceChangeString(szBuffer, eTech, iI, true, bPlayerContext);
// Building yield changes
if (kBuilding.m_bAnyTechYieldChanges)
buildBuildingTechYieldChangeString(szBuffer, eTech, iI, true, bPlayerContext);
// Building specialist count changes
if (kBuilding.m_bAnyTechSpecialistChanges)
buildBuildingTechSpecialistChangeString(szBuffer, eTech, iI, true, bPlayerContext);
// Building commerce changes
if (kBuilding.m_bAnyTechCommerceModifiers)
buildBuildingTechCommerceModifierString(szBuffer, eTech, iI, true, bPlayerContext);
// Building yield changes
if (kBuilding.m_bAnyTechYieldModifiers)
buildBuildingTechYieldModifierString(szBuffer, eTech, iI, true, bPlayerContext);
// Building happy changes
buildBuildingTechHappinessChangesString(szBuffer, eTech, iI, true, bPlayerContext);
// Building health changes
buildBuildingTechHealthChangesString(szBuffer, eTech, iI, true, bPlayerContext);
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Build farm, mine, etc...
for (iI = 0; iI < GC.getNumImprovementInfos(); ++iI)
{
buildYieldChangeString(szBuffer, eTech, iI, true, bPlayerContext);
}
bFirst = true;
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
bFirst = buildBonusRevealString(szBuffer, eTech, iI, bFirst, true, bPlayerContext);
}
bFirst = true;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
bFirst = buildCivicRevealString(szBuffer, eTech, iI, bFirst, true, bPlayerContext);
}
if (!bCivilopediaText)
{
bFirst = true;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (!bPlayerContext || !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isProductionMaxedUnitClass((UnitClassTypes)iI)))
{
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eLoopUnit = (UnitTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationUnits(iI);
}
else
{
eLoopUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)iI).getDefaultUnitIndex();
}
/************************************************************************************************/
/* Afforess Start 07/22/10 */
/* */
/* */
/************************************************************************************************/
/*
if (eLoopUnit != NO_UNIT)
*/
if (GC.getGameINLINE().canEverTrain(eLoopUnit))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
if (!bPlayerContext || !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canTrain(eLoopUnit)))
{
if (GC.getUnitInfo(eLoopUnit).getPrereqAndTech() == eTech)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_TECH_CAN_TRAIN").c_str());
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo(eLoopUnit).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
else
{
for (int iJ = 0; iJ < GC.getNUM_UNIT_AND_TECH_PREREQS(); iJ++)
{
if (GC.getUnitInfo(eLoopUnit).getPrereqAndTechs(iJ) == eTech)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_TECH_CAN_TRAIN").c_str());
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo(eLoopUnit).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
break;
}
}
}
}
}
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (!bPlayerContext || !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isProductionMaxedBuildingClass((BuildingClassTypes)iI)))
{
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
/************************************************************************************************/
/* Afforess Start 07/22/10 */
/* */
/* */
/************************************************************************************************/
/*
if (eLoopBuilding != NO_BUILDING)
*/
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
if (!bPlayerContext || !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canConstruct(eLoopBuilding, false, true)))
{
if (GC.getBuildingInfo(eLoopBuilding).getPrereqAndTech() == eTech)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_TECH_CAN_CONSTRUCT").c_str());
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
else
{
for (int iJ = 0; iJ < GC.getNUM_BUILDING_AND_TECH_PREREQS(); iJ++)
{
if (GC.getBuildingInfo(eLoopBuilding).getPrereqAndTechs(iJ) == eTech)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_TECH_CAN_CONSTRUCT").c_str());
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
break;
}
}
}
}
}
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
if (!bPlayerContext || !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isProductionMaxedProject((ProjectTypes)iI)))
{
if (!bPlayerContext || !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canCreate(((ProjectTypes)iI), false, true)))
{
if (GC.getProjectInfo((ProjectTypes)iI).getTechPrereq() == eTech)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_TECH_CAN_CREATE").c_str());
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_PROJECT_TEXT"), GC.getProjectInfo((ProjectTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
}
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumProcessInfos(); ++iI)
{
bFirst = buildProcessInfoString(szBuffer, eTech, iI, bFirst, true, bPlayerContext);
}
bFirst = true;
for (iI = 0; iI < GC.getNumReligionInfos(); ++iI)
{
/************************************************************************************************/
/* RevDCM Start 4/29/10 */
/* */
/* OC_LIMITED_RELIGIONS */
/************************************************************************************************/
if (!bPlayerContext ||
(!(GC.getGameINLINE().isReligionSlotTaken((ReligionTypes)iI))
&& GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canFoundReligion()) )
/************************************************************************************************/
/* LIMITED_RELIGIONS END */
/************************************************************************************************/
{
bFirst = buildFoundReligionString(szBuffer, eTech, iI, bFirst, true, bPlayerContext);
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumCorporationInfos(); ++iI)
{
/************************************************************************************************/
/* Afforess Start 07/22/10 */
/* */
/* */
/************************************************************************************************/
/*
if (!bPlayerContext || !(GC.getGameINLINE().isCorporationFounded((CorporationTypes)iI)))
{
bFirst = buildFoundCorporationString(szBuffer, eTech, iI, bFirst, true, bPlayerContext);
}
*/
if (GC.getGameINLINE().canEverSpread((CorporationTypes)iI))
{
if (!bPlayerContext || !(GC.getGameINLINE().isCorporationFounded((CorporationTypes)iI)))
{
bFirst = buildFoundCorporationString(szBuffer, eTech, iI, bFirst, true, bPlayerContext);
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
bFirst = true;
for (iI = 0; iI < GC.getNumPromotionInfos(); ++iI)
{
bFirst = buildPromotionString(szBuffer, eTech, iI, bFirst, true, bPlayerContext);
}
/************************************************************************************************/
/* Afforess Start 01/03/10 */
/* */
/* */
/************************************************************************************************/
bFirst = true;
for (iI = 0; iI < GC.getNumPromotionInfos(); ++iI)
{
if (GC.getPromotionInfo((PromotionTypes)iI).getObsoleteTech() == eTech)
{
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_OBSOLETES", GC.getPromotionInfo((PromotionTypes)iI).getDescription()));
bFirst = false;
}
else
{
szTempBuffer.Format(L", <link=literal>%s</link>", GC.getPromotionInfo((PromotionTypes)iI).getDescription());
szBuffer.append(szTempBuffer);
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (bTreeInfo && NO_TECH == eFromTech)
{
buildSingleLineTechTreeString(szBuffer, eTech, bPlayerContext);
}
if (!CvWString(GC.getTechInfo(eTech).getHelp()).empty())
{
szBuffer.append(CvWString::format(L"%s%s", NEWLINE, GC.getTechInfo(eTech).getHelp()).c_str());
}
/************************************************************************************************/
/* Afforess Start 04/01/10 */
/* */
/* */
/************************************************************************************************/
if (bCivilopediaText || GC.getGameINLINE().getActivePlayer() == NO_PLAYER || !GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canResearch(eTech))
{
BuildingTypes eLoopBuilding;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
int iPrereq = GC.getTechInfo(eTech).getPrereqBuildingClass(iI) + GC.getTechInfo(eTech).getPrereqOrBuildingClass(iI);
if (iPrereq > 0)
{
if (GC.getGameINLINE().getActivePlayer() == NO_PLAYER)
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_SPECIAL_BUILDINGS_NO_CITY", GC.getBuildingInfo(eLoopBuilding).getTextKeyWide(), iPrereq).c_str());
}
else
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCivilizationType()).getCivilizationBuildings(iI)));
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_SPECIAL_BUILDINGS", GC.getBuildingInfo(eLoopBuilding).getTextKeyWide(), GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getBuildingClassCount((BuildingClassTypes)iI), iPrereq).c_str());
}
szBuffer.append(szTempBuffer);
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (!bCivilopediaText)
{
if (GC.getGameINLINE().getActivePlayer() == NO_PLAYER)
{
szTempBuffer.Format(L"\n%d%c", GC.getTechInfo(eTech).getResearchCost(), GC.getCommerceInfo(COMMERCE_RESEARCH).getChar());
szBuffer.append(szTempBuffer);
}
else if (GET_TEAM(GC.getGameINLINE().getActiveTeam()).isHasTech(eTech))
{
szTempBuffer.Format(L"\n%d%c", GET_TEAM(GC.getGameINLINE().getActiveTeam()).getResearchCost(eTech), GC.getCommerceInfo(COMMERCE_RESEARCH).getChar());
szBuffer.append(szTempBuffer);
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_NUM_TURNS", GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getResearchTurnsLeft(eTech, (gDLL->ctrlKey() || !(gDLL->shiftKey())))));
szTempBuffer.Format(L" (%d/%d %c)", GET_TEAM(GC.getGameINLINE().getActiveTeam()).getResearchProgress(eTech), GET_TEAM(GC.getGameINLINE().getActiveTeam()).getResearchCost(eTech), GC.getCommerceInfo(COMMERCE_RESEARCH).getChar());
szBuffer.append(szTempBuffer);
}
}
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
if (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canResearch(eTech))
{
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
CvUnitInfo& kUnit = GC.getUnitInfo((UnitTypes)iI);
if (kUnit.getBaseDiscover() > 0 || kUnit.getDiscoverMultiplier() > 0)
{
if (::getDiscoveryTech((UnitTypes)iI, GC.getGameINLINE().getActivePlayer()) == eTech)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_GREAT_PERSON_DISCOVER", kUnit.getTextKeyWide()));
}
}
}
if (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCurrentEra() < GC.getTechInfo(eTech).getEra())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TECH_ERA_ADVANCE", GC.getEraInfo((EraTypes)GC.getTechInfo(eTech).getEra()).getTextKeyWide()));
}
}
}
// BUG - Trade Denial - start
if (eTradePlayer != NO_PLAYER && GC.getGameINLINE().getActivePlayer() != NO_PLAYER && getBugOptionBOOL("MiscHover__TechTradeDenial", true, "BUG_TECH_TRADE_DENIAL_HOVER"))
{
TradeData trade;
trade.m_eItemType = TRADE_TECHNOLOGIES;
trade.m_iData = eTech;
if (GET_PLAYER(eTradePlayer).canTradeItem(GC.getGameINLINE().getActivePlayer(), trade, false))
{
DenialTypes eDenial = GET_PLAYER(eTradePlayer).getTradeDenial(GC.getGameINLINE().getActivePlayer(), trade);
if (eDenial != NO_DENIAL)
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), GC.getDenialInfo(eDenial).getDescription());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
}
}
// BUG - Trade Denial - end
if (bStrategyText)
{
if (!CvWString(GC.getTechInfo(eTech).getStrategy()).empty())
{
if ((GC.getGameINLINE().getActivePlayer() == NO_PLAYER) || GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isOption(PLAYEROPTION_ADVISOR_HELP))
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_SIDS_TIPS"));
szBuffer.append(L'\"');
szBuffer.append(GC.getTechInfo(eTech).getStrategy());
szBuffer.append(L'\"');
}
}
}
}
void CvGameTextMgr::setBasicUnitHelp(CvWStringBuffer &szBuffer, UnitTypes eUnit, bool bCivilopediaText)
{
// BUG - Starting Experience - start
setBasicUnitHelpWithCity(szBuffer, eUnit, bCivilopediaText);
}
void CvGameTextMgr::setBasicUnitHelpWithCity(CvWStringBuffer &szBuffer, UnitTypes eUnit, bool bCivilopediaText, CvCity* pCity, bool bConscript)
{
// BUG - Starting Experience - end
PROFILE_FUNC();
CvWString szTempBuffer;
bool bFirst;
int iCount;
int iI;
if (NO_UNIT == eUnit)
{
return;
}
if (!bCivilopediaText)
{
szBuffer.append(NEWLINE);
if (GC.getUnitInfo(eUnit).getDomainType() == DOMAIN_AIR)
{
if (GC.getUnitInfo(eUnit).getAirCombat() > 0)
{
szTempBuffer.Format(L"%d%c, ", GC.getUnitInfo(eUnit).getAirCombat(), gDLL->getSymbolID(STRENGTH_CHAR));
szBuffer.append(szTempBuffer);
}
}
else
{
/************************************************************************************************/
/* Afforess Start 6/11/11 */
/* */
/* */
/************************************************************************************************/
int iCombat = (GC.getUnitInfo(eUnit).getCombat() +
(GC.getGame().getActiveTeam() == NO_TEAM ? 0 : (
GET_TEAM(pCity != NULL ? pCity->getTeam() : GC.getGame().getActiveTeam()).getUnitClassStrengthChange((UnitClassTypes)GC.getUnitInfo(eUnit).getUnitClassType()))));
if (iCombat > 0)
{
szTempBuffer.Format(L"%d%c, ", iCombat, gDLL->getSymbolID(STRENGTH_CHAR));
szBuffer.append(szTempBuffer);
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
szTempBuffer.Format(L"%d%c", GC.getUnitInfo(eUnit).getMoves(), gDLL->getSymbolID(MOVES_CHAR));
szBuffer.append(szTempBuffer);
if (GC.getUnitInfo(eUnit).getAirRange() > 0)
{
szBuffer.append(L", ");
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_AIR_RANGE", GC.getUnitInfo(eUnit).getAirRange()));
}
// BUG - Starting Experience - start
if (pCity != NULL && getBugOptionBOOL("MiscHover__UnitExperience", true, "BUG_UNIT_EXPERIENCE_HOVER"))
{
setUnitExperienceHelp(szBuffer, L", ", eUnit, pCity, bConscript);
}
// BUG - Starting Experience - end
}
if (GC.getUnitInfo(eUnit).isGoldenAge())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_GOLDEN_AGE"));
}
if (GC.getUnitInfo(eUnit).getLeaderExperience() > 0)
{
if (0 == GC.getDefineINT("WARLORD_EXTRA_EXPERIENCE_PER_UNIT_PERCENT"))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_LEADER", GC.getUnitInfo(eUnit).getLeaderExperience()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_LEADER_EXPERIENCE", GC.getUnitInfo(eUnit).getLeaderExperience()));
}
}
if (NO_PROMOTION != GC.getUnitInfo(eUnit).getLeaderPromotion())
{
szBuffer.append(CvWString::format(L"%s%c%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), gDLL->getText("TXT_KEY_PROMOTION_WHEN_LEADING").GetCString()));
parsePromotionHelp(szBuffer, (PromotionTypes)GC.getUnitInfo(eUnit).getLeaderPromotion(), L"\n ");
}
if ((GC.getUnitInfo(eUnit).getBaseDiscover() > 0) || (GC.getUnitInfo(eUnit).getDiscoverMultiplier() > 0))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_DISCOVER_TECH"));
}
if ((GC.getUnitInfo(eUnit).getBaseHurry() > 0) || (GC.getUnitInfo(eUnit).getHurryMultiplier() > 0))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HURRY_PRODUCTION"));
}
/************************************************************************************************/
/* Afforess Start 12/31/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).getBaseFoodChange() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HURRY_FOOD"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if ((GC.getUnitInfo(eUnit).getBaseTrade() > 0) || (GC.getUnitInfo(eUnit).getTradeMultiplier() > 0))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_TRADE_MISSION"));
}
if (GC.getUnitInfo(eUnit).getGreatWorkCulture() > 0)
{
int iCulture = GC.getUnitInfo(eUnit).getGreatWorkCulture();
if (NO_GAMESPEED != GC.getGameINLINE().getGameSpeedType())
{
iCulture *= GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getUnitGreatWorkPercent();
iCulture /= 100;
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_GREAT_WORK", iCulture));
}
if (GC.getUnitInfo(eUnit).getEspionagePoints() > 0)
{
int iEspionage = GC.getUnitInfo(eUnit).getEspionagePoints();
if (NO_GAMESPEED != GC.getGameINLINE().getGameSpeedType())
{
iEspionage *= GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getUnitGreatWorkPercent();
iEspionage /= 100;
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ESPIONAGE_MISSION", iEspionage));
}
bFirst = true;
for (iI = 0; iI < GC.getNumReligionInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getReligionSpreads(iI) > 0)
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CAN_SPREAD").c_str());
CvWString szReligion;
szReligion.Format(L"<link=literal>%s</link>", GC.getReligionInfo((ReligionTypes) iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szReligion, L", ", bFirst);
bFirst = false;
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumCorporationInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getCorporationSpreads(iI) > 0)
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CAN_EXPAND").c_str());
CvWString szCorporation;
szCorporation.Format(L"<link=literal>%s</link>", GC.getCorporationInfo((CorporationTypes) iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szCorporation, L", ", bFirst);
bFirst = false;
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getGreatPeoples(iI))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CAN_JOIN").c_str());
CvWString szSpecialistLink = CvWString::format(L"<link=literal>%s</link>", GC.getSpecialistInfo((SpecialistTypes) iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szSpecialistLink.GetCString(), L", ", bFirst);
bFirst = false;
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getBuildings(iI) || GC.getUnitInfo(eUnit).getForceBuildings(iI))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CAN_CONSTRUCT").c_str());
CvWString szBuildingLink = CvWString::format(L"<link=literal>%s</link>", GC.getBuildingInfo((BuildingTypes) iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szBuildingLink.GetCString(), L", ", bFirst);
bFirst = false;
}
}
// Thomas SG - AC: Advanced Cargo START
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_CARGO))
{
if (GC.getUnitInfo(eUnit).getTotalCargoSpace() > 0)
{
int GeneralCargo = GC.getUnitInfo(eUnit).getTotalCargoSpace();
for (iI = 0; iI < GC.getUnitInfo(eUnit).getNumSpecialCargos(); iI++)
{
GeneralCargo -= GC.getUnitInfo(eUnit).getSpecialCargoSpace(iI);
}
if (GeneralCargo > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CARGO_SPACE", GeneralCargo));
}
if (GC.getUnitInfo(eUnit).getNumSpecialCargos() > 0)
{
for (iI = 0; iI < GC.getUnitInfo(eUnit).getNumSpecialCargos(); iI++)
{
if (GC.getUnitInfo(eUnit).getSpecialCargoSpace(iI) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CARGO_SPACE", GC.getUnitInfo(eUnit).getSpecialCargoSpace(iI)));
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ADVANCED_CARGO", GC.getSpecialUnitInfo((SpecialUnitTypes) GC.getUnitInfo(eUnit).getSpecialCargo(iI)).getTextKeyWide()));
}
}
}
}
}
else
{
if (GC.getUnitInfo(eUnit).getCargoSpace() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CARGO_SPACE", GC.getUnitInfo(eUnit).getCargoSpace()));
if (GC.getUnitInfo(eUnit).getNumSpecialCargos() > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CARRIES", GC.getSpecialUnitInfo((SpecialUnitTypes) GC.getUnitInfo(eUnit).getSpecialCargo(0)).getTextKeyWide()));
}
}
}
// Thomas SG - AC: Advanced Cargo END
szTempBuffer.Format(L"%s%s ", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CANNOT_ENTER").GetCString());
bFirst = true;
for (iI = 0; iI < GC.getNumTerrainInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getTerrainImpassable(iI))
{
CvWString szTerrain;
TechTypes eTech = (TechTypes)GC.getUnitInfo(eUnit).getTerrainPassableTech(iI);
if (NO_TECH == eTech)
{
szTerrain.Format(L"<link=literal>%s</link>", GC.getTerrainInfo((TerrainTypes)iI).getDescription());
}
else
{
szTerrain = gDLL->getText("TXT_KEY_TERRAIN_UNTIL_TECH", GC.getTerrainInfo((TerrainTypes)iI).getTextKeyWide(), GC.getTechInfo(eTech).getTextKeyWide());
}
setListHelp(szBuffer, szTempBuffer, szTerrain, L", ", bFirst);
bFirst = false;
}
}
/************************************************************************************************/
/* Afforess Route Restricter Start 08/03/09 */
/* */
/* */
/************************************************************************************************/
szTempBuffer.clear();
szTempBuffer.Format(L"%s%s ", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CAN_ONLY_TRAVERSE").GetCString());
bFirst = true;
for (iI = 0; iI < GC.getNumRouteInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getPassableRouteNeeded(iI))
{
CvWString szRoute;
szRoute.Format(L"<link=literal>%s</link>", GC.getRouteInfo((RouteTypes)iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szRoute, L", ", bFirst);
bFirst = false;
}
}
/************************************************************************************************/
/* Afforess Route Restricter End END */
/************************************************************************************************/
for (iI = 0; iI < GC.getNumFeatureInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getFeatureImpassable(iI))
{
CvWString szFeature;
TechTypes eTech = (TechTypes)GC.getUnitInfo(eUnit).getFeaturePassableTech(iI);
if (NO_TECH == eTech)
{
szFeature.Format(L"<link=literal>%s</link>", GC.getFeatureInfo((FeatureTypes)iI).getDescription());
}
else
{
szFeature = gDLL->getText("TXT_KEY_TERRAIN_UNTIL_TECH", GC.getFeatureInfo((FeatureTypes)iI).getTextKeyWide(), GC.getTechInfo(eTech).getTextKeyWide());
}
setListHelp(szBuffer, szTempBuffer, szFeature, L", ", bFirst);
bFirst = false;
}
}
if (GC.getUnitInfo(eUnit).isInvisible())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INVISIBLE_ALL"));
}
else if (GC.getUnitInfo(eUnit).getInvisibleType() != NO_INVISIBLE)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INVISIBLE_MOST"));
}
for (iI = 0; iI < GC.getUnitInfo(eUnit).getNumSeeInvisibleTypes(); ++iI)
{
if (bCivilopediaText || (GC.getUnitInfo(eUnit).getSeeInvisibleType(iI) != GC.getUnitInfo(eUnit).getInvisibleType()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_SEE_INVISIBLE", GC.getInvisibleInfo((InvisibleTypes) GC.getUnitInfo(eUnit).getSeeInvisibleType(iI)).getTextKeyWide()));
}
}
if (GC.getUnitInfo(eUnit).isCanMoveImpassable())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CAN_MOVE_IMPASSABLE"));
}
if (GC.getUnitInfo(eUnit).isNoBadGoodies())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_NO_BAD_GOODIES"));
}
if (GC.getUnitInfo(eUnit).isHiddenNationality())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HIDDEN_NATIONALITY"));
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).isRequiresStateReligionInCity())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES_STATE_RELIGION_IN_CITY"));
}
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_DIPLOMACY) || bCivilopediaText)
{
if (GC.getUnitInfo(eUnit).isMilitaryTrade() || GC.getUnitInfo(eUnit).isWorkerTrade())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADABLE_UNIT"));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).isAlwaysHostile())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ALWAYS_HOSTILE"));
}
if (GC.getUnitInfo(eUnit).isOnlyDefensive())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ONLY_DEFENSIVE"));
}
if (GC.getUnitInfo(eUnit).isNoCapture())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CANNOT_CAPTURE"));
}
if (GC.getUnitInfo(eUnit).isRivalTerritory())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EXPLORE_RIVAL"));
}
if (GC.getUnitInfo(eUnit).isFound())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_FOUND_CITY"));
}
/************************************************************************************************/
/* REVDCM_OC 02/16/10 phungus420 */
/* */
/* Inquisitions */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).isInquisitor())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_IS_INQUISITOR"));
}
/************************************************************************************************/
/* REVDCM_OC END */
/************************************************************************************************/
iCount = 0;
for (iI = 0; iI < GC.getNumBuildInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getBuilds(iI))
{
iCount++;
}
}
if (iCount > ((GC.getNumBuildInfos() * 3) / 4))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_IMPROVE_PLOTS"));
}
else
{
bFirst = true;
for (iI = 0; iI < GC.getNumBuildInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getBuilds(iI))
{
szTempBuffer.Format(L"%s%s ", NEWLINE, gDLL->getText("TXT_KEY_UNIT_CAN").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getBuildInfo((BuildTypes) iI).getDescription(), L", ", bFirst);
bFirst = false;
}
}
}
if (GC.getUnitInfo(eUnit).getNukeRange() != -1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CAN_NUKE"));
}
if (GC.getUnitInfo(eUnit).isCounterSpy())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EXPOSE_SPIES"));
}
if ((GC.getUnitInfo(eUnit).getFirstStrikes() + GC.getUnitInfo(eUnit).getChanceFirstStrikes()) > 0)
{
if (GC.getUnitInfo(eUnit).getChanceFirstStrikes() == 0)
{
if (GC.getUnitInfo(eUnit).getFirstStrikes() == 1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", GC.getUnitInfo(eUnit).getFirstStrikes()));
}
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", GC.getUnitInfo(eUnit).getFirstStrikes(), GC.getUnitInfo(eUnit).getFirstStrikes() + GC.getUnitInfo(eUnit).getChanceFirstStrikes()));
}
}
if (GC.getUnitInfo(eUnit).isFirstStrikeImmune())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_IMMUNE_FIRST_STRIKES"));
}
if (GC.getUnitInfo(eUnit).isNoDefensiveBonus())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_NO_DEFENSE_BONUSES"));
}
if (GC.getUnitInfo(eUnit).isFlatMovementCost())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_FLAT_MOVEMENT"));
}
if (GC.getUnitInfo(eUnit).isIgnoreTerrainCost())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_IGNORE_TERRAIN"));
}
if (GC.getUnitInfo(eUnit).getInterceptionProbability() > 0)
{
//TSHEEP Display Spy Messages Differently
if(GC.getUnitInfo(eUnit).isSpy())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT_SPY", GC.getUnitInfo(eUnit).getInterceptionProbability()));
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT_SPY_COUNTER", GC.getUnitInfo(eUnit).getInterceptionProbability() * 5));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT", GC.getUnitInfo(eUnit).getInterceptionProbability()));
}
//szBuffer.append(NEWLINE);
//szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INTERCEPT_AIRCRAFT", GC.getUnitInfo(eUnit).getInterceptionProbability()));
//TSHEEP End
}
if (GC.getUnitInfo(eUnit).getEvasionProbability() > 0)
{
//TSHEEP Display Spy Messages Differently
if(GC.getUnitInfo(eUnit).isSpy())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EVADE_INTERCEPTION_SPY", GC.getUnitInfo(eUnit).getEvasionProbability()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EVADE_INTERCEPTION", GC.getUnitInfo(eUnit).getEvasionProbability()));
}
//szBuffer.append(NEWLINE);
//szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EVADE_INTERCEPTION", GC.getUnitInfo(eUnit).getEvasionProbability()));
//TSHEEP End
}
if (GC.getUnitInfo(eUnit).getWithdrawalProbability() > 0)
{
//TSHEEP Display Spy Messages Differently
if(GC.getUnitInfo(eUnit).isSpy())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ESCAPE_SPY", GC.getUnitInfo(eUnit).getWithdrawalProbability()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WITHDRAWL_PROBABILITY", GC.getUnitInfo(eUnit).getWithdrawalProbability()));
}
//szBuffer.append(NEWLINE);
//szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WITHDRAWL_PROBABILITY", GC.getUnitInfo(eUnit).getWithdrawalProbability()));
//TSHEEP End
}
if (GC.getUnitInfo(eUnit).getCombatLimit() < GC.getMAX_HIT_POINTS() && GC.getUnitInfo(eUnit).getCombat() > 0 && !GC.getUnitInfo(eUnit).isOnlyDefensive())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_COMBAT_LIMIT", (100 * GC.getUnitInfo(eUnit).getCombatLimit()) / GC.getMAX_HIT_POINTS()));
}
if (GC.getUnitInfo(eUnit).getCollateralDamage() > 0)
{
szBuffer.append(NEWLINE);
//RevDCM Max Damage to collateral
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_COLLATERAL_DAMAGE_REVDCM", 100 * GC.getUnitInfo(eUnit).getCollateralDamageLimit() / GC.getMAX_HIT_POINTS(), GC.getUnitInfo(eUnit).getCollateralDamageMaxUnits()));
//RevDCM end
}
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getUnitCombatCollateralImmune(iI))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_COLLATERAL_IMMUNE", GC.getUnitCombatInfo((UnitCombatTypes)iI).getTextKeyWide()));
}
}
if (GC.getUnitInfo(eUnit).getCityAttackModifier() == GC.getUnitInfo(eUnit).getCityDefenseModifier())
{
if (GC.getUnitInfo(eUnit).getCityAttackModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CITY_STRENGTH_MOD", GC.getUnitInfo(eUnit).getCityAttackModifier()));
}
}
else
{
if (GC.getUnitInfo(eUnit).getCityAttackModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CITY_ATTACK_MOD", GC.getUnitInfo(eUnit).getCityAttackModifier()));
}
if (GC.getUnitInfo(eUnit).getCityDefenseModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CITY_DEFENSE_MOD", GC.getUnitInfo(eUnit).getCityDefenseModifier()));
}
}
if (GC.getUnitInfo(eUnit).getAnimalCombatModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ANIMAL_COMBAT_MOD", GC.getUnitInfo(eUnit).getAnimalCombatModifier()));
}
if (GC.getUnitInfo(eUnit).getDropRange() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_PARADROP_RANGE", GC.getUnitInfo(eUnit).getDropRange()));
}
if (GC.getUnitInfo(eUnit).getHillsDefenseModifier() == GC.getUnitInfo(eUnit).getHillsAttackModifier())
{
if (GC.getUnitInfo(eUnit).getHillsAttackModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HILLS_STRENGTH", GC.getUnitInfo(eUnit).getHillsAttackModifier()));
}
}
else
{
if (GC.getUnitInfo(eUnit).getHillsAttackModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HILLS_ATTACK", GC.getUnitInfo(eUnit).getHillsAttackModifier()));
}
if (GC.getUnitInfo(eUnit).getHillsDefenseModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_HILLS_DEFENSE", GC.getUnitInfo(eUnit).getHillsDefenseModifier()));
}
}
for (iI = 0; iI < GC.getNumTerrainInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getTerrainDefenseModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_DEFENSE", GC.getUnitInfo(eUnit).getTerrainDefenseModifier(iI), GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
if (GC.getUnitInfo(eUnit).getTerrainAttackModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ATTACK", GC.getUnitInfo(eUnit).getTerrainAttackModifier(iI), GC.getTerrainInfo((TerrainTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < GC.getNumFeatureInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getFeatureDefenseModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_DEFENSE", GC.getUnitInfo(eUnit).getFeatureDefenseModifier(iI), GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
if (GC.getUnitInfo(eUnit).getFeatureAttackModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ATTACK", GC.getUnitInfo(eUnit).getFeatureAttackModifier(iI), GC.getFeatureInfo((FeatureTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getUnitClassAttackModifier(iI) == GC.getUnitInfo(eUnit).getUnitClassDefenseModifier(iI))
{
if (GC.getUnitInfo(eUnit).getUnitClassAttackModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_MOD_VS_TYPE", GC.getUnitInfo(eUnit).getUnitClassAttackModifier(iI), GC.getUnitClassInfo((UnitClassTypes)iI).getTextKeyWide()));
}
}
else
{
if (GC.getUnitInfo(eUnit).getUnitClassAttackModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_ATTACK_MOD_VS_CLASS", GC.getUnitInfo(eUnit).getUnitClassAttackModifier(iI), GC.getUnitClassInfo((UnitClassTypes)iI).getTextKeyWide()));
}
if (GC.getUnitInfo(eUnit).getUnitClassDefenseModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_DEFENSE_MOD_VS_CLASS", GC.getUnitInfo(eUnit).getUnitClassDefenseModifier(iI), GC.getUnitClassInfo((UnitClassTypes) iI).getTextKeyWide()));
}
}
}
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getUnitCombatModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_MOD_VS_TYPE", GC.getUnitInfo(eUnit).getUnitCombatModifier(iI), GC.getUnitCombatInfo((UnitCombatTypes) iI).getTextKeyWide()));
}
}
for (iI = 0; iI < NUM_DOMAIN_TYPES; ++iI)
{
if (GC.getUnitInfo(eUnit).getDomainModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_MOD_VS_TYPE_NO_LINK", GC.getUnitInfo(eUnit).getDomainModifier(iI), GC.getDomainInfo((DomainTypes)iI).getTextKeyWide()));
}
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getTargetUnitClass(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitClassInfo((UnitClassTypes)iI).getDescription());
}
}
if (!bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_TARGETS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getDefenderUnitClass(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitClassInfo((UnitClassTypes)iI).getDescription());
}
}
if (!bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_DEFENDS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getTargetUnitCombat(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
}
}
if (!bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_TARGETS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getDefenderUnitCombat(iI))
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
}
}
if (!bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_DEFENDS_UNIT_FIRST", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
bFirst = true;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getFlankingStrikeUnitClass(iI) > 0)
{
if (bFirst)
{
bFirst = false;
}
else
{
szTempBuffer += L", ";
}
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getUnitClassInfo((UnitClassTypes)iI).getDescription());
}
}
if (!bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_FLANKING_STRIKES", szTempBuffer.GetCString()));
}
if (GC.getUnitInfo(eUnit).getBombRate() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_BOMB_RATE", ((GC.getUnitInfo(eUnit).getBombRate() * 100) / GC.getMAX_CITY_DEFENSE_DAMAGE())));
}
/************************************************************************************************/
/* DCM 04/19/09 Johny Smith */
/************************************************************************************************/
// Dale - RB: Field Bombard START
if (GC.isDCM_RANGE_BOMBARD())
{
if (GC.getUnitInfo(eUnit).getDCMBombRange() > 0 || GC.getUnitInfo(eUnit).getDCMBombAccuracy() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IS_DCM_BOMBARD"));
}
if (GC.getUnitInfo(eUnit).getDCMBombRange() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IS_RANGE_BOMBARD", GC.getUnitInfo(eUnit).getDCMBombRange()));
}
if (GC.getUnitInfo(eUnit).getDCMBombAccuracy() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IS_ACCURACY_BOMBARD", GC.getUnitInfo(eUnit).getDCMBombAccuracy()));
}
}
/************************************************************************************************/
/* DCM END */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).getBombardRate() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_BOMBARD_RATE", ((GC.getUnitInfo(eUnit).getBombardRate() * 100) / GC.getMAX_CITY_DEFENSE_DAMAGE())));
}
/************************************************************************************************/
/* DCM 04/19/09 Johny Smith */
/************************************************************************************************/
// Dale - RB: Field Bombard END
// Dale - FE: Fighters START
if (GC.isDCM_FIGHTER_ENGAGE())
{
if (GC.getUnitInfo(eUnit).getDCMFighterEngage())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IS_FIGHTER_ENGAGE"));
}
}
// Dale - FE: Fighters END
/************************************************************************************************/
/* DCM END */
/************************************************************************************************/
bFirst = true;
for (iI = 0; iI < GC.getNumPromotionInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getFreePromotions(iI))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_UNIT_STARTS_WITH").c_str());
setListHelp(szBuffer, szTempBuffer, CvWString::format(L"<link=literal>%s</link>", GC.getPromotionInfo((PromotionTypes) iI).getDescription()), L", ", bFirst);
bFirst = false;
}
}
GC.getUnitInfo(eUnit).getPropertyManipulators()->buildDisplayString(szBuffer);
// BUG - Starting Experience - start
if (pCity != NULL && getBugOptionBOOL("MiscHover__UnitExperienceModifiers", true, "BUG_UNIT_EXPERIENCE_MODIFIERS_HOVER"))
{
CvUnitInfo& kUnit = GC.getUnitInfo(eUnit);
CvPlayer& kPlayer = GET_PLAYER(pCity->getOwnerINLINE());
CvCivilizationInfo& kCivilization = GC.getCivilizationInfo(pCity->getCivilizationType());
UnitClassTypes eUnitClass = (UnitClassTypes)kUnit.getUnitClassType();
UnitCombatTypes eCombatType = (UnitCombatTypes)kUnit.getUnitCombatType();
DomainTypes eDomainType = (DomainTypes)kUnit.getDomainType();
if ((UnitTypes)kCivilization.getCivilizationUnits(eUnitClass) == eUnit && kUnit.canAcquireExperience())
{
int iExperience;
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
bool bFirst = true;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
iExperience = pCity->getFreeExperience();
if (iExperience != 0)
{
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WILL_RECEIVE_FREE_EXPERIENCE"));
}
bFirst = false;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CITY_FREE_EXPERIENCE", iExperience));
}
iExperience = kPlayer.getFreeExperience();
if (iExperience != 0)
{
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WILL_RECEIVE_FREE_EXPERIENCE"));
}
bFirst = false;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PLAYER_FREE_EXPERIENCE", iExperience));
}
iExperience = pCity->getSpecialistFreeExperience();
if (iExperience != 0)
{
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WILL_RECEIVE_FREE_EXPERIENCE"));
}
bFirst = false;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_SPECIALIST_FREE_EXPERIENCE", iExperience));
}
for (int iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
BuildingTypes eLoopBuilding = (BuildingTypes)kCivilization.getCivilizationBuildings((BuildingClassTypes)iI);
if (eLoopBuilding == NO_BUILDING)
{
continue;
}
CvBuildingInfo& kBuilding = GC.getBuildingInfo(eLoopBuilding);
/************************************************************************************************/
/* RevDCM Start 5/2/09 */
/* */
/* Experience */
/************************************************************************************************/
iExperience = kBuilding.getUnitCombatFreeExperience(eCombatType);
iExperience += kBuilding.getDomainFreeExperience(eDomainType);
/************************************************************************************************/
/* Experience END */
/************************************************************************************************/
if (iExperience != 0)
{
if (pCity->getNumBuilding(eLoopBuilding) > 0)
{
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WILL_RECEIVE_FREE_EXPERIENCE"));
}
bFirst = false;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_EXPERIENCE", iExperience, kBuilding.getTextKeyWide()));
}
else if (pCity->canConstruct(eLoopBuilding, false, true))
{
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WILL_RECEIVE_FREE_EXPERIENCE"));
}
bFirst = false;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_NO_BUILDING_FREE_EXPERIENCE", iExperience, kBuilding.getTextKeyWide()));
}
}
}
if (kPlayer.getStateReligion() != NO_RELIGION)
{
iExperience = kPlayer.getStateReligionFreeExperience();
if (iExperience != 0)
{
if (pCity->isHasReligion(kPlayer.getStateReligion()))
{
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WILL_RECEIVE_FREE_EXPERIENCE"));
}
bFirst = false;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_STATE_RELIGION_FREE_EXPERIENCE", iExperience));
}
else
{
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* */
/************************************************************************************************/
if (bFirst)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WILL_RECEIVE_FREE_EXPERIENCE"));
}
bFirst = false;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_NO_STATE_RELIGION_FREE_EXPERIENCE", iExperience));
}
}
}
}
}
// BUG - Starting Experience - end
if (GC.getUnitInfo(eUnit).getExtraCost() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EXTRA_COST", GC.getUnitInfo(eUnit).getExtraCost()));
}
/************************************************************************************************/
/* Great Diplomat MOD START Stolenrays */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).isStealPlans())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_STEAL_PLANS"));
}
if (GC.getUnitInfo(eUnit).isInvestigate())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INVESTIGATE_CITY"));
}
if (GC.getUnitInfo(eUnit).isBribeBarbarian())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_BRIBE_BARBARIAN"));
}
if (GC.getUnitInfo(eUnit).isGoodwill())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_GOODWILL"));
}
if (GC.getUnitInfo(eUnit).canForcePeace())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_CAN_FORCE_PEACE"));
}
if (GC.getUnitInfo(eUnit).isUpgradeImprovements())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_UPGRADE_IMPROVEMENTS"));
}
/************************************************************************************************/
/* Great Diplomat MOD END */
/************************************************************************************************/
if (bCivilopediaText)
{
/************************************************************************************************/
/* REVDCM 02/16/10 phungus420 */
/* */
/* CanTrain */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).getMaxStartEra() != NO_ERA)
{
szTempBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_MAX_START_ERA", GC.getEraInfo((EraTypes)GC.getUnitInfo(eUnit).getMaxStartEra()).getTextKeyWide()));
}
if (GC.getUnitInfo(eUnit).isStateReligion())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_STATE_RELIGION"));
}
/************************************************************************************************/
/* REVDCM END */
/************************************************************************************************/
// Trait
for (int i = 0; i < GC.getNumTraitInfos(); ++i)
{
if (GC.getUnitInfo(eUnit).getProductionTraits((TraitTypes)i) != 0)
{
if (GC.getUnitInfo(eUnit).getProductionTraits((TraitTypes)i) == 100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_DOUBLE_SPEED_TRAIT", GC.getTraitInfo((TraitTypes)i).getTextKeyWide()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PRODUCTION_MODIFIER_TRAIT", GC.getUnitInfo(eUnit).getProductionTraits((TraitTypes)i), GC.getTraitInfo((TraitTypes)i).getTextKeyWide()));
}
}
}
}
if (!CvWString(GC.getUnitInfo(eUnit).getHelp()).empty())
{
szBuffer.append(NEWLINE);
szBuffer.append(GC.getUnitInfo(eUnit).getHelp());
}
if (!CvWString(GC.getUnitInfo(eUnit).getExtraHoverText()).empty())
{
szBuffer.append(NEWLINE);
szBuffer.append(GC.getUnitInfo(eUnit).getExtraHoverText());
}
}
// BUG - Starting Experience - start
/*
* Appends the starting experience and number of promotions the given unit will have
* when trained or conscripted in the given city.
*/
void CvGameTextMgr::setUnitExperienceHelp(CvWStringBuffer &szBuffer, CvWString szStart, UnitTypes eUnit, CvCity* pCity, bool bConscript)
{
if (GC.getUnitInfo(eUnit).canAcquireExperience())
{
int iExperience = pCity->getProductionExperience(eUnit) >> (bConscript ? 1 : 0);
if (iExperience > 0)
{
szBuffer.append(szStart);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_EXPERIENCE", iExperience));
int iLevel = calculateLevel(iExperience, pCity->getOwnerINLINE());
if (iLevel > 1)
{
szBuffer.append(L", ");
szBuffer.append(gDLL->getText("TXT_KEY_MISC_PROMOTIONS", iLevel - 1));
}
}
}
}
// BUG - Starting Experience - end
void CvGameTextMgr::setUnitHelp(CvWStringBuffer &szBuffer, UnitTypes eUnit, bool bCivilopediaText, bool bStrategyText, bool bTechChooserText, CvCity* pCity)
{
PROFILE_FUNC();
CvWString szTempBuffer;
PlayerTypes ePlayer;
bool bFirst;
int iProduction;
int iI;
if (NO_UNIT == eUnit)
{
return;
}
if (pCity != NULL)
{
ePlayer = pCity->getOwnerINLINE();
}
else
{
ePlayer = GC.getGameINLINE().getActivePlayer();
}
if (!bCivilopediaText)
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo(eUnit).getDescription());
szBuffer.append(szTempBuffer);
if (GC.getUnitInfo(eUnit).getUnitCombatType() != NO_UNITCOMBAT)
{
szTempBuffer.Format(L" (%s)", GC.getUnitCombatInfo((UnitCombatTypes) GC.getUnitInfo(eUnit).getUnitCombatType()).getDescription());
szBuffer.append(szTempBuffer);
}
}
// test for unique unit
UnitClassTypes eUnitClass = (UnitClassTypes)GC.getUnitInfo(eUnit).getUnitClassType();
UnitTypes eDefaultUnit = (UnitTypes)GC.getUnitClassInfo(eUnitClass).getDefaultUnitIndex();
/************************************************************************************************/
/* Afforess Start 12/23/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getUnitClassInfo(eUnitClass).isUnique() || eDefaultUnit != eUnit)
{
bool bFound = false;
for (iI = 0; iI < GC.getNumCivilizationInfos(); ++iI)
{
UnitTypes eUniqueUnit = (UnitTypes)GC.getCivilizationInfo((CivilizationTypes)iI).getCivilizationUnits((int)eUnitClass);
if (eUniqueUnit == eUnit)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIQUE_UNIT", GC.getCivilizationInfo((CivilizationTypes)iI).getTextKeyWide()));
bFound = true;
}
}
if (bFound)
{
if (NO_UNIT != eDefaultUnit && eDefaultUnit != eUnit && !GC.getUnitClassInfo(eUnitClass).isUnique())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REPLACES_UNIT", GC.getUnitInfo(eDefaultUnit).getTextKeyWide()));
}
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_RESTRICTED_UNIT"));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (isWorldUnitClass(eUnitClass))
{
if (pCity == NULL)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WORLD_UNIT_ALLOWED", GC.getUnitClassInfo(eUnitClass).getMaxGlobalInstances()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WORLD_UNIT_LEFT", (GC.getUnitClassInfo(eUnitClass).getMaxGlobalInstances() - (ePlayer != NO_PLAYER ? GC.getGameINLINE().getUnitClassCreatedCount(eUnitClass) + GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getUnitClassMaking(eUnitClass) : 0))));
}
}
if (isTeamUnitClass(eUnitClass))
{
//TB Unlimited National Units Mod
if (!GC.getGameINLINE().isOption(GAMEOPTION_UNLIMITED_NATIONAL_UNITS) || GC.getUnitClassInfo(eUnitClass).isUnlimitedException())
{
if (pCity == NULL)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_TEAM_UNIT_ALLOWED", GC.getUnitClassInfo(eUnitClass).getMaxTeamInstances()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_TEAM_UNIT_LEFT", (GC.getUnitClassInfo(eUnitClass).getMaxTeamInstances() - (ePlayer != NO_PLAYER ? GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getUnitClassCountPlusMaking(eUnitClass) : 0))));
}
}
//TB Unlimied National Units End
}
if (isNationalUnitClass(eUnitClass))
{
//TB Unlimited National Units Mod
if (!GC.getGameINLINE().isOption(GAMEOPTION_UNLIMITED_NATIONAL_UNITS) || GC.getUnitClassInfo(eUnitClass).isUnlimitedException())
{
if (pCity == NULL)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_NATIONAL_UNIT_ALLOWED", GC.getUnitClassInfo(eUnitClass).getMaxPlayerInstances()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_NATIONAL_UNIT_LEFT", (GC.getUnitClassInfo(eUnitClass).getMaxPlayerInstances() - (ePlayer != NO_PLAYER ? GET_PLAYER(ePlayer).getUnitClassCountPlusMaking(eUnitClass) : 0))));
}
}
//TB Unlimied National Units End
}
if (0 != GC.getUnitClassInfo(eUnitClass).getInstanceCostModifier())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_INSTANCE_COST_MOD", GC.getUnitClassInfo(eUnitClass).getInstanceCostModifier()));
}
// BUG - Starting Experience - start
setBasicUnitHelpWithCity(szBuffer, eUnit, bCivilopediaText, pCity);
// BUG - Starting Experience - end
if ((pCity == NULL) || !(pCity->canTrain(eUnit)))
{
if (pCity != NULL)
{
if (GC.getGameINLINE().isNoNukes())
{
if (GC.getUnitInfo(eUnit).getNukeRange() != -1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_NO_NUKES"));
}
}
}
if (GC.getUnitInfo(eUnit).getHolyCity() != NO_RELIGION)
{
if ((pCity == NULL) || !(pCity->isHolyCity((ReligionTypes)(GC.getUnitInfo(eUnit).getHolyCity()))))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_HOLY_CITY", GC.getReligionInfo((ReligionTypes)(GC.getUnitInfo(eUnit).getHolyCity())).getChar()));
}
}
bFirst = true;
//Advanced Cargo START
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_CARGO))
{
if (GC.getUnitInfo(eUnit).getNumSpecialUnitTypes() > 0)
{
for (int iJ = 0; iJ < GC.getUnitInfo(eUnit).getNumSpecialUnitTypes(); ++iJ)
{
if ((pCity == NULL) || !(GC.getGameINLINE().isSpecialUnitValid((SpecialUnitTypes)(GC.getUnitInfo(eUnit).getSpecialUnitType(iJ)))))
{
for (iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
for (int iK = 0; iK < GC.getUnitInfo(eUnit).getNumSpecialUnitTypes(); ++iK)
{
if (GC.getProjectInfo((ProjectTypes)iI).getEveryoneSpecialUnit() == GC.getUnitInfo(eUnit).getSpecialUnitType(iK))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
CvWString szProject;
szProject.Format(L"<link=literal>%s</link>", GC.getProjectInfo((ProjectTypes)iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szProject, gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
}
}
}
}
}
else
{
if (GC.getUnitInfo(eUnit).getNumSpecialUnitTypes() > 0)
{
if ((pCity == NULL) || !(GC.getGameINLINE().isSpecialUnitValid((SpecialUnitTypes)(GC.getUnitInfo(eUnit).getSpecialUnitType(0)))))
{
for (iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
if (GC.getProjectInfo((ProjectTypes)iI).getEveryoneSpecialUnit() == GC.getUnitInfo(eUnit).getSpecialUnitType(0))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
CvWString szProject;
szProject.Format(L"<link=literal>%s</link>", GC.getProjectInfo((ProjectTypes)iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szProject, gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
//Advanced Cargo END
}
}
}
}
if (!bFirst)
{
szBuffer.append(ENDCOLR);
}
bFirst = true;
if (GC.getUnitInfo(eUnit).getNukeRange() != -1)
{
if (NULL == pCity || !GET_PLAYER(ePlayer).isNukesValid())
{
for (iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
if (GC.getProjectInfo((ProjectTypes)iI).isAllowsNukes())
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
CvWString szProject;
szProject.Format(L"<link=literal>%s</link>", GC.getProjectInfo((ProjectTypes)iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szProject, gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
for (iI = 0; iI < GC.getNumBuildingInfos(); ++iI)
{
if (GC.getBuildingInfo((BuildingTypes)iI).isAllowsNukes())
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo((BuildingTypes)iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szBuilding, gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
}
}
if (!bFirst)
{
szBuffer.append(ENDCOLR);
}
/************************************************************************************************/
/* Afforess Vicinity Bonus Start 07/29/09 */
/* */
/* */
/************************************************************************************************/
if (GC.getUnitInfo(eUnit).getPrereqVicinityBonus() != NO_BONUS)
{
if ((pCity == NULL) || !(pCity->canTrain(eUnit)))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES_VICINITY_BONUS", GC.getBonusInfo((BonusTypes)(GC.getUnitInfo(eUnit).getPrereqVicinityBonus())).getTextKeyWide()));
}
}
bFirst = true;
for (iI = 0; iI < GC.getNUM_UNIT_PREREQ_OR_BONUSES(); ++iI)
{
if (GC.getUnitInfo(eUnit).getPrereqOrVicinityBonuses(iI) != NO_BONUS)
{
if ((pCity == NULL) || !(pCity->canTrain(eUnit)))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES_IN_CITY_VICINITY").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getBonusInfo((BonusTypes) GC.getUnitInfo(eUnit).getPrereqOrVicinityBonuses(iI)).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
}
if (!bFirst)
{
szBuffer.append(ENDCOLR);
}
/************************************************************************************************/
/* Afforess Vicinity Bonus End END */
/************************************************************************************************/
if (!bCivilopediaText)
{
if (GC.getUnitInfo(eUnit).getPrereqBuilding() != NO_BUILDING)
{
if ((pCity == NULL) || (pCity->getNumBuilding((BuildingTypes)(GC.getUnitInfo(eUnit).getPrereqBuilding())) <= 0))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_STRING", GC.getBuildingInfo((BuildingTypes)(GC.getUnitInfo(eUnit).getPrereqBuilding())).getTextKeyWide()));
}
}
bFirst = true;
int iNum = GC.getUnitInfo(eUnit).getPrereqOrBuildingsNum();
bool bNeeded = true;
if (pCity)
{
for (iI = 0; iI < iNum; iI++) // Check if this requirement has been met already
{
BuildingTypes eBuilding = GC.getUnitInfo(eUnit).getPrereqOrBuilding(iI);
if (pCity->getNumBuilding(eBuilding) > 0)
{
bNeeded = false;
break;
}
}
}
if (bNeeded)
{
for (iI = 0; iI < iNum; iI++)
{
BuildingTypes eBuilding = GC.getUnitInfo(eUnit).getPrereqOrBuilding(iI);
if (!bFirst)
{
szBuffer.append(gDLL->getText("TXT_KEY_OR"));
CvWString szBuilding;
szBuffer.append(gDLL->getText("TXT_KEY_SET_WARNING_COLOR"));
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eBuilding).getDescription());
szBuffer.append(szBuilding);
szBuffer.append(ENDCOLR);
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_STRING", GC.getBuildingInfo(eBuilding).getTextKeyWide()));
bFirst = false;
}
}
}
if (!bTechChooserText)
{
if (GC.getUnitInfo(eUnit).getPrereqAndTech() != NO_TECH)
{
if (GC.getGameINLINE().getActivePlayer() == NO_PLAYER || !(GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasTech((TechTypes)(GC.getUnitInfo(eUnit).getPrereqAndTech()))))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_STRING", GC.getTechInfo((TechTypes)(GC.getUnitInfo(eUnit).getPrereqAndTech())).getTextKeyWide()));
}
}
}
bFirst = true;
for (iI = 0; iI < GC.getNUM_UNIT_AND_TECH_PREREQS(); ++iI)
{
if (GC.getUnitInfo(eUnit).getPrereqAndTechs(iI) != NO_TECH)
{
if (bTechChooserText || GC.getGameINLINE().getActivePlayer() == NO_PLAYER || !(GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasTech((TechTypes)(GC.getUnitInfo(eUnit).getPrereqAndTechs(iI)))))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getTechInfo(((TechTypes)(GC.getUnitInfo(eUnit).getPrereqAndTechs(iI)))).getDescription(), gDLL->getText("TXT_KEY_AND").c_str(), bFirst);
bFirst = false;
}
}
}
if (!bFirst)
{
szBuffer.append(ENDCOLR);
}
if (GC.getUnitInfo(eUnit).getPrereqAndBonus() != NO_BONUS)
{
if ((pCity == NULL) || !(pCity->hasBonus((BonusTypes)GC.getUnitInfo(eUnit).getPrereqAndBonus())))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_STRING", GC.getBonusInfo((BonusTypes)(GC.getUnitInfo(eUnit).getPrereqAndBonus())).getTextKeyWide()));
}
}
bFirst = true;
for (iI = 0; iI < GC.getNUM_UNIT_PREREQ_OR_BONUSES(); ++iI)
{
if (GC.getUnitInfo(eUnit).getPrereqOrBonuses(iI) != NO_BONUS)
{
if ((pCity == NULL) || !(pCity->hasBonus((BonusTypes)GC.getUnitInfo(eUnit).getPrereqOrBonuses(iI))))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getBonusInfo((BonusTypes) GC.getUnitInfo(eUnit).getPrereqOrBonuses(iI)).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
}
/************************************************************************************************/
/* REVDCM 02/16/10 phungus420 */
/* */
/* CanTrain */
/************************************************************************************************/
bFirst = true;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).isPrereqOrCivics(CivicTypes(iI)))
{
bool civicActive = (pCity == NULL ?
(GC.getGameINLINE().getActivePlayer() != NO_PLAYER && GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic(CivicTypes(iI))) :
GET_PLAYER(pCity->getOwnerINLINE()).isCivic(CivicTypes(iI)));
CvWString prefix = gDLL->getText("TXT_KEY_REVERT_COLOR") + gDLL->getText("TXT_KEY_REQUIRES_NO_WARNING");
CvWString desc = GC.getCivicInfo((CivicTypes(iI))).getDescription();
CvWString separator = gDLL->getText("TXT_KEY_REVERT_COLOR") + gDLL->getText("TXT_KEY_OR");
if (!civicActive)
{
desc = gDLL->getText("TXT_KEY_SET_WARNING_COLOR") + desc;
}
else
{
desc = gDLL->getText("TXT_KEY_POSITIVE_COLOR") + desc;
}
szTempBuffer.Format(L"%s%s", NEWLINE, prefix.c_str());
setListHelp(szBuffer,szTempBuffer, desc.c_str(), separator.c_str(), bFirst);
bFirst = false;
}
}
for (iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
if (GC.getUnitInfo(eUnit).isPrereqBuildingClass(iI))
{
BuildingTypes eRequiredBuilding = NO_BUILDING;
if (!pCity)
{
if (ePlayer != NO_PLAYER)
{
if(GET_PLAYER(ePlayer).isBuildingClassRequiredToTrain(BuildingClassTypes(iI), eUnit))
{
eRequiredBuilding = (BuildingTypes)GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI);
}
}
else
{
// show default building
eRequiredBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
}
else
{
// show unique building for city's owner if city doesn't have any
if(GET_PLAYER(ePlayer).isBuildingClassRequiredToTrain(BuildingClassTypes(iI), eUnit))
{
eRequiredBuilding = (BuildingTypes)GC.getCivilizationInfo(pCity->getCivilizationType()).getCivilizationBuildings(iI);
if(pCity->getNumBuilding(eRequiredBuilding))
{
eRequiredBuilding = NO_BUILDING;
}
}
}
if (eRequiredBuilding != NO_BUILDING)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_STRING", GC.getBuildingInfo(eRequiredBuilding).getTextKeyWide()));
}
}
}
if (GC.getUnitInfo(eUnit).isStateReligion())
{
if ((pCity == NULL) || GET_PLAYER(ePlayer).getStateReligion() == NO_RELIGION || !pCity->isHasReligion(GET_PLAYER(ePlayer).getStateReligion()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES_STATE_RELIGION"));
}
}
if (GC.getUnitInfo(eUnit).isInquisitor())
{
if ((pCity == NULL) || !GET_PLAYER(ePlayer).isInquisitionConditions())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_NOT_INQUISITION_CONDITIONS"));
}
}
/************************************************************************************************/
/* REVDCM END */
/************************************************************************************************/
if (!bFirst)
{
szBuffer.append(ENDCOLR);
}
}
}
if (!bCivilopediaText && GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
if (pCity == NULL)
{
szTempBuffer.Format(L"%s%d%c", NEWLINE, GET_PLAYER(ePlayer).getProductionNeeded(eUnit), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
szBuffer.append(szTempBuffer);
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_TURNS", pCity->getProductionTurnsLeft(eUnit, ((gDLL->ctrlKey() || !(gDLL->shiftKey())) ? 0 : pCity->getOrderQueueLength())), pCity->getProductionNeeded(eUnit), GC.getYieldInfo(YIELD_PRODUCTION).getChar()));
iProduction = pCity->getUnitProduction(eUnit);
if (iProduction > 0)
{
szTempBuffer.Format(L" - %d/%d%c", iProduction, pCity->getProductionNeeded(eUnit), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
szBuffer.append(szTempBuffer);
// BUG - Production Decay - start
if (getBugOptionBOOL("CityScreen__ProductionDecayHover", true, "BUG_PRODUCTION_DECAY_HOVER"))
{
setProductionDecayHelp(szBuffer, pCity->getUnitProductionDecayTurns(eUnit), getBugOptionINT("CityScreen__ProductionDecayHoverUnitThreshold", 5, "BUG_PRODUCTION_DECAY_HOVER_UNIT_THRESHOLD"), pCity->getUnitProductionDecay(eUnit), pCity->getProductionUnit() == eUnit);
}
// BUG - Production Decay - end
}
else
{
szTempBuffer.Format(L" - %d%c", pCity->getProductionNeeded(eUnit), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
szBuffer.append(szTempBuffer);
}
}
}
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (GC.getUnitInfo(eUnit).getBonusProductionModifier(iI) != 0)
{
if (pCity != NULL)
{
if (pCity->hasBonus((BonusTypes)iI))
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
}
}
if (!bCivilopediaText)
{
szBuffer.append(L" (");
}
else
{
szTempBuffer.Format(L"%s%c", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), szTempBuffer.c_str());
szBuffer.append(szTempBuffer);
}
if (GC.getUnitInfo(eUnit).getBonusProductionModifier(iI) == 100)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_DOUBLE_SPEED", GC.getBonusInfo((BonusTypes)iI).getTextKeyWide()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_BUILDS_FASTER", GC.getUnitInfo(eUnit).getBonusProductionModifier(iI), GC.getBonusInfo((BonusTypes)iI).getTextKeyWide()));
}
if (!bCivilopediaText)
{
szBuffer.append(L")");
}
if (pCity != NULL)
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
}
}
}
BoolExpr* pExpr = GC.getUnitInfo(eUnit).getTrainCondition();
if (pExpr)
{
bool bEval = false;
if (pCity)
{
bEval = pExpr->evaluate(const_cast<CvGameObjectCity*>(pCity->getGameObjectConst())); // Const wegcasten ist hier ok da evaluate nicht wirklich etwas ändert
}
if (!bEval)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES"));
szBuffer.append(" ");
pExpr->buildDisplayString(szBuffer);
}
}
if (bStrategyText)
{
if (!CvWString(GC.getUnitInfo(eUnit).getStrategy()).empty())
{
if ((ePlayer == NO_PLAYER) || GET_PLAYER(ePlayer).isOption(PLAYEROPTION_ADVISOR_HELP))
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_SIDS_TIPS"));
szBuffer.append(L'\"');
szBuffer.append(GC.getUnitInfo(eUnit).getStrategy());
szBuffer.append(L'\"');
}
}
}
if (bCivilopediaText)
{
if (eDefaultUnit == eUnit)
{
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
if (iI != eUnit)
{
if (eUnitClass == GC.getUnitInfo((UnitTypes)iI).getUnitClassType())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REPLACED_BY_UNIT", GC.getUnitInfo((UnitTypes)iI).getTextKeyWide()));
}
}
}
}
}
if (pCity != NULL)
{
if ((gDLL->getChtLvl() > 0) && gDLL->ctrlKey())
{
szBuffer.append(NEWLINE);
for (int iUnitAI = 0; iUnitAI < NUM_UNITAI_TYPES; iUnitAI++)
{
int iTempValue = GET_PLAYER(pCity->getOwner()).AI_unitValue(eUnit, (UnitAITypes)iUnitAI, pCity->area());
if (iTempValue != 0)
{
CvWString szTempString;
getUnitAIString(szTempString, (UnitAITypes)iUnitAI);
szBuffer.append(CvWString::format(L"(%s : %d) ", szTempString.GetCString(), iTempValue));
}
}
}
}
}
// BUG - Building Actual Effects - start
/*
* Adds the actual effects of adding a building to the city.
*/
void CvGameTextMgr::setBuildingActualEffects(CvWStringBuffer &szBuffer, CvWString& szStart, BuildingTypes eBuilding, CvCity* pCity, bool bNewLine)
{
if (NULL != pCity)
{
bool bStarted = false;
// Defense
int iDefense = pCity->getAdditionalDefenseByBuilding(eBuilding);
bStarted = setResumableValueChangeHelp(szBuffer, szStart, L": ", L"", iDefense, gDLL->getSymbolID(DEFENSE_CHAR), true, bNewLine, bStarted);
// Happiness
int iGood = 0;
int iBad = 0;
int iAngryPop = 0;
int iHappiness = pCity->getAdditionalHappinessByBuilding(eBuilding, iGood, iBad, iAngryPop);
bStarted = setResumableGoodBadChangeHelp(szBuffer, szStart, L": ", L"", iGood, gDLL->getSymbolID(HAPPY_CHAR), iBad, gDLL->getSymbolID(UNHAPPY_CHAR), false, bNewLine, bStarted);
bStarted = setResumableValueChangeHelp(szBuffer, szStart, L": ", L"", iAngryPop, gDLL->getSymbolID(ANGRY_POP_CHAR), false, bNewLine, bStarted);
// Health
iGood = 0;
iBad = 0;
int iSpoiledFood = 0;
int iStarvation = 0;
int iHealth = pCity->getAdditionalHealthByBuilding(eBuilding, iGood, iBad, iSpoiledFood, iStarvation);
bStarted = setResumableGoodBadChangeHelp(szBuffer, szStart, L": ", L"", iGood, gDLL->getSymbolID(HEALTHY_CHAR), iBad, gDLL->getSymbolID(UNHEALTHY_CHAR), false, bNewLine, bStarted);
bStarted = setResumableValueChangeHelp(szBuffer, szStart, L": ", L"", iSpoiledFood, gDLL->getSymbolID(EATEN_FOOD_CHAR), false, bNewLine, bStarted);
bStarted = setResumableValueChangeHelp(szBuffer, szStart, L": ", L"", iStarvation, gDLL->getSymbolID(BAD_FOOD_CHAR), false, bNewLine, bStarted);
// Yield
int aiYields[NUM_YIELD_TYPES];
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = pCity->getAdditionalYieldByBuilding((YieldTypes)iI, eBuilding);
}
/************************************************************************************************/
/* Afforess Start 07/16/10 */
/* */
/* */
/************************************************************************************************/
int iCommerce = aiYields[YIELD_COMMERCE];
aiYields[YIELD_COMMERCE] = 0;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
bStarted = setResumableYieldChangeHelp(szBuffer, szStart, L": ", L"", aiYields, false, bNewLine, bStarted);
// Commerce
int aiCommerces[NUM_COMMERCE_TYPES];
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
aiCommerces[iI] = pCity->getAdditionalCommerceTimes100ByBuilding((CommerceTypes)iI, eBuilding);
/************************************************************************************************/
/* Afforess Start 07/16/10 */
/* */
/* */
/************************************************************************************************/
aiCommerces[iI] += iCommerce * GET_PLAYER(pCity->getOwnerINLINE()).getCommercePercent((CommerceTypes)iI);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
// Maintenance - add to gold
aiCommerces[COMMERCE_GOLD] += pCity->getSavedMaintenanceTimes100ByBuilding(eBuilding);
bStarted = setResumableCommerceTimes100ChangeHelp(szBuffer, szStart, L": ", L"", aiCommerces, bNewLine, bStarted);
// Great People
int iGreatPeopleRate = pCity->getAdditionalGreatPeopleRateByBuilding(eBuilding);
bStarted = setResumableValueChangeHelp(szBuffer, szStart, L": ", L"", iGreatPeopleRate, gDLL->getSymbolID(GREAT_PEOPLE_CHAR), false, bNewLine, bStarted);
}
}
/*
* Calls new function below without displaying actual effects.
*/
void CvGameTextMgr::setBuildingHelp(CvWStringBuffer &szBuffer, BuildingTypes eBuilding, bool bCivilopediaText, bool bStrategyText, bool bTechChooserText, CvCity* pCity)
{
setBuildingHelpActual(szBuffer, eBuilding, bCivilopediaText, bStrategyText, bTechChooserText, pCity, false);
}
/*
* Adds option to display actual effects.
*/
void CvGameTextMgr::setBuildingHelpActual(CvWStringBuffer &szBuffer, BuildingTypes eBuilding, bool bCivilopediaText, bool bStrategyText, bool bTechChooserText, CvCity* pCity, bool bActual)
// BUG - Building Actual Effects - end
{
PROFILE_FUNC();
CvWString szFirstBuffer;
CvWString szTempBuffer;
BuildingTypes eLoopBuilding;
UnitTypes eGreatPeopleUnit;
PlayerTypes ePlayer;
TeamTypes eTeam = NO_TEAM;
bool bFirst;
int iProduction;
int iLast;
int iI;
if (NO_BUILDING == eBuilding)
{
return;
}
CvBuildingInfo& kBuilding = GC.getBuildingInfo(eBuilding);
if (pCity != NULL)
{
ePlayer = pCity->getOwnerINLINE();
}
else
{
ePlayer = GC.getGameINLINE().getActivePlayer();
}
if (ePlayer != NO_PLAYER)
{
eTeam = GET_PLAYER(ePlayer).getTeam();
}
if (!bCivilopediaText)
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_BUILDING_TEXT"), kBuilding.getDescription());
szBuffer.append(szTempBuffer);
//ls612: bNoHolyCity tag text
if (kBuilding.isNoHolyCity())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_NO_HOLY_CITY"));
}
int iHappiness;
if (NULL != pCity)
{
iHappiness = pCity->getBuildingHappiness(eBuilding);
}
else
{
iHappiness = kBuilding.getHappiness();
}
if (iHappiness != 0)
{
szTempBuffer.Format(L", +%d%c", abs(iHappiness), ((iHappiness > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)));
szBuffer.append(szTempBuffer);
}
int iHealth;
if (NULL != pCity)
{
iHealth = pCity->getBuildingGoodHealth(eBuilding);
}
else
{
iHealth = kBuilding.getHealth();
if (ePlayer != NO_PLAYER)
{
if (eBuilding == GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(kBuilding.getBuildingClassType()))
{
iHealth += GET_PLAYER(ePlayer).getExtraBuildingHealth(eBuilding);
}
}
}
if (iHealth != 0)
{
szTempBuffer.Format(L", +%d%c", abs(iHealth), ((iHealth > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR)));
szBuffer.append(szTempBuffer);
}
iHealth = 0;
if (NULL != pCity)
{
iHealth = pCity->getBuildingBadHealth(eBuilding);
}
if (iHealth != 0)
{
szTempBuffer.Format(L", +%d%c", abs(iHealth), ((iHealth > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR)));
szBuffer.append(szTempBuffer);
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
/* Was:
int aiYields[NUM_YIELD_TYPES];
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = kBuilding.getYieldChange(iI);
if (NULL != pCity)
{
aiYields[iI] += pCity->getBuildingYieldChange((BuildingClassTypes)kBuilding.getBuildingClassType(), (YieldTypes)iI);
}
}
setYieldChangeHelp(szBuffer, L", ", L"", L"", aiYields, false, false);
int aiCommerces[NUM_COMMERCE_TYPES];
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
if ((NULL != pCity) && (pCity->getNumBuilding(eBuilding) > 0))
{
aiCommerces[iI] = pCity->getBuildingCommerceByBuilding((CommerceTypes)iI, eBuilding);
}
else
{
aiCommerces[iI] = kBuilding.getCommerceChange(iI);
aiCommerces[iI] += kBuilding.getObsoleteSafeCommerceChange(iI);
}
}
setCommerceChangeHelp(szBuffer, L", ", L"", L"", aiCommerces, false, false);
setYieldChangeHelp(szBuffer, L", ", L"", L"", kBuilding.getYieldModifierArray(), true, bCivilopediaText);
setCommerceChangeHelp(szBuffer, L", ", L"", L"", kBuilding.getCommerceModifierArray(), true, bCivilopediaText);
*/
int aiYields[NUM_YIELD_TYPES];
int aiYieldModifiers[NUM_YIELD_TYPES];
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = kBuilding.getYieldChange(iI);
//Afforess: include connectedness yield
if (pCity != NULL)
{
aiYields[iI] += pCity->getConnectednessYield(eBuilding, (YieldTypes)iI);
}
//Afforess: end
aiYieldModifiers[iI] = aiYieldModifiers[iI] = kBuilding.getYieldModifier(iI);
if (NULL != pCity)
{
aiYields[iI] += pCity->getBuildingYieldChange((BuildingClassTypes)kBuilding.getBuildingClassType(), (YieldTypes)iI);
if (ePlayer != NO_PLAYER)
{
aiYields[iI] += GET_TEAM(eTeam).getBuildingYieldChange(eBuilding, (YieldTypes)iI);
aiYieldModifiers[iI] += GET_TEAM(eTeam).getBuildingYieldModifier(eBuilding, (YieldTypes)iI);
}
}
}
if (aiYieldModifiers[YIELD_PRODUCTION] > 0 && kBuilding.getMilitaryProductionModifier() < 0 || aiYieldModifiers[YIELD_PRODUCTION] < 0 && kBuilding.getMilitaryProductionModifier() > 0)
{
aiYieldModifiers[YIELD_PRODUCTION] += kBuilding.getMilitaryProductionModifier();
}
setYieldChangeHelp(szBuffer, L", ", L"", L"", aiYields, false, false);
int aiCommerces[NUM_COMMERCE_TYPES];
int aiCommerceModifiers[NUM_COMMERCE_TYPES];
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
int iBaseCommerceChange = kBuilding.getCommerceChange(iI);
if ( iBaseCommerceChange < 0 && iI == COMMERCE_GOLD && GC.getDefineINT("TREAT_NEGATIVE_GOLD_AS_MAINTENANCE") )
{
iBaseCommerceChange = 0;
}
aiCommerceModifiers[iI] = kBuilding.getCommerceModifier(iI);
if (NULL == pCity)
{
aiCommerces[iI] = iBaseCommerceChange;
aiCommerces[iI] += kBuilding.getObsoleteSafeCommerceChange(iI);
}
else if (pCity->getNumBuilding(eBuilding) <= 0)
{
aiCommerces[iI] = iBaseCommerceChange;
aiCommerces[iI] += kBuilding.getObsoleteSafeCommerceChange(iI);
if (ePlayer != NO_PLAYER)
{
aiCommerces[iI] += GET_TEAM(eTeam).getBuildingCommerceChange(eBuilding, (CommerceTypes)iI);
aiCommerceModifiers[iI] += GET_TEAM(eTeam).getBuildingCommerceModifier(eBuilding, (CommerceTypes)iI);
}
}
else
{
aiCommerces[iI] = pCity->getBuildingCommerceByBuilding((CommerceTypes)iI, eBuilding) + (pCity->getBonusCommercePercentChanges((CommerceTypes)iI, eBuilding) / 100);
if (ePlayer != NO_PLAYER)
{
aiCommerceModifiers[iI] += GET_TEAM(eTeam).getBuildingCommerceModifier(eBuilding, (CommerceTypes)iI); }
}
}
setCommerceChangeHelp(szBuffer, L", ", L"", L"", aiCommerces, false, false);
setYieldChangeHelp(szBuffer, L", ", L"", L"", aiYieldModifiers, true, bCivilopediaText);
setCommerceChangeHelp(szBuffer, L", ", L"", L"", aiCommerceModifiers, true, bCivilopediaText);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (kBuilding.getGreatPeopleRateChange() != 0)
{
szTempBuffer.Format(L", %s%d%c", ((kBuilding.getGreatPeopleRateChange() > 0) ? L"+" : L""), kBuilding.getGreatPeopleRateChange(), gDLL->getSymbolID(GREAT_PEOPLE_CHAR));
szBuffer.append(szTempBuffer);
if (kBuilding.getGreatPeopleUnitClass() != NO_UNITCLASS)
{
if (ePlayer != NO_PLAYER)
{
eGreatPeopleUnit = ((UnitTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationUnits(kBuilding.getGreatPeopleUnitClass())));
}
else
{
eGreatPeopleUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)kBuilding.getGreatPeopleUnitClass()).getDefaultUnitIndex();
}
if (eGreatPeopleUnit != NO_UNIT)
{
szTempBuffer.Format(L" (%s)", GC.getUnitInfo(eGreatPeopleUnit).getDescription());
szBuffer.append(szTempBuffer);
}
}
}
int iBuildingMaintenance = -kBuilding.getCommerceChange(COMMERCE_GOLD);
if ( iBuildingMaintenance > 0 )
{
if ( GC.getGame().getHandicapType() != NO_HANDICAP )
{
iBuildingMaintenance *= GC.getHandicapInfo(GC.getGame().getHandicapType()).getCorporationMaintenancePercent();
}
CvWString szRate = CvWString::format(L"%d.%02d", iBuildingMaintenance/100, iBuildingMaintenance%100);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_MAINTENANCE", szRate.GetCString()));
}
int iCount = 0;
for (int iJ = 0; iJ < NUM_COMMERCE_TYPES; iJ++)
{
iLast = 0;
for (int iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
BuildingTypes eLoopBuilding;
if (!bCivilopediaText && NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
eLoopBuilding = (BuildingTypes)GC.getCivilizationInfo(GC.getGameINLINE().getActiveCivilizationType()).getCivilizationBuildings(iI);
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING && kBuilding.getGlobalBuildingCommerceChange(iI, iJ) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_BUILDING_COMMERCE_CHANGE", kBuilding.getGlobalBuildingCommerceChange(iI, iJ), GC.getCommerceInfo((CommerceTypes)iJ).getChar()).c_str());
CvWString szBuilding;
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szBuilding, L", ", (kBuilding.getGlobalBuildingCommerceChange(iI, iJ) != iLast));
if (iLast == kBuilding.getGlobalBuildingCommerceChange(iI, iJ)) iCount++;
iLast = kBuilding.getGlobalBuildingCommerceChange(iI, iJ);
if (iCount > 3) iCount = iLast = 0;
}
}
}
// BUG - Building Actual Effects - start
if (bActual && NULL != pCity && pCity->getOwnerINLINE() == GC.getGame().getActivePlayer() && getBugOptionBOOL("MiscHover__BuildingActualEffects", true, "BUG_BUILDING_HOVER_ACTUAL_EFFECTS"))
{
CvWString szStart = gDLL->getText("TXT_KEY_ACTUAL_EFFECTS");
setBuildingActualEffects(szBuffer, szStart, eBuilding, pCity);
}
// BUG - Building Actual Effects - end
}
// test for unique building
BuildingClassTypes eBuildingClass = (BuildingClassTypes)kBuilding.getBuildingClassType();
BuildingTypes eDefaultBuilding = (BuildingTypes)GC.getBuildingClassInfo(eBuildingClass).getDefaultBuildingIndex();
if (NO_BUILDING != eDefaultBuilding && eDefaultBuilding != eBuilding)
{
for (iI = 0; iI < GC.getNumCivilizationInfos(); ++iI)
{
BuildingTypes eUniqueBuilding = (BuildingTypes)GC.getCivilizationInfo((CivilizationTypes)iI).getCivilizationBuildings((int)eBuildingClass);
if (eUniqueBuilding == eBuilding)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIQUE_BUILDING", GC.getCivilizationInfo((CivilizationTypes)iI).getTextKeyWide()));
}
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REPLACES_UNIT", GC.getBuildingInfo(eDefaultBuilding).getTextKeyWide()));
}
if (bCivilopediaText)
{
/************************************************************************************************/
/* Afforess Start 06/11/10 */
/* */
/* */
/************************************************************************************************/
int iBuildingMod = std::min(abs(kBuilding.getYieldModifier(YIELD_PRODUCTION)), abs(kBuilding.getMilitaryProductionModifier()));
if (kBuilding.getYieldModifier(YIELD_PRODUCTION) > 0 && kBuilding.getMilitaryProductionModifier() < 0 || kBuilding.getYieldModifier(YIELD_PRODUCTION) < 0 && kBuilding.getMilitaryProductionModifier() > 0)
{
int aiYieldMod[NUM_YIELD_TYPES];
for (iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
aiYieldMod[iI] = kBuilding.getYieldModifier(iI);
}
aiYieldMod[YIELD_PRODUCTION] = aiYieldMod[YIELD_PRODUCTION] - iBuildingMod;
setYieldChangeHelp(szBuffer, L"", L"", L"", aiYieldMod, true, bCivilopediaText);
}
else
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
setYieldChangeHelp(szBuffer, L"", L"", L"", kBuilding.getYieldModifierArray(), true, bCivilopediaText);
setCommerceChangeHelp(szBuffer, L"", L"", L"", kBuilding.getCommerceModifierArray(), true, bCivilopediaText);
}
else
{
if (isWorldWonderClass((BuildingClassTypes)(kBuilding.getBuildingClassType())))
{
if (pCity == NULL || ePlayer == NO_PLAYER)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_WORLD_WONDER_ALLOWED", GC.getBuildingClassInfo((BuildingClassTypes) kBuilding.getBuildingClassType()).getMaxGlobalInstances()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_WORLD_WONDER_LEFT", (GC.getBuildingClassInfo((BuildingClassTypes) kBuilding.getBuildingClassType()).getMaxGlobalInstances() - GC.getGameINLINE().getBuildingClassCreatedCount((BuildingClassTypes)(kBuilding.getBuildingClassType())) - GET_TEAM(eTeam).getBuildingClassMaking((BuildingClassTypes)(kBuilding.getBuildingClassType())))));
}
}
if (isTeamWonderClass((BuildingClassTypes)(kBuilding.getBuildingClassType())))
{
if (pCity == NULL || ePlayer == NO_PLAYER)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TEAM_WONDER_ALLOWED", (GC.getBuildingClassInfo((BuildingClassTypes) kBuilding.getBuildingClassType()).getMaxTeamInstances())));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TEAM_WONDER_LEFT", (GC.getBuildingClassInfo((BuildingClassTypes) kBuilding.getBuildingClassType()).getMaxTeamInstances() - GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getBuildingClassCountPlusMaking((BuildingClassTypes)(kBuilding.getBuildingClassType())))));
}
}
if (isNationalWonderClass((BuildingClassTypes)(kBuilding.getBuildingClassType())))
{
if (pCity == NULL || ePlayer == NO_PLAYER)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NATIONAL_WONDER_ALLOWED", GC.getBuildingClassInfo((BuildingClassTypes) kBuilding.getBuildingClassType()).getMaxPlayerInstances()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NATIONAL_WONDER_LEFT", (GC.getBuildingClassInfo((BuildingClassTypes) kBuilding.getBuildingClassType()).getMaxPlayerInstances() - GET_PLAYER(ePlayer).getBuildingClassCountPlusMaking((BuildingClassTypes)(kBuilding.getBuildingClassType())))));
}
}
}
if (kBuilding.isAutoBuild())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_AUTO_BUILD"));
}
if (kBuilding.getGlobalReligionCommerce() != NO_RELIGION)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_PER_CITY_WITH", GC.getReligionInfo((ReligionTypes) kBuilding.getGlobalReligionCommerce()).getChar());
setCommerceChangeHelp(szBuffer, L"", L"", szFirstBuffer, GC.getReligionInfo((ReligionTypes) kBuilding.getGlobalReligionCommerce()).getGlobalReligionCommerceArray());
}
if (NO_CORPORATION != kBuilding.getFoundsCorporation())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FOUNDS_CORPORATION", GC.getCorporationInfo((CorporationTypes)kBuilding.getFoundsCorporation()).getTextKeyWide()));
}
if (kBuilding.getGlobalCorporationCommerce() != NO_CORPORATION)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_PER_CITY_WITH", GC.getCorporationInfo((CorporationTypes) kBuilding.getGlobalCorporationCommerce()).getChar());
setCommerceChangeHelp(szBuffer, L"", L"", szFirstBuffer, GC.getCorporationInfo((CorporationTypes) kBuilding.getGlobalCorporationCommerce()).getHeadquarterCommerceArray());
}
if (kBuilding.getNoBonus() != NO_BONUS)
{
CvBonusInfo& kBonus = GC.getBonusInfo((BonusTypes) kBuilding.getNoBonus());
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DISABLES", kBonus.getTextKeyWide(), kBonus.getChar()));
}
if (kBuilding.getFreeBonus() != NO_BONUS)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PROVIDES", GC.getGameINLINE().getNumFreeBonuses(eBuilding), GC.getBonusInfo((BonusTypes) kBuilding.getFreeBonus()).getTextKeyWide(), GC.getBonusInfo((BonusTypes) kBuilding.getFreeBonus()).getChar()));
if (GC.getBonusInfo((BonusTypes)(kBuilding.getFreeBonus())).getHealth() != 0)
{
szTempBuffer.Format(L", +%d%c", abs(GC.getBonusInfo((BonusTypes) kBuilding.getFreeBonus()).getHealth()), ((GC.getBonusInfo((BonusTypes)(kBuilding.getFreeBonus())).getHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR)));
szBuffer.append(szTempBuffer);
}
if (GC.getBonusInfo((BonusTypes)(kBuilding.getFreeBonus())).getHappiness() != 0)
{
szTempBuffer.Format(L", +%d%c", abs(GC.getBonusInfo((BonusTypes) kBuilding.getFreeBonus()).getHappiness()), ((GC.getBonusInfo((BonusTypes)(kBuilding.getFreeBonus())).getHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)));
szBuffer.append(szTempBuffer);
}
}
int iNum = kBuilding.getNumExtraFreeBonuses();
for (iI=0; iI<iNum; iI++)
{
CvBonusInfo& kBonus = GC.getBonusInfo(kBuilding.getExtraFreeBonus(iI));
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PROVIDES", kBuilding.getExtraFreeBonusNum(iI), kBonus.getTextKeyWide(), kBonus.getChar()));
if (kBonus.getHealth() != 0)
{
szTempBuffer.Format(L", +%d%c", abs(kBonus.getHealth()), (kBonus.getHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR));
szBuffer.append(szTempBuffer);
}
if (kBonus.getHappiness() != 0)
{
szTempBuffer.Format(L", +%d%c", abs(kBonus.getHappiness()), (kBonus.getHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR));
szBuffer.append(szTempBuffer);
}
}
if (kBuilding.getFreeBuildingClass() != NO_BUILDINGCLASS)
{
BuildingTypes eFreeBuilding;
if (ePlayer != NO_PLAYER)
{
eFreeBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(kBuilding.getFreeBuildingClass())));
}
else
{
eFreeBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)kBuilding.getFreeBuildingClass()).getDefaultBuildingIndex();
}
if (NO_BUILDING != eFreeBuilding)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_IN_CITY", GC.getBuildingInfo(eFreeBuilding).getTextKeyWide()));
}
}
if (kBuilding.getFreeAreaBuildingClass() != NO_BUILDINGCLASS)
{
BuildingTypes eFreeBuilding;
if (ePlayer != NO_PLAYER)
{
eFreeBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(kBuilding.getFreeAreaBuildingClass())));
}
else
{
eFreeBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)kBuilding.getFreeAreaBuildingClass()).getDefaultBuildingIndex();
}
if (NO_BUILDING != eFreeBuilding)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_IN_AREA", GC.getBuildingInfo(eFreeBuilding).getTextKeyWide()));
}
}
if (kBuilding.getFreeTradeRegionBuildingClass() != NO_BUILDINGCLASS)
{
BuildingTypes eFreeBuilding;
if (ePlayer != NO_PLAYER)
{
eFreeBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(kBuilding.getFreeTradeRegionBuildingClass())));
}
else
{
eFreeBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)kBuilding.getFreeTradeRegionBuildingClass()).getDefaultBuildingIndex();
}
if (NO_BUILDING != eFreeBuilding)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_IN_TRADE_REGION", GC.getBuildingInfo(eFreeBuilding).getTextKeyWide()));
}
}
if (kBuilding.getFreePromotion() != NO_PROMOTION)
{
/************************************************************************************************/
/* Afforess Start 06/13/10 */
/* */
/* */
/************************************************************************************************/
bFirst = true;
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_PROMOTION_START", GC.getPromotionInfo((PromotionTypes)(kBuilding.getFreePromotion())).getTextKeyWide()));
for (int iI = 0; iI < GC.getNumUnitCombatInfos(); iI++)
{
if (GC.getPromotionInfo((PromotionTypes)(kBuilding.getFreePromotion())).getUnitCombat(iI))
{
szFirstBuffer.clear();
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_PROMOTION_END"));
}
if (kBuilding.getFreePromotion_2() != NO_PROMOTION)
{
bFirst = true;
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_PROMOTION_START", GC.getPromotionInfo((PromotionTypes)(kBuilding.getFreePromotion_2())).getTextKeyWide()));
for (int iI = 0; iI < GC.getNumUnitCombatInfos(); iI++)
{
if (GC.getPromotionInfo((PromotionTypes)(kBuilding.getFreePromotion_2())).getUnitCombat(iI))
{
szFirstBuffer.clear();
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_PROMOTION_END"));
}
if (kBuilding.getFreePromotion_3() != NO_PROMOTION)
{
bFirst = true;
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_PROMOTION_START", GC.getPromotionInfo((PromotionTypes)(kBuilding.getFreePromotion_3())).getTextKeyWide()));
for (int iI = 0; iI < GC.getNumUnitCombatInfos(); iI++)
{
if (GC.getPromotionInfo((PromotionTypes)(kBuilding.getFreePromotion_3())).getUnitCombat(iI))
{
szFirstBuffer.clear();
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_PROMOTION_END"));
}
if (kBuilding.isProvidesFreshWater())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PROVIDES_WATER"));
}
if (kBuilding.getWorkableRadius() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_EXPANDS_WORKABLE_RADIUS", kBuilding.getWorkableRadius()));
}
if (kBuilding.getAdjacentDamagePercent() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DAMAGES_ENEMY_UNITS", kBuilding.getAdjacentDamagePercent()));
}
if (kBuilding.getInvasionChance() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_INVASION", kBuilding.getInvasionChance()));
}
if (kBuilding.isProtectedCulture() && GC.getDefineINT("IDW_ENABLED"))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PROTECTS_CULTURE"));
}
if (kBuilding.getOccupationTimeModifier() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_OCCUPATION_TIME", kBuilding.getOccupationTimeModifier()));
}
if (kBuilding.getNoEntryDefenseLevel() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NO_ENTRY", kBuilding.getNoEntryDefenseLevel()));
}
if (kBuilding.getNumUnitFullHeal() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FULL_HEAL_UNITS", kBuilding.getNumUnitFullHeal()));
}
if (kBuilding.isZoneOfControl())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ZONE_OF_CONTROL"));
}
if (kBuilding.getNumPopulationEmployed() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_POPULATION_EMPLOYED", kBuilding.getNumPopulationEmployed()));
}
if (kBuilding.getExtraCapitalCommerce() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_EXTRA_CAPITAL_COMMERCE", kBuilding.getExtraCapitalCommerce()));
}
if (kBuilding.getExtraForeignCapitalCommerce() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_EXTRA_FOREIGN_CAPITAL_COMMERCE", kBuilding.getExtraForeignCapitalCommerce()));
}
if (kBuilding.getDomesticConnectedCommerce() > 0)
{
szBuffer.append(NEWLINE);
int iCities = kBuilding.getCitiesRequiredPerDomesticConnectedCommerce();
if (pCity != NULL && iCities > 1)
{
iCities += GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getTargetNumCities();
iCities -= pCity->getAvgTargetCities();
}
iCities = std::max(1, iCities);
if (iCities > 1)
{
if (kBuilding.getMaxDomesticConnectedCommerce() <= 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DOMESTIC_CONNECTED_COMMERCE_CITY", kBuilding.getDomesticConnectedCommerce(), iCities));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DOMESTIC_CONNECTED_COMMERCE_CITY_MAX", kBuilding.getDomesticConnectedCommerce(), iCities, kBuilding.getMaxDomesticConnectedCommerce()));
}
}
else
{
if (kBuilding.getMaxDomesticConnectedCommerce() <= 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DOMESTIC_CONNECTED_COMMERCE_EACH_CITY", kBuilding.getDomesticConnectedCommerce()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DOMESTIC_CONNECTED_COMMERCE_EACH_CITY_MAX", kBuilding.getDomesticConnectedCommerce(), kBuilding.getMaxDomesticConnectedCommerce()));
}
}
}
if (kBuilding.getForeignConnectedCommerce() > 0)
{
szBuffer.append(NEWLINE);
int iCities = kBuilding.getCitiesRequiredPerForeignConnectedCommerce();
if (pCity != NULL && iCities > 1)
{
iCities += GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getTargetNumCities();
iCities -= pCity->getAvgTargetCities();
}
iCities = std::max(1, iCities);
if (iCities > 1)
{
if (kBuilding.getMaxForeignConnectedCommerce() <= 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FOREIGN_CONNECTED_COMMERCE_CITY", kBuilding.getForeignConnectedCommerce(), iCities));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FOREIGN_CONNECTED_COMMERCE_CITY_MAX", kBuilding.getForeignConnectedCommerce(), iCities, kBuilding.getMaxForeignConnectedCommerce()));
}
}
else
{
if (kBuilding.getMaxForeignConnectedCommerce() <= 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FOREIGN_CONNECTED_COMMERCE_EACH_CITY", kBuilding.getForeignConnectedCommerce()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FOREIGN_CONNECTED_COMMERCE_EACH_CITY_MAX", kBuilding.getForeignConnectedCommerce(), kBuilding.getMaxForeignConnectedCommerce()));
}
}
}
if (kBuilding.getHealthPercentPerPopulation() != 0)
{
szBuffer.append(NEWLINE);
int iHealthPercent = kBuilding.getHealthPercentPerPopulation();
if (iHealthPercent % 100 == 0)
{
szTempBuffer = CvWString::format(L"%c%s%d%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHealthPercent > 0 ? L"+" : L"",
abs(iHealthPercent / 100),
(iHealthPercent > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)),
gDLL->getText("TXT_KEY_MISC_PER_CITIZEN").GetCString());
}
else if (iHealthPercent % 10 == 0)
{
szTempBuffer = CvWString::format(L"%c%s%.1f%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHealthPercent > 0 ? L"+" : L"",
abs(iHealthPercent) * 0.01f,
(iHealthPercent > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)),
gDLL->getText("TXT_KEY_MISC_PER_CITIZEN").GetCString());
}
else
{
szTempBuffer = CvWString::format(L"%c%s%.2f%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHealthPercent > 0 ? L"+" : L"",
abs(iHealthPercent) * 0.01f,
(iHealthPercent > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)),
gDLL->getText("TXT_KEY_MISC_PER_CITIZEN").GetCString());
}
szBuffer.append(szTempBuffer);
}
if (kBuilding.getHappinessPercentPerPopulation() != 0)
{
szBuffer.append(NEWLINE);
int iHappinessPercent = kBuilding.getHappinessPercentPerPopulation();
if (iHappinessPercent % 100 == 0)
{
szTempBuffer = CvWString::format(L"%c%s%d%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHappinessPercent > 0 ? L"+" : L"",
abs(iHappinessPercent / 100),
(iHappinessPercent > 0 ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)),
gDLL->getText("TXT_KEY_MISC_PER_CITIZEN").GetCString());
}
else if (iHappinessPercent % 10 == 0)
{
szTempBuffer = CvWString::format(L"%c%s%.1f%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHappinessPercent > 0 ? L"+" : L"",
abs(iHappinessPercent) * 0.01f,
(iHappinessPercent > 0 ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)),
gDLL->getText("TXT_KEY_MISC_PER_CITIZEN").GetCString());
}
else
{
szTempBuffer = CvWString::format(L"%c%s%.2f%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHappinessPercent > 0 ? L"+" : L"",
abs(iHappinessPercent) * 0.01f,
(iHappinessPercent > 0 ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)),
gDLL->getText("TXT_KEY_MISC_PER_CITIZEN").GetCString());
}
szBuffer.append(szTempBuffer);
}
if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_REVOLUTION) || bCivilopediaText)
{
if (0 != kBuilding.getRevIdxLocal())
{
if ( kBuilding.getRevIdxLocal() > 0 )
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_LOCAL_PENALTY", kBuilding.getRevIdxLocal()));
}
else if ( kBuilding.getRevIdxLocal() < 0 )
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_LOCAL_BONUS", abs(kBuilding.getRevIdxLocal())));
}
}
// Revolution National Civic Index Modifiers
if (0 != kBuilding.getRevIdxNational())
{
if ( kBuilding.getRevIdxNational() > 0 )
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_NATIONAL_PENALTY", kBuilding.getRevIdxNational()));
}
else if ( kBuilding.getRevIdxNational() < 0 )
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_REV_INDEX_NATIONAL_BONUS", abs(kBuilding.getRevIdxNational())));
}
}
if ( kBuilding.getRevIdxDistanceModifier() < 0 )
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_CITY_DISTANCE_GOOD_MOD", kBuilding.getRevIdxDistanceModifier()));
}
else if ( kBuilding.getRevIdxDistanceModifier() > 0 )
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_CITY_DISTANCE_BAD_MOD", abs(kBuilding.getRevIdxDistanceModifier())));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (kBuilding.getCivicOption() != NO_CIVICOPTION)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ENABLES_CIVICS", GC.getCivicOptionInfo((CivicOptionTypes)(kBuilding.getCivicOption())).getTextKeyWide()));
}
if (kBuilding.getFreeSpecialTech() != NO_TECH)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_SPECIAL_TECH", GC.getTechInfo((kBuilding.getFreeSpecialTech())).getTextKeyWide()));
}
if (kBuilding.isPower())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PROVIDES_POWER"));
if (kBuilding.isDirtyPower() && (GC.getDefineINT("DIRTY_POWER_HEALTH_CHANGE") != 0))
{
szTempBuffer.Format(L" (+%d%c)", abs(GC.getDefineINT("DIRTY_POWER_HEALTH_CHANGE")), ((GC.getDefineINT("DIRTY_POWER_HEALTH_CHANGE") > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR)));
szBuffer.append(szTempBuffer);
}
}
if (kBuilding.isAreaCleanPower())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PROVIDES_AREA_CLEAN_POWER"));
}
if (kBuilding.isAreaBorderObstacle())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_BORDER_OBSTACLE"));
}
for (iI = 0; iI < GC.getNumVoteSourceInfos(); ++iI)
{
if (kBuilding.getVoteSourceType() == (VoteSourceTypes)iI)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DIPLO_VOTE", GC.getVoteSourceInfo((VoteSourceTypes)iI).getTextKeyWide()));
}
}
if (kBuilding.isForceTeamVoteEligible())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ELECTION_ELIGIBILITY"));
}
if (kBuilding.isCapital())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_CAPITAL"));
}
if (kBuilding.isGovernmentCenter())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REDUCES_MAINTENANCE"));
}
if (kBuilding.isGoldenAge())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GOLDEN_AGE"));
}
if (kBuilding.isAllowsNukes())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_ENABLES_NUKES"));
}
if (kBuilding.isMapCentering())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_CENTERS_MAP"));
}
if (kBuilding.isNoUnhappiness())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NO_UNHAPPY"));
}
if (kBuilding.isNoUnhealthyPopulation())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NO_UNHEALTHY_POP"));
}
if (kBuilding.isBuildingOnlyHealthy())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NO_UNHEALTHY_BUILDINGS"));
}
if (kBuilding.getGreatPeopleRateModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_BIRTH_RATE_MOD", kBuilding.getGreatPeopleRateModifier()));
}
if (kBuilding.getGreatGeneralRateModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GENERAL_RATE_MOD", kBuilding.getGreatGeneralRateModifier()));
}
if (kBuilding.getDomesticGreatGeneralRateModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_DOMESTIC_GREAT_GENERAL_MODIFIER", kBuilding.getDomesticGreatGeneralRateModifier()));
}
if (kBuilding.getGlobalGreatPeopleRateModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_BIRTH_RATE_MOD_ALL_CITIES", kBuilding.getGlobalGreatPeopleRateModifier()));
}
if (kBuilding.getAnarchyModifier() != 0)
{
if (-100 == kBuilding.getAnarchyModifier())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NO_ANARCHY"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ANARCHY_MOD", kBuilding.getAnarchyModifier()));
// szBuffer.append(NEWLINE);
// szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ANARCHY_TIMER_MOD", kBuilding.getAnarchyModifier()));
}
}
if (kBuilding.getGoldenAgeModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GOLDENAGE_MOD", kBuilding.getGoldenAgeModifier()));
}
if (kBuilding.getGlobalHurryModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HURRY_MOD", kBuilding.getGlobalHurryModifier()));
}
if (kBuilding.getFreeExperience() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_XP_UNITS", kBuilding.getFreeExperience()));
}
if (kBuilding.getGlobalFreeExperience() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_XP_ALL_CITIES", kBuilding.getGlobalFreeExperience()));
}
if (kBuilding.getFoodKept() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_STORES_FOOD", kBuilding.getFoodKept()));
}
if (kBuilding.getAirlift() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_AIRLIFT", kBuilding.getAirlift()));
}
if (kBuilding.getAirModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_AIR_DAMAGE_MOD", kBuilding.getAirModifier()));
}
if (kBuilding.getAirUnitCapacity() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_AIR_UNIT_CAPACITY", kBuilding.getAirUnitCapacity()));
}
if (kBuilding.getNukeModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NUKE_DAMAGE_MOD", kBuilding.getNukeModifier()));
}
if (kBuilding.getNukeExplosionRand() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NUKE_EXPLOSION_CHANCE"));
}
if (kBuilding.getFreeSpecialist() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_SPECIALISTS", kBuilding.getFreeSpecialist()));
}
if (kBuilding.getAreaFreeSpecialist() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_SPECIALISTS_CONT", kBuilding.getAreaFreeSpecialist()));
}
if (kBuilding.getGlobalFreeSpecialist() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_SPECIALISTS_ALL_CITIES", kBuilding.getGlobalFreeSpecialist()));
}
if (kBuilding.getMaintenanceModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_MAINT_MOD", kBuilding.getMaintenanceModifier()));
}
//DPII < Maintenance Modifiers >
if (kBuilding.getGlobalMaintenanceModifier() != 0)
{
if (kBuilding.getGlobalMaintenanceModifier() <= -100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GLOBAL_MAINT"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GLOBAL_MAINT_MOD", kBuilding.getGlobalMaintenanceModifier()));
}
}
if (kBuilding.getDistanceMaintenanceModifier() != 0)
{
if (kBuilding.getDistanceMaintenanceModifier() <= -100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DISTANCE_MAINT"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DISTANCE_MAINT_MOD", kBuilding.getDistanceMaintenanceModifier()));
}
}
if (kBuilding.getNumCitiesMaintenanceModifier() != 0)
{
if (kBuilding.getNumCitiesMaintenanceModifier() <= -100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NO_MAINT_NUM_CITIES"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NO_MAINT_NUM_CITIES_MOD", kBuilding.getNumCitiesMaintenanceModifier()));
}
}
if (kBuilding.getCoastalDistanceMaintenanceModifier() != 0)
{
if (kBuilding.getCoastalDistanceMaintenanceModifier() <= -100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_COASTAL_DISTANCE_MAINT"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_COASTAL_DISTANCE_MAINT_MOD", kBuilding.getCoastalDistanceMaintenanceModifier()));
}
}
if (kBuilding.getConnectedCityMaintenanceModifier() != 0)
{
if (kBuilding.getConnectedCityMaintenanceModifier() <= -100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CONNECTED_CITY_MAINT"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CONNECTED_CITY_MAINT_MOD", kBuilding.getConnectedCityMaintenanceModifier()));
}
}
if (kBuilding.getAreaMaintenanceModifier() != 0)
{
if (kBuilding.getAreaMaintenanceModifier() <= -100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CONTINENTAL_CITY_MAINT"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CONTINENTAL_CITY_MAINT_MOD", kBuilding.getAreaMaintenanceModifier()));
}
}
if (kBuilding.getOtherAreaMaintenanceModifier() != 0)
{
if (kBuilding.getOtherAreaMaintenanceModifier() <= -100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_OVERSEAS_CITY_MAINT"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_OVERSEAS_CITY_MAINT_MOD", kBuilding.getOtherAreaMaintenanceModifier()));
}
}
//DPII < Maintenance Modifiers >
if (kBuilding.getHurryAngerModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HURRY_ANGER_MOD", kBuilding.getHurryAngerModifier()));
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if (kBuilding.getLineOfSight() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_INCREASES_LINE_OF_SIGHT"));
}
else if (kBuilding.getLineOfSight() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DECREASES_LINE_OF_SIGHT"));
}
if (kBuilding.getInflationModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ADJUSTS_INFLATION", kBuilding.getInflationModifier()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (kBuilding.getWarWearinessModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_WAR_WEAR_MOD", kBuilding.getWarWearinessModifier()));
}
if (kBuilding.getGlobalWarWearinessModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_WAR_WEAR_MOD_ALL_CITIES", kBuilding.getGlobalWarWearinessModifier()));
}
if (kBuilding.getEnemyWarWearinessModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ENEMY_WAR_WEAR", kBuilding.getEnemyWarWearinessModifier()));
}
if (kBuilding.getHealRateChange() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HEAL_MOD", kBuilding.getHealRateChange()));
}
if (kBuilding.getAreaHealth() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HEALTH_CHANGE_CONT", abs(kBuilding.getAreaHealth()), ((kBuilding.getAreaHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))));
}
if (kBuilding.getGlobalHealth() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HEALTH_CHANGE_ALL_CITIES", abs(kBuilding.getGlobalHealth()), ((kBuilding.getGlobalHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))));
}
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
if (kBuilding.getAreaHappiness() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HAPPY_CHANGE_CONT", kBuilding.getAreaHappiness(), ((kBuilding.getAreaHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
if (kBuilding.getGlobalHappiness() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HAPPY_CHANGE_ALL_CITIES", kBuilding.getGlobalHappiness(), ((kBuilding.getGlobalHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
if (kBuilding.getStateReligionHappiness() > 0)
{
if (kBuilding.getReligionType() != NO_RELIGION)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_RELIGION_HAPPINESS", kBuilding.getStateReligionHappiness(), ((kBuilding.getStateReligionHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), GC.getReligionInfo((ReligionTypes)(kBuilding.getReligionType())).getChar()));
}
}
*/
// Use absolute value with unhappy face
if (kBuilding.getAreaHappiness() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HAPPY_CHANGE_CONT", abs(kBuilding.getAreaHappiness()), ((kBuilding.getAreaHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
if (kBuilding.getGlobalHappiness() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HAPPY_CHANGE_ALL_CITIES", abs(kBuilding.getGlobalHappiness()), ((kBuilding.getGlobalHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
}
if (kBuilding.getWonderCapacityIncrement() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_WONDER_CAPACITY_INCREMENT", abs(kBuilding.getWonderCapacityIncrement()), ((kBuilding.getWonderCapacityIncrement()))));
}
if (kBuilding.getStateReligionHappiness() != 0)
{
if (kBuilding.getReligionType() != NO_RELIGION)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_RELIGION_HAPPINESS", abs(kBuilding.getStateReligionHappiness()), ((kBuilding.getStateReligionHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), GC.getReligionInfo((ReligionTypes)(kBuilding.getReligionType())).getChar()));
}
}
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
if (kBuilding.getWorkerSpeedModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_WORKER_MOD", kBuilding.getWorkerSpeedModifier()));
}
/************************************************************************************************/
/* Afforess Start 06/11/10 */
/* */
/* */
/************************************************************************************************/
int iBuildingMod = std::min(abs(kBuilding.getYieldModifier(YIELD_PRODUCTION)), abs(kBuilding.getMilitaryProductionModifier()));
if (kBuilding.getYieldModifier(YIELD_PRODUCTION) > 0 && kBuilding.getMilitaryProductionModifier() < 0 || kBuilding.getYieldModifier(YIELD_PRODUCTION) < 0 && kBuilding.getMilitaryProductionModifier() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_BUILDING_MOD", iBuildingMod));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
/************************************************************************************************/
/* Afforess Start 06/11/10 */
/* */
/* */
/************************************************************************************************/
/*
if (kBuilding.getMilitaryProductionModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_MILITARY_MOD", kBuilding.getMilitaryProductionModifier()));
}
*/
if (kBuilding.getMilitaryProductionModifier() != 0 && (kBuilding.getMilitaryProductionModifier() + iBuildingMod != 0))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_MILITARY_MOD", kBuilding.getMilitaryProductionModifier() + iBuildingMod));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (kBuilding.getSpaceProductionModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_SPACESHIP_MOD", kBuilding.getSpaceProductionModifier()));
}
if (kBuilding.getGlobalSpaceProductionModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_SPACESHIP_MOD_ALL_CITIES", kBuilding.getGlobalSpaceProductionModifier()));
}
if (kBuilding.getTradeRoutes() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TRADE_ROUTES", kBuilding.getTradeRoutes()));
}
if (kBuilding.getCoastalTradeRoutes() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_COASTAL_TRADE_ROUTES", kBuilding.getCoastalTradeRoutes()));
}
if (kBuilding.getGlobalTradeRoutes() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TRADE_ROUTES_ALL_CITIES", kBuilding.getGlobalTradeRoutes()));
}
if (kBuilding.getTradeRouteModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TRADE_ROUTE_MOD", kBuilding.getTradeRouteModifier()));
}
if (kBuilding.getForeignTradeRouteModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FOREIGN_TRADE_ROUTE_MOD", kBuilding.getForeignTradeRouteModifier()));
}
if (kBuilding.getGlobalPopulationChange() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GLOBAL_POP", kBuilding.getGlobalPopulationChange()));
}
if (kBuilding.getFreeTechs() != 0)
{
if (kBuilding.getFreeTechs() == 1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_TECH"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_TECHS", kBuilding.getFreeTechs()));
}
}
if (kBuilding.getDefenseModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DEFENSE_MOD", kBuilding.getDefenseModifier()));
}
if (kBuilding.getBombardDefenseModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_BOMBARD_DEFENSE_MOD", -kBuilding.getBombardDefenseModifier()));
}
if (kBuilding.getAllCityDefenseModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DEFENSE_MOD_ALL_CITIES", kBuilding.getAllCityDefenseModifier()));
}
if (kBuilding.getEspionageDefenseModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ESPIONAGE_DEFENSE_MOD", kBuilding.getEspionageDefenseModifier()));
/************************************************************************************************/
/* UNOFFICIAL_PATCH 12/07/09 Afforess & jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original BTS code
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EXPOSE_SPIES"));
*/
if (kBuilding.getEspionageDefenseModifier() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EXPOSE_SPIES"));
}
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
setYieldChangeHelp(szBuffer, gDLL->getText("TXT_KEY_BUILDING_WATER_PLOTS").c_str(), L": ", L"", kBuilding.getSeaPlotYieldChangeArray());
setYieldChangeHelp(szBuffer, gDLL->getText("TXT_KEY_BUILDING_RIVER_PLOTS").c_str(), L": ", L"", kBuilding.getRiverPlotYieldChangeArray());
setYieldChangeHelp(szBuffer, gDLL->getText("TXT_KEY_BUILDING_WATER_PLOTS_ALL_CITIES").c_str(), L": ", L"", kBuilding.getGlobalSeaPlotYieldChangeArray());
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_WITH_POWER").c_str(), kBuilding.getPowerYieldModifierArray(), true, true);
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_ALL_CITIES_THIS_CONTINENT").c_str(), kBuilding.getAreaYieldModifierArray(), true, true);
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_ALL_CITIES").c_str(), kBuilding.getGlobalYieldModifierArray(), true, true);
setCommerceChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_ALL_CITIES").c_str(), kBuilding.getGlobalCommerceModifierArray(), true);
setCommerceChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_PER_SPECIALIST_ALL_CITIES").c_str(), kBuilding.getSpecialistExtraCommerceArray());
if (ePlayer != NO_PLAYER && GET_PLAYER(ePlayer).getStateReligion() != NO_RELIGION)
{
szTempBuffer = gDLL->getText("TXT_KEY_BUILDING_FROM_ALL_REL_BUILDINGS", GC.getReligionInfo(GET_PLAYER(ePlayer).getStateReligion()).getChar());
}
else
{
szTempBuffer = gDLL->getText("TXT_KEY_BUILDING_STATE_REL_BUILDINGS");
}
setCommerceChangeHelp(szBuffer, L"", L"", szTempBuffer, kBuilding.getStateReligionCommerceArray());
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
if (kBuilding.getCommerceHappiness(iI) != 0)
{
szBuffer.append(NEWLINE);
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PER_LEVEL", ((kBuilding.getCommerceHappiness(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), (100 / kBuilding.getCommerceHappiness(iI)), GC.getCommerceInfo((CommerceTypes)iI).getChar()));
*/
// Use absolute value with unhappy face
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PER_LEVEL", ((kBuilding.getCommerceHappiness(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)), abs(100 / kBuilding.getCommerceHappiness(iI)), GC.getCommerceInfo((CommerceTypes)iI).getChar()));
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
if (kBuilding.isCommerceFlexible(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ADJUST_COMM_RATE", GC.getCommerceInfo((CommerceTypes) iI).getChar()));
}
}
/************************************************************************************************/
/* Afforess 5/15/10 */
/* */
/* */
/************************************************************************************************/
if (kBuilding.m_bAnySpecialistYieldChanges)
{
for (iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_FROM_IN_ALL_CITIES", GC.getSpecialistInfo((SpecialistTypes) iI).getTextKeyWide());
setYieldChangeHelp(szBuffer, L"", L"", szFirstBuffer, kBuilding.getSpecialistYieldChangeArray(iI), false, true);
}
}
if (kBuilding.m_bAnyBonusYieldModifiers)
{
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_WITH_BONUS", GC.getBonusInfo((BonusTypes) iI).getTextKeyWide());
setYieldChangeHelp(szBuffer, L"", L"", szFirstBuffer, kBuilding.getBonusYieldModifierArray(iI), true, true);
}
}
if (kBuilding.m_bAnyBonusCommerceModifiers)
{
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_WITH_BONUS", GC.getBonusInfo((BonusTypes) iI).getTextKeyWide());
setCommerceChangeHelp(szBuffer, L"", L"", szFirstBuffer, kBuilding.getBonusCommerceModifierArray(iI), true, true);
}
}
iLast = 0;
if (kBuilding.m_bAnyVicinityBonusYieldChanges)
{
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_WITH_BONUS", GC.getBonusInfo((BonusTypes) iI).getTextKeyWide());
szFirstBuffer += gDLL->getText("TXT_KEY_IN_CITY_VICINITY");
setYieldChangeHelp(szBuffer, L"", L"", szFirstBuffer, kBuilding.getVicinityBonusYieldChangesArray(iI), false, true);
}
}
iLast = 0;
if (kBuilding.m_bAnyBonusYieldChanges)
{
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
szFirstBuffer = gDLL->getText("TXT_KEY_BUILDING_WITH_BONUS", GC.getBonusInfo((BonusTypes) iI).getTextKeyWide());
setYieldChangeHelp(szBuffer, L"", L"", szFirstBuffer, kBuilding.getBonusYieldChangesArray(iI), false, true);
}
}
iLast = 0;
if (kBuilding.m_bAnyBonusCommercePercentChanges)
{
bool* pabProcessed = new bool[GC.getNumBonusInfos()];
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
pabProcessed[iI] = false;
}
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
CvWString szTempBuffer;
CvWString szTempBuffer2;
for (int iJ = 0; iJ < NUM_COMMERCE_TYPES; ++iJ)
{
if (kBuilding.getBonusCommercePercentChanges(iI, iJ) != 0 && !pabProcessed[iI])
{
float fValue = (float)kBuilding.getBonusCommercePercentChanges(iI, iJ);
if (fmod(fValue,100) == 0)
{
if (fValue > 0)
{
szTempBuffer2.Format(L"+%.0f", fValue/100);
}
else
{
szTempBuffer2.Format(L"%.0f", fValue/100);
}
}
else
{
if (fValue > 0)
{
szTempBuffer2.Format(L"+%.2f", fValue/100);
}
else
{
szTempBuffer2.Format(L"%.2f", fValue/100);
}
}
szTempBuffer.Format(L"\n%c%s%c%s", gDLL->getSymbolID(BULLET_CHAR), szTempBuffer2.GetCString(), GC.getCommerceInfo((CommerceTypes) iJ).getChar(), gDLL->getText("TXT_KEY_WITH").GetCString());
szTempBuffer += CvWString::format(L"<link=literal>%s</link>", GC.getBonusInfo((BonusTypes)iI).getDescription());
for (int iK = 0; iK < GC.getNumBonusInfos(); ++iK)
{
if (iK != iI && kBuilding.getBonusCommercePercentChanges(iI, iJ) == kBuilding.getBonusCommercePercentChanges(iK, iJ))
{
szTempBuffer += CvWString::format(L", <link=literal>%s</link>", GC.getBonusInfo((BonusTypes)iK).getDescription());
pabProcessed[iK] = true;
}
}
pabProcessed[iI] = true;
iLast = kBuilding.getBonusCommercePercentChanges(iI, iJ);
szBuffer.append(szTempBuffer);
}
}
}
SAFE_DELETE_ARRAY(pabProcessed);
}
for (iI = 0; iI < NUM_COMMERCE_TYPES; iI++)
{
if (kBuilding.getCommerceAttacks(iI) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FROM_ATTACKS", GC.getCommerceInfo((CommerceTypes) iI).getChar(), kBuilding.getCommerceAttacks(iI), GC.getCommerceInfo((CommerceTypes) iI).getChar(), GC.getCommerceInfo((CommerceTypes) iI).getChar(), GC.getDefineINT("COMMERCE_ATTACKS_FADE_RATE")));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
for (iI = 0; iI < GC.getNumReligionInfos(); ++iI)
{
if (kBuilding.getReligionChange(iI) > 0)
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_SPREADS_RELIGION", GC.getReligionInfo((ReligionTypes) iI).getChar()).c_str());
szBuffer.append(szTempBuffer);
}
}
for (iI = 0; iI < GC.getNumSpecialistInfos(); ++iI)
{
if (kBuilding.getSpecialistCount(iI) > 0)
{
if (kBuilding.getSpecialistCount(iI) == 1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TURN_CITIZEN_INTO", GC.getSpecialistInfo((SpecialistTypes) iI).getTextKeyWide()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TURN_CITIZENS_INTO", kBuilding.getSpecialistCount(iI), GC.getSpecialistInfo((SpecialistTypes) iI).getTextKeyWide()));
}
}
if (kBuilding.getFreeSpecialistCount(iI) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_SPECIALIST", kBuilding.getFreeSpecialistCount(iI), GC.getSpecialistInfo((SpecialistTypes) iI).getTextKeyWide()));
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumImprovementInfos(); ++iI)
{
if (kBuilding.getImprovementFreeSpecialist(iI) > 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_IMPROVEMENT_FREE_SPECIALISTS", kBuilding.getImprovementFreeSpecialist(iI)).GetCString() );
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (kBuilding.getImprovementFreeSpecialist(iI) != iLast));
iLast = kBuilding.getImprovementFreeSpecialist(iI);
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (kBuilding.getBonusHealthChanges(iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_HEALTH_HAPPINESS_CHANGE", abs(kBuilding.getBonusHealthChanges(iI)), ((kBuilding.getBonusHealthChanges(iI) > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))).c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBonusInfo((BonusTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (kBuilding.getBonusHealthChanges(iI) != iLast));
iLast = kBuilding.getBonusHealthChanges(iI);
}
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
for (int iTech = 0; iTech < GC.getNumTechInfos(); iTech++)
{
if (GC.getGameINLINE().canEverResearch((TechTypes)iTech))
{
if (kBuilding.m_bAnyTechCommerceChanges)
{
szTempBuffer.Format(L"%s<link=literal>%s</link>", gDLL->getText("TXT_KEY_WITH").GetCString(),GC.getTechInfo((TechTypes)iTech).getDescription());
setCommerceChangeHelp(szBuffer, L"", L"", szTempBuffer, kBuilding.getTechCommerceChangeArray(iTech), false, true);
}
if (kBuilding.m_bAnyTechYieldChanges)
{
szTempBuffer.Format(L"%s<link=literal>%s</link>", gDLL->getText("TXT_KEY_WITH").GetCString(),GC.getTechInfo((TechTypes)iTech).getDescription());
setYieldChangeHelp(szBuffer, L"", L"", szTempBuffer, kBuilding.getTechYieldChangeArray(iTech), false, true);
}
if (kBuilding.m_bAnyTechSpecialistChanges)
{
for (int iSpecialist = 0; iSpecialist < GC.getNumSpecialistInfos(); iSpecialist++)
{
int iChange = kBuilding.getTechSpecialistChange(iTech, iSpecialist);
if (0 != iChange)
{
szBuffer.append(NEWLINE);
if (iChange == 1)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TURN_CITIZEN_INTO", GC.getSpecialistInfo((SpecialistTypes) iSpecialist).getTextKeyWide()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TURN_CITIZENS_INTO", iChange, GC.getSpecialistInfo((SpecialistTypes) iSpecialist).getTextKeyWide()));
}
szBuffer.append(gDLL->getText("TXT_KEY_WITH"));
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getTechInfo((TechTypes)iTech).getDescription());
szBuffer.append(szTempBuffer);
}
}
}
if (kBuilding.m_bAnyTechCommerceModifiers)
{
szTempBuffer.Format(L"%s<link=literal>%s</link>", gDLL->getText("TXT_KEY_WITH").GetCString(),GC.getTechInfo((TechTypes)iTech).getDescription());
setCommerceChangeHelp(szBuffer, L"", L"", szTempBuffer, kBuilding.getTechCommerceModifierArray(iTech), true, true);
}
if (kBuilding.m_bAnyTechYieldModifiers)
{
szTempBuffer.Format(L"%s<link=literal>%s</link>", gDLL->getText("TXT_KEY_WITH").GetCString(),GC.getTechInfo((TechTypes)iTech).getDescription());
setYieldChangeHelp(szBuffer, L"", L"", szTempBuffer, kBuilding.getTechYieldModifierArray(iTech), true, true);
}
if (kBuilding.getTechHealthChanges(iTech) != 0)
{
szFirstBuffer.Format(L"%s%c+%d%c%s ", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(kBuilding.getTechHealthChanges(iTech)), (((kBuilding.getTechHealthChanges(iTech) > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))), gDLL->getText("TXT_KEY_WITH").GetCString());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getTechInfo((TechTypes)iTech).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (kBuilding.getTechHealthChanges(iTech) != iLast));
iLast = kBuilding.getTechHealthChanges(iTech);
}
iLast = 0;
if (kBuilding.getTechHappinessChanges(iTech) != 0)
{
szFirstBuffer.Format(L"%s%c+%d%c%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(kBuilding.getTechHappinessChanges(iTech)), (((kBuilding.getTechHappinessChanges(iTech) > 0) ? gDLL->getSymbolID(HAPPY_CHAR): gDLL->getSymbolID(UNHAPPY_CHAR))), gDLL->getText("TXT_KEY_WITH").GetCString());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getTechInfo((TechTypes)iTech).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (kBuilding.getTechHappinessChanges(iTech) != iLast));
iLast = kBuilding.getTechHappinessChanges(iTech);
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
iLast = 0;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
int iChange = GC.getCivicInfo((CivicTypes)iI).getBuildingHealthChanges(kBuilding.getBuildingClassType());
if (0 != iChange)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_CIVIC_HEALTH_HAPPINESS_CHANGE", abs(iChange), ((iChange > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))).c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getCivicInfo((CivicTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (iChange != iLast));
iLast = iChange;
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (kBuilding.getBonusHappinessChanges(iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_HEALTH_HAPPINESS_CHANGE", abs(kBuilding.getBonusHappinessChanges(iI)), ((kBuilding.getBonusHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBonusInfo((BonusTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (kBuilding.getBonusHappinessChanges(iI) != iLast));
iLast = kBuilding.getBonusHappinessChanges(iI);
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
int iChange = GC.getCivicInfo((CivicTypes)iI).getBuildingHappinessChanges(kBuilding.getBuildingClassType());
if (0 != iChange)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_CIVIC_HEALTH_HAPPINESS_CHANGE", abs(iChange), ((iChange > 0) ? gDLL->getSymbolID(HAPPY_CHAR): gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getCivicInfo((CivicTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (iChange != iLast));
iLast = iChange;
}
}
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (kBuilding.getUnitCombatFreeExperience(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_XP", GC.getUnitCombatInfo((UnitCombatTypes)iI).getTextKeyWide(), kBuilding.getUnitCombatFreeExperience(iI)));
}
}
for (iI = 0; iI < NUM_DOMAIN_TYPES; ++iI)
{
if (kBuilding.getDomainFreeExperience(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_XP", GC.getDomainInfo((DomainTypes)iI).getTextKeyWide(), kBuilding.getDomainFreeExperience(iI)));
}
}
for (iI = 0; iI < NUM_DOMAIN_TYPES; ++iI)
{
if (kBuilding.getDomainProductionModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_BUILDS_FASTER_DOMAIN", GC.getDomainInfo((DomainTypes)iI).getTextKeyWide(), kBuilding.getDomainProductionModifier(iI)));
}
}
/************************************************************************************************/
/* Afforess 01/03/10 */
/* */
/* */
/************************************************************************************************/
if (GC.getBuildingInfo(eBuilding).isForceAllTradeRoutes())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_ALL_TRADE"));
}
if (GC.getBuildingInfo(eBuilding).getWorldTradeRoutes() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_MORE_WORLD_TRADE", GC.getBuildingInfo(eBuilding).getWorldTradeRoutes()));
}
else if (GC.getBuildingInfo(eBuilding).getWorldTradeRoutes() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_LESS_WORLD_TRADE", -GC.getBuildingInfo(eBuilding).getWorldTradeRoutes()));
}
CvWString szUnit;
UnitTypes eLoopUnit;
for (iI = 0; iI < GC.getNumUnitClassInfos(); ++iI)
{
if (ePlayer != NO_PLAYER)
{
eLoopUnit = ((UnitTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationUnits(iI)));
}
else
{
eLoopUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)iI).getDefaultUnitIndex();
}
if (GC.getGameINLINE().canEverTrain(eLoopUnit))
{
if (kBuilding.getUnitClassProductionModifier(iI) != 0)
{
szFirstBuffer.Format(L"%s%c%d%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(kBuilding.getUnitClassProductionModifier(iI)), (kBuilding.getUnitClassProductionModifier(iI) > 0 ? gDLL->getText("TXT_KEY_UNIT_CLASS_PRODUCTION_FAST_MOD") : gDLL->getText("TXT_KEY_UNIT_CLASS_PRODUCTION_SLOW_MOD")).c_str());
/************************************************************************************************/
/* Afforess Start 08/25/10 */
/* */
/* */
/************************************************************************************************/
/*
szUnit.Format(L"<link=literal>%s</link>", GC.getUnitInfo(eLoopUnit).getDescription());
*/
if (ePlayer != NO_PLAYER)
{
szUnit.Format(L"<link=literal>%s</link>", GC.getUnitInfo(eLoopUnit).getDescription(GET_PLAYER(ePlayer).getCivilizationType()));
}
else
{
szUnit.Format(L"<link=literal>%s</link>", GC.getUnitInfo(eLoopUnit).getDescription());
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
setListHelp(szBuffer, szFirstBuffer, szUnit, L", ", (kBuilding.getUnitClassProductionModifier(iI) != iLast));
iLast = kBuilding.getUnitClassProductionModifier(iI);
}
}
}
bool bGlobal = false;
CvWString szBuilding;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (ePlayer != NO_PLAYER)
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
{
if (kBuilding.getBuildingClassProductionModifier(iI) != 0)
{
szFirstBuffer.Format(L"%s%c%d%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(kBuilding.getBuildingClassProductionModifier(iI)), (kBuilding.getBuildingClassProductionModifier(iI) > 0 ? gDLL->getText("TXT_KEY_CIVIC_BUILDING_CLASS_PRODUCTION_MOD") : gDLL->getText("TXT_KEY_CIVIC_BUILDING_CLASS_PRODUCTION_SLOW")).c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szBuilding, L", ", (kBuilding.getBuildingClassProductionModifier(iI) != iLast));
iLast = kBuilding.getBuildingClassProductionModifier(iI);
}
if (kBuilding.getGlobalBuildingClassProductionModifier(iI) != 0)
{
bGlobal = true;
szFirstBuffer.Format(L"%s%c%d%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(kBuilding.getGlobalBuildingClassProductionModifier(iI)), (kBuilding.getGlobalBuildingClassProductionModifier(iI) > 0 ? gDLL->getText("TXT_KEY_CIVIC_BUILDING_CLASS_PRODUCTION_MOD") : gDLL->getText("TXT_KEY_CIVIC_BUILDING_CLASS_PRODUCTION_SLOW")).c_str());
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szBuilding, L", ", (kBuilding.getGlobalBuildingClassProductionModifier(iI) != iLast));
iLast = kBuilding.getGlobalBuildingClassProductionModifier(iI);
}
}
}
if (bGlobal)
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_GLOBAL"));
//City Growth Speed Modifier
if (GC.getBuildingInfo(eBuilding).getPopulationgrowthratepercentage() != 0)
{
if (GC.getBuildingInfo(eBuilding).getPopulationgrowthratepercentage() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_CITY_SLOW_GROWTH_SPEED", GC.getBuildingInfo(eBuilding).getPopulationgrowthratepercentage()));
}
if (GC.getBuildingInfo(eBuilding).getPopulationgrowthratepercentage() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_CITY_FAST_GROWTH_SPEED", -GC.getBuildingInfo(eBuilding).getPopulationgrowthratepercentage()));
}
}
//Properties
kBuilding.getProperties()->buildChangesString(szBuffer);
kBuilding.getPropertiesAllCities()->buildChangesAllCitiesString(szBuffer);
kBuilding.getPrereqMinProperties()->buildRequiresMinString(szBuffer, pCity ? pCity->getPropertiesConst() : NULL);
kBuilding.getPrereqMaxProperties()->buildRequiresMaxString(szBuffer, pCity ? pCity->getPropertiesConst() : NULL);
kBuilding.getPrereqPlayerMinProperties()->buildRequiresMinString(szBuffer, ePlayer != NO_PLAYER ? GET_PLAYER(ePlayer).getPropertiesConst() : NULL);
kBuilding.getPrereqPlayerMaxProperties()->buildRequiresMaxString(szBuffer, ePlayer != NO_PLAYER ? GET_PLAYER(ePlayer).getPropertiesConst() : NULL);
kBuilding.getPropertyManipulators()->buildDisplayString(szBuffer);
iLast = 0;
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (kBuilding.getBonusDefenseChanges(iI) != 0)
{
szFirstBuffer.Format(L"%s%c%s%d%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), (kBuilding.getBonusDefenseChanges(iI) > 0 ? L"+" : L""), kBuilding.getBonusDefenseChanges(iI), gDLL->getText("TXT_KEY_BUILDING_BONUS_DEFENSE_CHANGE").c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBonusInfo((BonusTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (kBuilding.getBonusDefenseChanges(iI) != iLast));
iLast = kBuilding.getBonusDefenseChanges(iI);
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumUnitCombatInfos(); ++iI)
{
if (kBuilding.getUnitCombatExtraStrength(iI) != 0)
{
szFirstBuffer.Format(L"%s%c%s%d%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), (kBuilding.getUnitCombatExtraStrength(iI) > 0 ? L"+" : L""), kBuilding.getUnitCombatExtraStrength(iI), gDLL->getText("TXT_KEY_BUILDING_UNITCOMBAT_EXTRA_STRENGTH").c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getUnitCombatInfo((UnitCombatTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", (kBuilding.getUnitCombatExtraStrength(iI) != iLast));
if (iLast != kBuilding.getUnitCombatExtraStrength(iI))
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_IN_CITY"));
iLast = kBuilding.getUnitCombatExtraStrength(iI);
}
}
/* iLast = 0;
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
for (int iJ = 0; iJ < GC.getNumImprovementInfos(); iJ++)
{
if (kBuilding.getImprovementYieldChanges(iJ, iI) != 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_YIELD_CHANGE", kBuilding.getImprovementYieldChanges(iJ, iI), GC.getYieldInfo((YieldTypes)iI).getChar()).c_str());
CvWString szImprovement;
szImprovement.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iJ).getDescription());
setListHelp(szBuffer, szFirstBuffer, szImprovement, L", ", (kBuilding.getImprovementYieldChanges(iJ, iI) != iLast));
iLast = kBuilding.getImprovementYieldChanges(iJ, iI);
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
bFirst = true;
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
if (GC.getUnitInfo((UnitTypes)iI).getPrereqBuilding() == eBuilding)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRED_TO_TRAIN").c_str());
/************************************************************************************************/
/* Afforess Start 08/25/10 */
/* */
/* */
/************************************************************************************************/
/*
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription());
*/
if (ePlayer != NO_PLAYER)
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription(GET_PLAYER(ePlayer).getCivilizationType()));
}
else
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription());
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
bFirst = true;
int iCount = 0;
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
if (GC.getUnitInfo((UnitTypes)iI).getBuildings(eBuilding) || GC.getUnitInfo((UnitTypes)iI).getForceBuildings(eBuilding))
{
iCount++;
if (!bCivilopediaText && (iCount > 5))
{
szBuffer.append(L", ...");
break;
}
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_UNIT_REQUIRED_TO_BUILD").c_str());
/************************************************************************************************/
/* Afforess Start 08/25/10 */
/* */
/* */
/************************************************************************************************/
/*
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription());
*/
if (ePlayer != NO_PLAYER)
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription(GET_PLAYER(ePlayer).getCivilizationType()));
}
else
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_UNIT_TEXT"), GC.getUnitInfo((UnitTypes)iI).getDescription());
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
iLast = 0;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (kBuilding.getBuildingHappinessChanges(iI) != 0)
{
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_HAPPINESS_CHANGE", kBuilding.getBuildingHappinessChanges(iI),
((kBuilding.getBuildingHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
*/
// Use absolute value with unhappy face
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_HAPPINESS_CHANGE", abs(kBuilding.getBuildingHappinessChanges(iI)),
((kBuilding.getBuildingHappinessChanges(iI) > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))).c_str());
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
CvWString szBuilding;
if (NO_PLAYER != ePlayer)
{
BuildingTypes ePlayerBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
if (NO_BUILDING != ePlayerBuilding)
{
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingClassInfo((BuildingClassTypes)iI).getDescription());
}
}
else
{
szBuilding.Format(L"<link=literal>%s</link>", GC.getBuildingClassInfo((BuildingClassTypes)iI).getDescription());
}
setListHelp(szBuffer, szTempBuffer, szBuilding, L", ", (kBuilding.getBuildingHappinessChanges(iI) != iLast));
iLast = kBuilding.getBuildingHappinessChanges(iI);
}
}
if (kBuilding.getPowerBonus() != NO_BONUS)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_PROVIDES_POWER_WITH", GC.getBonusInfo((BonusTypes)kBuilding.getPowerBonus()).getTextKeyWide()));
if (kBuilding.isDirtyPower() && (GC.getDefineINT("DIRTY_POWER_HEALTH_CHANGE") != 0))
{
szTempBuffer.Format(L" (+%d%c)", abs(GC.getDefineINT("DIRTY_POWER_HEALTH_CHANGE")), ((GC.getDefineINT("DIRTY_POWER_HEALTH_CHANGE") > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR)));
szBuffer.append(szTempBuffer);
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (ePlayer != NO_PLAYER)
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING)
{
if (GC.getBuildingInfo(eLoopBuilding).isBuildingClassNeededInCity(kBuilding.getBuildingClassType()))
{
if ((pCity == NULL) || pCity->canConstruct(eLoopBuilding, false, true))
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRED_TO_BUILD").c_str());
szTempBuffer.Format(SETCOLR L"<link=literal>%s</link>" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
}
}
/************************************************************************************************/
/* REVDCM 02/16/10 phungus420 */
/* */
/* Leonardo's Workshop */
/************************************************************************************************/
if (kBuilding.getUnitUpgradePriceModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_UNIT_UPGRADE_COST_MOD", kBuilding.getUnitUpgradePriceModifier()));
}
/************************************************************************************************/
/* REVDCM END */
/************************************************************************************************/
if (bCivilopediaText)
{
// Trait
for (int i = 0; i < GC.getNumTraitInfos(); ++i)
{
if (kBuilding.getProductionTraits((TraitTypes)i) != 0)
{
if (kBuilding.getProductionTraits((TraitTypes)i) == 100)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_DOUBLE_SPEED_TRAIT", GC.getTraitInfo((TraitTypes)i).getTextKeyWide()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PRODUCTION_MODIFIER_TRAIT", kBuilding.getProductionTraits((TraitTypes)i), GC.getTraitInfo((TraitTypes)i).getTextKeyWide()));
}
}
}
for (int i = 0; i < GC.getNumTraitInfos(); ++i)
{
if (kBuilding.getHappinessTraits((TraitTypes)i) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_HAPPINESS_TRAIT", kBuilding.getHappinessTraits((TraitTypes)i), GC.getTraitInfo((TraitTypes)i).getTextKeyWide()));
}
}
}
if (bCivilopediaText)
{
if (kBuilding.getGreatPeopleUnitClass() != NO_UNITCLASS)
{
if (ePlayer != NO_PLAYER)
{
eGreatPeopleUnit = ((UnitTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationUnits(kBuilding.getGreatPeopleUnitClass())));
}
else
{
eGreatPeopleUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)kBuilding.getGreatPeopleUnitClass()).getDefaultUnitIndex();
}
if (eGreatPeopleUnit!= NO_UNIT)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_LIKELY_TO_GENERATE", GC.getUnitInfo(eGreatPeopleUnit).getTextKeyWide()));
}
}
if (kBuilding.getFreeStartEra() != NO_ERA)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FREE_START_ERA", GC.getEraInfo((EraTypes)kBuilding.getFreeStartEra()).getTextKeyWide()));
}
}
//Afforess: moved replace building text towards bottom
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (ePlayer != NO_PLAYER)
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (GC.getGameINLINE().canEverConstruct(eLoopBuilding))
{
if (GC.getBuildingInfo(eLoopBuilding).isReplaceBuildingClass(kBuilding.getBuildingClassType()))
{
if ((pCity == NULL) || (pCity->getNumBuilding(eLoopBuilding) == 0))
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REPLACED_BY_BUILDING").c_str());
szTempBuffer.Format(SETCOLR L"<link=literal>%s</link>" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
}
}
if (!CvWString(kBuilding.getHelp()).empty())
{
szBuffer.append(NEWLINE);
szBuffer.append(kBuilding.getHelp());
}
buildBuildingRequiresString(szBuffer, eBuilding, bCivilopediaText, bTechChooserText, pCity);
//AIAndy: Display in which range of a property this building is auto built
for (int i=0; i<GC.getNumPropertyInfos(); i++)
{
CvPropertyInfo& kInfo = GC.getPropertyInfo((PropertyTypes)i);
int iNum = kInfo.getNumPropertyBuildings();
for (int j=0; j<iNum; j++)
{
if (kInfo.getPropertyBuilding(j).eBuilding == eBuilding)
{
szBuffer.append(NEWLINE);
int iMinVal = kInfo.getPropertyBuilding(j).iMinValue;
int iMaxVal = kInfo.getPropertyBuilding(j).iMaxValue;
int iOpMin = kInfo.getOperationalRangeMin();
int iOpMax = kInfo.getOperationalRangeMax();
if (iMinVal < iOpMin - 5*(iOpMax - iOpMin))
{
szBuffer.append(gDLL->getText("TXT_KEY_PROPERTY_BUILDING_DISPLAY_UNDER", iMaxVal));
}
else if (iMaxVal > iOpMax + 5*(iOpMax - iOpMin))
{
szBuffer.append(gDLL->getText("TXT_KEY_PROPERTY_BUILDING_DISPLAY_OVER", iMinVal));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_PROPERTY_BUILDING_DISPLAY", iMinVal, iMaxVal));
}
CvWString szTemp;
szTemp.Format(L"%c", kInfo.getChar());
szBuffer.append(szTemp);
}
}
}
if (pCity != NULL)
{
// BUG - Building Double Commerce - start
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER &&
(pCity->getNumRealBuilding(eBuilding) == 0 || (pCity->getNumRealBuilding(eBuilding) > 0 && pCity->getBuildingOriginalOwner(eBuilding) == GC.getGameINLINE().getActivePlayer())))
{
if (getBugOptionBOOL("CityScreen__BuildingDoubleCommerce", true, "BUG_BUILDING_DOUBLE_COMMERCE"))
{
int iYear = pCity->getBuildingOriginalTime(eBuilding);
if (iYear != MIN_INT)
{
// year built
CvWString szYear;
if (iYear < 0)
{
szYear = gDLL->getText("TXT_KEY_TIME_BC", -iYear);
}
else if (iYear > 0)
{
szYear = gDLL->getText("TXT_KEY_TIME_AD", iYear);
}
else
{
szYear = gDLL->getText("TXT_KEY_TIME_AD", 1);
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUG_YEAR_BUILT", szYear.GetCString()));
}
if ( iYear == MIN_INT )
{
iYear = GC.getGameINLINE().getGameTurnYear(); // Not yet built so display the full time to double commerces
}
// double commerce
if (pCity->getOwnerINLINE() == GC.getGameINLINE().getActivePlayer())
{
for (iI = 0; iI < NUM_COMMERCE_TYPES; iI++)
{
int iDoubleTime = kBuilding.getCommerceChangeDoubleTime(iI);
int iAge = GC.getGameINLINE().getGameTurnYear() - iYear;
if (iAge < iDoubleTime)
{
szBuffer.append(NEWLINE);
if (iAge - iDoubleTime == 1)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_DOUBLE_COMMERCE_NEXT_YEAR", GC.getCommerceInfo((CommerceTypes)iI).getTextKeyWide()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_DOUBLE_COMMERCE_YEARS", GC.getCommerceInfo((CommerceTypes)iI).getTextKeyWide(), iDoubleTime - iAge));
}
}
}
}
}
}
// BUG - Building Double Commerce - end
if (!(GC.getBuildingClassInfo((BuildingClassTypes)(kBuilding.getBuildingClassType())).isNoLimit()))
{
if (isWorldWonderClass((BuildingClassTypes)(kBuilding.getBuildingClassType())))
{
if (pCity->isWorldWondersMaxed())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_WORLD_WONDERS_PER_CITY", pCity->getMaxNumWorldWonders()));
}
}
else if (isTeamWonderClass((BuildingClassTypes)(kBuilding.getBuildingClassType())))
{
if (pCity->isTeamWondersMaxed())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TEAM_WONDERS_PER_CITY", GC.getCultureLevelInfo(pCity->getCultureLevel()).getMaxTeamWonders()));
}
}
else if (isNationalWonderClass((BuildingClassTypes)(kBuilding.getBuildingClassType())))
{
if (pCity->isNationalWondersMaxed())
{
int iMaxNumWonders = (GC.getGameINLINE().isOption(GAMEOPTION_ONE_CITY_CHALLENGE) && GET_PLAYER(pCity->getOwnerINLINE()).isHuman()) ? GC.getCultureLevelInfo(pCity->getCultureLevel()).getMaxNationalWondersOCC() : GC.getCultureLevelInfo(pCity->getCultureLevel()).getMaxNationalWonders();
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NATIONAL_WONDERS_PER_CITY", iMaxNumWonders));
}
}
else
{
if (pCity->isBuildingsMaxed())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NUM_PER_CITY", GC.getDefineINT("MAX_BUILDINGS_PER_CITY")));
}
}
}
}
if ((pCity == NULL) || pCity->getNumRealBuilding(eBuilding) < GC.getCITY_MAX_NUM_BUILDINGS())
{
if (!bCivilopediaText)
{
if (pCity == NULL)
{
if (kBuilding.getProductionCost() > 0)
{
szTempBuffer.Format(L"\n%d%c", (ePlayer != NO_PLAYER ? GET_PLAYER(ePlayer).getProductionNeeded(eBuilding) : kBuilding.getProductionCost()), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
szBuffer.append(szTempBuffer);
}
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_NUM_TURNS", pCity->getProductionTurnsLeft(eBuilding, ((gDLL->ctrlKey() || !(gDLL->shiftKey())) ? 0 : pCity->getOrderQueueLength()))));
iProduction = pCity->getBuildingProduction(eBuilding);
int iProductionNeeded = pCity->getProductionNeeded(eBuilding);
if (iProduction > 0)
{
szTempBuffer.Format(L" - %d/%d%c", iProduction, iProductionNeeded, GC.getYieldInfo(YIELD_PRODUCTION).getChar());
szBuffer.append(szTempBuffer);
}
else
{
szTempBuffer.Format(L" - %d%c", iProductionNeeded, GC.getYieldInfo(YIELD_PRODUCTION).getChar());
szBuffer.append(szTempBuffer);
}
// BUG - Production Decay - start
if (getBugOptionBOOL("CityScreen__ProductionDecayHover", true, "BUG_PRODUCTION_DECAY_HOVER"))
{
setProductionDecayHelp(szBuffer, pCity->getBuildingProductionDecayTurns(eBuilding), getBugOptionINT("CityScreen__ProductionDecayHoverBuildingThreshold", 5, "BUG_PRODUCTION_DECAY_HOVER_BUILDING_THRESHOLD"), pCity->getBuildingProductionDecay(eBuilding), pCity->getProductionBuilding() == eBuilding);
}
// BUG - Production Decay - end
}
}
for (int iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (kBuilding.getBonusProductionModifier(iI) != 0)
{
if (pCity != NULL)
{
if (pCity->hasBonus((BonusTypes)iI))
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
}
}
if (!bCivilopediaText)
{
szBuffer.append(L" (");
}
else
{
szTempBuffer.Format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR), szTempBuffer.c_str());
szBuffer.append(szTempBuffer);
}
if (kBuilding.getBonusProductionModifier(iI) == 100)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DOUBLE_SPEED_WITH", GC.getBonusInfo((BonusTypes)iI).getTextKeyWide()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_BUILDS_FASTER_WITH", kBuilding.getBonusProductionModifier(iI), GC.getBonusInfo((BonusTypes)iI).getTextKeyWide()));
}
if (!bCivilopediaText)
{
szBuffer.append(L')');
}
if (pCity != NULL)
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
}
}
}
if (kBuilding.getObsoleteTech() != NO_TECH)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_OBSOLETE_WITH", GC.getTechInfo((TechTypes) kBuilding.getObsoleteTech()).getTextKeyWide()));
if (kBuilding.getDefenseModifier() != 0 || kBuilding.getBombardDefenseModifier() != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_OBSOLETE_EXCEPT"));
}
}
if (kBuilding.getSpecialBuildingType() != NO_SPECIALBUILDING)
{
if (GC.getSpecialBuildingInfo((SpecialBuildingTypes) kBuilding.getSpecialBuildingType()).getObsoleteTech() != NO_TECH)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_OBSOLETE_WITH", GC.getTechInfo((TechTypes) GC.getSpecialBuildingInfo((SpecialBuildingTypes) kBuilding.getSpecialBuildingType()).getObsoleteTech()).getTextKeyWide()));
}
}
if ((gDLL->getChtLvl() > 0) && gDLL->ctrlKey() && (pCity != NULL))
{
int iBuildingValue = pCity->AI_buildingValue(eBuilding);
szBuffer.append(CvWString::format(L"\nAI Building Value = %d", iBuildingValue));
}
}
if (bStrategyText)
{
if (!CvWString(kBuilding.getStrategy()).empty())
{
if ((ePlayer == NO_PLAYER) || GET_PLAYER(ePlayer).isOption(PLAYEROPTION_ADVISOR_HELP))
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_SIDS_TIPS"));
szBuffer.append(L'\"');
szBuffer.append(kBuilding.getStrategy());
szBuffer.append(L'\"');
}
}
}
if (bCivilopediaText)
{
if (eDefaultBuilding == eBuilding)
{
for (iI = 0; iI < GC.getNumBuildingInfos(); ++iI)
{
if (iI != eBuilding)
{
if (eBuildingClass == GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REPLACED_BY_BUILDING", GC.getBuildingInfo((BuildingTypes)iI).getTextKeyWide()));
}
}
}
}
}
}
void CvGameTextMgr::buildBuildingRequiresString(CvWStringBuffer& szBuffer, BuildingTypes eBuilding, bool bCivilopediaText, bool bTechChooserText, const CvCity* pCity)
{
bool bFirst;
PlayerTypes ePlayer;
CvWString szTempBuffer;
CvWString szFirstBuffer;
CvBuildingInfo& kBuilding = GC.getBuildingInfo(eBuilding);
BuildingTypes eLoopBuilding;
int iI;
int iTerrainCount;
if (pCity != NULL)
{
ePlayer = pCity->getOwnerINLINE();
}
else
{
ePlayer = GC.getGameINLINE().getActivePlayer();
}
bool bCanConstruct = (NULL != pCity && pCity->canConstruct(eBuilding));
// Future - do the green/red text thing with all of this - for now just civics do it
// so can skip the rest of teh code for constructable buildings
if ( !bCanConstruct )
{
if (kBuilding.getHolyCity() != NO_RELIGION)
{
if (pCity == NULL || !pCity->isHolyCity((ReligionTypes)(kBuilding.getHolyCity())))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ACTION_ONLY_HOLY_CONSTRUCT", GC.getReligionInfo((ReligionTypes) kBuilding.getHolyCity()).getChar()));
}
}
bFirst = true;
if (kBuilding.getSpecialBuildingType() != NO_SPECIALBUILDING)
{
if ((pCity == NULL) || !(GC.getGameINLINE().isSpecialBuildingValid((SpecialBuildingTypes)(kBuilding.getSpecialBuildingType()))))
{
for (int iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
if (GC.getProjectInfo((ProjectTypes)iI).getEveryoneSpecialBuilding() == kBuilding.getSpecialBuildingType())
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
CvWString szProject;
szProject.Format(L"<link=literal>%s</link>", GC.getProjectInfo((ProjectTypes)iI).getDescription());
setListHelp(szBuffer, szTempBuffer, szProject, gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
}
}
if (!bFirst)
{
szBuffer.append(ENDCOLR);
}
if (kBuilding.getSpecialBuildingType() != NO_SPECIALBUILDING)
{
if ((pCity == NULL) || !(GC.getGameINLINE().isSpecialBuildingValid((SpecialBuildingTypes)(kBuilding.getSpecialBuildingType()))))
{
TechTypes eTech = (TechTypes)GC.getSpecialBuildingInfo((SpecialBuildingTypes)kBuilding.getSpecialBuildingType()).getTechPrereqAnyone();
if (NO_TECH != eTech)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES_TECH_ANYONE", GC.getTechInfo(eTech).getTextKeyWide()));
}
}
}
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (ePlayer == NO_PLAYER && kBuilding.getPrereqNumOfBuildingClass((BuildingClassTypes)iI) > 0)
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_SPECIAL_BUILDINGS_NO_CITY", GC.getBuildingInfo(eLoopBuilding).getTextKeyWide(), kBuilding.getPrereqNumOfBuildingClass((BuildingClassTypes)iI)).c_str());
szBuffer.append(szTempBuffer);
}
else if (ePlayer != NO_PLAYER && GET_PLAYER(ePlayer).getBuildingClassPrereqBuilding(eBuilding, ((BuildingClassTypes)iI)) > 0)
{
if ((pCity == NULL) || (GET_PLAYER(ePlayer).getBuildingClassCount((BuildingClassTypes)iI) < GET_PLAYER(ePlayer).getBuildingClassPrereqBuilding(eBuilding, ((BuildingClassTypes)iI))))
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
if (eLoopBuilding != NO_BUILDING)
{
if (pCity != NULL)
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_SPECIAL_BUILDINGS", GC.getBuildingInfo(eLoopBuilding).getTextKeyWide(), GET_PLAYER(ePlayer).getBuildingClassCount((BuildingClassTypes)iI), GET_PLAYER(ePlayer).getBuildingClassPrereqBuilding(eBuilding, ((BuildingClassTypes)iI))).c_str());
}
else
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_SPECIAL_BUILDINGS_NO_CITY", GC.getBuildingInfo(eLoopBuilding).getTextKeyWide(), GET_PLAYER(ePlayer).getBuildingClassPrereqBuilding(eBuilding, ((BuildingClassTypes)iI))).c_str());
}
szBuffer.append(szTempBuffer);
}
}
}
else if (kBuilding.isBuildingClassNeededInCity(iI))
{
if (NO_PLAYER != ePlayer)
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING)
{
if ((pCity == NULL) || (pCity->getNumBuilding(eLoopBuilding) <= 0))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_STRING", GC.getBuildingInfo(eLoopBuilding).getTextKeyWide()));
}
}
}
}
if (kBuilding.isStateReligion())
{
if (NULL == pCity || NO_PLAYER == ePlayer || NO_RELIGION == GET_PLAYER(ePlayer).getStateReligion() || !pCity->isHasReligion(GET_PLAYER(ePlayer).getStateReligion()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES_STATE_RELIGION"));
}
}
if (kBuilding.getNumCitiesPrereq() > 0)
{
if (NO_PLAYER == ePlayer || GET_PLAYER(ePlayer).getNumCities() < kBuilding.getNumCitiesPrereq())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_CITIES", kBuilding.getNumCitiesPrereq()));
}
}
if (kBuilding.getUnitLevelPrereq() > 0)
{
if (NO_PLAYER == ePlayer || GET_PLAYER(ePlayer).getHighestUnitLevel() < kBuilding.getUnitLevelPrereq())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_UNIT_LEVEL", kBuilding.getUnitLevelPrereq()));
}
}
if (kBuilding.getMinLatitude() > 0)
{
if (NULL == pCity || pCity->plot()->getLatitude() < kBuilding.getMinLatitude())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MIN_LATITUDE", kBuilding.getMinLatitude()));
}
}
if (kBuilding.getMaxLatitude() < 90)
{
if (NULL == pCity || pCity->plot()->getLatitude() > kBuilding.getMaxLatitude())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MAX_LATITUDE", kBuilding.getMaxLatitude()));
}
}
/************************************************************************************************/
/* Afforess 5/5/10 */
/* */
/* */
/************************************************************************************************/
if (kBuilding.isBuildOnlyOnPeaks())
{
if (pCity == NULL || !pCity->plot()->isPeak())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_MOUNTAIN"));
}
}
}
bFirst = true;
bool bLastCivicWasMet = false;
bool civicRequirementsAllMet = true;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
if (kBuilding.isPrereqAndCivics(CivicTypes(iI)))
{
if ((GC.getGameINLINE().getActivePlayer() == NO_PLAYER )|| !(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic((CivicTypes(iI)))))
{
if ( bLastCivicWasMet && !bFirst )
{
szBuffer.append(gDLL->getText("TXT_KEY_SET_WARNING_COLOR").c_str());
}
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getCivicInfo((CivicTypes(iI))).getDescription(), gDLL->getText("TXT_KEY_AND").c_str(), bFirst);
bLastCivicWasMet = false;
civicRequirementsAllMet = false;
}
else
{
if ( !bLastCivicWasMet && !bFirst )
{
szBuffer.append(gDLL->getText("TXT_KEY_REVERT_COLOR").c_str());
}
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES_NO_WARNING").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getCivicInfo((CivicTypes(iI))).getDescription(), gDLL->getText("TXT_KEY_AND").c_str(), bFirst);
bLastCivicWasMet = true;
}
bFirst = false;
}
}
bFirst = true;
bool bCivicORRequirementMet = false;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
if (kBuilding.isPrereqOrCivics(CivicTypes(iI)))
{
bool bThisConditionMet = (GC.getGameINLINE().getActivePlayer() != NO_PLAYER && GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isCivic(CivicTypes(iI)));
CvWString separator = gDLL->getText("TXT_KEY_OR");
CvWString prefix = gDLL->getText("TXT_KEY_REQUIRES_NO_WARNING");
CvWString desc = GC.getCivicInfo((CivicTypes(iI))).getDescription();
separator = gDLL->getText("TXT_KEY_REVERT_COLOR") + gDLL->getText("TXT_KEY_OR");
if (!bThisConditionMet)
{
desc = gDLL->getText("TXT_KEY_SET_WARNING_COLOR") + desc;
}
else
{
desc = gDLL->getText("TXT_KEY_POSITIVE_COLOR") + desc;
bCivicORRequirementMet= true;
}
szTempBuffer.Format(L"%s%s", NEWLINE, prefix.c_str());
setListHelp(szBuffer,szTempBuffer, desc.c_str(), separator.c_str(), bFirst);
bFirst = false;
}
}
civicRequirementsAllMet &= (bFirst || bCivicORRequirementMet);
if (kBuilding.isRequiresActiveCivics())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText(civicRequirementsAllMet ? "TXT_KEY_BUILDING_REQUIRES_ACTIVE_CIVICS_MET" : "TXT_KEY_BUILDING_REQUIRES_ACTIVE_CIVICS"));
}
if ( !bCanConstruct )
{
if (kBuilding.getPrereqVicinityBonus() != NO_BONUS)
{
if (pCity == NULL || !pCity->hasVicinityBonus((BonusTypes)kBuilding.getPrereqVicinityBonus()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES_VICINITY_BONUS", GC.getBonusInfo((BonusTypes)kBuilding.getPrereqVicinityBonus()).getTextKeyWide()));
}
}
CvWStringBuffer szBonusList;
bFirst = true;
for (iI = 0; iI < GC.getNUM_BUILDING_PREREQ_OR_BONUSES(); ++iI)
{
if (kBuilding.getPrereqOrVicinityBonuses(iI) != NO_BONUS)
{
if (pCity == NULL || !pCity->hasVicinityBonus((BonusTypes)kBuilding.getPrereqOrVicinityBonuses(iI)))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES_IN_CITY_VICINITY").c_str());
setListHelp(szBonusList, szTempBuffer, GC.getBonusInfo((BonusTypes)kBuilding.getPrereqOrVicinityBonuses(iI)).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
else if (NULL != pCity)
{
bFirst = true;
break;
}
}
}
if (!bFirst)
{
szBonusList.append(ENDCOLR);
szBuffer.append(szBonusList);
}
if (kBuilding.isPrereqPower())
{
if (pCity == NULL || !pCity->isPower())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_POWER"));
szBuffer.append(CvWString::format(L" (%c)", gDLL->getSymbolID(POWER_CHAR)));
}
}
if (kBuilding.isPrereqWar())
{
if (pCity == NULL || GET_TEAM(pCity->getTeam()).getAtWarCount(true) == 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_WARTIME"));
}
}
int iPrereqPopulation = std::max(kBuilding.getPrereqPopulation(), (pCity != NULL ? pCity->getNumPopulationEmployed() + 1 : 0) + kBuilding.getNumPopulationEmployed());
if (iPrereqPopulation > 0)
{
if (pCity == NULL || pCity->getPopulation() < iPrereqPopulation)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_POPULATION", iPrereqPopulation));
}
}
if (kBuilding.isRiver() && kBuilding.isWater())
{
if (pCity == NULL || !(pCity->plot()->isRiver() || pCity->isCoastal(kBuilding.getMinAreaSize())))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_RIVER_OR_COAST"));
}
}
else if (kBuilding.isRiver())
{
if (pCity == NULL || !(pCity->plot()->isRiver()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_RIVER"));
}
}
else if (kBuilding.isWater())
{
if (pCity == NULL || !(pCity->isCoastal(kBuilding.getMinAreaSize())))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_COAST"));
}
}
else if (kBuilding.isFreshWater())
{
if (pCity == NULL || !(pCity->plot()->isFreshWater()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_FRESH_WATER"));
}
}
bool bFound = false;
if (pCity != NULL)
{
for (iI = 0; iI < GC.getNumGameSpeedInfos(); iI++)
{
if (kBuilding.isPrereqOrGameSpeed(iI))
{
if (GC.getGameINLINE().getGameSpeedType() == iI)
{
bFound = true;
break;
}
}
}
}
if (!bFound)
{
bFirst = true;
for (iI = 0; iI < GC.getNumGameSpeedInfos(); iI++)
{
if (kBuilding.isPrereqOrGameSpeed(iI))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getGameSpeedInfo((GameSpeedTypes)iI).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
}
if (kBuilding.getPrereqCultureLevel() != NO_CULTURELEVEL)
{
if (pCity == NULL || pCity->getCultureLevel() < kBuilding.getPrereqCultureLevel())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_CULTURE", GC.getCultureLevelInfo((CultureLevelTypes)kBuilding.getPrereqCultureLevel()).getDescription()));
}
}
if (kBuilding.getPrereqAnyoneBuildingClass() != NO_BUILDINGCLASS)
{
BuildingClassTypes ePrereqBuildingClass = (BuildingClassTypes)GC.getBuildingInfo(eBuilding).getPrereqAnyoneBuildingClass();
if (pCity == NULL || GC.getGameINLINE().getBuildingClassCreatedCount(ePrereqBuildingClass) == 0)
{
BuildingTypes ePrereqBuilding;
if (pCity != NULL)
{
ePrereqBuilding = (BuildingTypes)(GC.getCivilizationInfo(pCity->getCivilizationType()).getCivilizationBuildings(ePrereqBuildingClass));
}
else
{
ePrereqBuilding = (BuildingTypes)GC.getBuildingClassInfo(ePrereqBuildingClass).getDefaultBuildingIndex();
}
if (ePrereqBuilding != NO_BUILDING)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_ANY_BUILDINGCLASS", GC.getBuildingInfo(ePrereqBuilding).getDescription()));
}
}
}
bFirst = true;
bool bValid = false;
if (pCity != NULL)
{
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (kBuilding.isPrereqOrBuildingClass(iI))
{
if (NO_PLAYER != ePlayer)
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING)
{
if (pCity->getNumBuilding(eLoopBuilding) > 0)
{
bValid = true;
break;
}
}
}
}
}
if (!bValid)
{
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (kBuilding.isPrereqOrBuildingClass(iI))
{
if (NO_PLAYER != ePlayer)
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING)
{
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getBuildingInfo(eLoopBuilding).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
}
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumBuildingClassInfos(); ++iI)
{
if (kBuilding.isPrereqNotBuildingClass(iI))
{
if (ePlayer != NO_PLAYER)
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(ePlayer).getCivilizationType()).getCivilizationBuildings(iI)));
}
else
{
eLoopBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (eLoopBuilding != NO_BUILDING)
{
if ((pCity == NULL) || (pCity->getNumActiveBuilding(eLoopBuilding) > 0))
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_NOT_REQUIRED_TO_BUILD").c_str());
szTempBuffer.Format(SETCOLR L"<link=literal>%s</link>" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eLoopBuilding).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
}
}
bFirst = true;
for (iTerrainCount = 0; iTerrainCount < GC.getNumTerrainInfos(); ++iTerrainCount)
{
if (kBuilding.isPrereqOrTerrain(iTerrainCount))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getTerrainInfo((TerrainTypes(iTerrainCount))).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
if (!bFirst)
{
szBuffer.append(gDLL->getText("TXT_KEY_IN_CITY_VICINITY"));
}
bFirst = true;
for (iTerrainCount = 0; iTerrainCount < GC.getNumTerrainInfos(); ++iTerrainCount)
{
if (kBuilding.isPrereqAndTerrain(iTerrainCount))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getTerrainInfo((TerrainTypes(iTerrainCount))).getDescription(), gDLL->getText("TXT_KEY_AND").c_str(), bFirst);
bFirst = false;
}
}
if (!bFirst)
{
szBuffer.append(gDLL->getText("TXT_KEY_IN_CITY_VICINITY"));
}
bFirst = true;
for (iTerrainCount = 0; iTerrainCount < GC.getNumImprovementInfos(); ++iTerrainCount)
{
if (kBuilding.isPrereqOrImprovement(iTerrainCount))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getImprovementInfo((ImprovementTypes(iTerrainCount))).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
if (!bFirst)
{
szBuffer.append(gDLL->getText("TXT_KEY_IN_CITY_VICINITY"));
}
bFirst = true;
for (iTerrainCount = 0; iTerrainCount < GC.getNumFeatureInfos(); ++iTerrainCount)
{
if (kBuilding.isPrereqOrFeature(iTerrainCount))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getFeatureInfo((FeatureTypes(iTerrainCount))).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
}
if (!bFirst)
{
szBuffer.append(gDLL->getText("TXT_KEY_IN_CITY_VICINITY"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (pCity != NULL)
{
if (GC.getGameINLINE().isNoNukes())
{
if (kBuilding.isAllowsNukes())
{
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
if (GC.getUnitInfo((UnitTypes)iI).getNukeRange() != -1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_NO_NUKES"));
break;
}
}
}
}
}
BoolExpr* pExpr = kBuilding.getConstructCondition();
if (pExpr)
{
bool bEval = false;
if (pCity)
{
bEval = pExpr->evaluate(const_cast<CvGameObjectCity*>(pCity->getGameObjectConst())); // Const wegcasten ist hier ok da evaluate nicht wirklich etwas ändert
}
if (!bEval)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_REQUIRES"));
szBuffer.append(" ");
pExpr->buildDisplayString(szBuffer);
}
}
if (bCivilopediaText)
{
if (kBuilding.getVictoryPrereq() != NO_VICTORY)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_VICTORY", GC.getVictoryInfo((VictoryTypes)(kBuilding.getVictoryPrereq())).getTextKeyWide()));
}
if (kBuilding.getMaxStartEra() != NO_ERA)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_MAX_START_ERA", GC.getEraInfo((EraTypes)kBuilding.getMaxStartEra()).getTextKeyWide()));
}
if (kBuilding.getNumTeamsPrereq() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_TEAMS", kBuilding.getNumTeamsPrereq()));
}
}
else
{
if (!bTechChooserText)
{
if (kBuilding.getPrereqAndTech() != NO_TECH)
{
if (ePlayer == NO_PLAYER || !(GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasTech((TechTypes)(kBuilding.getPrereqAndTech()))))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_STRING", GC.getTechInfo((TechTypes)(kBuilding.getPrereqAndTech())).getTextKeyWide()));
}
}
}
bFirst = true;
for (iI = 0; iI < GC.getNUM_BUILDING_AND_TECH_PREREQS(); ++iI)
{
if (kBuilding.getPrereqAndTechs(iI) != NO_TECH)
{
if (bTechChooserText || ePlayer == NO_PLAYER || !(GET_TEAM(GET_PLAYER(ePlayer).getTeam()).isHasTech((TechTypes)(kBuilding.getPrereqAndTechs(iI)))))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBuffer, szTempBuffer, GC.getTechInfo(((TechTypes)(kBuilding.getPrereqAndTechs(iI)))).getDescription(), gDLL->getText("TXT_KEY_AND").c_str(), bFirst);
bFirst = false;
}
}
}
if (!bFirst)
{
szBuffer.append(ENDCOLR);
}
if (kBuilding.getPrereqAndBonus() != NO_BONUS)
{
if ((pCity == NULL) || !(pCity->hasBonus((BonusTypes)kBuilding.getPrereqAndBonus())))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_REQUIRES_STRING", GC.getBonusInfo((BonusTypes)kBuilding.getPrereqAndBonus()).getTextKeyWide()));
}
}
/************************************************************************************************/
/* Afforess Vicinity Bonus Start 07/29/09 */
/* */
/* */
/************************************************************************************************/
// CvWStringBuffer szBonusList;
szBonusList.clear();
/************************************************************************************************/
/* Afforess Vicinity Bonus End END */
/************************************************************************************************/
bFirst = true;
for (iI = 0; iI < GC.getNUM_BUILDING_PREREQ_OR_BONUSES(); ++iI)
{
if (kBuilding.getPrereqOrBonuses(iI) != NO_BONUS)
{
if ((pCity == NULL) || !(pCity->hasBonus((BonusTypes)kBuilding.getPrereqOrBonuses(iI))))
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
setListHelp(szBonusList, szTempBuffer, GC.getBonusInfo((BonusTypes)kBuilding.getPrereqOrBonuses(iI)).getDescription(), gDLL->getText("TXT_KEY_OR").c_str(), bFirst);
bFirst = false;
}
else if (NULL != pCity)
{
bFirst = true;
break;
}
}
}
if (!bFirst)
{
szBonusList.append(ENDCOLR);
szBuffer.append(szBonusList);
}
if (NO_CORPORATION != kBuilding.getFoundsCorporation())
{
bFirst = true;
szBonusList.clear();
for (iI = 0; iI < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++iI)
{
BonusTypes eBonus = (BonusTypes)GC.getCorporationInfo((CorporationTypes)kBuilding.getFoundsCorporation()).getPrereqBonus(iI);
if (NO_BONUS != eBonus)
{
if ((pCity == NULL) || !(pCity->hasBonus(eBonus)))
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_REQUIRES").c_str());
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBonusInfo(eBonus).getDescription());
setListHelp(szBonusList, szFirstBuffer, szTempBuffer, gDLL->getText("TXT_KEY_OR"), bFirst);
bFirst = false;
}
else if (NULL != pCity)
{
bFirst = true;
break;
}
}
}
if (!bFirst)
{
szBonusList.append(ENDCOLR);
szBuffer.append(szBonusList);
}
}
}
}
}
// BUG - Production Decay - start
void CvGameTextMgr::setProductionDecayHelp(CvWStringBuffer &szBuffer, int iTurnsLeft, int iThreshold, int iDecay, bool bProducing)
{
if (iTurnsLeft <= 1)
{
if (bProducing)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PRODUCTION_DECAY_PRODUCING", iDecay));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PRODUCTION_DECAY", iDecay));
}
}
else
{
if (iTurnsLeft <= iThreshold)
{
if (bProducing)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PRODUCTION_DECAY_TURNS_PRODUCING", iDecay, iTurnsLeft));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PRODUCTION_DECAY_TURNS", iDecay, iTurnsLeft));
}
}
}
}
// BUG - Production Decay - end
void CvGameTextMgr::setProjectHelp(CvWStringBuffer &szBuffer, ProjectTypes eProject, bool bCivilopediaText, CvCity* pCity)
{
PROFILE_FUNC();
CvWString szTempBuffer;
CvWString szFirstBuffer;
PlayerTypes ePlayer;
bool bFirst;
int iProduction;
int iI;
if (NO_PROJECT == eProject)
{
return;
}
CvProjectInfo& kProject = GC.getProjectInfo(eProject);
if (pCity != NULL)
{
ePlayer = pCity->getOwnerINLINE();
}
else
{
ePlayer = GC.getGameINLINE().getActivePlayer();
}
if (!bCivilopediaText)
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_PROJECT_TEXT"), kProject.getDescription());
szBuffer.append(szTempBuffer);
if (isWorldProject(eProject))
{
if (pCity == NULL)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_WORLD_NUM_ALLOWED", kProject.getMaxGlobalInstances()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_WORLD_NUM_LEFT", (kProject.getMaxGlobalInstances() - GC.getGameINLINE().getProjectCreatedCount(eProject) - GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getProjectMaking(eProject))));
}
}
if (isTeamProject(eProject))
{
if (pCity == NULL)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_TEAM_NUM_ALLOWED", kProject.getMaxTeamInstances()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_TEAM_NUM_LEFT", (kProject.getMaxTeamInstances() - GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getProjectCount(eProject) - GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getProjectMaking(eProject))));
}
}
}
if (kProject.getNukeInterception() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_CHANCE_INTERCEPT_NUKES", kProject.getNukeInterception()));
}
if (kProject.getTechShare() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_TECH_SHARE", kProject.getTechShare()));
}
//DPII < Maintenance Modifiers >
if (kProject.getGlobalMaintenanceModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_GLOBAL_MAINT_MOD", kProject.getGlobalMaintenanceModifier()));
}
if (kProject.getDistanceMaintenanceModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_DISTANCE_MAINT_MOD", kProject.getDistanceMaintenanceModifier()));
}
if (kProject.getNumCitiesMaintenanceModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_NUM_CITIES_MAINT_MOD", kProject.getNumCitiesMaintenanceModifier()));
}
//DPII < Maintenance Modifiers >
if (kProject.isAllowsNukes())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_ENABLES_NUKES"));
}
if (kProject.getEveryoneSpecialUnit() != NO_SPECIALUNIT)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_ENABLES_SPECIAL", GC.getSpecialUnitInfo((SpecialUnitTypes)(kProject.getEveryoneSpecialUnit())).getTextKeyWide()));
}
if (kProject.getEveryoneSpecialBuilding() != NO_SPECIALBUILDING)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_ENABLES_SPECIAL", GC.getSpecialBuildingInfo((SpecialBuildingTypes)(kProject.getEveryoneSpecialBuilding())).getTextKeyWide()));
}
/************************************************************************************************/
/* Afforess Start 01/02/10 */
/* */
/* */
/************************************************************************************************/
if (kProject.getWorldHappiness() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_WORLD_HAPPINESS", kProject.getWorldHappiness()));
}
else if (kProject.getWorldHappiness() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_WORLD_UNHAPPINESS", -kProject.getWorldHappiness()));
}
if (kProject.getWorldHealth() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_WORLD_HEALTH", kProject.getWorldHealth()));
}
else if (kProject.getWorldHealth() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_WORLD_UNHEALTH", -kProject.getWorldHealth()));
}
if (kProject.getGlobalHappiness() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_HAPPINESS", kProject.getGlobalHappiness()));
}
else if (kProject.getGlobalHappiness() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_UNHAPPINESS", -kProject.getGlobalHappiness()));
}
if (kProject.getGlobalHealth() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_HEALTH", kProject.getGlobalHealth()));
}
else if (kProject.getGlobalHealth() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_UNHEALTH", -kProject.getGlobalHealth()));
}
if (kProject.getWorldTradeRoutes() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_MORE_WORLD_TRADE", kProject.getWorldTradeRoutes()));
}
else if (kProject.getWorldTradeRoutes() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_LESS_WORLD_TRADE", -kProject.getWorldTradeRoutes()));
}
if (kProject.getInflationModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ADJUSTS_INFLATION", kProject.getInflationModifier()));
}
setCommerceChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_ALL_CITIES").c_str(), kProject.getCommerceModifierArray(), true);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
for (iI = 0; iI < GC.getNumVictoryInfos(); ++iI)
{
if (kProject.getVictoryThreshold(iI) > 0)
{
if (kProject.getVictoryThreshold(iI) == kProject.getVictoryMinThreshold(iI))
{
szTempBuffer.Format(L"%d", kProject.getVictoryThreshold(iI));
}
else
{
szTempBuffer.Format(L"%d-%d", kProject.getVictoryMinThreshold(iI), kProject.getVictoryThreshold(iI));
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_REQUIRED_FOR_VICTORY", szTempBuffer.GetCString(), GC.getVictoryInfo((VictoryTypes)iI).getTextKeyWide()));
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
if (GC.getProjectInfo((ProjectTypes)iI).getAnyoneProjectPrereq() == eProject)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_PROJECT_REQUIRED_TO_CREATE_ANYONE").c_str());
szTempBuffer.Format(SETCOLR L"<link=literal>%s</link>" ENDCOLR, TEXT_COLOR("COLOR_PROJECT_TEXT"), GC.getProjectInfo((ProjectTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
bFirst = true;
for (iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
if (GC.getProjectInfo((ProjectTypes)iI).getProjectsNeeded(eProject) > 0)
{
if ((pCity == NULL) || pCity->canCreate(((ProjectTypes)iI), false, true))
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_PROJECT_REQUIRED_TO_CREATE").c_str());
szTempBuffer.Format(SETCOLR L"<link=literal>%s</link>" ENDCOLR, TEXT_COLOR("COLOR_PROJECT_TEXT"), GC.getProjectInfo((ProjectTypes)iI).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
}
if ((pCity == NULL) || !(pCity->canCreate(eProject)))
{
if (pCity != NULL)
{
if (GC.getGameINLINE().isNoNukes())
{
if (kProject.isAllowsNukes())
{
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
if (GC.getUnitInfo((UnitTypes)iI).getNukeRange() != -1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_NO_NUKES"));
break;
}
}
}
}
}
if (kProject.getAnyoneProjectPrereq() != NO_PROJECT)
{
if ((pCity == NULL) || (GC.getGameINLINE().getProjectCreatedCount((ProjectTypes)(kProject.getAnyoneProjectPrereq())) == 0))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_REQUIRES_ANYONE", GC.getProjectInfo((ProjectTypes)kProject.getAnyoneProjectPrereq()).getTextKeyWide()));
}
}
for (iI = 0; iI < GC.getNumProjectInfos(); ++iI)
{
if (kProject.getProjectsNeeded(iI) > 0)
{
if ((pCity == NULL) || (GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getProjectCount((ProjectTypes)iI) < kProject.getProjectsNeeded(iI)))
{
if (pCity != NULL)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_REQUIRES", GC.getProjectInfo((ProjectTypes)iI).getTextKeyWide(), GET_TEAM(GET_PLAYER(ePlayer).getTeam()).getProjectCount((ProjectTypes)iI), kProject.getProjectsNeeded(iI)));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_REQUIRES_NO_CITY", GC.getProjectInfo((ProjectTypes)iI).getTextKeyWide(), kProject.getProjectsNeeded(iI)));
}
}
}
}
if (bCivilopediaText)
{
if (kProject.getVictoryPrereq() != NO_VICTORY)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_REQUIRES_STRING_VICTORY", GC.getVictoryInfo((VictoryTypes)(kProject.getVictoryPrereq())).getTextKeyWide()));
}
}
}
if (!bCivilopediaText)
{
if (pCity == NULL)
{
if (ePlayer != NO_PLAYER)
{
szTempBuffer.Format(L"\n%d%c", GET_PLAYER(ePlayer).getProductionNeeded(eProject), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
}
else
{
szTempBuffer.Format(L"\n%d%c", kProject.getProductionCost(), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
}
szBuffer.append(szTempBuffer);
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_NUM_TURNS", pCity->getProductionTurnsLeft(eProject, ((gDLL->ctrlKey() || !(gDLL->shiftKey())) ? 0 : pCity->getOrderQueueLength()))));
iProduction = pCity->getProjectProduction(eProject);
if (iProduction > 0)
{
szTempBuffer.Format(L" - %d/%d%c", iProduction, pCity->getProductionNeeded(eProject), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
}
else
{
szTempBuffer.Format(L" - %d%c", pCity->getProductionNeeded(eProject), GC.getYieldInfo(YIELD_PRODUCTION).getChar());
}
szBuffer.append(szTempBuffer);
}
}
for (iI = 0; iI < GC.getNumBonusInfos(); ++iI)
{
if (kProject.getBonusProductionModifier(iI) != 0)
{
if (pCity != NULL)
{
if (pCity->hasBonus((BonusTypes)iI))
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
}
}
if (!bCivilopediaText)
{
szBuffer.append(L" (");
}
else
{
szTempBuffer.Format(L"%s%c", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), szTempBuffer.c_str());
szBuffer.append(szTempBuffer);
}
if (kProject.getBonusProductionModifier(iI) == 100)
{
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_DOUBLE_SPEED_WITH", GC.getBonusInfo((BonusTypes)iI).getTextKeyWide()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_PROJECT_BUILDS_FASTER_WITH", kProject.getBonusProductionModifier(iI), GC.getBonusInfo((BonusTypes)iI).getTextKeyWide()));
}
if (!bCivilopediaText)
{
szBuffer.append(L')');
}
if (pCity != NULL)
{
szBuffer.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
}
}
}
}
void CvGameTextMgr::setProcessHelp(CvWStringBuffer &szBuffer, ProcessTypes eProcess)
{
int iI;
szBuffer.append(GC.getProcessInfo(eProcess).getDescription());
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
if (GC.getProcessInfo(eProcess).getProductionToCommerceModifier(iI) != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_PROCESS_CONVERTS", GC.getProcessInfo(eProcess).getProductionToCommerceModifier(iI), GC.getYieldInfo(YIELD_PRODUCTION).getChar(), GC.getCommerceInfo((CommerceTypes) iI).getChar()));
}
}
}
void CvGameTextMgr::setBadHealthHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
CvPlot* pLoopPlot;
FeatureTypes eFeature;
int iHealth;
int iI;
if (city.badHealth() > 0)
{
iHealth = -(city.getFreshWaterBadHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_FROM_FRESH_WATER", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -(city.getFeatureBadHealth());
if (iHealth > 0)
{
eFeature = NO_FEATURE;
for (iI = 0; iI < NUM_CITY_PLOTS; ++iI)
{
pLoopPlot = plotCity(city.getX_INLINE(), city.getY_INLINE(), iI);
if (pLoopPlot != NULL)
{
if (pLoopPlot->getFeatureType() != NO_FEATURE)
{
if (GC.getFeatureInfo(pLoopPlot->getFeatureType()).getHealthPercent() < 0)
{
if (eFeature == NO_FEATURE)
{
eFeature = pLoopPlot->getFeatureType();
}
else if (eFeature != pLoopPlot->getFeatureType())
{
eFeature = NO_FEATURE;
break;
}
}
}
}
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_FEAT_HEALTH", iHealth, ((eFeature == NO_FEATURE) ? L"TXT_KEY_MISC_FEATURES" : GC.getFeatureInfo(eFeature).getTextKeyWide())));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* JOOYO_ADDON, Added by Jooyo, 06/19/09 */
/* */
/* */
/************************************************************************************************/
iHealth = -(city.getImprovementBadHealth()) / 100;
CvPlayer &kPlayer = GET_PLAYER(city.getOwnerINLINE());
if (iHealth > 0)
{
ImprovementTypes eImprovement = NO_IMPROVEMENT;
int iTotalHealth;
int iBestHealth = 0;
for (int iI = 0; iI < GC.getNumImprovementInfos(); iI++)
{
iTotalHealth = 0;
if (GC.getImprovementInfo((ImprovementTypes)iI).getHealthPercent() < 0)
{
for (int iJ = 0; iJ < city.getNumCityPlots(); ++iJ)
{
pLoopPlot = plotCity(city.getX_INLINE(), city.getY_INLINE(), iJ);
if (pLoopPlot != NULL)
{
if (pLoopPlot->getImprovementType() == iI)
{
iTotalHealth -= GC.getImprovementInfo((ImprovementTypes)iI).getHealthPercent();
for (int iK = 0; iK < GC.getNumCivicOptionInfos(); iK++)
{
if (kPlayer.getCivics((CivicOptionTypes)iK) != NO_CIVIC)
{
iTotalHealth -= std::min(0, GC.getCivicInfo(kPlayer.getCivics((CivicOptionTypes)iK)).getImprovementHealthPercentChanges(iI)) / 100;
}
}
}
}
}
}
if (iTotalHealth > iBestHealth)
{
eImprovement = (ImprovementTypes)iI;
iBestHealth = iTotalHealth;
}
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_IMPR_HEALTH", iHealth, ((eImprovement == NO_IMPROVEMENT) ? L"TXT_KEY_MISC_IMPROVEMENTS" : GC.getImprovementInfo(eImprovement).getTextKeyWide())));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* JOOYO_ADDON END */
/************************************************************************************************/
/************************************************************************************************/
/* Specialists Enhancements, by Supercheese 10/9/09 */
/* */
/* */
/************************************************************************************************/
iHealth = -(city.getSpecialistBadHealth() / 100);
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_BAD_HEALTH_FROM_SPECIALISTS", iHealth));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Specialists Enhancements END */
/************************************************************************************************/
iHealth = city.getEspionageHealthCounter();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_ESPIONAGE", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -(city.getPowerBadHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_POWER", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -(city.getBonusBadHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_BONUSES", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -(city.totalBadBuildingHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_BUILDINGS", iHealth));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Afforess Start 01/29/10 */
/* */
/* Traits Were displaying Civic Health too */
/************************************************************************************************/
iHealth = -GET_PLAYER(city.getOwnerINLINE()).getCivicHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_BAD_HEALTH_FROM_CIVICS", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -GET_PLAYER(city.getOwnerINLINE()).getCivilizationHealth();
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_CIV", iHealth));
szBuffer.append(NEWLINE);
}
// Koshling - event health
iHealth = -GET_PLAYER(city.getOwnerINLINE()).getExtraHealth() + GET_PLAYER(city.getOwnerINLINE()).getCivicHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_BAD_HEALTH_FROM_EVENTS", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -city.getExtraHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_UNHEALTH_EXTRA", iHealth));
szBuffer.append(NEWLINE);
}
if ( GC.getGame().getHandicapType() != NO_HANDICAP )
{
iHealth = -(GC.getHandicapInfo(city.getHandicapType()).getHealthBonus());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_HANDICAP", iHealth));
szBuffer.append(NEWLINE);
}
}
iHealth = city.unhealthyPopulation();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_POP", iHealth));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Afforess Start 01/03/10 */
/* */
/* */
/************************************************************************************************/
iHealth = -(GET_PLAYER(city.getOwnerINLINE()).getWorldHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_WORLD_PROJECT", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -(GET_PLAYER(city.getOwnerINLINE()).getProjectHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_PROJECT", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = -city.calculateCorporationHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_CORPORATION", iHealth));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(L"-----------------------\n");
szBuffer.append(gDLL->getText("TXT_KEY_MISC_TOTAL_UNHEALTHY", city.badHealth()));
}
}
void CvGameTextMgr::setGoodHealthHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
CvPlot* pLoopPlot;
FeatureTypes eFeature;
int iHealth;
int iI;
if (city.goodHealth() > 0)
{
iHealth = city.getFreshWaterGoodHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_FROM_FRESH_WATER", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = city.getFeatureGoodHealth();
if (iHealth > 0)
{
eFeature = NO_FEATURE;
for (iI = 0; iI < NUM_CITY_PLOTS; ++iI)
{
pLoopPlot = plotCity(city.getX_INLINE(), city.getY_INLINE(), iI);
if (pLoopPlot != NULL)
{
if (pLoopPlot->getFeatureType() != NO_FEATURE)
{
if (GC.getFeatureInfo(pLoopPlot->getFeatureType()).getHealthPercent() > 0)
{
if (eFeature == NO_FEATURE)
{
eFeature = pLoopPlot->getFeatureType();
}
else if (eFeature != pLoopPlot->getFeatureType())
{
eFeature = NO_FEATURE;
break;
}
}
}
}
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_FEAT_GOOD_HEALTH", iHealth, ((eFeature == NO_FEATURE) ? L"TXT_KEY_MISC_FEATURES" : GC.getFeatureInfo(eFeature).getTextKeyWide())));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* JOOYO_ADDON, Added by Jooyo, 06/19/09 */
/* */
/* */
/************************************************************************************************/
iHealth = city.getImprovementGoodHealth() / 100;
CvPlayer &kPlayer = GET_PLAYER(city.getOwnerINLINE());
if (iHealth > 0)
{
ImprovementTypes eImprovement = NO_IMPROVEMENT;
int iTotalHealth;
int iBestHealth = 0;
for (int iI = 0; iI < GC.getNumImprovementInfos(); iI++)
{
iTotalHealth = 0;
if (GC.getImprovementInfo((ImprovementTypes)iI).getHealthPercent() > 0)
{
for (int iJ = 0; iJ < city.getNumCityPlots(); ++iJ)
{
pLoopPlot = plotCity(city.getX_INLINE(), city.getY_INLINE(), iJ);
if (pLoopPlot != NULL)
{
if (pLoopPlot->getImprovementType() == iI)
{
iTotalHealth += GC.getImprovementInfo((ImprovementTypes)iI).getHealthPercent();
for (int iK = 0; iK < GC.getNumCivicOptionInfos(); iK++)
{
if (kPlayer.getCivics((CivicOptionTypes)iK) != NO_CIVIC)
{
iTotalHealth += std::max(0, GC.getCivicInfo(kPlayer.getCivics((CivicOptionTypes)iK)).getImprovementHealthPercentChanges(iI)) / 100;
}
}
}
}
}
}
if (iTotalHealth > iBestHealth)
{
eImprovement = (ImprovementTypes)iI;
iBestHealth = iTotalHealth;
}
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_IMPR_GOOD_HEALTH", iHealth, ((eImprovement == NO_IMPROVEMENT) ? L"TXT_KEY_MISC_IMPROVEMENTS" : GC.getImprovementInfo(eImprovement).getTextKeyWide())));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* JOOYO_ADDON END */
/************************************************************************************************/
/************************************************************************************************/
/* Specialists Enhancements, by Supercheese 10/9/09 */
/* */
/* */
/************************************************************************************************/
iHealth = city.getSpecialistGoodHealth() / 100;
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_GOOD_HEALTH_FROM_SPECIALISTS", iHealth));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Specialists Enhancements END */
/************************************************************************************************/
iHealth = city.getPowerGoodHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_POWER", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = city.getBonusGoodHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_BONUSES", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = city.totalGoodBuildingHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_BUILDINGS", iHealth));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Afforess Start 01/29/10 */
/* */
/* Traits Were displaying Civic Health too */
/************************************************************************************************/
iHealth = GET_PLAYER(city.getOwnerINLINE()).getCivicHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_CIVICS", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = GET_PLAYER(city.getOwnerINLINE()).getCivilizationHealth();
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_CIV", iHealth));
szBuffer.append(NEWLINE);
}
// Koshling - event health
iHealth = GET_PLAYER(city.getOwnerINLINE()).getExtraHealth() - GET_PLAYER(city.getOwnerINLINE()).getCivicHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_EVENTS", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = city.getExtraHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_EXTRA", iHealth));
szBuffer.append(NEWLINE);
}
if ( GC.getGame().getHandicapType() != NO_HANDICAP )
{
iHealth = GC.getHandicapInfo(city.getHandicapType()).getHealthBonus();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_HANDICAP", iHealth));
szBuffer.append(NEWLINE);
}
}
/************************************************************************************************/
/* Afforess Start 01/03/10 */
/* */
/* */
/************************************************************************************************/
iHealth = (GET_PLAYER(city.getOwnerINLINE()).getWorldHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_WORLD_PROJECT", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = (GET_PLAYER(city.getOwnerINLINE()).getProjectHealth());
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_PROJECT", iHealth));
szBuffer.append(NEWLINE);
}
iHealth = city.calculateCorporationHealth();
if (iHealth > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOOD_HEALTH_FROM_CORPORATION", iHealth));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(L"-----------------------\n");
szBuffer.append(gDLL->getText("TXT_KEY_MISC_TOTAL_HEALTHY", city.goodHealth()));
}
}
// BUG - Building Additional Health - start
bool CvGameTextMgr::setBuildingAdditionalHealthHelp(CvWStringBuffer &szBuffer, CvCity& city, const CvWString& szStart, bool bStarted)
{
CvWString szLabel;
CvCivilizationInfo& kCivilization = GC.getCivilizationInfo(city.getCivilizationType());
for (int iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
BuildingTypes eBuilding = (BuildingTypes)kCivilization.getCivilizationBuildings((BuildingClassTypes)iI);
if (eBuilding != NO_BUILDING && city.canConstruct(eBuilding, false, false, false))
{
int iGood = 0, iBad = 0, iSpoiledFood = 0, iStarvation = 0;
int iChange = city.getAdditionalHealthByBuilding(eBuilding, iGood, iBad, iSpoiledFood, iStarvation);
if (iGood != 0 || iBad != 0)
{
if (!bStarted)
{
szBuffer.append(szStart);
bStarted = true;
}
szLabel.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eBuilding).getDescription());
bool bStartedLine = setResumableGoodBadChangeHelp(szBuffer, szLabel, L": ", L"", iGood, gDLL->getSymbolID(HEALTHY_CHAR), iBad, gDLL->getSymbolID(UNHEALTHY_CHAR), false, true);
setResumableValueChangeHelp(szBuffer, szLabel, L": ", L"", iSpoiledFood, gDLL->getSymbolID(EATEN_FOOD_CHAR), false, true, bStartedLine);
setResumableValueChangeHelp(szBuffer, szLabel, L": ", L"", iStarvation, gDLL->getSymbolID(BAD_FOOD_CHAR), false, true, bStartedLine);
}
}
}
return bStarted;
}
// BUG - Building Additional Health - end
void CvGameTextMgr::setAngerHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
int iOldAngerPercent;
int iNewAngerPercent;
int iOldAnger;
int iNewAnger;
int iAnger;
int iI;
if (city.isOccupation())
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_RESISTANCE"));
}
else if (GET_PLAYER(city.getOwnerINLINE()).isAnarchy())
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_ANARCHY"));
}
else if (city.unhappyLevel() > 0)
{
iOldAngerPercent = 0;
iNewAngerPercent = 0;
iOldAnger = 0;
iNewAnger = 0;
// XXX decomp these???
iNewAngerPercent += city.getOvercrowdingPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_OVERCROWDING", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
iNewAngerPercent += city.getNoMilitaryPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_MILITARY_PROTECTION", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
iNewAngerPercent += city.getCulturePercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_OCCUPIED", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
iNewAngerPercent += city.getReligionPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_RELIGION_FIGHT", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
/************************************************************************************************/
/* Afforess Start 07/15/10 */
/* */
/* */
/************************************************************************************************/
iNewAngerPercent += city.getHurryPercentAnger() + city.getEventAnger();
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_OPPRESSION", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
/************************************************************************************************/
/* REVOLUTION_MOD 04/26/08 jdog5000 */
/* */
/* */
/************************************************************************************************/
iNewAngerPercent += city.getRevRequestPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_REV_REQUEST_ANGER", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
iNewAngerPercent += city.getRevIndexPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_REV_INDEX_ANGER", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
iNewAngerPercent += city.getConscriptPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_DRAFT", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
iNewAngerPercent += city.getDefyResolutionPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_DEFY_RESOLUTION", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
iNewAngerPercent += city.getWarWearinessPercentAnger();
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_WAR_WEAR", iAnger));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
iNewAnger += std::max(0, city.getVassalUnhappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNHAPPY_VASSAL", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger += std::max(0, city.getEspionageHappinessCounter());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_ESPIONAGE", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
for (iI = 0; iI < GC.getNumCivicInfos(); ++iI)
{
iNewAngerPercent += GET_PLAYER(city.getOwnerINLINE()).getCivicPercentAnger((CivicTypes)iI);
iNewAnger += (((iNewAngerPercent * city.getPopulation()) / GC.getPERCENT_ANGER_DIVISOR()) - ((iOldAngerPercent * city.getPopulation()) / GC.getDefineINT("PERCENT_ANGER_DIVISOR")));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_DEMAND_CIVIC", iAnger, GC.getCivicInfo((CivicTypes) iI).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
if (iAnger < 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_NOT_CIVIC", iAnger, GC.getCivicInfo((CivicTypes) iI).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
iOldAngerPercent = iNewAngerPercent;
iOldAnger = iNewAnger;
}
iNewAnger -= std::min(0, city.getLargestCityHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_BIG_CITY", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
/************************************************************************************************/
/* Afforess 01/03/10 */
/* */
/* */
/************************************************************************************************/
iNewAnger -= std::min(0, city.getCivicHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNHAPPY_CIVIC", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, GET_PLAYER(city.getOwnerINLINE()).getWorldHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNHAPPY_WORLD_PROJECT", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, GET_PLAYER(city.getOwnerINLINE()).getProjectHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNHAPPY_PROJECT", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger += std::max(0, GET_PLAYER(city.getOwnerINLINE()).calculateTaxRateUnhappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_CITY_TAXATION_ANGER", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, city.calculateCorporationHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNHAPPY_CORPORATIONS", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iAnger = GET_PLAYER(city.getOwnerINLINE()).getForeignUnhappyPercent();
if (iAnger > 0) {
iAnger = 100 / iAnger;
iAnger = ((100 - city.plot()->calculateCulturePercent(city.getOwnerINLINE())) * iAnger) / 100;
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_CITY_FOREIGNER_ANGER", iAnger));
szBuffer.append(NEWLINE);
}
iNewAnger += std::max(0, iAnger);
}
iOldAnger = iNewAnger;
if (GC.getGameINLINE().isOption(GAMEOPTION_PERSONALIZED_MAP))
{
iNewAnger -= std::min(0, GET_PLAYER(city.getOwnerINLINE()).getLandmarkHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_CITY_LANDMARK_ANGER", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
if (!GET_PLAYER(city.getOwnerINLINE()).isNoLandmarkAnger())
{
iNewAnger += std::min(0, city.getLandmarkAnger());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_CITY_LANDMARK_DESTRUCTION_ANGER", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
iNewAnger -= std::min(0, city.getMilitaryHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_MILITARY_PRESENCE", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, city.getCurrentStateReligionHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_STATE_RELIGION", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
if ( GET_PLAYER(city.getOwnerINLINE()).getCityLimit() > 0 &&
GET_PLAYER(city.getOwnerINLINE()).getCityOverLimitUnhappy() > 0 &&
GET_PLAYER(city.getOwnerINLINE()).getNumCities() > GET_PLAYER(city.getOwnerINLINE()).getCityLimit())
{
iNewAnger += (GET_PLAYER(city.getOwnerINLINE()).getNumCities() - GET_PLAYER(city.getOwnerINLINE()).getCityLimit())*GET_PLAYER(city.getOwnerINLINE()).getCityOverLimitUnhappy();
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_TOO_MANY_CITIES", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
}
iNewAnger -= std::min(0, (city.getBuildingBadHappiness() + city.getExtraBuildingBadHappiness()));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_BUILDINGS", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, city.getFeatureBadHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_FEATURES", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, city.getBonusBadHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_BONUS", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
/************************************************************************************************/
/* Specialists Enhancements, by Supercheese 10/9/09 */
/* */
/* */
/************************************************************************************************/
iNewAnger -= std::min(0, city.getSpecialistUnhappiness() / 100);
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_UNHAPPY_SPECIALISTS", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
/************************************************************************************************/
/* Specialists Enhancements END */
/************************************************************************************************/
iNewAnger -= std::min(0, city.getReligionBadHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_RELIGIOUS_FREEDOM", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, city.getCommerceHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_BAD_ENTERTAINMENT", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, city.area()->getBuildingHappiness(city.getOwnerINLINE()));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_BUILDINGS", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, GET_PLAYER(city.getOwnerINLINE()).getBuildingHappiness());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_BUILDINGS", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
iNewAnger -= std::min(0, (city.getExtraHappiness() + GET_PLAYER(city.getOwnerINLINE()).getExtraHappiness()));
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_ARGH", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
if ( GC.getGame().getHandicapType() != NO_HANDICAP )
{
iNewAnger -= std::min(0, GC.getHandicapInfo(city.getHandicapType()).getHappyBonus());
iAnger = ((iNewAnger - iOldAnger) + std::min(0, iOldAnger));
if (iAnger > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_HANDICAP", iAnger));
szBuffer.append(NEWLINE);
}
iOldAnger = iNewAnger;
}
szBuffer.append(L"-----------------------\n");
szBuffer.append(gDLL->getText("TXT_KEY_ANGER_TOTAL_UNHAPPY", iOldAnger));
FAssert(iOldAnger == city.unhappyLevel());
}
}
void CvGameTextMgr::setHappyHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
int iHappy;
int iTotalHappy = 0;
if (city.isOccupation() || GET_PLAYER(city.getOwnerINLINE()).isAnarchy())
{
return;
}
if (city.happyLevel() > 0)
{
/************************************************************************************************/
/* REVOLUTION_MOD 04/28/08 jdog5000 */
/* */
/* */
/************************************************************************************************/
iHappy = city.getRevSuccessHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_REV_SUCCESS_HAPPINESS", iHappy));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
iHappy = city.getLargestCityHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_BIG_CITY", iHappy));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Afforess Civic Happiness & Happy Per Military Percent 10/4/09 */
/* */
/* */
/************************************************************************************************/
iHappy = city.getCivicHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_CIVIC", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = GET_PLAYER(city.getOwnerINLINE()).getWorldHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_WORLD_PROJECT", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = GET_PLAYER(city.getOwnerINLINE()).getProjectHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_WORLD_PROJECT", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = city.calculateCorporationHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_CORPORATIONS", iHappy));
szBuffer.append(NEWLINE);
}
if (GC.getGameINLINE().isOption(GAMEOPTION_PERSONALIZED_MAP))
{
iHappy = GET_PLAYER(city.getOwnerINLINE()).getLandmarkHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_LANDMARKS", iHappy));
szBuffer.append(NEWLINE);
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
iHappy = city.getMilitaryHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_MILITARY_PRESENCE", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = city.getVassalHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_VASSAL", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = city.getCurrentStateReligionHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_STATE_RELIGION", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = (city.getBuildingGoodHappiness() + city.getExtraBuildingGoodHappiness());
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_BUILDINGS", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = city.getFeatureGoodHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_FEATURES", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = city.getBonusGoodHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_BONUS", iHappy));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Specialists Enhancements, by Supercheese 10/9/09 */
/* */
/* */
/************************************************************************************************/
iHappy = city.getSpecialistHappiness() / 100;
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_SPECIALISTS", iHappy));
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Specialists Enhancements END */
/************************************************************************************************/
iHappy = city.getReligionGoodHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_RELIGIOUS_FREEDOM", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = city.getCommerceHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_ENTERTAINMENT", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = city.area()->getBuildingHappiness(city.getOwnerINLINE());
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_BUILDINGS", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = GET_PLAYER(city.getOwnerINLINE()).getBuildingHappiness();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_BUILDINGS", iHappy));
szBuffer.append(NEWLINE);
}
iHappy = (city.getExtraHappiness() + GET_PLAYER(city.getOwnerINLINE()).getExtraHappiness());
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_YEAH", iHappy));
szBuffer.append(NEWLINE);
}
if (city.getHappinessTimer() > 0)
{
iHappy = GC.getDefineINT("TEMP_HAPPY");
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_TEMP", iHappy, city.getHappinessTimer()));
szBuffer.append(NEWLINE);
}
iHappy = GC.getHandicapInfo(city.getHandicapType()).getHappyBonus();
if (iHappy > 0)
{
iTotalHappy += iHappy;
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_HANDICAP", iHappy));
szBuffer.append(NEWLINE);
}
szBuffer.append(L"-----------------------\n");
szBuffer.append(gDLL->getText("TXT_KEY_HAPPY_TOTAL_HAPPY", iTotalHappy));
FAssert(iTotalHappy == city.happyLevel())
}
}
// BUG - Building Additional Happiness - start
bool CvGameTextMgr::setBuildingAdditionalHappinessHelp(CvWStringBuffer &szBuffer, CvCity& city, const CvWString& szStart, bool bStarted)
{
CvWString szLabel;
// BUG jdog5000 - need to verify building type is correct for this player to avoid asserts - start
for (int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GET_PLAYER(city.getOwnerINLINE()).getCivilizationType()).getCivilizationBuildings((BuildingClassTypes)i);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
/*
if (city.canConstruct(eBuilding, false, true, false))
*/
if (city.canConstruct(eBuilding, false, false, false))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
int iGood = 0, iBad = 0, iAngryPop = 0;
int iChange = city.getAdditionalHappinessByBuilding(eBuilding, iGood, iBad, iAngryPop);
if (iGood != 0 || iBad != 0)
{
if (!bStarted)
{
szBuffer.append(szStart);
bStarted = true;
}
szLabel.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eBuilding).getDescription());
bool bStartedLine = setResumableGoodBadChangeHelp(szBuffer, szLabel, L": ", L"", iGood, gDLL->getSymbolID(HAPPY_CHAR), iBad, gDLL->getSymbolID(UNHAPPY_CHAR), false, true);
setResumableValueChangeHelp(szBuffer, szLabel, L": ", L"", iAngryPop, gDLL->getSymbolID(ANGRY_POP_CHAR), false, true, bStartedLine);
}
}
}
return bStarted;
}
// BUG - Building Additional Happiness - end
// BUG - Resumable Value Change Help - start
void CvGameTextMgr::setYieldChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, const int* piYieldChange, bool bPercent, bool bNewLine)
{
setResumableYieldChangeHelp(szBuffer, szStart, szSpace, szEnd, piYieldChange, bPercent, bNewLine);
}
/*
* Adds the ability to pass in and get back the value of bStarted so that
* it can be used with other setResumable<xx>ChangeHelp() calls on a single line.
*/
bool CvGameTextMgr::setResumableYieldChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, const int* piYieldChange, bool bPercent, bool bNewLine, bool bStarted)
{
CvWString szTempBuffer;
// bool bStarted;
int iI;
// bStarted = false;
if ( piYieldChange != NULL )
{
for (iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
if (piYieldChange != NULL && piYieldChange[iI] != 0)
{
if (!bStarted)
{
if (bNewLine)
{
szTempBuffer.Format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR));
}
szTempBuffer += CvWString::format(L"%s%s%s%d%s%c",
szStart.GetCString(),
szSpace.GetCString(),
piYieldChange[iI] > 0 ? L"+" : L"",
piYieldChange[iI],
bPercent ? L"%" : L"",
GC.getYieldInfo((YieldTypes)iI).getChar());
}
else
{
szTempBuffer.Format(L", %s%d%s%c",
piYieldChange[iI] > 0 ? L"+" : L"",
piYieldChange[iI],
bPercent ? L"%" : L"",
GC.getYieldInfo((YieldTypes)iI).getChar());
}
szBuffer.append(szTempBuffer);
bStarted = true;
}
}
if (bStarted)
{
szBuffer.append(szEnd);
}
}
// added
return bStarted;
}
void CvGameTextMgr::setCommerceChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, const int* piCommerceChange, bool bPercent, bool bNewLine)
{
setResumableCommerceChangeHelp(szBuffer, szStart, szSpace, szEnd, piCommerceChange, bPercent, bNewLine);
}
/*
* Adds the ability to pass in and get back the value of bStarted so that
* it can be used with other setResumable<xx>ChangeHelp() calls on a single line.
*/
bool CvGameTextMgr::setResumableCommerceChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, const int* piCommerceChange, bool bPercent, bool bNewLine, bool bStarted)
{
CvWString szTempBuffer;
// bool bStarted;
int iI;
// bStarted = false;
if ( piCommerceChange )
{
for (iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
if (piCommerceChange[iI] != 0)
{
if (!bStarted)
{
if (bNewLine)
{
szTempBuffer.Format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR));
}
szTempBuffer += CvWString::format(L"%s%s%s%d%s%c", szStart.GetCString(), szSpace.GetCString(), ((piCommerceChange[iI] > 0) ? L"+" : L""), piCommerceChange[iI], ((bPercent) ? L"%" : L""), GC.getCommerceInfo((CommerceTypes) iI).getChar());
}
else
{
szTempBuffer.Format(L", %s%d%s%c", ((piCommerceChange[iI] > 0) ? L"+" : L""), piCommerceChange[iI], ((bPercent) ? L"%" : L""), GC.getCommerceInfo((CommerceTypes) iI).getChar());
}
szBuffer.append(szTempBuffer);
bStarted = true;
}
}
}
if (bStarted)
{
szBuffer.append(szEnd);
}
// added
return bStarted;
}
/*
* Displays float values by dividing each value by 100.
*/
void CvGameTextMgr::setCommerceTimes100ChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, const int* piCommerceChange, bool bNewLine, bool bStarted)
{
setResumableCommerceTimes100ChangeHelp(szBuffer, szStart, szSpace, szEnd, piCommerceChange, bNewLine);
}
/*
* Adds the ability to pass in and get back the value of bStarted so that
* it can be used with other setResumable<xx>ChangeHelp() calls on a single line.
*/
bool CvGameTextMgr::setResumableCommerceTimes100ChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, const int* piCommerceChange, bool bNewLine, bool bStarted)
{
CvWString szTempBuffer;
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
int iChange = piCommerceChange[iI];
if (iChange != 0)
{
if (!bStarted)
{
if (bNewLine)
{
szTempBuffer.Format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR));
}
szTempBuffer += CvWString::format(L"%s%s", szStart.GetCString(), szSpace.GetCString());
bStarted = true;
}
else
{
szTempBuffer.Format(L", ");
}
szBuffer.append(szTempBuffer);
if (iChange % 100 == 0)
{
szTempBuffer.Format(L"%+d%c", iChange / 100, GC.getCommerceInfo((CommerceTypes) iI).getChar());
}
else
{
if (iChange >= 0)
{
szBuffer.append(L"+");
}
else
{
iChange = - iChange;
szBuffer.append(L"-");
}
szTempBuffer.Format(L"%d.%02d%c", iChange / 100, iChange % 100, GC.getCommerceInfo((CommerceTypes) iI).getChar());
}
szBuffer.append(szTempBuffer);
}
}
if (bStarted)
{
szBuffer.append(szEnd);
}
return bStarted;
}
/*
* Adds the ability to pass in and get back the value of bStarted so that
* it can be used with other setResumable<xx>ChangeHelp() calls on a single line.
*/
bool CvGameTextMgr::setResumableGoodBadChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, int iGood, int iGoodSymbol, int iBad, int iBadSymbol, bool bPercent, bool bNewLine, bool bStarted)
{
bStarted = setResumableValueChangeHelp(szBuffer, szStart, szSpace, szEnd, iGood, iGoodSymbol, bPercent, bNewLine, bStarted);
bStarted = setResumableValueChangeHelp(szBuffer, szStart, szSpace, szEnd, iBad, iBadSymbol, bPercent, bNewLine, bStarted);
return bStarted;
}
/*
* Adds the ability to pass in and get back the value of bStarted so that
* it can be used with other setResumable<xx>ChangeHelp() calls on a single line.
*/
bool CvGameTextMgr::setResumableValueChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, int iValue, int iSymbol, bool bPercent, bool bNewLine, bool bStarted)
{
CvWString szTempBuffer;
if (iValue != 0)
{
if (!bStarted)
{
if (bNewLine)
{
szTempBuffer.Format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR));
}
szTempBuffer += CvWString::format(L"%s%s", szStart.GetCString(), szSpace.GetCString());
}
else
{
szTempBuffer = L", ";
}
szBuffer.append(szTempBuffer);
szTempBuffer.Format(L"%+d%s%c", iValue, bPercent ? L"%" : L"", iSymbol);
szBuffer.append(szTempBuffer);
bStarted = true;
}
return bStarted;
}
/*
* Adds the ability to pass in and get back the value of bStarted so that
* it can be used with other setResumable<xx>ChangeHelp() calls on a single line.
*/
bool CvGameTextMgr::setResumableValueTimes100ChangeHelp(CvWStringBuffer &szBuffer, const CvWString& szStart, const CvWString& szSpace, const CvWString& szEnd, int iValue, int iSymbol, bool bNewLine, bool bStarted)
{
CvWString szTempBuffer;
if (iValue != 0)
{
if (!bStarted)
{
if (bNewLine)
{
szTempBuffer.Format(L"\n%c", gDLL->getSymbolID(BULLET_CHAR));
}
szTempBuffer += CvWString::format(L"%s%s", szStart.GetCString(), szSpace.GetCString());
}
else
{
szTempBuffer = L", ";
}
szBuffer.append(szTempBuffer);
if (iValue % 100 == 0)
{
szTempBuffer.Format(L"%+d%c", iValue / 100, iSymbol);
}
else
{
if (iValue >= 0)
{
szBuffer.append(L"+");
}
else
{
iValue = - iValue;
szBuffer.append(L"-");
}
szTempBuffer.Format(L"%d.%02d%c", iValue / 100, iValue % 100, iSymbol);
}
szBuffer.append(szTempBuffer);
bStarted = true;
}
return bStarted;
}
// BUG - Resumable Value Change Help - end
/************************************************************************************************/
/* REVOLUTION_MOD ?/?/? DPII */
/* */
/* BUG */
/************************************************************************************************/
void CvGameTextMgr::setBonusHelp(CvWStringBuffer &szBuffer, BonusTypes eBonus, bool bCivilopediaText)
{
setBonusTradeHelp(szBuffer, eBonus, bCivilopediaText, NO_PLAYER);
}
void CvGameTextMgr::setBonusTradeHelp(CvWStringBuffer &szBuffer, BonusTypes eBonus, bool bCivilopediaText, PlayerTypes eTradePlayer)
{
/************************************************************************************************/
/* REVOLUTION_MOD END */
/************************************************************************************************/
if (NO_BONUS == eBonus)
{
return;
}
if (!bCivilopediaText)
{
szBuffer.append(CvWString::format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBonusInfo(eBonus).getDescription()));
if (NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
CvPlayer& kActivePlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_AVAILABLE_PLAYER", kActivePlayer.getNumAvailableBonuses(eBonus), kActivePlayer.getNameKey()));
for (int iCorp = 0; iCorp < GC.getNumCorporationInfos(); ++iCorp)
{
bool bFound = false;
if (kActivePlayer.isActiveCorporation((CorporationTypes)iCorp))
{
for (int i = 0; i < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++i)
{
if (eBonus == GC.getCorporationInfo((CorporationTypes)iCorp).getPrereqBonus(i))
{
int iLoop;
for (CvCity* pCity = kActivePlayer.firstCity(&iLoop); NULL != pCity; pCity = kActivePlayer.nextCity(&iLoop))
{
if (pCity->isHasCorporation((CorporationTypes)iCorp))
{
bFound = true;
break;
}
}
}
if (bFound)
{
break;
}
}
}
if (bFound)
{
szBuffer.append(GC.getCorporationInfo((CorporationTypes)iCorp).getChar());
}
}
/************************************************************************************************/
/* Afforess Start 03/18/10 */
/* */
/* */
/************************************************************************************************/
if (kActivePlayer.getBonusImport(eBonus) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_IMPORTS_PLAYER", kActivePlayer.getBonusImport(eBonus), kActivePlayer.getNameKey()));
}
if (kActivePlayer.getBonusExport(eBonus) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_EXPORTS_PLAYER", kActivePlayer.getBonusExport(eBonus), kActivePlayer.getNameKey()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
setYieldChangeHelp(szBuffer, L"", L"", L"", GC.getBonusInfo(eBonus).getYieldChangeArray());
if (GC.getBonusInfo(eBonus).getTechReveal() != NO_TECH)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_REVEALED_BY", GC.getTechInfo((TechTypes)GC.getBonusInfo(eBonus).getTechReveal()).getTextKeyWide()));
}
}
ImprovementTypes eImprovement = NO_IMPROVEMENT;
for (int iLoopImprovement = 0; iLoopImprovement < GC.getNumImprovementInfos(); iLoopImprovement++)
{
if (GC.getImprovementInfo((ImprovementTypes)iLoopImprovement).isImprovementBonusMakesValid(eBonus))
{
eImprovement = (ImprovementTypes)iLoopImprovement;
break;
}
}
if (GC.getBonusInfo(eBonus).getHealth() != 0)
{
if (GC.getBonusInfo(eBonus).getHealth() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_HEALTHY", GC.getBonusInfo(eBonus).getHealth()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_UNHEALTHY", -GC.getBonusInfo(eBonus).getHealth()));
}
if (eImprovement != NO_IMPROVEMENT)
{
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_WITH_IMPROVEMENT", GC.getImprovementInfo(eImprovement).getTextKeyWide()));
}
}
if (GC.getBonusInfo(eBonus).getHappiness() != 0)
{
if (GC.getBonusInfo(eBonus).getHappiness() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_HAPPY", GC.getBonusInfo(eBonus).getHappiness()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_UNHAPPY", -GC.getBonusInfo(eBonus).getHappiness()));
}
if (eImprovement != NO_IMPROVEMENT)
{
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_WITH_IMPROVEMENT", GC.getImprovementInfo(eImprovement).getTextKeyWide()));
}
}
CivilizationTypes eCivilization = GC.getGameINLINE().getActiveCivilizationType();
for (int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eLoopBuilding;
if (eCivilization == NO_CIVILIZATION)
{
eLoopBuilding = ((BuildingTypes)(GC.getBuildingClassInfo((BuildingClassTypes)i).getDefaultBuildingIndex()));
}
else
{
eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(eCivilization).getCivilizationBuildings(i)));
}
if (eLoopBuilding != NO_BUILDING)
{
CvBuildingInfo& kBuilding = GC.getBuildingInfo(eLoopBuilding);
if (kBuilding.getBonusHappinessChanges(eBonus) != 0)
{
if (kBuilding.getBonusHappinessChanges(eBonus) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_HAPPY", kBuilding.getBonusHappinessChanges(eBonus)));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_UNHAPPY", -kBuilding.getBonusHappinessChanges(eBonus)));
}
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_WITH_IMPROVEMENT", kBuilding.getTextKeyWide()));
}
if (kBuilding.getBonusHealthChanges(eBonus) != 0)
{
if (kBuilding.getBonusHealthChanges(eBonus) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_HEALTHY", kBuilding.getBonusHealthChanges(eBonus)));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_UNHEALTHY", -kBuilding.getBonusHealthChanges(eBonus)));
}
szBuffer.append(gDLL->getText("TXT_KEY_BONUS_WITH_IMPROVEMENT", kBuilding.getTextKeyWide()));
}
}
}
// BUG - Trade Denial - start
if (eTradePlayer != NO_PLAYER && GC.getGameINLINE().getActivePlayer() != NO_PLAYER && getBugOptionBOOL("MiscHover__BonusTradeDenial", true, "BUG_BONUS_TRADE_DENIAL_HOVER"))
{
TradeData trade;
trade.m_eItemType = TRADE_RESOURCES;
trade.m_iData = eBonus;
if (GET_PLAYER(eTradePlayer).canTradeItem(GC.getGameINLINE().getActivePlayer(), trade, false))
{
DenialTypes eDenial = GET_PLAYER(eTradePlayer).getTradeDenial(GC.getGameINLINE().getActivePlayer(), trade);
if (eDenial != NO_DENIAL)
{
CvWString szTempBuffer;
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_NEGATIVE_TEXT"), GC.getDenialInfo(eDenial).getDescription());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
}
}
// BUG - Trade Denial - end
if (!CvWString(GC.getBonusInfo(eBonus).getHelp()).empty())
{
szBuffer.append(NEWLINE);
szBuffer.append(GC.getBonusInfo(eBonus).getHelp());
}
}
void CvGameTextMgr::setReligionHelp(CvWStringBuffer &szBuffer, ReligionTypes eReligion, bool bCivilopedia)
{
UnitTypes eFreeUnit;
if (NO_RELIGION == eReligion)
{
return;
}
CvReligionInfo& religion = GC.getReligionInfo(eReligion);
if (!bCivilopedia)
{
szBuffer.append(CvWString::format(SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), religion.getDescription()));
}
setCommerceChangeHelp(szBuffer, gDLL->getText("TXT_KEY_RELIGION_HOLY_CITY").c_str(), L": ", L"", religion.getHolyCityCommerceArray());
setCommerceChangeHelp(szBuffer, gDLL->getText("TXT_KEY_RELIGION_ALL_CITIES").c_str(), L": ", L"", religion.getStateReligionCommerceArray());
if (!bCivilopedia)
{
if (religion.getTechPrereq() != NO_TECH)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_FOUNDED_FIRST", GC.getTechInfo((TechTypes)religion.getTechPrereq()).getTextKeyWide()));
}
}
if (religion.getFreeUnitClass() != NO_UNITCLASS)
{
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eFreeUnit = ((UnitTypes)(GC.getCivilizationInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCivilizationType()).getCivilizationUnits(religion.getFreeUnitClass())));
}
else
{
eFreeUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)religion.getFreeUnitClass()).getDefaultUnitIndex();
}
if (eFreeUnit != NO_UNIT)
{
if (religion.getNumFreeUnits() > 1)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_FOUNDER_RECEIVES_NUM", GC.getUnitInfo(eFreeUnit).getTextKeyWide(), religion.getNumFreeUnits()));
}
else if (religion.getNumFreeUnits() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_FOUNDER_RECEIVES", GC.getUnitInfo(eFreeUnit).getTextKeyWide()));
}
}
}
}
void CvGameTextMgr::setReligionHelpCity(CvWStringBuffer &szBuffer, ReligionTypes eReligion, CvCity *pCity, bool bCityBar, bool bForceReligion, bool bForceState, bool bNoStateReligion)
{
int i;
CvWString szTempBuffer;
bool bHandled = false;
int iCommerce;
int iHappiness;
int iProductionModifier;
int iFreeExperience;
int iGreatPeopleRateModifier;
if (pCity == NULL)
{
return;
}
ReligionTypes eStateReligion = (bNoStateReligion ? NO_RELIGION : GET_PLAYER(pCity->getOwnerINLINE()).getStateReligion());
if (bCityBar)
{
szBuffer.append(CvWString::format(SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getReligionInfo(eReligion).getDescription()));
szBuffer.append(NEWLINE);
if (!(GC.getGameINLINE().isReligionFounded(eReligion)) && !GC.getGameINLINE().isOption(GAMEOPTION_PICK_RELIGION))
{
if (GC.getReligionInfo(eReligion).getTechPrereq() != NO_TECH)
{
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_FOUNDED_FIRST", GC.getTechInfo((TechTypes)(GC.getReligionInfo(eReligion).getTechPrereq())).getTextKeyWide()));
}
}
}
if (!bForceReligion)
{
if (!(pCity->isHasReligion(eReligion)))
{
return;
}
}
/************************************************************************************************/
/* REVDCM 02/16/10 phungus420 */
/* */
/* RevTrait Effects */
/************************************************************************************************/
if (eStateReligion == eReligion || eStateReligion == NO_RELIGION || (GET_PLAYER(pCity->getOwnerINLINE()).isNonStateReligionCommerce()) || bForceState)
/************************************************************************************************/
/* REVDCM END */
/************************************************************************************************/
{
for (i = 0; i < NUM_COMMERCE_TYPES; i++)
{
iCommerce = GC.getReligionInfo(eReligion).getStateReligionCommerce((CommerceTypes)i);
if (pCity->isHolyCity(eReligion))
{
iCommerce += GC.getReligionInfo(eReligion).getHolyCityCommerce((CommerceTypes)i);
}
if (iCommerce != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
szTempBuffer.Format(L"%s%d%c", iCommerce > 0 ? L"+" : L"", iCommerce, GC.getCommerceInfo((CommerceTypes)i).getChar());
szBuffer.append(szTempBuffer);
bHandled = true;
}
}
}
if (eStateReligion == eReligion || bForceState)
{
iHappiness = (pCity->getStateReligionHappiness(eReligion) + GET_PLAYER(pCity->getOwnerINLINE()).getStateReligionHappiness());
if (iHappiness != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
szTempBuffer.Format(L"%d%c", iHappiness, ((iHappiness > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)));
*/
// Use absolute value with unhappy face
szTempBuffer.Format(L"%d%c", abs(iHappiness), ((iHappiness > 0) ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR)));
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
szBuffer.append(szTempBuffer);
bHandled = true;
}
iProductionModifier = GET_PLAYER(pCity->getOwnerINLINE()).getStateReligionBuildingProductionModifier();
if (iProductionModifier != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_BUILDING_PROD_MOD", iProductionModifier));
bHandled = true;
}
iProductionModifier = GET_PLAYER(pCity->getOwnerINLINE()).getStateReligionUnitProductionModifier();
if (iProductionModifier != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_UNIT_PROD_MOD", iProductionModifier));
bHandled = true;
}
iFreeExperience = GET_PLAYER(pCity->getOwnerINLINE()).getStateReligionFreeExperience();
if (iFreeExperience != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_FREE_XP", iFreeExperience));
bHandled = true;
}
iGreatPeopleRateModifier = GET_PLAYER(pCity->getOwnerINLINE()).getStateReligionGreatPeopleRateModifier();
if (iGreatPeopleRateModifier != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_BIRTH_RATE_MOD", iGreatPeopleRateModifier));
bHandled = true;
}
}
}
void CvGameTextMgr::setCorporationHelp(CvWStringBuffer &szBuffer, CorporationTypes eCorporation, bool bCivilopedia)
{
UnitTypes eFreeUnit;
CvWString szTempBuffer;
if (NO_CORPORATION == eCorporation)
{
return;
}
CvCorporationInfo& kCorporation = GC.getCorporationInfo(eCorporation);
if (!bCivilopedia)
{
szBuffer.append(CvWString::format(SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), kCorporation.getDescription()));
}
szTempBuffer.clear();
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
int iYieldProduced = GC.getCorporationInfo(eCorporation).getYieldProduced((YieldTypes)iI);
if (NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
iYieldProduced *= GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getCorporationMaintenancePercent();
iYieldProduced /= 100;
}
if (iYieldProduced != 0)
{
if (!szTempBuffer.empty())
{
szTempBuffer += L", ";
}
if (iYieldProduced % 100 == 0)
{
szTempBuffer += CvWString::format(L"%s%d%c",
iYieldProduced > 0 ? L"+" : L"",
iYieldProduced / 100,
GC.getYieldInfo((YieldTypes)iI).getChar());
}
else
{
szTempBuffer += CvWString::format(L"%s%.2f%c",
iYieldProduced > 0 ? L"+" : L"",
0.01f * abs(iYieldProduced),
GC.getYieldInfo((YieldTypes)iI).getChar());
}
}
}
if (!szTempBuffer.empty())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_ALL_CITIES", szTempBuffer.GetCString()));
}
szTempBuffer.clear();
for (int iI = 0; iI < NUM_COMMERCE_TYPES; ++iI)
{
int iCommerceProduced = GC.getCorporationInfo(eCorporation).getCommerceProduced((CommerceTypes)iI);
if (NO_PLAYER != GC.getGameINLINE().getActivePlayer())
{
iCommerceProduced *= GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getCorporationMaintenancePercent();
iCommerceProduced /= 100;
}
if (iCommerceProduced != 0)
{
if (!szTempBuffer.empty())
{
szTempBuffer += L", ";
}
if (iCommerceProduced % 100 == 0)
{
szTempBuffer += CvWString::format(L"%s%d%c",
iCommerceProduced > 0 ? L"+" : L"",
iCommerceProduced / 100,
GC.getCommerceInfo((CommerceTypes)iI).getChar());
}
else
{
szTempBuffer += CvWString::format(L"%s%.2f%c",
iCommerceProduced > 0 ? L"+" : L"",
0.01f * abs(iCommerceProduced),
GC.getCommerceInfo((CommerceTypes)iI).getChar());
}
}
}
if (!szTempBuffer.empty())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_ALL_CITIES", szTempBuffer.GetCString()));
}
if (!bCivilopedia)
{
if (kCorporation.getTechPrereq() != NO_TECH)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_FOUNDED_FIRST", GC.getTechInfo((TechTypes)kCorporation.getTechPrereq()).getTextKeyWide()));
}
}
/************************************************************************************************/
/* TGA_INDEXATION 02/18/08 MRGENIE */
/* */
/* adding link to resources in the Pedia */
/************************************************************************************************/
/*
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_BONUS_REQUIRED"));
*/
bool bFirst = true;
/*
for (int i = 0; i < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++i)
*/
{
/*
if (NO_BONUS != kCorporation.getPrereqBonus(i))
*/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_BONUS_REQUIRED"));
for (int i = 0; i < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++i)
{
/*
if (bFirst)
*/
if (NO_BONUS != kCorporation.getPrereqBonus(i))
{
/*
bFirst = false;
*/
if (bFirst)
{
bFirst = false;
}
else
{
szBuffer.append(L", ");
}
/*
szBuffer.append(CvWString::format(L"%c", GC.getBonusInfo((BonusTypes)kCorporation.getPrereqBonus(i)).getChar()));
*/ if (!bFirst)
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_BONUS_CONSUMES", GC.getBonusInfo((BonusTypes)kCorporation.getPrereqBonus(i)).getTextKeyWide(), GC.getBonusInfo((BonusTypes)kCorporation.getPrereqBonus(i)).getChar()));
}
/*
else
{
szBuffer.append(L", ");
}
szBuffer.append(CvWString::format(L"%c", GC.getBonusInfo((BonusTypes)kCorporation.getPrereqBonus(i)).getChar()));
*/
/************************************************************************************************/
/* TGA_INDEXATION END */
/************************************************************************************************/
}
}
if (kCorporation.getBonusProduced() != NO_BONUS)
{
if (!bFirst)
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_BONUS_PRODUCED", GC.getBonusInfo((BonusTypes)kCorporation.getBonusProduced()).getChar()));
}
if (kCorporation.getFreeUnitClass() != NO_UNITCLASS)
{
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eFreeUnit = ((UnitTypes)(GC.getCivilizationInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCivilizationType()).getCivilizationUnits(kCorporation.getFreeUnitClass())));
}
else
{
eFreeUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)kCorporation.getFreeUnitClass()).getDefaultUnitIndex();
}
if (eFreeUnit != NO_UNIT)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_RELIGION_FOUNDER_RECEIVES", GC.getUnitInfo(eFreeUnit).getTextKeyWide()));
}
}
std::vector<CorporationTypes> aCompetingCorps;
bFirst = true;
for (int iCorporation = 0; iCorporation < GC.getNumCorporationInfos(); ++iCorporation)
{
if (iCorporation != eCorporation)
{
bool bCompeting = false;
CvCorporationInfo& kLoopCorporation = GC.getCorporationInfo((CorporationTypes)iCorporation);
/************************************************************************************************/
/* Afforess Start 02/09/10 */
/* */
/* */
/************************************************************************************************/
if (kLoopCorporation.isCompetingCorporation(eCorporation) || kCorporation.isCompetingCorporation(iCorporation))
bCompeting = true;
if (!bCompeting) {
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
for (int i = 0; i < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++i)
{
if (kCorporation.getPrereqBonus(i) != NO_BONUS)
{
for (int j = 0; j < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++j)
{
if (kLoopCorporation.getPrereqBonus(j) == kCorporation.getPrereqBonus(i))
{
bCompeting = true;
break;
}
}
}
if (bCompeting)
{
break;
}
}
}
if (bCompeting)
{
CvWString szTemp = CvWString::format(L"<link=literal>%s</link>", kLoopCorporation.getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_CORPORATION_COMPETES").c_str(), szTemp.GetCString(), L", ", bFirst);
bFirst = false;
}
}
}
/************************************************************************************************/
/* Afforess Start 01/14/10 */
/* */
/* */
/************************************************************************************************/
if (kCorporation.getHealth() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_HEALTHINESS", kCorporation.getHealth()));
}
else if (kCorporation.getHealth() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_UNHEALTHINESS", -kCorporation.getHealth()));
}
if (kCorporation.getHappiness() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_HAPPINESS", kCorporation.getHappiness()));
}
else if (kCorporation.getHappiness() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_UNHAPPINESS", -kCorporation.getHappiness()));
}
if (kCorporation.getMilitaryProductionModifier() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_MILITARY_PRODUCTION", kCorporation.getMilitaryProductionModifier()));
}
if (kCorporation.getFreeXP() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_FREE_XP", kCorporation.getFreeXP()));
}
setCommerceChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_ALL_CITIES").c_str(), kCorporation.getCommerceChangeArray(), false);
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_BUILDING_ALL_CITIES").c_str(), kCorporation.getYieldChangeArray(), false);
BuildingTypes ePrereqBuilding;
for (int iI = 0; iI < GC.getNumBuildingClassInfos(); iI++)
{
if (kCorporation.getPrereqBuildingClass(iI) > 0)
{
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
ePrereqBuilding = ((BuildingTypes)(GC.getCivilizationInfo(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getCivilizationType()).getCivilizationBuildings((BuildingClassTypes)iI)));
}
else
{
ePrereqBuilding = (BuildingTypes)GC.getBuildingClassInfo((BuildingClassTypes)iI).getDefaultBuildingIndex();
}
if (ePrereqBuilding != NO_BUILDING)
{
szTempBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_BUILDING_REQUIRES_NUM_SPECIAL_BUILDINGS_NO_CITY", GC.getBuildingInfo(ePrereqBuilding).getTextKeyWide(), kCorporation.getPrereqBuildingClass(iI)).c_str());
szBuffer.append(szTempBuffer);
}
}
}
if (kCorporation.getObsoleteTech() != NO_TECH)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_OBSOLETE_WITH", GC.getTechInfo((TechTypes)kCorporation.getObsoleteTech()).getTextKeyWide()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
void CvGameTextMgr::setCorporationHelpCity(CvWStringBuffer &szBuffer, CorporationTypes eCorporation, CvCity *pCity, bool bCityBar, bool bForceCorporation)
{
if (pCity == NULL)
{
return;
}
CvCorporationInfo& kCorporation = GC.getCorporationInfo(eCorporation);
if (bCityBar)
{
szBuffer.append(CvWString::format(SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), kCorporation.getDescription()));
szBuffer.append(NEWLINE);
if (!(GC.getGameINLINE().isCorporationFounded(eCorporation)))
{
if (GC.getCorporationInfo(eCorporation).getTechPrereq() != NO_TECH)
{
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_FOUNDED_FIRST", GC.getTechInfo((TechTypes)(kCorporation.getTechPrereq())).getTextKeyWide()));
}
}
}
if (!bForceCorporation)
{
if (!(pCity->isHasCorporation(eCorporation)))
{
return;
}
}
/************************************************************************************************/
/* Afforess Start 03/2/10 */
/* */
/* Rewritten to handle corporations that consume no resources */
/************************************************************************************************/
int iNumResources = 0;
int iNumReqResources = 0;
for (int i = 0; i < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++i)
{
BonusTypes eBonus = (BonusTypes)kCorporation.getPrereqBonus(i);
if (NO_BONUS != eBonus)
{
iNumReqResources++;
iNumResources += pCity->getNumBonuses(eBonus);
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
/************************************************************************************************/
/* Afforess Start 03/2/10 */
/* */
/* Rewritten to handle corporations that consume no resources */
/************************************************************************************************/
bool bActive = ((pCity->isActiveCorporation(eCorporation) || (bForceCorporation && iNumResources > 0) || (iNumReqResources == 0)) &&
(!GET_TEAM(pCity->getTeam()).isHasTech((TechTypes)kCorporation.getObsoleteTech()) || (kCorporation.getObsoleteTech() == NO_TECH)));
bool bGenerates = kCorporation.getBonusProduced() != NO_BONUS || kCorporation.getHappiness() != 0 || kCorporation.getHealth() != 0;
int iMaintenance = 0;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
bool bHandled = false;
for (int i = 0; i < NUM_YIELD_TYPES; ++i)
{
int iYield = 0;
if (bActive)
{
iYield += (kCorporation.getYieldProduced(i) * iNumResources * GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getCorporationMaintenancePercent()) / 100;
/************************************************************************************************/
/* Afforess Start 02/27/10 */
/* */
/* */
/************************************************************************************************/
iYield += 100 * kCorporation.getYieldChange(i);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
if (iYield != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
CvWString szTempBuffer;
szTempBuffer.Format(L"%s%d%c", iYield > 0 ? L"+" : L"", (iYield + 99) / 100, GC.getYieldInfo((YieldTypes)i).getChar());
szBuffer.append(szTempBuffer);
bHandled = true;
}
}
bHandled = false;
for (int i = 0; i < NUM_COMMERCE_TYPES; ++i)
{
int iCommerce = 0;
if (bActive)
{
iCommerce += (kCorporation.getCommerceProduced(i) * iNumResources * GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getCorporationMaintenancePercent()) / 100;
/************************************************************************************************/
/* Afforess Start 02/27/10 */
/* */
/* */
/************************************************************************************************/
iCommerce += 100 * kCorporation.getCommerceChange(i);
iCommerce *= (GET_TEAM(pCity->getTeam()).getCorporationRevenueModifier() + 100);
iCommerce /= 100;
if (i == COMMERCE_GOLD)
{
iMaintenance += pCity->calculateCorporationMaintenanceTimes100(eCorporation);
iMaintenance *= 100 + pCity->getMaintenanceModifier();
iMaintenance /= 100;
iCommerce -= iMaintenance;
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
if (iCommerce != 0)
{
if (bHandled)
{
szBuffer.append(L", ");
}
CvWString szTempBuffer;
szTempBuffer.Format(L"%s%d%c", iCommerce > 0 ? L"+" : L"", (iCommerce + 99) / 100, GC.getCommerceInfo((CommerceTypes)i).getChar());
szBuffer.append(szTempBuffer);
bHandled = true;
}
}
if (bCityBar)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_BONUS_REQUIRED"));
bool bFirst = true;
for (int i = 0; i < GC.getNUM_CORPORATION_PREREQ_BONUSES(); ++i)
{
if (NO_BONUS != kCorporation.getPrereqBonus(i))
{
if (bFirst)
{
bFirst = false;
}
else
{
szBuffer.append(L", ");
}
szBuffer.append(CvWString::format(L"%c", GC.getBonusInfo((BonusTypes)kCorporation.getPrereqBonus(i)).getChar()));
}
}
if (bActive)
{
/************************************************************************************************/
/* Afforess Start 03/18/10 */
/* */
/* Show health and happiness */
/************************************************************************************************/
if (bGenerates)
{
szBuffer.append(NEWLINE);
if (kCorporation.getBonusProduced() != NO_BONUS)
{
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_BONUS_PRODUCED", GC.getBonusInfo((BonusTypes)kCorporation.getBonusProduced()).getChar()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_CORPORATION_BONUS_GENERATES"));
}
if (kCorporation.getHappiness() != 0)
{
szBuffer.append(CvWString::format(L"%c", ((kCorporation.getHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR): gDLL->getSymbolID(UNHAPPY_CHAR))));
}
if (kCorporation.getHealth() != 0)
{
szBuffer.append(CvWString::format(L"%c", ((kCorporation.getHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))));
}
}
}
}
else
{
if (bGenerates)
{
if (bActive)
{
if (bHandled)
{
szBuffer.append(L", ");
}
if (kCorporation.getBonusProduced() != NO_BONUS)
{
szBuffer.append(CvWString::format(L"%c", GC.getBonusInfo((BonusTypes)kCorporation.getBonusProduced()).getChar()));
}
if (kCorporation.getHappiness() != 0)
{
szBuffer.append(CvWString::format(L"%c", ((kCorporation.getHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR): gDLL->getSymbolID(UNHAPPY_CHAR))));
}
if (kCorporation.getHealth() != 0)
{
szBuffer.append(CvWString::format(L"%c", ((kCorporation.getHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))));
}
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
void CvGameTextMgr::buildObsoleteString(CvWStringBuffer &szBuffer, int iItem, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_TECH_OBSOLETES", GC.getBuildingInfo((BuildingTypes) iItem).getTextKeyWide()));
}
void CvGameTextMgr::buildObsoleteBonusString(CvWStringBuffer &szBuffer, int iItem, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_TECH_OBSOLETES", GC.getBonusInfo((BonusTypes) iItem).getTextKeyWide()));
}
void CvGameTextMgr::buildObsoleteSpecialString(CvWStringBuffer &szBuffer, int iItem, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_TECH_OBSOLETES_NO_LINK", GC.getSpecialBuildingInfo((SpecialBuildingTypes) iItem).getTextKeyWide()));
}
void CvGameTextMgr::buildMoveString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
int iI;
int iMoveDiff;
for (iI = 0; iI < GC.getNumRouteInfos(); ++iI)
{
iMoveDiff = ((GC.getMOVE_DENOMINATOR() / std::max(1, (GC.getRouteInfo((RouteTypes) iI).getMovementCost() + ((bPlayerContext) ? GET_TEAM(GC.getGameINLINE().getActiveTeam()).getRouteChange((RouteTypes)iI) : 0)))) - (GC.getMOVE_DENOMINATOR() / std::max(1, (GC.getRouteInfo((RouteTypes) iI).getMovementCost() + ((bPlayerContext) ? GET_TEAM(GC.getGameINLINE().getActiveTeam()).getRouteChange((RouteTypes)iI) : 0) + GC.getRouteInfo((RouteTypes) iI).getTechMovementChange(eTech)))));
if (iMoveDiff != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_MOVEMENT", -(iMoveDiff), GC.getRouteInfo((RouteTypes) iI).getTextKeyWide()));
bList = true;
}
}
}
void CvGameTextMgr::buildFreeUnitString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
UnitTypes eFreeUnit = NO_UNIT;
if (GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
eFreeUnit = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getTechFreeUnit(eTech);
}
else
{
if (GC.getTechInfo(eTech).getFirstFreeUnitClass() != NO_UNITCLASS)
{
eFreeUnit = (UnitTypes)GC.getUnitClassInfo((UnitClassTypes)GC.getTechInfo(eTech).getFirstFreeUnitClass()).getDefaultUnitIndex();
}
}
if (eFreeUnit != NO_UNIT)
{
if (!bPlayerContext || (GC.getGameINLINE().countKnownTechNumTeams(eTech) == 0))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_TECH_FIRST_RECEIVES", GC.getUnitInfo(eFreeUnit).getTextKeyWide()));
}
}
}
void CvGameTextMgr::buildFeatureProductionString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getFeatureProductionModifier() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_FEATURE_PRODUCTION_MODIFIER", GC.getTechInfo(eTech).getFeatureProductionModifier()));
}
}
void CvGameTextMgr::buildWorkerRateString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getWorkerSpeedModifier() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_WORKERS_FASTER", GC.getTechInfo(eTech).getWorkerSpeedModifier()));
}
}
void CvGameTextMgr::buildTradeRouteString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getTradeRoutes() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_TRADE_ROUTES", GC.getTechInfo(eTech).getTradeRoutes()));
}
}
void CvGameTextMgr::buildHealthRateString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getHealth() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HEALTH_ALL_CITIES", abs(GC.getTechInfo(eTech).getHealth()), ((GC.getTechInfo(eTech).getHealth() > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))));
}
}
void CvGameTextMgr::buildHappinessRateString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getHappiness() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HAPPINESS_ALL_CITIES", abs(GC.getTechInfo(eTech).getHappiness()), ((GC.getTechInfo(eTech).getHappiness() > 0) ? gDLL->getSymbolID(HAPPY_CHAR): gDLL->getSymbolID(UNHAPPY_CHAR))));
}
}
void CvGameTextMgr::buildFreeTechString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getFirstFreeTechs() > 0)
{
if (!bPlayerContext || (GC.getGameINLINE().countKnownTechNumTeams(eTech) == 0))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
if (GC.getTechInfo(eTech).getFirstFreeTechs() == 1)
{
szBuffer.append(gDLL->getText("TXT_KEY_TECH_FIRST_FREE_TECH"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_TECH_FIRST_FREE_TECHS", GC.getTechInfo(eTech).getFirstFreeTechs()));
}
}
}
}
void CvGameTextMgr::buildLOSString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isExtraWaterSeeFrom() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isExtraWaterSeeFrom())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_UNIT_EXTRA_SIGHT"));
}
}
void CvGameTextMgr::buildMapCenterString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isMapCentering() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isMapCentering())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CENTERS_MAP"));
}
}
void CvGameTextMgr::buildMapRevealString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList)
{
if (GC.getTechInfo(eTech).isMapVisible())
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_REVEALS_MAP"));
}
}
void CvGameTextMgr::buildMapTradeString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isMapTrading() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isMapTrading())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_MAP_TRADING"));
}
}
void CvGameTextMgr::buildTechTradeString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isTechTrading() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isTechTrading())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_TECH_TRADING"));
}
}
void CvGameTextMgr::buildGoldTradeString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isGoldTrading() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isGoldTrading())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_GOLD_TRADING"));
}
}
void CvGameTextMgr::buildOpenBordersString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isOpenBordersTrading() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isOpenBordersTrading())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_OPEN_BORDERS"));
}
}
void CvGameTextMgr::buildDefensivePactString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isDefensivePactTrading() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isDefensivePactTrading())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_DEFENSIVE_PACTS"));
}
}
void CvGameTextMgr::buildPermanentAllianceString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isPermanentAllianceTrading() && (!bPlayerContext || (!(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isPermanentAllianceTrading()) && GC.getGameINLINE().isOption(GAMEOPTION_PERMANENT_ALLIANCES))))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_PERM_ALLIANCES"));
}
}
void CvGameTextMgr::buildVassalStateString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isVassalStateTrading() && (!bPlayerContext || (!(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isVassalStateTrading()) && GC.getGameINLINE().isOption(GAMEOPTION_NO_VASSAL_STATES))))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_VASSAL_STATES"));
}
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
void CvGameTextMgr::buildEmbassyString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_DIPLOMACY))
{
if (GC.getTechInfo(eTech).isEmbassyTrading() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isEmbassyTrading())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_EMBASSIES"));
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
void CvGameTextMgr::buildBridgeString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isBridgeBuilding() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isBridgeBuilding())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_BRIDGE_BUILDING"));
}
}
void CvGameTextMgr::buildIrrigationString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isIrrigation() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isIrrigation())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_SPREAD_IRRIGATION"));
}
}
void CvGameTextMgr::buildIgnoreIrrigationString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isIgnoreIrrigation() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isIgnoreIrrigation())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_IRRIGATION_ANYWHERE"));
}
}
void CvGameTextMgr::buildWaterWorkString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isWaterWork() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isWaterWork())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WATER_WORK"));
}
}
void CvGameTextMgr::buildImprovementString(CvWStringBuffer &szBuffer, TechTypes eTech, int iImprovement, bool bList, bool bPlayerContext)
{
bool bTechFound;
int iJ;
bTechFound = false;
if (GC.getBuildInfo((BuildTypes) iImprovement).getTechPrereq() == NO_TECH)
{
for (iJ = 0; iJ < GC.getNumFeatureInfos(); iJ++)
{
if (GC.getBuildInfo((BuildTypes) iImprovement).getFeatureTech(iJ) == eTech)
{
bTechFound = true;
}
}
}
else
{
if (GC.getBuildInfo((BuildTypes) iImprovement).getTechPrereq() == eTech)
{
bTechFound = true;
}
}
if (bTechFound)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CAN_BUILD_IMPROVEMENT", GC.getBuildInfo((BuildTypes) iImprovement).getTextKeyWide()));
}
}
void CvGameTextMgr::buildDomainExtraMovesString(CvWStringBuffer &szBuffer, TechTypes eTech, int iDomainType, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getDomainExtraMoves(iDomainType) != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
/************************************************************************************************/
/* Afforess Start 07/16/10 */
/* */
/* */
/************************************************************************************************/
if (iDomainType == DOMAIN_AIR)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_EXTRA_RANGE", GC.getTechInfo(eTech).getDomainExtraMoves(iDomainType)));
}
else
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(gDLL->getText("TXT_KEY_MISC_EXTRA_MOVES", GC.getTechInfo(eTech).getDomainExtraMoves(iDomainType), GC.getDomainInfo((DomainTypes)iDomainType).getTextKeyWide()));
}
}
void CvGameTextMgr::buildAdjustString(CvWStringBuffer &szBuffer, TechTypes eTech, int iCommerceType, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isCommerceFlexible(iCommerceType) && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isCommerceFlexible((CommerceTypes)iCommerceType))))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ADJUST_COMMERCE_RATE", GC.getCommerceInfo((CommerceTypes) iCommerceType).getChar()));
}
}
void CvGameTextMgr::buildTerrainTradeString(CvWStringBuffer &szBuffer, TechTypes eTech, int iTerrainType, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isTerrainTrade(iTerrainType) && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isTerrainTrade((TerrainTypes)iTerrainType))))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_ON_TERRAIN", gDLL->getSymbolID(TRADE_CHAR), GC.getTerrainInfo((TerrainTypes) iTerrainType).getTextKeyWide()));
}
}
void CvGameTextMgr::buildRiverTradeString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).isRiverTrade() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isRiverTrade())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ENABLES_ON_TERRAIN", gDLL->getSymbolID(TRADE_CHAR), gDLL->getText("TXT_KEY_MISC_RIVERS").GetCString()));
}
}
void CvGameTextMgr::buildSpecialBuildingString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
if (GC.getSpecialBuildingInfo((SpecialBuildingTypes)iBuildingType).getTechPrereq() == eTech)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CAN_CONSTRUCT_BUILDING", GC.getSpecialBuildingInfo((SpecialBuildingTypes) iBuildingType).getTextKeyWide()));
}
if (GC.getSpecialBuildingInfo((SpecialBuildingTypes)iBuildingType).getTechPrereqAnyone() == eTech)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CAN_CONSTRUCT_BUILDING_ANYONE", GC.getSpecialBuildingInfo((SpecialBuildingTypes) iBuildingType).getTextKeyWide()));
}
}
void CvGameTextMgr::buildYieldChangeString(CvWStringBuffer &szBuffer, TechTypes eTech, int iYieldType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getImprovementInfo((ImprovementTypes)iYieldType).getDescription());
}
else
{
szTempBuffer.Format(L"%c<link=literal>%s</link>", gDLL->getSymbolID(BULLET_CHAR), GC.getImprovementInfo((ImprovementTypes)iYieldType).getDescription());
}
setYieldChangeHelp(szBuffer, szTempBuffer, L": ", L"", GC.getImprovementInfo((ImprovementTypes)iYieldType).getTechYieldChangesArray(eTech), false, bList);
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
void CvGameTextMgr::buildBuildingTechCommerceChangeString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
else
{
szTempBuffer.Format(L"%c<link=literal>%s</link>", gDLL->getSymbolID(BULLET_CHAR), GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
setCommerceChangeHelp(szBuffer, szTempBuffer, L": ", L"", GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechCommerceChangeArray(eTech), false, bList);
}
void CvGameTextMgr::buildBuildingTechYieldChangeString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
else
{
szTempBuffer.Format(L"%c<link=literal>%s</link>", gDLL->getSymbolID(BULLET_CHAR), GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
setYieldChangeHelp(szBuffer, szTempBuffer, L": ", L"", GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechYieldChangeArray(eTech), false, bList);
}
void CvGameTextMgr::buildBuildingTechSpecialistChangeString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
for (int iSpecialist = 0; iSpecialist < GC.getNumSpecialistInfos(); iSpecialist++)
{
int iChange = GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechSpecialistChange(eTech, iSpecialist);
if (0 != iChange)
{
szBuffer.append(NEWLINE);
if (bList)
{
szTempBuffer.Format(L"%c<link=literal>%s</link>: ", gDLL->getSymbolID(BULLET_CHAR), GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
else
{
szTempBuffer.Format(L"<link=literal>%s</link>: ", GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
szBuffer.append(szTempBuffer);
if (iChange == 1)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TURN_CITIZEN_INTO_NO_BULLET", GC.getSpecialistInfo((SpecialistTypes) iSpecialist).getTextKeyWide()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_TURN_CITIZENS_INTO_NO_BULLET", iChange, GC.getSpecialistInfo((SpecialistTypes) iSpecialist).getTextKeyWide()));
}
}
}
}
void CvGameTextMgr::buildBuildingTechCommerceModifierString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
else
{
szTempBuffer.Format(L"%c<link=literal>%s</link>", gDLL->getSymbolID(BULLET_CHAR), GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
setCommerceChangeHelp(szBuffer, szTempBuffer, L": ", L"", GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechCommerceModifierArray(eTech), true, bList);
}
void CvGameTextMgr::buildBuildingTechYieldModifierString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szTempBuffer.Format(L"<link=literal>%s</link>", GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
else
{
szTempBuffer.Format(L"%c<link=literal>%s</link>", gDLL->getSymbolID(BULLET_CHAR), GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
}
setYieldChangeHelp(szBuffer, szTempBuffer, L": ", L"", GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechYieldModifierArray(eTech), true, bList);
}
void CvGameTextMgr::buildBuildingTechHappinessChangesString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
CvWString szFirstBuffer;
if (GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechHappinessChanges(eTech) != 0)
{
szTempBuffer.Format(L"%s%c+%d%c%s<link=literal>%s</link>", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechHappinessChanges(eTech)), (((GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechHappinessChanges(eTech) > 0) ? gDLL->getSymbolID(HAPPY_CHAR): gDLL->getSymbolID(UNHAPPY_CHAR))), gDLL->getText("TXT_KEY_WITH").GetCString(), GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", true);
}
}
void CvGameTextMgr::buildBuildingTechHealthChangesString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBuildingType, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
CvWString szFirstBuffer;
if (GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechHealthChanges(eTech) != 0)
{
szTempBuffer.Format(L"%s%c+%d%c%s<link=literal>%s</link>", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), abs(GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechHealthChanges(eTech)), (((GC.getBuildingInfo((BuildingTypes)iBuildingType).getTechHealthChanges(eTech) > 0) ? gDLL->getSymbolID(HEALTHY_CHAR): gDLL->getSymbolID(UNHEALTHY_CHAR))), gDLL->getText("TXT_KEY_WITH").GetCString(), GC.getBuildingInfo((BuildingTypes)iBuildingType).getDescription());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", true);
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
bool CvGameTextMgr::buildBonusRevealString(CvWStringBuffer &szBuffer, TechTypes eTech, int iBonusType, bool bFirst, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (GC.getBonusInfo((BonusTypes) iBonusType).getTechReveal() == eTech)
{
if (bList && bFirst)
{
szBuffer.append(NEWLINE);
}
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getBonusInfo((BonusTypes) iBonusType).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_REVEALS").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
return bFirst;
}
bool CvGameTextMgr::buildCivicRevealString(CvWStringBuffer &szBuffer, TechTypes eTech, int iCivicType, bool bFirst, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (GC.getCivicInfo((CivicTypes) iCivicType).getTechPrereq() == eTech)
{
if (bList && bFirst)
{
szBuffer.append(NEWLINE);
}
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getCivicInfo((CivicTypes) iCivicType).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_ENABLES").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
return bFirst;
}
bool CvGameTextMgr::buildProcessInfoString(CvWStringBuffer &szBuffer, TechTypes eTech, int iProcessType, bool bFirst, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (GC.getProcessInfo((ProcessTypes) iProcessType).getTechPrereq() == eTech)
{
if (bList && bFirst)
{
szBuffer.append(NEWLINE);
}
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getProcessInfo((ProcessTypes) iProcessType).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_CAN_BUILD").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
return bFirst;
}
bool CvGameTextMgr::buildFoundReligionString(CvWStringBuffer &szBuffer, TechTypes eTech, int iReligionType, bool bFirst, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (GC.getReligionInfo((ReligionTypes) iReligionType).getTechPrereq() == eTech)
{
/************************************************************************************************/
/* REVDCM 04/29/10 phungus420 */
/* */
/* Player Functions */
/************************************************************************************************/
if (!bPlayerContext ||
(!(GC.getGameINLINE().isReligionSlotTaken((ReligionTypes)iReligionType))
&& GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canFoundReligion()) )
/************************************************************************************************/
/* LIMITED_RELIGIONS END */
/************************************************************************************************/
{
if (bList && bFirst)
{
szBuffer.append(NEWLINE);
}
if (GC.getGameINLINE().isOption(GAMEOPTION_PICK_RELIGION))
{
szTempBuffer = gDLL->getText("TXT_KEY_RELIGION_UNKNOWN");
}
else
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getReligionInfo((ReligionTypes) iReligionType).getDescription());
}
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_FIRST_DISCOVER_FOUNDS").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
return bFirst;
}
bool CvGameTextMgr::buildFoundCorporationString(CvWStringBuffer &szBuffer, TechTypes eTech, int iCorporationType, bool bFirst, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (GC.getCorporationInfo((CorporationTypes) iCorporationType).getTechPrereq() == eTech)
{
if (!bPlayerContext || (GC.getGameINLINE().countKnownTechNumTeams(eTech) == 0))
{
if (bList && bFirst)
{
szBuffer.append(NEWLINE);
}
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getCorporationInfo((CorporationTypes) iCorporationType).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_FIRST_DISCOVER_INCORPORATES").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
return bFirst;
}
bool CvGameTextMgr::buildPromotionString(CvWStringBuffer &szBuffer, TechTypes eTech, int iPromotionType, bool bFirst, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (GC.getPromotionInfo((PromotionTypes) iPromotionType).getTechPrereq() == eTech)
{
if (bList && bFirst)
{
szBuffer.append(NEWLINE);
}
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getPromotionInfo((PromotionTypes) iPromotionType).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_ENABLES").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
return bFirst;
}
/************************************************************************************************/
/* Afforess Start 01/01/10 */
/* */
/* */
/************************************************************************************************/
void CvGameTextMgr::buildObsoletePromotionString(CvWStringBuffer &szBuffer, int iItem, bool bList, bool bPlayerContext)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_TECH_OBSOLETES", GC.getPromotionInfo((PromotionTypes)iItem).getDescription()));
}
void CvGameTextMgr::buildObsoleteCorporationString(CvWStringBuffer &szBuffer, int iItem, bool bList, bool bPlayerContext)
{
CvWString szTempBuffer;
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_TECH_OBSOLETES", GC.getCorporationInfo((CorporationTypes)iItem).getDescription()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Displays a list of derived technologies - no distinction between AND/OR prerequisites
void CvGameTextMgr::buildSingleLineTechTreeString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bPlayerContext)
{
CvWString szTempBuffer; // Formatting
if (NO_TECH == eTech)
{
// you need to specify a tech of origin for this method to do anything
return;
}
// BUG - Show Sped-Up Techs - start
if (bPlayerContext && getBugOptionBOOL("MiscHover__SpedUpTechs", true, "BUG_SPED_UP_TECHS_HOVER"))
{
CvPlayer& player = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
// techs that speed this one up
bool bFirst = true;
for (int iJ = 0; iJ < GC.getNUM_OR_TECH_PREREQS(); iJ++)
{
TechTypes ePrereqTech = (TechTypes)GC.getTechInfo(eTech).getPrereqOrTechs(iJ);
if (ePrereqTech != NO_TECH && player.canResearch(ePrereqTech))
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_TECH_TEXT"), GC.getTechInfo(ePrereqTech).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_SPED_UP_BY").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
// techs sped up by this one
bFirst = true;
for (int iI = 0; iI < GC.getNumTechInfos(); ++iI)
{
if (player.canResearch((TechTypes)iI))
{
bool bTechFound = false;
if (!bTechFound)
{
for (int iJ = 0; iJ < GC.getNUM_OR_TECH_PREREQS(); iJ++)
{
if (GC.getTechInfo((TechTypes) iI).getPrereqOrTechs(iJ) == eTech)
{
bTechFound = true;
break;
}
}
}
if (!bTechFound)
{
for (int iJ = 0; iJ < GC.getNUM_AND_TECH_PREREQS(); iJ++)
{
if (GC.getTechInfo((TechTypes) iI).getPrereqAndTechs(iJ) == eTech)
{
bTechFound = true;
break;
}
}
}
if (bTechFound)
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_TECH_TEXT"), GC.getTechInfo((TechTypes) iI).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_SPEEDS_UP").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
}
}
// BUG - Show Sped-Up Techs - end
bool bFirst = true;
for (int iI = 0; iI < GC.getNumTechInfos(); ++iI)
{
bool bTechAlreadyAccessible = false;
if (bPlayerContext)
{
bTechAlreadyAccessible = (GET_TEAM(GC.getGameINLINE().getActiveTeam()).isHasTech((TechTypes)iI) || GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canResearch((TechTypes)iI));
}
if (!bTechAlreadyAccessible)
{
bool bTechFound = false;
if (!bTechFound)
{
for (int iJ = 0; iJ < GC.getNUM_OR_TECH_PREREQS(); iJ++)
{
if (GC.getTechInfo((TechTypes) iI).getPrereqOrTechs(iJ) == eTech)
{
bTechFound = true;
break;
}
}
}
if (!bTechFound)
{
for (int iJ = 0; iJ < GC.getNUM_AND_TECH_PREREQS(); iJ++)
{
if (GC.getTechInfo((TechTypes) iI).getPrereqAndTechs(iJ) == eTech)
{
bTechFound = true;
break;
}
}
}
if (bTechFound)
{
szTempBuffer.Format( SETCOLR L"<link=literal>%s</link>" ENDCOLR , TEXT_COLOR("COLOR_TECH_TEXT"), GC.getTechInfo((TechTypes) iI).getDescription());
setListHelp(szBuffer, gDLL->getText("TXT_KEY_MISC_LEADS_TO").c_str(), szTempBuffer, L", ", bFirst);
bFirst = false;
}
}
}
}
// Information about other prerequisite technologies to eTech besides eFromTech
void CvGameTextMgr::buildTechTreeString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bPlayerContext, TechTypes eFromTech)
{
CvWString szTempBuffer; // Formatting
if (NO_TECH == eTech || NO_TECH == eFromTech)
{
return;
}
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_TECH_TEXT"), GC.getTechInfo(eTech).getDescription());
szBuffer.append(szTempBuffer);
// Loop through OR prerequisites to make list
CvWString szOtherOrTechs;
int nOtherOrTechs = 0;
bool bOrTechFound = false;
for (int iJ = 0; iJ < GC.getNUM_OR_TECH_PREREQS(); iJ++)
{
TechTypes eTestTech = (TechTypes)GC.getTechInfo(eTech).getPrereqOrTechs(iJ);
if (eTestTech >= 0)
{
bool bTechAlreadyResearched = false;
if (bPlayerContext)
{
bTechAlreadyResearched = GET_TEAM(GC.getGameINLINE().getActiveTeam()).isHasTech(eTestTech);
}
if (!bTechAlreadyResearched)
{
if (eTestTech == eFromTech)
{
bOrTechFound = true;
}
else
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_TECH_TEXT"), GC.getTechInfo(eTestTech).getDescription());
setListHelp(szOtherOrTechs, L"", szTempBuffer, gDLL->getText("TXT_KEY_OR").c_str(), 0 == nOtherOrTechs);
nOtherOrTechs++;
}
}
}
}
// Loop through AND prerequisites to make list
CvWString szOtherAndTechs;
int nOtherAndTechs = 0;
bool bAndTechFound = false;
for (int iJ = 0; iJ < GC.getNUM_AND_TECH_PREREQS(); iJ++)
{
TechTypes eTestTech = (TechTypes)GC.getTechInfo(eTech).getPrereqAndTechs(iJ);
if (eTestTech >= 0)
{
bool bTechAlreadyResearched = false;
if (bPlayerContext)
{
bTechAlreadyResearched = GET_TEAM(GC.getGameINLINE().getActiveTeam()).isHasTech(eTestTech);
}
if (!bTechAlreadyResearched)
{
if (eTestTech == eFromTech)
{
bAndTechFound = true;
}
else
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_TECH_TEXT"), GC.getTechInfo(eTestTech).getDescription());
setListHelp(szOtherAndTechs, L"", szTempBuffer, L", ", 0 == nOtherAndTechs);
nOtherAndTechs++;
}
}
}
}
if (bOrTechFound || bAndTechFound)
{
if (nOtherAndTechs > 0 || nOtherOrTechs > 0)
{
szBuffer.append(L' ');
if (nOtherAndTechs > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_WITH_SPACE"));
szBuffer.append(szOtherAndTechs);
}
if (nOtherOrTechs > 0)
{
if (bAndTechFound)
{
if (nOtherAndTechs > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_AND_SPACE"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_WITH_SPACE"));
}
szBuffer.append(szOtherOrTechs);
}
else if (bOrTechFound)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ALTERNATIVELY_DERIVED", GC.getTechInfo(eTech).getTextKeyWide(), szOtherOrTechs.GetCString()));
}
}
}
}
}
void CvGameTextMgr::setPromotionHelp(CvWStringBuffer &szBuffer, PromotionTypes ePromotion, bool bCivilopediaText)
{
if (!bCivilopediaText)
{
CvWString szTempBuffer;
if (NO_PROMOTION == ePromotion)
{
return;
}
CvPromotionInfo& promo = GC.getPromotionInfo(ePromotion);
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), promo.getDescription());
szBuffer.append(szTempBuffer);
}
parsePromotionHelp(szBuffer, ePromotion);
}
void CvGameTextMgr::setUnitCombatHelp(CvWStringBuffer &szBuffer, UnitCombatTypes eUnitCombat)
{
szBuffer.append(GC.getUnitCombatInfo(eUnitCombat).getDescription());
}
void CvGameTextMgr::setImprovementHelp(CvWStringBuffer &szBuffer, ImprovementTypes eImprovement, bool bCivilopediaText)
{
CvWString szTempBuffer;
CvWString szFirstBuffer;
int iTurns;
if (NO_IMPROVEMENT == eImprovement)
{
return;
}
CvImprovementInfo& info = GC.getImprovementInfo(eImprovement);
if (!bCivilopediaText)
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), info.getDescription());
szBuffer.append(szTempBuffer);
setYieldChangeHelp(szBuffer, L", ", L"", L"", info.getYieldChangeArray(), false, false);
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_MISC_WITH_IRRIGATION").c_str(), info.getIrrigatedYieldChangeArray());
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_MISC_ON_HILLS").c_str(), info.getHillsYieldChangeArray());
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_MISC_ALONG_RIVER").c_str(), info.getRiverSideYieldChangeArray());
for (int iTech = 0; iTech < GC.getNumTechInfos(); iTech++)
{
/************************************************************************************************/
/* Afforess Start 06/26/10 */
/* */
/* */
/************************************************************************************************/
if (GC.getGameINLINE().canEverResearch((TechTypes)iTech))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
for (int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)
{
if (0 != info.getTechYieldChanges(iTech, iYield))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_WITH_TECH", info.getTechYieldChanges(iTech, iYield), GC.getYieldInfo((YieldTypes)iYield).getChar(), GC.getTechInfo((TechTypes)iTech).getTextKeyWide()));
}
}
}
/************************************************************************************************/
/* Afforess Start 08/26/10 */
/* */
/* */
/************************************************************************************************/
for (int iTrait = 0; iTrait < GC.getNumTraitInfos(); iTrait++)
{
for (int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)
{
if (0 != info.getTraitYieldChanges(iTrait, iYield))
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_MAGENTA"), GC.getTraitInfo((TraitTypes)iTrait).getDescription());
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_YIELD_CHANGE", info.getTraitYieldChanges(iTrait, iYield), GC.getYieldInfo((YieldTypes)iYield).getChar()));
szBuffer.append(szTempBuffer);
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Civics
for (int iYield = 0; iYield < NUM_YIELD_TYPES; iYield++)
{
for (int iCivic = 0; iCivic < GC.getNumCivicInfos(); iCivic++)
{
int iChange = GC.getCivicInfo((CivicTypes)iCivic).getImprovementYieldChanges(eImprovement, iYield);
if (0 != iChange)
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR , TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getCivicInfo((CivicTypes)iCivic).getDescription());
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_CIVIC_IMPROVEMENT_YIELD_CHANGE", iChange, GC.getYieldInfo((YieldTypes)iYield).getChar()));
szBuffer.append(szTempBuffer);
}
}
}
}
if (info.isRequiresRiverSide())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_REQUIRES_RIVER"));
}
if (info.isCarriesIrrigation())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_CARRIES_IRRIGATION"));
}
if (bCivilopediaText)
{
if (info.isNoFreshWater())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_NO_BUILD_FRESH_WATER"));
}
if (info.isWater())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_BUILD_ONLY_WATER"));
}
if (info.isRequiresFlatlands())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_ONLY_BUILD_FLATLANDS"));
}
}
if (info.getImprovementUpgrade() != NO_IMPROVEMENT)
{
iTurns = GC.getGameINLINE().getImprovementUpgradeTime(eImprovement);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_EVOLVES", GC.getImprovementInfo((ImprovementTypes) info.getImprovementUpgrade()).getTextKeyWide(), iTurns));
}
int iLast = -1;
for (int iBonus = 0; iBonus < GC.getNumBonusInfos(); iBonus++)
{
int iRand = info.getImprovementBonusDiscoverRand(iBonus);
if (iRand > 0)
{
szFirstBuffer.Format(L"%s%s", NEWLINE, gDLL->getText("TXT_KEY_IMPROVEMENT_CHANCE_DISCOVER").c_str());
szTempBuffer.Format(L"%c", GC.getBonusInfo((BonusTypes) iBonus).getChar());
setListHelp(szBuffer, szFirstBuffer, szTempBuffer, L", ", iRand != iLast);
iLast = iRand;
}
}
if (0 != info.getDefenseModifier())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_DEFENSE_MODIFIER", info.getDefenseModifier()));
}
/************************************************************************************************/
/* Afforess Start 05/22/10 */
/* */
/* */
/************************************************************************************************/
if (0 != info.getHealthPercent())
{
szBuffer.append(NEWLINE);
int iHealthPercent = info.getHealthPercent();
if (iHealthPercent % 100 == 0)
{
szTempBuffer = CvWString::format(L"%c%s%d%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHealthPercent > 0 ? L"+" : L"",
abs(iHealthPercent / 100),
(iHealthPercent > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)),
gDLL->getText("TXT_KEY_MISC_ICON_CHANGE_NEARBY_CITIES_1").GetCString());
}
else if (iHealthPercent % 10 == 0)
{
szTempBuffer = CvWString::format(L"%c%s%.1f%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHealthPercent > 0 ? L"+" : L"",
abs(iHealthPercent) * 0.01f,
(iHealthPercent > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)),
gDLL->getText("TXT_KEY_MISC_ICON_CHANGE_NEARBY_CITIES_1").GetCString());
}
else
{
szTempBuffer = CvWString::format(L"%c%s%.2f%c%s", gDLL->getSymbolID(BULLET_CHAR),
iHealthPercent > 0 ? L"+" : L"",
abs(iHealthPercent) * 0.01f,
(iHealthPercent > 0 ? gDLL->getSymbolID(HEALTHY_CHAR) : gDLL->getSymbolID(UNHEALTHY_CHAR)),
gDLL->getText("TXT_KEY_MISC_ICON_CHANGE_NEARBY_CITIES_1").GetCString());
}
szBuffer.append(szTempBuffer);
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (0 != info.getHappiness())
{
szBuffer.append(NEWLINE);
/************************************************************************************************/
/* UNOFFICIAL_PATCH 08/28/09 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
/* original bts code
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ICON_CHANGE_NEARBY_CITIES", info.getHappiness(), (info.getHappiness() > 0 ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
*/
// Use absolute value with unhappy face
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ICON_CHANGE_NEARBY_CITIES", abs(info.getHappiness()), (info.getHappiness() > 0 ? gDLL->getSymbolID(HAPPY_CHAR) : gDLL->getSymbolID(UNHAPPY_CHAR))));
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
if (info.isActsAsCity())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_DEFENSE_MODIFIER_EXTRA"));
}
if (info.getFeatureGrowthProbability() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_MORE_GROWTH"));
}
else if (info.getFeatureGrowthProbability() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_LESS_GROWTH"));
}
if (bCivilopediaText)
{
if (info.getPillageGold() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_IMPROVEMENT_PILLAGE_YIELDS", info.getPillageGold()));
}
}
info.getPropertyManipulators()->buildDisplayString(szBuffer);
}
void CvGameTextMgr::setRouteHelp(CvWStringBuffer &szBuffer, RouteTypes eRoute, bool bCivilopediaText)
{
CvWString szTempBuffer;
CvWString szFirstBuffer;
int iI;
if (NO_ROUTE == eRoute)
{
return;
}
CvRouteInfo& info = GC.getRouteInfo(eRoute);
if (!bCivilopediaText)
{
szTempBuffer.Format( SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), info.getDescription());
szBuffer.append(szTempBuffer);
setYieldChangeHelp(szBuffer, L", ", L"", L"", info.getYieldChangeArray(), false, false);
for (int iTech = 0; iTech < GC.getNumTechInfos(); iTech++)
{
if (GC.getGameINLINE().canEverResearch((TechTypes)iTech))
{
if (0 != info.getTechMovementChange(iTech))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MOVEMENT_ROUTE_WITH_TECH", info.getTechMovementChange(iTech), gDLL->getSymbolID(MOVES_CHAR), GC.getTechInfo((TechTypes)iTech).getTextKeyWide()));
}
}
}
}
if (info.isSeaTunnel())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ROUTE_SEA_TUNNEL"));
}
if (info.getMovementCost() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ROUTE_MOVEMENT_COST", info.getMovementCost()));
}
if (info.getFlatMovementCost() != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ROUTE_FLAT_MOVEMENT_COST", info.getFlatMovementCost()));
}
if (info.getPrereqBonus() != NO_BONUS)
{
if ((GC.getGame().getActivePlayer()!= NO_PLAYER && !GET_PLAYER(GC.getGame().getActivePlayer()).hasBonus((BonusTypes)info.getPrereqBonus())) || GC.getGame().getActivePlayer() == NO_PLAYER)
{
if (info.isAnyPrereqOrBonus())
{
bool bQualified = true;
if ((GC.getGame().getActivePlayer()!= NO_PLAYER && !GET_PLAYER(GC.getGame().getActivePlayer()).hasBonus((BonusTypes)info.getPrereqBonus())) || GC.getGame().getActivePlayer() == NO_PLAYER)
{
for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
BonusTypes eBonusOrPrereq = (BonusTypes)iI;
if (GET_PLAYER(GC.getGame().getActivePlayer()).hasBonus((BonusTypes)info.getPrereqOrBonus(eBonusOrPrereq)))
{
bQualified = false;
}
}
if (bQualified)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ROUTE_REQUIRES_BONUS", GC.getBonusInfo((BonusTypes)info.getPrereqBonus()).getTextKeyWide()));
for (iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
BonusTypes eBonusOrPrereq = (BonusTypes)iI;
if ((GC.getGame().getActivePlayer()!= NO_PLAYER && !GET_PLAYER(GC.getGame().getActivePlayer()).hasBonus((BonusTypes)info.getPrereqOrBonus(eBonusOrPrereq))) || GC.getGame().getActivePlayer() != NO_PLAYER)
{
szBuffer.append(gDLL->getText("TXT_KEY_ROUTE_REQUIRES_BONUS_OR", GC.getBonusInfo((BonusTypes)info.getPrereqOrBonus(eBonusOrPrereq)).getTextKeyWide()));
}
}
}
}
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ROUTE_REQUIRES_BONUS", GC.getBonusInfo((BonusTypes)info.getPrereqBonus()).getTextKeyWide()));
}
}
}
info.getPropertyManipulators()->buildDisplayString(szBuffer);
}
void CvGameTextMgr::getDealString(CvWStringBuffer& szBuffer, CvDeal& deal, PlayerTypes ePlayerPerspective)
{
PlayerTypes ePlayer1 = deal.getFirstPlayer();
PlayerTypes ePlayer2 = deal.getSecondPlayer();
const CLinkList<TradeData>* pListPlayer1 = deal.getFirstTrades();
const CLinkList<TradeData>* pListPlayer2 = deal.getSecondTrades();
getDealString(szBuffer, ePlayer1, ePlayer2, pListPlayer1, pListPlayer2, ePlayerPerspective);
}
void CvGameTextMgr::getDealString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer1, PlayerTypes ePlayer2, const CLinkList<TradeData>* pListPlayer1, const CLinkList<TradeData>* pListPlayer2, PlayerTypes ePlayerPerspective)
{
if (NO_PLAYER == ePlayer1 || NO_PLAYER == ePlayer2)
{
FAssertMsg(false, "Deal needs two parties");
return;
}
CvWStringBuffer szDealOne;
if (NULL != pListPlayer1 && pListPlayer1->getLength() > 0)
{
CLLNode<TradeData>* pTradeNode;
bool bFirst = true;
for (pTradeNode = pListPlayer1->head(); pTradeNode; pTradeNode = pListPlayer1->next(pTradeNode))
{
CvWStringBuffer szTrade;
getTradeString(szTrade, pTradeNode->m_data, ePlayer1, ePlayer2);
setListHelp(szDealOne, L"", szTrade.getCString(), L", ", bFirst);
bFirst = false;
}
}
CvWStringBuffer szDealTwo;
if (NULL != pListPlayer2 && pListPlayer2->getLength() > 0)
{
CLLNode<TradeData>* pTradeNode;
bool bFirst = true;
for (pTradeNode = pListPlayer2->head(); pTradeNode; pTradeNode = pListPlayer2->next(pTradeNode))
{
CvWStringBuffer szTrade;
getTradeString(szTrade, pTradeNode->m_data, ePlayer2, ePlayer1);
setListHelp(szDealTwo, L"", szTrade.getCString(), L", ", bFirst);
bFirst = false;
}
}
if (!szDealOne.isEmpty())
{
if (!szDealTwo.isEmpty())
{
if (ePlayerPerspective == ePlayer1)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_OUR_DEAL", szDealOne.getCString(), GET_PLAYER(ePlayer2).getNameKey(), szDealTwo.getCString()));
}
else if (ePlayerPerspective == ePlayer2)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_OUR_DEAL", szDealTwo.getCString(), GET_PLAYER(ePlayer1).getNameKey(), szDealOne.getCString()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEAL", GET_PLAYER(ePlayer1).getNameKey(), szDealOne.getCString(), GET_PLAYER(ePlayer2).getNameKey(), szDealTwo.getCString()));
}
}
else
{
if (ePlayerPerspective == ePlayer1)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEAL_ONESIDED_OURS", szDealOne.getCString(), GET_PLAYER(ePlayer2).getNameKey()));
}
else if (ePlayerPerspective == ePlayer2)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEAL_ONESIDED_THEIRS", szDealOne.getCString(), GET_PLAYER(ePlayer1).getNameKey()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEAL_ONESIDED", GET_PLAYER(ePlayer1).getNameKey(), szDealOne.getCString(), GET_PLAYER(ePlayer2).getNameKey()));
}
}
}
else if (!szDealTwo.isEmpty())
{
if (ePlayerPerspective == ePlayer1)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEAL_ONESIDED_THEIRS", szDealTwo.getCString(), GET_PLAYER(ePlayer2).getNameKey()));
}
else if (ePlayerPerspective == ePlayer2)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEAL_ONESIDED_OURS", szDealTwo.getCString(), GET_PLAYER(ePlayer1).getNameKey()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEAL_ONESIDED", GET_PLAYER(ePlayer2).getNameKey(), szDealTwo.getCString(), GET_PLAYER(ePlayer1).getNameKey()));
}
}
}
void CvGameTextMgr::getWarplanString(CvWStringBuffer& szString, WarPlanTypes eWarPlan)
{
switch (eWarPlan)
{
case WARPLAN_ATTACKED_RECENT: szString.assign(L"new defensive war"); break;
case WARPLAN_ATTACKED: szString.assign(L"defensive war"); break;
case WARPLAN_PREPARING_LIMITED: szString.assign(L"preparing limited war"); break;
case WARPLAN_PREPARING_TOTAL: szString.assign(L"preparing total war"); break;
case WARPLAN_LIMITED: szString.assign(L"limited war"); break;
case WARPLAN_TOTAL: szString.assign(L"total war"); break;
case WARPLAN_DOGPILE: szString.assign(L"dogpile war"); break;
case NO_WARPLAN: szString.assign(L"unplanned war"); break;
default: szString.assign(L"unknown war"); break;
}
}
void CvGameTextMgr::getAttitudeString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer, PlayerTypes eTargetPlayer)
{
CvWString szTempBuffer;
int iAttitudeChange;
int iPass;
int iI;
CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);
TeamTypes eTeam = (TeamTypes) kPlayer.getTeam();
CvTeamAI& kTeam = GET_TEAM(eTeam);
szBuffer.append(gDLL->getText("TXT_KEY_ATTITUDE_TOWARDS", GC.getAttitudeInfo(GET_PLAYER(ePlayer).AI_getAttitude(eTargetPlayer)).getTextKeyWide(), GET_PLAYER(eTargetPlayer).getNameKey()));
for (int iTeam = 0; iTeam < MAX_TEAMS; iTeam++)
{
CvTeam& kLoopTeam = GET_TEAM((TeamTypes)iTeam);
if (kLoopTeam.isAlive())
{
if (NO_PLAYER != eTargetPlayer)
{
CvTeam& kTargetTeam = GET_TEAM(GET_PLAYER(eTargetPlayer).getTeam());
if (kTargetTeam.isHasMet((TeamTypes)iTeam))
{
if (kTeam.isVassal((TeamTypes)iTeam))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ATTITUDE_VASSAL_OF", kLoopTeam.getName().GetCString()));
setVassalRevoltHelp(szBuffer, (TeamTypes)iTeam, kTeam.getID());
}
else if (kLoopTeam.isVassal(kTeam.getID()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ATTITUDE_MASTER_OF", kLoopTeam.getName().GetCString()));
}
}
}
}
}
for (iPass = 0; iPass < 2; iPass++)
{
iAttitudeChange = kPlayer.AI_getCloseBordersAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_LAND_TARGET", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getWarAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_WAR", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getPeaceAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_PEACE", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getSameReligionAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_SAME_RELIGION", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getDifferentReligionAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_DIFFERENT_RELIGION", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getBonusTradeAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_BONUS_TRADE", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getOpenBordersAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_OPEN_BORDERS", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getDefensivePactAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_DEFENSIVE_PACT", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getRivalDefensivePactAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_RIVAL_DEFENSIVE_PACT", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getRivalVassalAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_RIVAL_VASSAL", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getShareWarAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_SHARE_WAR", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getFavoriteCivicAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_FAVORITE_CIVIC", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getTradeAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_TRADE", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getRivalTradeAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_RIVAL_TRADE", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = GET_PLAYER(ePlayer).AI_getColonyAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_FREEDOM", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = GET_PLAYER(ePlayer).AI_getAttitudeExtra(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText(((iAttitudeChange > 0) ? "TXT_KEY_MISC_ATTITUDE_EXTRA_GOOD" : "TXT_KEY_MISC_ATTITUDE_EXTRA_BAD"), iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
iAttitudeChange = GET_PLAYER(ePlayer).AI_getCivicShareAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
if (GET_PLAYER(ePlayer).AI_getCivicShareAttitude(eTargetPlayer) > 0)
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_CIVIC_SHARE_GOOD", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
if (GET_PLAYER(ePlayer).AI_getCivicShareAttitude(eTargetPlayer) < 0)
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_CIVIC_SHARE_BAD", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
}
iAttitudeChange = GET_PLAYER(ePlayer).AI_getEmbassyAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
if (iAttitudeChange > 0)
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_EMBASSY_DIPLOMACY_BONUS", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
else if (iAttitudeChange < 0)
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_EMBASSY_DIPLOMACY_MALUS", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
}
//if (iPass == 0)
{
CivicTypes eTargetCivic;
CivicTypes eCivic;
int** ppaiCivicAttitudeChanges = new int*[GC.getNumCivicOptionInfos()];
CvWString** ppaszCivicAttitudeReasons = new CvWString*[GC.getNumCivicOptionInfos()];
for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
ppaiCivicAttitudeChanges[iJ] = new int[GC.getNumCivicOptionInfos()];
ppaszCivicAttitudeReasons[iJ] = new CvWString[GC.getNumCivicOptionInfos()];
}
for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
eTargetCivic = GET_PLAYER(eTargetPlayer).getCivics((CivicOptionTypes)iJ);
for (int iK = 0; iK < GC.getNumCivicOptionInfos(); iK++)
{
eCivic = GET_PLAYER(ePlayer).getCivics((CivicOptionTypes)iK);
ppaiCivicAttitudeChanges[iJ][iK] = GC.getCivicInfo(eCivic).getCivicAttitudeChange(eTargetCivic);
ppaszCivicAttitudeReasons[iJ][iK] = GC.getCivicInfo(eCivic).getCivicAttitudeReason(eTargetCivic);
}
}
for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
for (int iK = 0; iK < GC.getNumCivicOptionInfos(); iK++)
{
for (int iL = iK + 1; iL < GC.getNumCivicOptionInfos(); iL++)
{
if (ppaszCivicAttitudeReasons[iJ][iK] == ppaszCivicAttitudeReasons[iJ][iL])
{
ppaiCivicAttitudeChanges[iJ][iK] += ppaiCivicAttitudeChanges[iJ][iL];
ppaszCivicAttitudeReasons[iJ][iL].clear();
ppaiCivicAttitudeChanges[iJ][iL] = 0;
}
}
}
}
for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
for (int iK = 0; iK < GC.getNumCivicOptionInfos(); iK++)
{
if (ppaiCivicAttitudeChanges[iJ][iK] != 0 && !ppaszCivicAttitudeReasons[iJ][iK].empty())
{
iAttitudeChange = ppaiCivicAttitudeChanges[iJ][iK];
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szBuffer.append(NEWLINE);
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((ppaiCivicAttitudeChanges[iJ][iK] > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText(ppaszCivicAttitudeReasons[iJ][iK], ppaiCivicAttitudeChanges[iJ][iK]).GetCString());
szBuffer.append(szTempBuffer);
}
}
}
}
for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
SAFE_DELETE_ARRAY(ppaiCivicAttitudeChanges[iJ]);
SAFE_DELETE_ARRAY(ppaszCivicAttitudeReasons[iJ]);
}
SAFE_DELETE_ARRAY(ppaiCivicAttitudeChanges);
SAFE_DELETE_ARRAY(ppaszCivicAttitudeReasons);
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
/************************************************************************************************/
/* REVDCM 02/16/10 glider1 */
/* */
/* Hidden Attitude */
/************************************************************************************************/
if (GC.getDefineINT("SHOW_HIDDEN_ATTITUDE"))
{
// BEGIN: Show Hidden Attitude Mod 01/22/2010
if (getBugOptionBOOL("MiscHover__LeaderheadHiddenAttitude", true, "BUG_LEADERHEAD_HOVER_HIDDEN_ATTITUDE"))
{
iAttitudeChange = kPlayer.AI_getBetterRankDifferenceAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_BETTER_RANK", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getWorseRankDifferenceAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_WORSE_RANK", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getLowRankAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_LOW_RANK", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getLostWarAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_LOST_WAR", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getTeamSizeAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_TEAM_SIZE", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
iAttitudeChange = kPlayer.AI_getFirstImpressionAttitude(eTargetPlayer);
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_FIRST_IMPRESSION", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
// Afforess: Add more hidden attitudes
if (iPass == 0)
{
if (GC.getGameINLINE().isOption(GAMEOPTION_RUTHLESS_AI))
{
if (GET_TEAM(GET_PLAYER(ePlayer).getTeam()).AI_getWorstEnemy() != NO_TEAM && GET_TEAM(GET_PLAYER(ePlayer).getTeam()).AI_getWorstEnemy() == GET_TEAM(GET_PLAYER(eTargetPlayer).getTeam()).AI_getWorstEnemy())
{
iAttitudeChange = 2;
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_WORST_ENEMY", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
}
}
iAttitudeChange = 0;
int iWarMongererDivisor = GC.getDefineINT("WARMONGERER_INDEX_ATTITUDE_DIVISOR", 500);
if (iWarMongererDivisor > 0)
{
iAttitudeChange -= std::min(5, (GET_PLAYER(eTargetPlayer).getWarMongererIndex() / iWarMongererDivisor));
}
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_WARMONGERER_INDEX", iAttitudeChange).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
}
}
/************************************************************************************************/
/* REVDCM END */
/************************************************************************************************/
for (iI = 0; iI < NUM_MEMORY_TYPES; ++iI)
{
iAttitudeChange = kPlayer.AI_getMemoryAttitude(eTargetPlayer, ((MemoryTypes)iI));
if ((iPass == 0) ? (iAttitudeChange > 0) : (iAttitudeChange < 0))
{
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((iAttitudeChange > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText("TXT_KEY_MISC_ATTITUDE_MEMORY", iAttitudeChange, GC.getMemoryInfo((MemoryTypes)iI).getDescription()).GetCString());
szBuffer.append(NEWLINE);
szBuffer.append(szTempBuffer);
}
}
}
if (NO_PLAYER != eTargetPlayer)
{
int iWarWeariness = GET_PLAYER(eTargetPlayer).getModifiedWarWearinessPercentAnger(GET_TEAM(GET_PLAYER(eTargetPlayer).getTeam()).getWarWeariness(eTeam) * std::max(0, 100 + kTeam.getEnemyWarWearinessModifier()));
if (iWarWeariness / 10000 > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_WAR_WEAR_HELP", iWarWeariness / 10000));
}
}
}
void CvGameTextMgr::getEspionageString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer, PlayerTypes eTargetPlayer)
{
if (!GC.getGameINLINE().isOption(GAMEOPTION_NO_ESPIONAGE))
{
CvPlayer& kPlayer = GET_PLAYER(ePlayer);
TeamTypes eTeam = (TeamTypes) kPlayer.getTeam();
CvTeam& kTeam = GET_TEAM(eTeam);
CvPlayer& kTargetPlayer = GET_PLAYER(eTargetPlayer);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_AGAINST_PLAYER", kTargetPlayer.getNameKey(), kTeam.getEspionagePointsAgainstTeam(kTargetPlayer.getTeam()), GET_TEAM(kTargetPlayer.getTeam()).getEspionagePointsAgainstTeam(kPlayer.getTeam())));
}
}
void CvGameTextMgr::getTradeString(CvWStringBuffer& szBuffer, const TradeData& tradeData, PlayerTypes ePlayer1, PlayerTypes ePlayer2)
{
switch (tradeData.m_eItemType)
{
case TRADE_GOLD:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOLD", tradeData.m_iData));
break;
case TRADE_GOLD_PER_TURN:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_GOLD_PER_TURN", tradeData.m_iData));
break;
case TRADE_MAPS:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WORLD_MAP"));
break;
case TRADE_SURRENDER:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CAPITULATE"));
break;
case TRADE_VASSAL:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_VASSAL"));
break;
case TRADE_OPEN_BORDERS:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_OPEN_BORDERS"));
break;
case TRADE_DEFENSIVE_PACT:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEFENSIVE_PACT"));
break;
case TRADE_PERMANENT_ALLIANCE:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_PERMANENT_ALLIANCE"));
break;
case TRADE_PEACE_TREATY:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_PEACE_TREATY", getTreatyLength()));
break;
case TRADE_TECHNOLOGIES:
szBuffer.assign(CvWString::format(L"%s", GC.getTechInfo((TechTypes)tradeData.m_iData).getDescription()));
break;
case TRADE_RESOURCES:
szBuffer.assign(CvWString::format(L"%s", GC.getBonusInfo((BonusTypes)tradeData.m_iData).getDescription()));
break;
case TRADE_CITIES:
szBuffer.assign(CvWString::format(L"%s", GET_PLAYER(ePlayer1).getCity(tradeData.m_iData)->getName().GetCString()));
break;
case TRADE_PEACE:
case TRADE_WAR:
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* Advanced Diplomacy */
/************************************************************************************************/
case TRADE_CONTACT:
case TRADE_CEASE_RELATIONS:
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
case TRADE_EMBARGO:
szBuffer.assign(CvWString::format(L"%s", GET_TEAM((TeamTypes)tradeData.m_iData).getName().GetCString()));
break;
case TRADE_CIVIC:
szBuffer.assign(CvWString::format(L"%s", GC.getCivicInfo((CivicTypes)tradeData.m_iData).getDescription()));
break;
case TRADE_RELIGION:
szBuffer.assign(CvWString::format(L"%s", GC.getReligionInfo((ReligionTypes)tradeData.m_iData).getDescription()));
break;
/************************************************************************************************/
/* Afforess Start 06/16/10 */
/* */
/* Advanced Diplomacy */
/************************************************************************************************/
case TRADE_WORKER:
case TRADE_MILITARY_UNIT:
szBuffer.assign(CvWString::format(L"%s", GET_PLAYER(ePlayer1).getUnit(tradeData.m_iData)->getName().GetCString()));
break;
case TRADE_EMBASSY:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_EMBASSY"));
break;
case TRADE_CORPORATION:
szBuffer.assign(CvWString::format(L"%s", GC.getCorporationInfo((CorporationTypes)tradeData.m_iData).getDescription()));
break;
case TRADE_SECRETARY_GENERAL_VOTE:
szBuffer.assign(CvWString::format(L"%s", GC.getVoteSourceInfo((VoteSourceTypes)tradeData.m_iData).getDescription()));
break;
case TRADE_RITE_OF_PASSAGE:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_LIMITED_BORDERS"));
break;
case TRADE_FREE_TRADE_ZONE:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_FREE_TRADE_ZONE"));
break;
case TRADE_WAR_REPARATIONS:
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WAR_REPARATIONS"));
break;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
default:
FAssert(false);
break;
}
}
void CvGameTextMgr::setFeatureHelp(CvWStringBuffer &szBuffer, FeatureTypes eFeature, bool bCivilopediaText)
{
if (NO_FEATURE == eFeature)
{
return;
}
CvFeatureInfo& feature = GC.getFeatureInfo(eFeature);
int aiYields[NUM_YIELD_TYPES];
if (!bCivilopediaText)
{
szBuffer.append(feature.getDescription());
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = feature.getYieldChange(iI);
}
setYieldChangeHelp(szBuffer, L"", L"", L"", aiYields);
}
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = feature.getRiverYieldChange(iI);
}
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_TERRAIN_NEXT_TO_RIVER"), aiYields);
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = feature.getHillsYieldChange(iI);
}
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_TERRAIN_ON_HILLS"), aiYields);
if (feature.getMovementCost() != 1)
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_MOVEMENT_COST", feature.getMovementCost()));
}
CvWString szHealth;
szHealth.Format(L"%.2f", 0.01f * abs(feature.getHealthPercent()));
if (feature.getHealthPercent() > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_FEATURE_GOOD_HEALTH", szHealth.GetCString()));
}
else if (feature.getHealthPercent() < 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_FEATURE_BAD_HEALTH", szHealth.GetCString()));
}
if (feature.getDefenseModifier() != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_DEFENSE_MODIFIER", feature.getDefenseModifier()));
}
if (feature.isAddsFreshWater())
{
szBuffer.append(gDLL->getText("TXT_KEY_FEATURE_ADDS_FRESH_WATER"));
}
if (feature.isImpassable())
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_IMPASSABLE"));
}
if (feature.isNoCity())
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_NO_CITIES"));
}
if (feature.isNoImprovement())
{
szBuffer.append(gDLL->getText("TXT_KEY_FEATURE_NO_IMPROVEMENT"));
}
feature.getPropertyManipulators()->buildDisplayString(szBuffer);
}
void CvGameTextMgr::setTerrainHelp(CvWStringBuffer &szBuffer, TerrainTypes eTerrain, bool bCivilopediaText)
{
if (NO_TERRAIN == eTerrain)
{
return;
}
CvTerrainInfo& terrain = GC.getTerrainInfo(eTerrain);
int aiYields[NUM_YIELD_TYPES];
if (!bCivilopediaText)
{
szBuffer.append(terrain.getDescription());
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = terrain.getYield(iI);
}
setYieldChangeHelp(szBuffer, L"", L"", L"", aiYields);
}
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = terrain.getRiverYieldChange(iI);
}
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_TERRAIN_NEXT_TO_RIVER"), aiYields);
for (int iI = 0; iI < NUM_YIELD_TYPES; ++iI)
{
aiYields[iI] = terrain.getHillsYieldChange(iI);
}
setYieldChangeHelp(szBuffer, L"", L"", gDLL->getText("TXT_KEY_TERRAIN_ON_HILLS"), aiYields);
if (terrain.getMovementCost() != 1)
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_MOVEMENT_COST", terrain.getMovementCost()));
}
if (terrain.getBuildModifier() != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_BUILD_MODIFIER", terrain.getBuildModifier()));
}
if (terrain.getDefenseModifier() != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_DEFENSE_MODIFIER", terrain.getDefenseModifier()));
}
if (terrain.isImpassable())
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_IMPASSABLE"));
}
if (!terrain.isFound())
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_NO_CITIES"));
bool bFirst = true;
if (terrain.isFoundCoast())
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_COASTAL_CITIES"));
bFirst = false;
}
if (!bFirst)
{
szBuffer.append(gDLL->getText("TXT_KEY_OR"));
}
if (terrain.isFoundFreshWater())
{
szBuffer.append(gDLL->getText("TXT_KEY_TERRAIN_FRESH_WATER_CITIES"));
bFirst = false;
}
}
terrain.getPropertyManipulators()->buildDisplayString(szBuffer);
}
// BUG - Finance Advisor - start
void CvGameTextMgr::buildFinanceSpecialistGoldString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
if (NO_PLAYER == ePlayer)
{
return;
}
CvPlayer& player = GET_PLAYER(ePlayer);
int* iCounts = new int[GC.getNumSpecialistInfos()];
for (int iI = 0; iI < GC.getNumSpecialistInfos(); iI++)
{
iCounts[iI] = 0;
}
int iIter;
int iTotalSpecialists = 0;
for (CvCity* pCity = player.firstCity(&iIter); NULL != pCity; pCity = player.nextCity(&iIter))
{
int iCityGold = 0;
if (!pCity->isDisorder())
{
for (int iI = 0; iI < GC.getNumSpecialistInfos(); iI++)
{
iCounts[iI] += pCity->getSpecialistCount((SpecialistTypes)iI) + pCity->getFreeSpecialistCount((SpecialistTypes)iI);
iCityGold += ((pCity->getSpecialistCount((SpecialistTypes)iI) + pCity->getFreeSpecialistCount((SpecialistTypes)iI))*player.specialistCommerceTimes100((SpecialistTypes)iI, COMMERCE_GOLD))/100;
}
iTotalSpecialists += pCity->getSpecialistPopulation() + pCity->getNumGreatPeople();
//if ( iCityGold != pCity->getSpecialistCommerce(COMMERCE_GOLD))
{
char buffer[200];
sprintf(buffer,"City %S, calculated %d vs getSpecialistCommerce of %d\r\n",pCity->getName().c_str(),iCityGold,pCity->getSpecialistCommerce(COMMERCE_GOLD));
OutputDebugString(buffer);
}
}
}
bool bFirst = true;
int iTotal = 0;
for (int iI = 0; iI < GC.getNumSpecialistInfos(); iI++)
{
int iGold = (iCounts[iI] * player.specialistCommerceTimes100((SpecialistTypes)iI, COMMERCE_GOLD));
if (iGold != 0)
{
if (bFirst)
{
szBuffer.append(NEWLINE);
bFirst = false;
}
CvWString buf;
buf.Format(L"%d.%02d",iGold/100, iGold%100);
szBuffer.append(gDLL->getText("TXT_KEY_BUG_FINANCIAL_ADVISOR_SPECIALIST_GOLD", buf.GetCString(), iCounts[iI], GC.getSpecialistInfo((SpecialistTypes)iI).getDescription()));
iTotal += iGold;
}
}
szBuffer.append(gDLL->getText("TXT_KEY_BUG_FINANCIAL_ADVISOR_SPECIALIST_TOTAL_GOLD", iTotal/100));
SAFE_DELETE_ARRAY(iCounts);
}
// BUG - Finance Advisor - end
void CvGameTextMgr::buildFinanceInflationString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
if (NO_PLAYER == ePlayer)
{
return;
}
CvPlayer& kPlayer = GET_PLAYER(ePlayer);
int iInflationRate = kPlayer.calculateInflationRate();
if (iInflationRate != 0)
{
int iPreInflation = kPlayer.calculatePreInflatedCosts();
szBuffer.append(NEWLINE);
int iCurrentInflationModifier = kPlayer.getCurrentInflationCostModifier();
int iEquilibriumInflationModifier = kPlayer.getEquilibriumInflationCostModifier();
CvWString szInflationOutlook;
if ( iCurrentInflationModifier > iEquilibriumInflationModifier )
{
if ( (9*iCurrentInflationModifier/10) > iEquilibriumInflationModifier )
{
szInflationOutlook = gDLL->getText("TXT_KEY_INFLATION_OUTLOOK_IMPROVING");
}
else
{
szInflationOutlook = gDLL->getText("TXT_KEY_INFLATION_OUTLOOK_STABLE");
}
}
else
{
if ( (9*iEquilibriumInflationModifier/10) > iCurrentInflationModifier )
{
szInflationOutlook = gDLL->getText("TXT_KEY_INFLATION_OUTLOOK_WORSENING");
}
else
{
szInflationOutlook = gDLL->getText("TXT_KEY_INFLATION_OUTLOOK_STABLE");
}
}
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_INFLATION_NEW", iPreInflation, iInflationRate, iInflationRate, iPreInflation, (iPreInflation * iInflationRate) / 100, szInflationOutlook.c_str()));
/************************************************************************************************/
/* Afforess Start 06/27/10 */
/* */
/* */
/************************************************************************************************/
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_ECONOMY))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_SOURCES_OF_INFLATION", kPlayer.getCivicInflation(), kPlayer.getTechInflation(), kPlayer.getBuildingInflation(), kPlayer.getProjectInflation(), kPlayer.getHurriedCount()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
void CvGameTextMgr::buildFinanceUnitCostString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
if (NO_PLAYER == ePlayer)
{
return;
}
CvPlayer& player = GET_PLAYER(ePlayer);
int iFreeUnits = 0;
int iFreeMilitaryUnits = 0;
int iUnits = player.getNumUnits();
int iMilitaryUnits = player.getNumMilitaryUnits();
int iPaidUnits = iUnits;
int iPaidMilitaryUnits = iMilitaryUnits;
int iMilitaryCost = 0;
int iBaseUnitCost = 0;
int iExtraCost = 0;
int iCost = player.calculateUnitCost(iFreeUnits, iFreeMilitaryUnits, iPaidUnits, iPaidMilitaryUnits, iBaseUnitCost, iMilitaryCost, iExtraCost);
int iHandicap = iCost-iBaseUnitCost-iMilitaryCost-iExtraCost;
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_UNIT_COST", iPaidUnits, iFreeUnits, iBaseUnitCost));
if (iPaidMilitaryUnits != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_UNIT_COST_2", iPaidMilitaryUnits, iFreeMilitaryUnits, iMilitaryCost));
}
if (iExtraCost != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_UNIT_COST_3", iExtraCost));
}
if (iHandicap != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_HANDICAP_COST", iHandicap));
}
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_UNIT_COST_4", iCost));
}
void CvGameTextMgr::buildFinanceAwaySupplyString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
if (NO_PLAYER == ePlayer)
{
return;
}
CvPlayer& player = GET_PLAYER(ePlayer);
int iPaidUnits = 0;
int iBaseCost = 0;
int iCost = player.calculateUnitSupply(iPaidUnits, iBaseCost);
int iHandicap = iCost - iBaseCost;
CvWString szHandicap;
if (iHandicap != 0)
{
szHandicap = gDLL->getText("TXT_KEY_FINANCE_ADVISOR_HANDICAP_COST", iHandicap);
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_SUPPLY_COST", iPaidUnits, GC.getDefineINT("INITIAL_FREE_OUTSIDE_UNITS"), iBaseCost, szHandicap.GetCString(), iCost));
}
void CvGameTextMgr::buildFinanceCityMaintString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
if (NO_PLAYER == ePlayer)
{
return;
}
int iLoop;
int iDistanceMaint = 0;
int iColonyMaint = 0;
int iCorporationMaint = 0;
CvPlayer& player = GET_PLAYER(ePlayer);
for (CvCity* pLoopCity = player.firstCity(&iLoop); pLoopCity != NULL; pLoopCity = player.nextCity(&iLoop))
{
iDistanceMaint += (pLoopCity->calculateDistanceMaintenanceTimes100() * std::max(0, (pLoopCity->getEffectiveMaintenanceModifier() + 100))) / 100;
iColonyMaint += (pLoopCity->calculateColonyMaintenanceTimes100() * std::max(0, (pLoopCity->getEffectiveMaintenanceModifier() + 100))) / 100;
iCorporationMaint += (pLoopCity->calculateCorporationMaintenanceTimes100() * std::max(0, (pLoopCity->getEffectiveMaintenanceModifier() + 100))) / 100;
}
iDistanceMaint /= 100;
iColonyMaint /= 100;
iCorporationMaint /= 100;
int iNumCityMaint = player.getTotalMaintenance() - iDistanceMaint - iColonyMaint - iCorporationMaint;
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_CITY_MAINT_COST", iDistanceMaint, iNumCityMaint, iColonyMaint, iCorporationMaint, player.getTotalMaintenance()));
}
void CvGameTextMgr::buildFinanceCivicUpkeepString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
if (NO_PLAYER == ePlayer)
{
return;
}
CvPlayer& player = GET_PLAYER(ePlayer);
CvWString szCivicOptionCosts;
for (int iI = 0; iI < GC.getNumCivicOptionInfos(); ++iI)
{
CivicTypes eCivic = player.getCivics((CivicOptionTypes)iI);
if (NO_CIVIC != eCivic)
{
CvWString szTemp;
szTemp.Format(L"%d%c: %s", player.getSingleCivicUpkeep(eCivic), GC.getCommerceInfo(COMMERCE_GOLD).getChar(), GC.getCivicInfo(eCivic).getDescription());
szCivicOptionCosts += NEWLINE + szTemp;
}
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_CIVIC_UPKEEP_COST", szCivicOptionCosts.GetCString(), player.getCivicUpkeep()));
}
void CvGameTextMgr::buildFinanceForeignIncomeString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
if (NO_PLAYER == ePlayer)
{
return;
}
CvPlayer& player = GET_PLAYER(ePlayer);
CvWString szPlayerIncome;
for (int iI = 0; iI < MAX_PLAYERS; ++iI)
{
CvPlayer& otherPlayer = GET_PLAYER((PlayerTypes)iI);
if (otherPlayer.isAlive() && player.getGoldPerTurnByPlayer((PlayerTypes)iI) != 0)
{
CvWString szTemp;
szTemp.Format(L"%d%c: %s", player.getGoldPerTurnByPlayer((PlayerTypes)iI), GC.getCommerceInfo(COMMERCE_GOLD).getChar(), otherPlayer.getCivilizationShortDescription());
szPlayerIncome += NEWLINE + szTemp;
}
}
if (!szPlayerIncome.empty())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FINANCE_ADVISOR_FOREIGN_INCOME", szPlayerIncome.GetCString(), player.getGoldPerTurn()));
}
}
// BUG - Food Rate Hover - start
/*
+14 from Worked Tiles
+2 from Specialists
+5 from Corporations
+1 from Buildings
----------------------- |
Base Food Produced: 22 |-- only if there are modifiers
+25% from Buildings |
-----------------------
Total Food Produced: 27
=======================
+16 for Population
+2 for Health
-----------------------
Total Food Consumed: 18
=======================
Net Food: +9 or
Net Food for Settler: 9
=======================
* Lighthouse: +3
* Supermarket: +1
*/
void CvGameTextMgr::setFoodHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
FAssertMsg(NO_PLAYER != city.getOwnerINLINE(), "City must have an owner");
CvYieldInfo& info = GC.getYieldInfo(YIELD_FOOD);
bool bNeedSubtotal = false;
int iBaseRate = 0;
int i;
// Worked Tiles
int iTileFood = 0;
for (i = 0; i < NUM_CITY_PLOTS; i++)
{
if (city.isWorkingPlot(i))
{
CvPlot* pPlot = city.getCityIndexPlot(i);
if (pPlot != NULL)
{
iTileFood += pPlot->getYield(YIELD_FOOD);
}
}
}
if (iTileFood != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_WORKED_TILES_YIELD", iTileFood, info.getChar()));
iBaseRate += iTileFood;
}
// Trade
int iTradeFood = city.getTradeYield(YIELD_FOOD);
if (iTradeFood != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_SPECIALIST_COMMERCE", iTradeFood, info.getChar(), L"TXT_KEY_HEADING_TRADEROUTE_LIST"));
iBaseRate += iTradeFood;
bNeedSubtotal = true;
}
// Specialists
int iSpecialistFood = 0;
for (i = 0; i < GC.getNumSpecialistInfos(); i++)
{
iSpecialistFood += GET_PLAYER(city.getOwnerINLINE()).specialistYield((SpecialistTypes)i, YIELD_FOOD) * (city.getSpecialistCount((SpecialistTypes)i) + city.getFreeSpecialistCount((SpecialistTypes)i));
}
if (iSpecialistFood != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_SPECIALIST_COMMERCE", iSpecialistFood, info.getChar(), L"TXT_KEY_CONCEPT_SPECIALISTS"));
iBaseRate += iSpecialistFood;
bNeedSubtotal = true;
}
// Corporations
int iCorporationFood = city.getCorporationYield(YIELD_FOOD);
if (iCorporationFood != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_CORPORATION_COMMERCE", iCorporationFood, info.getChar()));
iBaseRate += iCorporationFood;
bNeedSubtotal = true;
}
// Buildings
int iBuildingFood = 0;
for (i = 0; i < GC.getNumBuildingInfos(); i++)
{
int iCount = city.getNumActiveBuilding((BuildingTypes)i);
if (iCount > 0)
{
CvBuildingInfo& kBuilding = GC.getBuildingInfo((BuildingTypes)i);
iBuildingFood += iCount * (kBuilding.getYieldChange(YIELD_FOOD) + city.getBuildingYieldChange((BuildingClassTypes)kBuilding.getBuildingClassType(), YIELD_FOOD));
}
}
if (iBuildingFood != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_BUILDING_COMMERCE", iBuildingFood, info.getChar()));
iBaseRate += iBuildingFood;
bNeedSubtotal = true;
}
// Base and modifiers (only if there are modifiers since total is always shown)
if (city.getBaseYieldRateModifier(YIELD_FOOD) != 100)
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
// shows Base Food and lists all modifiers
setYieldHelp(szBuffer, city, YIELD_FOOD);
}
else
{
szBuffer.append(NEWLINE);
}
// Total Produced
int iBaseModifier = city.getBaseYieldRateModifier(YIELD_FOOD);
int iRate = iBaseModifier * iBaseRate / 100;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_TOTAL_FOOD_PRODUCED", iRate));
// ==========================
szBuffer.append(DOUBLE_SEPARATOR);
int iFoodConsumed = 0;
// Eaten
int iEatenFood = city.getPopulation() * GC.getFOOD_CONSUMPTION_PER_POPULATION();
if (iEatenFood != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_EATEN_FOOD", iEatenFood));
iFoodConsumed += iEatenFood;
}
// Wasted
int iWastedFood = (int)city.foodWastage();
if (iWastedFood != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_WASTED_FOOD", iWastedFood));
iFoodConsumed += iWastedFood;
}
// Health
int iSpoiledFood = - city.healthRate();
if (iSpoiledFood != 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_SPOILED_FOOD", iSpoiledFood));
iFoodConsumed += iSpoiledFood;
}
// Total Consumed
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_TOTAL_FOOD_CONSUMED", iFoodConsumed));
// ==========================
szBuffer.append(DOUBLE_SEPARATOR NEWLINE);
iRate -= iFoodConsumed;
// Production
if (city.isFoodProduction() && iRate > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_NET_FOOD_PRODUCTION", iRate, city.getProductionNameKey()));
}
else
{
// cannot starve a size 1 city with no food in
if (iRate < 0 && city.getPopulation() == 1 && city.getFood() == 0)
{
iRate = 0;
}
// Net Food
if (iRate > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_NET_FOOD_GROW", iRate));
}
else if (iRate < 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_NET_FOOD_SHRINK", iRate));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_NET_FOOD_STAGNATE"));
}
}
// ==========================
// BUG - Building Additional Food - start
if (city.getOwnerINLINE() == GC.getGame().getActivePlayer() && getBugOptionBOOL("MiscHover__BuildingAdditionalFood", true, "BUG_BUILDING_ADDITIONAL_FOOD_HOVER"))
{
setBuildingAdditionalYieldHelp(szBuffer, city, YIELD_FOOD, DOUBLE_SEPARATOR);
}
// BUG - Building Additional Food - end
}
// BUG - Food Rate Hover - end
// BUG - Building Additional Yield - start
bool CvGameTextMgr::setBuildingAdditionalYieldHelp(CvWStringBuffer &szBuffer, CvCity& city, YieldTypes eIndex, const CvWString& szStart, bool bStarted)
{
CvYieldInfo& info = GC.getYieldInfo(eIndex);
CvWString szLabel;
// BUG jdog5000 - need to verify building type is correct for this player to avoid asserts - start
for (int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GET_PLAYER(city.getOwnerINLINE()).getCivilizationType()).getCivilizationBuildings((BuildingClassTypes)i);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
/*
if (city.canConstruct(eBuilding, false, true, false))
*/
if (city.canConstruct(eBuilding, false, false, false))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
int iChange = city.getAdditionalYieldByBuilding(eIndex, eBuilding);
if (iChange != 0)
{
if (!bStarted)
{
szBuffer.append(szStart);
bStarted = true;
}
szLabel.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eBuilding).getDescription());
setResumableValueChangeHelp(szBuffer, szLabel, L": ", L"", iChange, info.getChar(), false, true);
}
}
}
return bStarted;
}
// BUG - Building Additional Yield - end
// BUG - Building Additional Commerce - start
bool CvGameTextMgr::setBuildingAdditionalCommerceHelp(CvWStringBuffer &szBuffer, CvCity& city, CommerceTypes eIndex, const CvWString& szStart, bool bStarted)
{
CvCommerceInfo& info = GC.getCommerceInfo(eIndex);
CvWString szLabel;
// BUG jdog5000 - need to verify building type is correct for this player to avoid asserts - start
for (int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GET_PLAYER(city.getOwnerINLINE()).getCivilizationType()).getCivilizationBuildings((BuildingClassTypes)i);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
/*
if (city.canConstruct(eBuilding, false, true, false))
*/
if (city.canConstruct(eBuilding, false, false, false))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
int iChange = city.getAdditionalCommerceTimes100ByBuilding(eIndex, eBuilding);
/************************************************************************************************/
/* Afforess Start 08/06/10 */
/* */
/* */
/************************************************************************************************/
int iCommerce = city.getAdditionalYieldByBuilding(YIELD_COMMERCE, eBuilding);
iChange += iCommerce * GET_PLAYER(city.getOwnerINLINE()).getCommercePercent(eIndex);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (iChange != 0)
{
if (!bStarted)
{
szBuffer.append(szStart);
bStarted = true;
}
szLabel.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eBuilding).getDescription());
setResumableValueTimes100ChangeHelp(szBuffer, szLabel, L": ", L"", iChange, info.getChar(), true);
}
}
}
// BUG jdog5000 - need to verify building type is correct for this player to avoid asserts - end
return bStarted;
}
// BUG - Building Additional Commerce - end
// BUG - Building Saved Maintenance - start
bool CvGameTextMgr::setBuildingSavedMaintenanceHelp(CvWStringBuffer &szBuffer, const CvCity& city, const CvWString& szStart, bool bStarted)
{
CvCommerceInfo& info = GC.getCommerceInfo(COMMERCE_GOLD);
CvWString szLabel;
// BUG jdog5000 - need to verify building type is correct for this player to avoid asserts - start
for (int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GET_PLAYER(city.getOwnerINLINE()).getCivilizationType()).getCivilizationBuildings((BuildingClassTypes)i);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
/*
if (city.canConstruct(eBuilding, false, true, false))
*/
if (city.canConstruct(eBuilding, false, false, false))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
int iChange = -city.getSavedMaintenanceTimes100ByBuilding(eBuilding); //Afforess: saved maintenance is displayed as negative in hover
if (iChange != 0)
{
if (!bStarted)
{
szBuffer.append(szStart);
bStarted = true;
}
szLabel.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eBuilding).getDescription());
setResumableValueTimes100ChangeHelp(szBuffer, szLabel, L": ", L"", iChange, info.getChar(), true);
}
}
}
return bStarted;
}
// BUG - Building Saved Maintenance - end
void CvGameTextMgr::setProductionHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
FAssertMsg(NO_PLAYER != city.getOwnerINLINE(), "City must have an owner");
bool bIsProcess = city.isProductionProcess();
int iPastOverflow = (bIsProcess ? 0 : city.getOverflowProduction());
if (iPastOverflow != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_OVERFLOW", iPastOverflow));
szBuffer.append(NEWLINE);
}
int iFromChops = (city.isProductionProcess() ? 0 : city.getFeatureProduction());
if (iFromChops != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_CHOPS", iFromChops));
szBuffer.append(NEWLINE);
}
// BUG - Building Additional Production - start
bool bBuildingAdditionalYield = getBugOptionBOOL("MiscHover__BuildingAdditionalProduction", true, "BUG_BUILDING_ADDITIONAL_PRODUCTION_HOVER");
if (city.getCurrentProductionDifference(false, true) == 0 && !bBuildingAdditionalYield)
// BUG - Building Additional Production - end
{
return;
}
setYieldHelp(szBuffer, city, YIELD_PRODUCTION);
int iBaseProduction = city.getBaseYieldRate(YIELD_PRODUCTION) + iPastOverflow + iFromChops;
int iBaseModifier = city.getBaseYieldRateModifier(YIELD_PRODUCTION);
UnitTypes eUnit = city.getProductionUnit();
if (NO_UNIT != eUnit)
{
CvUnitInfo& unit = GC.getUnitInfo(eUnit);
// Domain
int iDomainMod = city.getDomainProductionModifier((DomainTypes)unit.getDomainType());
if (0 != iDomainMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_DOMAIN", iDomainMod, GC.getDomainInfo((DomainTypes)unit.getDomainType()).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iDomainMod;
}
/************************************************************************************************/
/* Afforess Start 07/12/10 */
/* */
/* */
/************************************************************************************************/
int iUnitClassMod = city.getUnitClassProductionModifier((UnitClassTypes)unit.getUnitClassType()) + GET_PLAYER(city.getOwnerINLINE()).getUnitClassProductionModifier((UnitClassTypes)unit.getUnitClassType());
if (0 != iUnitClassMod)
{
CvWString szTempBuffer;
szTempBuffer.Format(iUnitClassMod > 0 ? L"+" : L"");
szBuffer.append(szTempBuffer + gDLL->getText("TXT_KEY_MISC_HELP_PROD_UNITCLASS", iUnitClassMod, unit.getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iUnitClassMod;
}
if (unit.getUnitCombatType() != NO_UNITCOMBAT)
{
int iUnitCombatMod = GET_PLAYER(city.getOwnerINLINE()).getUnitCombatProductionModifier((UnitCombatTypes)unit.getUnitCombatType());
if (0 != iUnitCombatMod)
{
CvWString szTempBuffer;
szTempBuffer.Format(iUnitCombatMod > 0 ? L"+" : L"");
szBuffer.append(szTempBuffer + gDLL->getText("TXT_KEY_MISC_HELP_PROD_UNITCLASS", iUnitCombatMod, GC.getUnitCombatInfo((UnitCombatTypes)unit.getUnitCombatType()).getDescription()));
szBuffer.append(NEWLINE);
iBaseModifier += iUnitCombatMod;
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Military
if (unit.isMilitaryProduction())
{
int iMilitaryMod = city.getMilitaryProductionModifier() + GET_PLAYER(city.getOwnerINLINE()).getMilitaryProductionModifier();
if (0 != iMilitaryMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_MILITARY", iMilitaryMod));
szBuffer.append(NEWLINE);
iBaseModifier += iMilitaryMod;
}
}
// Bonus
for (int i = 0; i < GC.getNumBonusInfos(); i++)
{
if (city.hasBonus((BonusTypes)i))
{
int iBonusMod = unit.getBonusProductionModifier(i);
if (0 != iBonusMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_MOD_BONUS", iBonusMod, unit.getTextKeyWide(), GC.getBonusInfo((BonusTypes)i).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iBonusMod;
}
}
}
// Trait
for (int i = 0; i < GC.getNumTraitInfos(); i++)
{
if (city.hasTrait((TraitTypes)i))
{
int iTraitMod = unit.getProductionTraits(i);
// Thomas SG - AC: Advanced Cargo START
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_CARGO))
{
if (unit.getNumSpecialUnitTypes() > 0)
{
for (int j = 0; j < unit.getNumSpecialUnitTypes(); j++)
{
iTraitMod += GC.getSpecialUnitInfo((SpecialUnitTypes) unit.getSpecialUnitType(j)).getProductionTraits(i);
}
}
}
else
{
if (unit.getNumSpecialUnitTypes() > 0)
{
iTraitMod += GC.getSpecialUnitInfo((SpecialUnitTypes) unit.getSpecialUnitType(0)).getProductionTraits(i);
}
}
// Thomas SG - AC: Advanced Cargo END
if (0 != iTraitMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_TRAIT", iTraitMod, unit.getTextKeyWide(), GC.getTraitInfo((TraitTypes)i).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iTraitMod;
}
}
}
// Religion
if (NO_PLAYER != city.getOwnerINLINE() && NO_RELIGION != GET_PLAYER(city.getOwnerINLINE()).getStateReligion())
{
if (city.isHasReligion(GET_PLAYER(city.getOwnerINLINE()).getStateReligion()))
{
int iReligionMod = GET_PLAYER(city.getOwnerINLINE()).getStateReligionUnitProductionModifier();
if (0 != iReligionMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_RELIGION", iReligionMod, GC.getReligionInfo(GET_PLAYER(city.getOwnerINLINE()).getStateReligion()).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iReligionMod;
}
}
}
}
BuildingTypes eBuilding = city.getProductionBuilding();
if (NO_BUILDING != eBuilding)
{
CvBuildingInfo& building = GC.getBuildingInfo(eBuilding);
// Bonus
for (int i = 0; i < GC.getNumBonusInfos(); i++)
{
if (city.hasBonus((BonusTypes)i))
{
int iBonusMod = building.getBonusProductionModifier(i);
if (0 != iBonusMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_MOD_BONUS", iBonusMod, building.getTextKeyWide(), GC.getBonusInfo((BonusTypes)i).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iBonusMod;
}
}
}
/************************************************************************************************/
/* Afforess Start 02/05/10 */
/* */
/* */
/************************************************************************************************/
int iBuildingClassMod = city.getBuildingClassProductionModifier((BuildingClassTypes)building.getBuildingClassType()) + GET_PLAYER(city.getOwnerINLINE()).getBuildingClassProductionModifier((BuildingClassTypes)building.getBuildingClassType());
if (0 != iBuildingClassMod)
{
CvWString szTempBuffer;
szTempBuffer.Format(iBuildingClassMod > 0 ? L"+" : L"");
szBuffer.append(szTempBuffer + gDLL->getText("TXT_KEY_MISC_HELP_PROD_UNITCLASS", iBuildingClassMod, building.getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iBuildingClassMod;
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Trait
for (int i = 0; i < GC.getNumTraitInfos(); i++)
{
if (city.hasTrait((TraitTypes)i))
{
int iTraitMod = building.getProductionTraits(i);
if (building.getSpecialBuildingType() != NO_SPECIALBUILDING)
{
iTraitMod += GC.getSpecialBuildingInfo((SpecialBuildingTypes) building.getSpecialBuildingType()).getProductionTraits(i);
}
if (0 != iTraitMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_TRAIT", iTraitMod, building.getTextKeyWide(), GC.getTraitInfo((TraitTypes)i).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iTraitMod;
}
}
}
// Wonder
if (isWorldWonderClass((BuildingClassTypes)(GC.getBuildingInfo(eBuilding).getBuildingClassType())) && NO_PLAYER != city.getOwnerINLINE())
{
int iWonderMod = GET_PLAYER(city.getOwnerINLINE()).getMaxGlobalBuildingProductionModifier();
if (0 != iWonderMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_WONDER", iWonderMod));
szBuffer.append(NEWLINE);
iBaseModifier += iWonderMod;
}
}
// Team Wonder
if (isTeamWonderClass((BuildingClassTypes)(GC.getBuildingInfo(eBuilding).getBuildingClassType())) && NO_PLAYER != city.getOwnerINLINE())
{
int iWonderMod = GET_PLAYER(city.getOwnerINLINE()).getMaxTeamBuildingProductionModifier();
if (0 != iWonderMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_TEAM_WONDER", iWonderMod));
szBuffer.append(NEWLINE);
iBaseModifier += iWonderMod;
}
}
// National Wonder
if (isNationalWonderClass((BuildingClassTypes)(GC.getBuildingInfo(eBuilding).getBuildingClassType())) && NO_PLAYER != city.getOwnerINLINE())
{
int iWonderMod = GET_PLAYER(city.getOwnerINLINE()).getMaxPlayerBuildingProductionModifier();
if (0 != iWonderMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_NATIONAL_WONDER", iWonderMod));
szBuffer.append(NEWLINE);
iBaseModifier += iWonderMod;
}
}
// Religion
if (NO_PLAYER != city.getOwnerINLINE() && NO_RELIGION != GET_PLAYER(city.getOwnerINLINE()).getStateReligion())
{
if (city.isHasReligion(GET_PLAYER(city.getOwnerINLINE()).getStateReligion()))
{
int iReligionMod = GET_PLAYER(city.getOwnerINLINE()).getStateReligionBuildingProductionModifier();
if (0 != iReligionMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_RELIGION", iReligionMod, GC.getReligionInfo(GET_PLAYER(city.getOwnerINLINE()).getStateReligion()).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iReligionMod;
}
}
}
}
ProjectTypes eProject = city.getProductionProject();
if (NO_PROJECT != eProject)
{
CvProjectInfo& project = GC.getProjectInfo(eProject);
// Spaceship
if (project.isSpaceship())
{
int iSpaceshipMod = city.getSpaceProductionModifier();
if (NO_PLAYER != city.getOwnerINLINE())
{
iSpaceshipMod += GET_PLAYER(city.getOwnerINLINE()).getSpaceProductionModifier();
}
if (0 != iSpaceshipMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_SPACESHIP", iSpaceshipMod));
szBuffer.append(NEWLINE);
iBaseModifier += iSpaceshipMod;
}
}
// Bonus
for (int i = 0; i < GC.getNumBonusInfos(); i++)
{
if (city.hasBonus((BonusTypes)i))
{
int iBonusMod = project.getBonusProductionModifier(i);
if (0 != iBonusMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_MOD_BONUS", iBonusMod, project.getTextKeyWide(), GC.getBonusInfo((BonusTypes)i).getTextKeyWide()));
szBuffer.append(NEWLINE);
iBaseModifier += iBonusMod;
}
}
}
}
int iFoodProduction = (city.isFoodProduction() ? std::max(0, (city.getYieldRate(YIELD_FOOD) - city.foodConsumption(true))) : 0);
if (iFoodProduction > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_FOOD", iFoodProduction, iFoodProduction));
szBuffer.append(NEWLINE);
}
int iModProduction = iFoodProduction + (iBaseModifier * iBaseProduction) / 100;
FAssertMsg(iModProduction == city.getCurrentProductionDifference(false, !bIsProcess), "Modified Production does not match actual value");
//szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PROD_FINAL_YIELD", iModProduction));
// BUG - Building Additional Production - start
if (bBuildingAdditionalYield && city.getOwnerINLINE() == GC.getGame().getActivePlayer())
{
setBuildingAdditionalYieldHelp(szBuffer, city, YIELD_PRODUCTION, "=======================");
}
// BUG - Building Additional Production - end
}
void CvGameTextMgr::parsePlayerTraits(CvWStringBuffer &szBuffer, PlayerTypes ePlayer)
{
bool bFirst = true;
for (int iTrait = 0; iTrait < GC.getNumTraitInfos(); ++iTrait)
{
if (GET_PLAYER(ePlayer).hasTrait((TraitTypes)iTrait))
{
if (bFirst)
{
szBuffer.append(L" (");
bFirst = false;
}
else
{
szBuffer.append(L", ");
}
szBuffer.append(GC.getTraitInfo((TraitTypes)iTrait).getDescription());
}
}
if (!bFirst)
{
szBuffer.append(L")");
}
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
void CvGameTextMgr::parsePlayerHasFixedBorders(CvWStringBuffer &szBuffer, PlayerTypes ePlayer)
{
bool bHasFixedBorders = GET_PLAYER(ePlayer).hasFixedBorders();
szBuffer.append(gDLL->getText(bHasFixedBorders ? "TXT_KEY_PLAYER_HAS_FIXED_BORDERS" : "TXT_KEY_PLAYER_HAS_NOT_FIXED_BORDERS"));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
void CvGameTextMgr::parseLeaderHeadHelp(CvWStringBuffer &szBuffer, PlayerTypes eThisPlayer, PlayerTypes eOtherPlayer)
{
if (NO_PLAYER == eThisPlayer)
{
return;
}
szBuffer.append(CvWString::format(L"%s", GET_PLAYER(eThisPlayer).getName()));
parsePlayerTraits(szBuffer, eThisPlayer);
szBuffer.append(L"\n");
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if ( !GC.getGameINLINE().isOption(GAMEOPTION_NO_FIXED_BORDERS) )
{
parsePlayerHasFixedBorders(szBuffer, eThisPlayer);
szBuffer.append(L"\n");
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// BUG - Leaderhead Relations - start
PlayerTypes eActivePlayer = GC.getGameINLINE().getActivePlayer();
TeamTypes eThisTeam = GET_PLAYER(eThisPlayer).getTeam();
CvTeam& kThisTeam = GET_TEAM(eThisTeam);
if (eOtherPlayer == NO_PLAYER)
{
eOtherPlayer = eActivePlayer;
}
if (eThisPlayer != eOtherPlayer && kThisTeam.isHasMet(GET_PLAYER(eOtherPlayer).getTeam()))
{
getEspionageString(szBuffer, eThisPlayer, eOtherPlayer);
getAttitudeString(szBuffer, eThisPlayer, eOtherPlayer);
if (gDLL->ctrlKey())
{
getActiveDealsString(szBuffer, eThisPlayer, eOtherPlayer);
}
}
getAllRelationsString(szBuffer, eThisTeam);
// BUG - Leaderhead Relations - end
}
// BUG - Leaderhead Relations - start
/*
* Displays the relations between two leaders only. This is used by the F4:GLANCE and F5:SIT-REP tabs.
*/
void CvGameTextMgr::parseLeaderHeadRelationsHelp(CvWStringBuffer &szBuffer, PlayerTypes eThisPlayer, PlayerTypes eOtherPlayer)
{
if (NO_PLAYER == eThisPlayer)
{
return;
}
if (NO_PLAYER == eOtherPlayer)
{
parseLeaderHeadHelp(szBuffer, eThisPlayer, NO_PLAYER);
return;
}
szBuffer.append(CvWString::format(L"%s", GET_PLAYER(eThisPlayer).getName()));
parsePlayerTraits(szBuffer, eThisPlayer);
szBuffer.append(L"\n");
PlayerTypes eActivePlayer = GC.getGameINLINE().getActivePlayer();
TeamTypes eThisTeam = GET_PLAYER(eThisPlayer).getTeam();
CvTeam& kThisTeam = GET_TEAM(eThisTeam);
if (eThisPlayer != eOtherPlayer && kThisTeam.isHasMet(GET_PLAYER(eOtherPlayer).getTeam()))
{
getEspionageString(szBuffer, eThisPlayer, eOtherPlayer);
getAttitudeString(szBuffer, eThisPlayer, eOtherPlayer);
getActiveDealsString(szBuffer, eThisPlayer, eOtherPlayer);
if (eOtherPlayer == eActivePlayer)
{
getActiveTeamRelationsString(szBuffer, eThisTeam);
}
else
{
getOtherRelationsString(szBuffer, eThisPlayer, eOtherPlayer);
}
}
else
{
getAllRelationsString(szBuffer, eThisTeam);
}
}
// BUG - Leaderhead Relations - end
void CvGameTextMgr::parseLeaderLineHelp(CvWStringBuffer &szBuffer, PlayerTypes eThisPlayer, PlayerTypes eOtherPlayer)
{
if (NO_PLAYER == eThisPlayer || NO_PLAYER == eOtherPlayer)
{
return;
}
CvTeam& thisTeam = GET_TEAM(GET_PLAYER(eThisPlayer).getTeam());
CvTeam& otherTeam = GET_TEAM(GET_PLAYER(eOtherPlayer).getTeam());
if (thisTeam.getID() == otherTeam.getID())
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_PERMANENT_ALLIANCE"));
szBuffer.append(NEWLINE);
}
else if (thisTeam.isAtWar(otherTeam.getID()))
{
szBuffer.append(gDLL->getText("TXT_KEY_CONCEPT_WAR"));
szBuffer.append(NEWLINE);
}
else
{
if (thisTeam.isDefensivePact(otherTeam.getID()))
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEFENSIVE_PACT"));
szBuffer.append(NEWLINE);
}
if (thisTeam.isOpenBorders(otherTeam.getID()))
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_OPEN_BORDERS"));
szBuffer.append(NEWLINE);
}
if (thisTeam.isVassal(otherTeam.getID()))
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_VASSAL"));
szBuffer.append(NEWLINE);
}
}
}
void CvGameTextMgr::getActiveDealsString(CvWStringBuffer &szBuffer, PlayerTypes eThisPlayer, PlayerTypes eOtherPlayer)
{
int iIndex;
CvDeal* pDeal = GC.getGameINLINE().firstDeal(&iIndex);
while (NULL != pDeal)
{
if ((pDeal->getFirstPlayer() == eThisPlayer && pDeal->getSecondPlayer() == eOtherPlayer)
|| (pDeal->getFirstPlayer() == eOtherPlayer && pDeal->getSecondPlayer() == eThisPlayer))
{
szBuffer.append(NEWLINE);
szBuffer.append(CvWString::format(L"%c", gDLL->getSymbolID(BULLET_CHAR)));
getDealString(szBuffer, *pDeal, eThisPlayer);
}
pDeal = GC.getGameINLINE().nextDeal(&iIndex);
}
}
// BUG - Leaderhead Relations - start
/*
* Shows the peace/war/enemy/pact status between eThisTeam and all rivals known to the active player.
* Relations for the active player are shown first.
*/
void CvGameTextMgr::getAllRelationsString(CvWStringBuffer& szString, TeamTypes eThisTeam)
{
getActiveTeamRelationsString(szString, eThisTeam);
getOtherRelationsString(szString, eThisTeam, NO_TEAM, GC.getGameINLINE().getActiveTeam());
}
/*
* Shows the peace/war/enemy/pact status between eThisTeam and the active player.
*/
void CvGameTextMgr::getActiveTeamRelationsString(CvWStringBuffer& szString, TeamTypes eThisTeam)
{
CvTeamAI& kThisTeam = GET_TEAM(eThisTeam);
TeamTypes eActiveTeam = GC.getGameINLINE().getActiveTeam();
CvTeamAI& kActiveTeam = GET_TEAM(eActiveTeam);
if (!kThisTeam.isHasMet(eActiveTeam))
{
return;
}
if (kThisTeam.isAtWar(eActiveTeam))
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_AT_WAR_WITH_YOU"));
}
else if (kThisTeam.isForcePeace(eActiveTeam))
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_PEACE_TREATY_WITH_YOU"));
}
if (!kThisTeam.isHuman() && kThisTeam.AI_getWorstEnemy() == eActiveTeam)
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WORST_ENEMY_IS_YOU"));
}
if (kThisTeam.isDefensivePact(eActiveTeam))
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_DEFENSIVE_PACT_WITH_YOU"));
}
if (!kThisTeam.isAtWar(eActiveTeam))
{
if (kActiveTeam.AI_getWarPlan(eThisTeam) == WARPLAN_PREPARING_TOTAL)
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WARPLAN_TARGET_OF_YOU"));
}
if (GC.getGameINLINE().isDebugMode())
{
if (kThisTeam.AI_getWarPlan(eActiveTeam) == WARPLAN_PREPARING_TOTAL || kThisTeam.AI_getWarPlan(eActiveTeam) == WARPLAN_TOTAL)
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WARPLAN_TARGET_IS_YOU"));
}
else if (kThisTeam.AI_getWarPlan(eActiveTeam) == WARPLAN_PREPARING_LIMITED || kThisTeam.AI_getWarPlan(eActiveTeam) == WARPLAN_LIMITED)
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WARPLAN_LIMITED_TARGET_IS_YOU"));
}
}
}
}
/*
* Shows the peace/war/enemy/pact status between eThisPlayer and eOtherPlayer (both must not be NO_PLAYER).
* If eOtherTeam is not NO_TEAM, only relations between it and eThisTeam are shown.
* if eSkipTeam is not NO_TEAM, relations involving it are not shown.
*/
void CvGameTextMgr::getOtherRelationsString(CvWStringBuffer& szString, PlayerTypes eThisPlayer, PlayerTypes eOtherPlayer)
{
if (eThisPlayer == NO_PLAYER || eOtherPlayer == NO_PLAYER)
{
return;
}
getOtherRelationsString(szString, GET_PLAYER(eThisPlayer).getTeam(), GET_PLAYER(eOtherPlayer).getTeam(), NO_TEAM);
}
/*
* Shows the peace/war/enemy/pact status between eThisPlayer and all rivals known to the active player.
* If eOtherTeam is not NO_TEAM, only relations between it and eThisTeam are shown.
* if eSkipTeam is not NO_TEAM, relations involving it are not shown.
*/
void CvGameTextMgr::getOtherRelationsString(CvWStringBuffer& szString, TeamTypes eThisTeam, TeamTypes eOtherTeam, TeamTypes eSkipTeam)
{
if (eThisTeam == NO_TEAM)
{
return;
}
CvTeamAI& kThisTeam = GET_TEAM(eThisTeam);
CvWString szWar, szPeace, szEnemy, szPact, szWarPlanTotal, szWarPlanLimited;
bool bFirstWar = true, bFirstPeace = true, bFirstEnemy = true, bFirstPact = true, bFirstWarPlanTotal = true, bFirstWarPlanLimited = true;
for (int iTeam = 0; iTeam < MAX_CIV_TEAMS; ++iTeam)
{
CvTeamAI& kTeam = GET_TEAM((TeamTypes) iTeam);
if (kTeam.isAlive() && !kTeam.isMinorCiv() && iTeam != eThisTeam && iTeam != eSkipTeam && (eOtherTeam == NO_TEAM || iTeam == eOtherTeam))
{
if (kTeam.isHasMet(eThisTeam) && kTeam.isHasMet(GC.getGameINLINE().getActiveTeam()))
{
if (::atWar((TeamTypes) iTeam, eThisTeam))
{
setListHelp(szWar, L"", kTeam.getName().GetCString(), L", ", bFirstWar);
bFirstWar = false;
}
else if (kTeam.isForcePeace(eThisTeam))
{
setListHelp(szPeace, L"", kTeam.getName().GetCString(), L", ", bFirstPeace);
bFirstPeace = false;
}
if (!kTeam.isHuman() && kTeam.AI_getWorstEnemy() == eThisTeam)
{
setListHelp(szEnemy, L"", kTeam.getName().GetCString(), L", ", bFirstEnemy);
bFirstEnemy = false;
}
if (kTeam.isDefensivePact(eThisTeam))
{
setListHelp(szPact, L"", kTeam.getName().GetCString(), L", ", bFirstPact);
bFirstPact = false;
}
//Show own war plans
if (eThisTeam == GC.getGameINLINE().getActiveTeam() || (GC.getGameINLINE().isDebugMode() && !(::atWar((TeamTypes) iTeam, eThisTeam))))
{
if (kThisTeam.AI_getWarPlan((TeamTypes)iTeam) == WARPLAN_PREPARING_TOTAL || kThisTeam.AI_getWarPlan((TeamTypes)iTeam) == WARPLAN_TOTAL)
{
setListHelp(szWarPlanTotal, L"", kTeam.getName().GetCString(), L", ", bFirstWarPlanTotal);
bFirstWarPlanTotal = false;
}
else if (kThisTeam.AI_getWarPlan((TeamTypes)iTeam) == WARPLAN_PREPARING_LIMITED || kThisTeam.AI_getWarPlan((TeamTypes)iTeam) == WARPLAN_LIMITED || kThisTeam.AI_getWarPlan((TeamTypes)iTeam) == WARPLAN_DOGPILE)
{
setListHelp(szWarPlanLimited, L"", kTeam.getName().GetCString(), L", ", bFirstWarPlanLimited);
bFirstWarPlanLimited = false;
}
}
}
}
}
if (!szWar.empty())
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_AT_WAR_WITH", szWar.GetCString()));
}
if (!kThisTeam.isHuman())
{
TeamTypes eWorstEnemy = kThisTeam.AI_getWorstEnemy();
if (eWorstEnemy != NO_TEAM && eWorstEnemy != eSkipTeam && (eOtherTeam == NO_TEAM || eWorstEnemy == eOtherTeam) && GET_TEAM(eWorstEnemy).isHasMet(GC.getGameINLINE().getActiveTeam()))
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WORST_ENEMY_IS", GET_TEAM(eWorstEnemy).getName().GetCString()));
}
}
if (!szEnemy.empty())
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WORST_ENEMY_OF", szEnemy.GetCString()));
}
if (!szPeace.empty())
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_PEACE_TREATY_WITH", szPeace.GetCString()));
}
if (!szPact.empty())
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_DEFENSIVE_PACT_WITH", szPact.GetCString()));
}
if (!szWarPlanTotal.empty())
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WARPLAN_TARGET_IS", szWarPlanTotal.GetCString()));
}
if (!szWarPlanLimited.empty())
{
szString.append(NEWLINE);
szString.append(gDLL->getText(L"TXT_KEY_WARPLAN_LIMITED_TARGET_IS", szWarPlanLimited.GetCString()));
}
}
// BUG - Leaderhead Relations - end
void CvGameTextMgr::buildHintsList(CvWStringBuffer& szBuffer)
{
for (int i = 0; i < GC.getNumHints(); i++)
{
szBuffer.append(CvWString::format(L"%c%s", gDLL->getSymbolID(BULLET_CHAR), GC.getHints(i).getText()));
szBuffer.append(NEWLINE);
szBuffer.append(NEWLINE);
}
}
void CvGameTextMgr::setCommerceHelp(CvWStringBuffer &szBuffer, CvCity& city, CommerceTypes eCommerceType)
{
// BUG - Building Additional Commerce - start
bool bBuildingAdditionalCommerce = getBugOptionBOOL("MiscHover__BuildingAdditionalCommerce", true, "BUG_BUILDING_ADDITIONAL_COMMERCE_HOVER");
if (NO_COMMERCE == eCommerceType || (0 == city.getCommerceRateTimes100(eCommerceType) && !bBuildingAdditionalCommerce))
// BUG - Building Additional Commerce - end
{
return;
}
CvCommerceInfo& info = GC.getCommerceInfo(eCommerceType);
if (NO_PLAYER == city.getOwnerINLINE())
{
return;
}
CvPlayer& owner = GET_PLAYER(city.getOwnerINLINE());
setYieldHelp(szBuffer, city, YIELD_COMMERCE);
// Slider
int iBaseCommerceRate = city.getCommerceFromPercent(eCommerceType, city.getBaseYieldRate(YIELD_COMMERCE) * city.getBaseYieldRateModifier(YIELD_COMMERCE));
CvWString szRate = CvWString::format(L"%d.%02d", iBaseCommerceRate/100, iBaseCommerceRate%100);
CvWString szBaseYield = CvWString::format(L"%d.%02d", (city.getBaseYieldRate(YIELD_COMMERCE) * city.getBaseYieldRateModifier(YIELD_COMMERCE)) / 100, std::abs((city.getBaseYieldRate(YIELD_COMMERCE) * city.getBaseYieldRateModifier(YIELD_COMMERCE)) % 100));
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_SLIDER_PERCENT_FLOAT", owner.getCommercePercent(eCommerceType), szBaseYield.GetCString(), szRate.GetCString(), info.getChar()));
szBuffer.append(NEWLINE);
// BUG - Base Commerce - start
bool bNeedSubtotal = false;
// BUG - Base Commerce - end
int iSpecialistCommerce = city.getSpecialistCommerce(eCommerceType) + (city.getSpecialistPopulation() + city.getNumGreatPeople()) * city.getExtraSpecialistCommerceTotal(eCommerceType);
if (0 != iSpecialistCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_SPECIALIST_COMMERCE", iSpecialistCommerce, info.getChar(), L"TXT_KEY_CONCEPT_SPECIALISTS"));
szBuffer.append(NEWLINE);
iBaseCommerceRate += 100 * iSpecialistCommerce;
// BUG - Base Commerce - start
bNeedSubtotal = true;
// BUG - Base Commerce - end
}
int iReligionCommerce = city.getReligionCommerce(eCommerceType);
if (0 != iReligionCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_RELIGION_COMMERCE", iReligionCommerce, info.getChar()));
szBuffer.append(NEWLINE);
iBaseCommerceRate += 100 * iReligionCommerce;
// BUG - Base Commerce - start
bNeedSubtotal = true;
// BUG - Base Commerce - end
}
int iCorporationCommerce = city.getCorporationCommerce(eCommerceType);
if (0 != iCorporationCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_CORPORATION_COMMERCE", iCorporationCommerce, info.getChar()));
szBuffer.append(NEWLINE);
iBaseCommerceRate += 100 * iCorporationCommerce;
// BUG - Base Commerce - start
bNeedSubtotal = true;
// BUG - Base Commerce - end
}
/************************************************************************************************/
/* Afforess Start 09/07/10 */
/* */
/* */
/************************************************************************************************/
int iBuildingCommerce = city.getBuildingCommerce(eCommerceType) + (city.getBonusCommercePercentChanges(eCommerceType) / 100);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (0 != iBuildingCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_BUILDING_COMMERCE", iBuildingCommerce, info.getChar()));
szBuffer.append(NEWLINE);
/************************************************************************************************/
/* Afforess Start 09/07/10 */
/* */
/* */
/************************************************************************************************/
iBaseCommerceRate += (100 * (iBuildingCommerce - (city.getBonusCommercePercentChanges(eCommerceType) / 100))) + (city.getBonusCommercePercentChanges(eCommerceType));
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// BUG - Base Commerce - start
bNeedSubtotal = true;
// BUG - Base Commerce - end
}
int iFreeCityCommerce = owner.getFreeCityCommerce(eCommerceType);
if (0 != iFreeCityCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_FREE_CITY_COMMERCE", iFreeCityCommerce, info.getChar()));
szBuffer.append(NEWLINE);
iBaseCommerceRate += 100 * iFreeCityCommerce;
// BUG - Base Commerce - start
bNeedSubtotal = true;
// BUG - Base Commerce - end
}
/************************************************************************************************/
/* Afforess Start 06/15/10 */
/* */
/* */
/************************************************************************************************/
int iCommerceAttacks = city.getCommerceAttacks(eCommerceType);
if (0 != iCommerceAttacks)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_COMMERE_ATTACKS", iCommerceAttacks, info.getChar()));
szBuffer.append(NEWLINE);
iBaseCommerceRate += 100 * iCommerceAttacks;
bNeedSubtotal = true;
}
if (eCommerceType == COMMERCE_GOLD)
{
int iMintedCommerce = city.getMintedCommerceTimes100() / 100;
if (0 != iMintedCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_MINTED_COMMERCE", iMintedCommerce, info.getChar()));
szBuffer.append(NEWLINE);
bNeedSubtotal = true;
}
iBaseCommerceRate += city.getMintedCommerceTimes100();
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// BUG - Base Commerce - start
if (bNeedSubtotal && city.getCommerceRateModifier(eCommerceType) != 0 && getBugOptionBOOL("MiscHover__BaseCommerce", true, "BUG_CITY_SCREEN_BASE_COMMERCE_HOVER"))
{
CvWString szYield = CvWString::format(L"%d.%02d", iBaseCommerceRate/100, iBaseCommerceRate%100);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_COMMERCE_SUBTOTAL_YIELD_FLOAT", info.getTextKeyWide(), szYield.GetCString(), info.getChar()));
szBuffer.append(NEWLINE);
}
// BUG - Base Commerce - end
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
int iModifier = 100;
int iBonusCommerce = city.getBonusCommerceRateModifier(eCommerceType);
if (0 != iBonusCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_BONUS_COMMERCE", iBonusCommerce, info.getChar()));
szBuffer.append(NEWLINE);
iModifier += iBonusCommerce;
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
FAssertMsg(city.getBaseCommerceRateTimes100(eCommerceType) == iBaseCommerceRate, "Base Commerce rate does not agree with actual value");
// Buildings
int iBuildingMod = 0;
for (int i = 0; i < GC.getNumBuildingInfos(); i++)
{
CvBuildingInfo& infoBuilding = GC.getBuildingInfo((BuildingTypes)i);
if (city.getNumBuilding((BuildingTypes)i) > 0 && !GET_TEAM(city.getTeam()).isObsoleteBuilding((BuildingTypes)i))
{
for (int iLoop = 0; iLoop < city.getNumBuilding((BuildingTypes)i); iLoop++)
{
iBuildingMod += infoBuilding.getCommerceModifier(eCommerceType);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
iBuildingMod += GET_TEAM(city.getTeam()).getBuildingCommerceModifier((BuildingTypes)i, eCommerceType);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
for (int j = 0; j < MAX_PLAYERS; j++)
{
if (GET_PLAYER((PlayerTypes)j).isAlive())
{
if (GET_PLAYER((PlayerTypes)j).getTeam() == owner.getTeam())
{
int iLoop;
for (CvCity* pLoopCity = GET_PLAYER((PlayerTypes)j).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER((PlayerTypes)j).nextCity(&iLoop))
{
if (pLoopCity->getNumBuilding((BuildingTypes)i) > 0 && !GET_TEAM(pLoopCity->getTeam()).isObsoleteBuilding((BuildingTypes)i))
{
for (int iLoop = 0; iLoop < pLoopCity->getNumBuilding((BuildingTypes)i); iLoop++)
{
iBuildingMod += infoBuilding.getGlobalCommerceModifier(eCommerceType);
}
}
}
}
}
}
}
if (0 != iBuildingMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_BUILDINGS", iBuildingMod, info.getChar()));
szBuffer.append(NEWLINE);
iModifier += iBuildingMod;
}
/************************************************************************************************/
/* Afforess Start 01/05/10 */
/* */
/* */
/************************************************************************************************/
//projects
int iProjectMod = 0;
for (int j = 0; j < GC.getNumProjectInfos(); j++)
{
if (GET_TEAM(owner.getTeam()).getProjectCount((ProjectTypes)j) > 0 )
{
if (GC.getProjectInfo((ProjectTypes)j).getCommerceModifier(eCommerceType) != 0)
{
iProjectMod += GC.getProjectInfo((ProjectTypes)j).getCommerceModifier(eCommerceType);
}
}
}
if (iProjectMod != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_PROJECTS", iProjectMod, info.getChar()));
szBuffer.append(NEWLINE);
iModifier += iProjectMod;
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
// Trait
for (int i = 0; i < GC.getNumTraitInfos(); i++)
{
if (city.hasTrait((TraitTypes)i))
{
CvTraitInfo& trait = GC.getTraitInfo((TraitTypes)i);
int iTraitMod = trait.getCommerceModifier(eCommerceType);
if (0 != iTraitMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_COMMERCE_TRAIT", iTraitMod, info.getChar(), trait.getTextKeyWide()));
szBuffer.append(NEWLINE);
iModifier += iTraitMod;
}
}
}
// Capital
int iCapitalMod = city.isCapital() ? owner.getCapitalCommerceRateModifier(eCommerceType) : 0;
if (iCapitalMod != 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_CAPITAL", iCapitalMod, info.getChar()));
szBuffer.append(NEWLINE);
iModifier += iCapitalMod;
}
// Civics
int iCivicMod = 0;
for (int i = 0; i < GC.getNumCivicOptionInfos(); i++)
{
if (NO_CIVIC != owner.getCivics((CivicOptionTypes)i))
{
iCivicMod += GC.getCivicInfo(owner.getCivics((CivicOptionTypes)i)).getCommerceModifier(eCommerceType);
}
}
if (0 != iCivicMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_CIVICS", iCivicMod, info.getChar()));
szBuffer.append(NEWLINE);
iModifier += iCivicMod;
}
iModifier = std::max(1, iModifier);
int iModYield;
// Modifiers apply inversely against a negative base to avoid counter-intuitive
// situations like intelligence agencies making negative espionag worse
if ( iBaseCommerceRate > 0 )
{
iModYield = (iModifier * iBaseCommerceRate) / 100;
}
else
{
iModYield = (100 * iBaseCommerceRate) / iModifier;
}
int iProductionToCommerce = city.getProductionToCommerceModifier(eCommerceType) * city.getYieldRate(YIELD_PRODUCTION);
if (0 != iProductionToCommerce)
{
if (iProductionToCommerce%100 == 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PRODUCTION_TO_COMMERCE", iProductionToCommerce/100, info.getChar()));
szBuffer.append(NEWLINE);
}
else
{
szRate = CvWString::format(L"+%d.%02d", iProductionToCommerce/100, iProductionToCommerce%100);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_PRODUCTION_TO_COMMERCE_FLOAT", szRate.GetCString(), info.getChar()));
szBuffer.append(NEWLINE);
}
iModYield += iProductionToCommerce;
}
if (eCommerceType == COMMERCE_CULTURE && GC.getGameINLINE().isOption(GAMEOPTION_NO_ESPIONAGE))
{
int iEspionageToCommerce = city.getCommerceRateTimes100(COMMERCE_CULTURE) - iModYield;
if (0 != iEspionageToCommerce)
{
if (iEspionageToCommerce%100 == 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_COMMERCE_TO_COMMERCE", iEspionageToCommerce/100, info.getChar(), GC.getCommerceInfo(COMMERCE_ESPIONAGE).getChar()));
szBuffer.append(NEWLINE);
}
else
{
szRate = CvWString::format(L"+%d.%02d", iEspionageToCommerce/100, iEspionageToCommerce%100);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_COMMERCE_TO_COMMERCE_FLOAT", szRate.GetCString(), info.getChar(), GC.getCommerceInfo(COMMERCE_ESPIONAGE).getChar()));
szBuffer.append(NEWLINE);
}
iModYield += iEspionageToCommerce;
}
}
FAssertMsg(iModYield == city.getCommerceRateTimes100(eCommerceType), "Commerce yield does not match actual value");
CvWString szYield = CvWString::format(L"%d.%02d", iModYield/100, std::abs(iModYield%100));
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_COMMERCE_FINAL_YIELD_FLOAT", info.getTextKeyWide(), szYield.GetCString(), info.getChar()));
// BUG - Building Additional Commerce - start
if (bBuildingAdditionalCommerce && city.getOwnerINLINE() == GC.getGame().getActivePlayer())
{
setBuildingAdditionalCommerceHelp(szBuffer, city, eCommerceType, DOUBLE_SEPARATOR);
}
// BUG - Building Additional Commerce - end
}
void CvGameTextMgr::setYieldHelp(CvWStringBuffer &szBuffer, CvCity& city, YieldTypes eYieldType)
{
FAssertMsg(NO_PLAYER != city.getOwnerINLINE(), "City must have an owner");
if (NO_YIELD == eYieldType)
{
return;
}
CvYieldInfo& info = GC.getYieldInfo(eYieldType);
if (NO_PLAYER == city.getOwnerINLINE())
{
return;
}
CvPlayer& owner = GET_PLAYER(city.getOwnerINLINE());
int iBaseProduction = city.getBaseYieldRate(eYieldType);
int iExtraCapitalCommerce = eYieldType == YIELD_COMMERCE ? city.calculateExtraCapitalCommerce() : 0;
int iExtraForeignCapitalCommerce = eYieldType == YIELD_COMMERCE ? city.calculateExtraForeignCapitalCommerce() : 0;
int iDomesticConnectednessCommerce = eYieldType == YIELD_COMMERCE ? city.getDomesticConnectednessCommerce() : 0;
int iForeignConnectednessCommerce = eYieldType == YIELD_COMMERCE ? city.getForeignConnectednessCommerce() : 0;
//Added back later
iBaseProduction -= iExtraCapitalCommerce;
iBaseProduction -= iExtraForeignCapitalCommerce;
iBaseProduction -= iDomesticConnectednessCommerce;
iBaseProduction -= iForeignConnectednessCommerce;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_BASE_YIELD", info.getTextKeyWide(), iBaseProduction, info.getChar()));
szBuffer.append(NEWLINE);
int iBaseModifier = 100;
// Buildings
int iBuildingMod = 0;
for (int i = 0; i < GC.getNumBuildingInfos(); i++)
{
CvBuildingInfo& infoBuilding = GC.getBuildingInfo((BuildingTypes)i);
if (city.getNumBuilding((BuildingTypes)i) > 0 && !GET_TEAM(city.getTeam()).isObsoleteBuilding((BuildingTypes)i))
{
for (int iLoop = 0; iLoop < city.getNumBuilding((BuildingTypes)i); iLoop++)
{
iBuildingMod += infoBuilding.getYieldModifier(eYieldType);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
iBuildingMod += GET_TEAM(city.getTeam()).getBuildingYieldModifier((BuildingTypes)i, eYieldType);
iBaseProduction += GET_TEAM(city.getTeam()).getBuildingYieldChange((BuildingTypes)i, eYieldType);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
for (int j = 0; j < MAX_PLAYERS; j++)
{
if (GET_PLAYER((PlayerTypes)j).isAlive())
{
if (GET_PLAYER((PlayerTypes)j).getTeam() == owner.getTeam())
{
int iLoop;
for (CvCity* pLoopCity = GET_PLAYER((PlayerTypes)j).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER((PlayerTypes)j).nextCity(&iLoop))
{
if (pLoopCity->getNumBuilding((BuildingTypes)i) > 0 && !GET_TEAM(pLoopCity->getTeam()).isObsoleteBuilding((BuildingTypes)i))
{
for (int iLoop = 0; iLoop < pLoopCity->getNumBuilding((BuildingTypes)i); iLoop++)
{
iBuildingMod += infoBuilding.getGlobalYieldModifier(eYieldType);
}
}
}
}
}
}
}
//Afforess: extra connectedness help
if (0 != iExtraCapitalCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_EXTRA_CAPITAL_COMMERCE_HELP", iExtraCapitalCommerce));
szBuffer.append(NEWLINE);
iBaseProduction += iExtraCapitalCommerce;
}
if (0 != iExtraForeignCapitalCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_EXTRA_FOREIGN_CAPITAL_COMMERCE_HELP", iExtraForeignCapitalCommerce));
szBuffer.append(NEWLINE);
iBaseProduction += iExtraCapitalCommerce;
}
if (0 != iDomesticConnectednessCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_DOMESTIC_CONNECTED_COMMERCE_CITY_HELP", iDomesticConnectednessCommerce));
szBuffer.append(NEWLINE);
iBaseProduction += iDomesticConnectednessCommerce;
}
if (0 != iForeignConnectednessCommerce)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_FOREIGN_CONNECTED_COMMERCE_CITY_HELP", iForeignConnectednessCommerce));
szBuffer.append(NEWLINE);
iBaseProduction += iForeignConnectednessCommerce;
}
//Afforess: end
if (NULL != city.area())
{
iBuildingMod += city.area()->getYieldRateModifier(city.getOwnerINLINE(), eYieldType);
}
if (0 != iBuildingMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_BUILDINGS", iBuildingMod, info.getChar()));
szBuffer.append(NEWLINE);
iBaseModifier += iBuildingMod;
}
// Power
if (city.isPower())
{
int iPowerMod = city.getPowerYieldRateModifier(eYieldType);
if (0 != iPowerMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_POWER", iPowerMod, info.getChar()));
szBuffer.append(NEWLINE);
iBaseModifier += iPowerMod;
}
}
// Resources
int iBonusMod = city.getBonusYieldRateModifier(eYieldType);
if (0 != iBonusMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_BONUS", iBonusMod, info.getChar()));
szBuffer.append(NEWLINE);
iBaseModifier += iBonusMod;
}
// Capital
if (city.isCapital())
{
int iCapitalMod = owner.getCapitalYieldRateModifier(eYieldType);
if (0 != iCapitalMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_CAPITAL", iCapitalMod, info.getChar()));
szBuffer.append(NEWLINE);
iBaseModifier += iCapitalMod;
}
}
// Civics
int iCivicMod = 0;
for (int i = 0; i < GC.getNumCivicOptionInfos(); i++)
{
if (NO_CIVIC != owner.getCivics((CivicOptionTypes)i))
{
iCivicMod += GC.getCivicInfo(owner.getCivics((CivicOptionTypes)i)).getYieldModifier(eYieldType);
}
}
if (0 != iCivicMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_YIELD_CIVICS", iCivicMod, info.getChar()));
szBuffer.append(NEWLINE);
iBaseModifier += iCivicMod;
}
FAssertMsg((iBaseModifier * iBaseProduction) / 100 == city.getYieldRate(eYieldType), "Yield Modifier in setProductionHelp does not agree with actual value");
CvWString szYield = CvWString::format(L"%d.%02d", (iBaseModifier * iBaseProduction) / 100, std::abs((iBaseModifier * iBaseProduction) % 100));
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_COMMERCE_FINAL_YIELD_FLOAT", info.getTextKeyWide(), szYield.GetCString(), info.getChar()));
szBuffer.append(NEWLINE);
}
void CvGameTextMgr::setConvertHelp(CvWStringBuffer& szBuffer, PlayerTypes ePlayer, ReligionTypes eReligion)
{
CvWString szReligion = L"TXT_KEY_MISC_NO_STATE_RELIGION";
if (eReligion != NO_RELIGION)
{
szReligion = GC.getReligionInfo(eReligion).getTextKeyWide();
}
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_CANNOT_CONVERT_TO", szReligion.GetCString()));
if (GET_PLAYER(ePlayer).isAnarchy())
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WHILE_IN_ANARCHY"));
}
else if (GET_PLAYER(ePlayer).getStateReligion() == eReligion)
{
szBuffer.append(L". ");
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ALREADY_STATE_REL"));
}
else if (GET_PLAYER(ePlayer).getConversionTimer() > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ANOTHER_REVOLUTION_RECENTLY"));
szBuffer.append(L". ");
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WAIT_MORE_TURNS", GET_PLAYER(ePlayer).getConversionTimer()));
}
}
void CvGameTextMgr::setRevolutionHelp(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_CANNOT_CHANGE_CIVICS"));
if (GET_PLAYER(ePlayer).isAnarchy())
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WHILE_IN_ANARCHY"));
}
else if (GET_PLAYER(ePlayer).getRevolutionTimer() > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_ANOTHER_REVOLUTION_RECENTLY"));
szBuffer.append(L" : ");
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WAIT_MORE_TURNS", GET_PLAYER(ePlayer).getRevolutionTimer()));
}
}
void CvGameTextMgr::setVassalRevoltHelp(CvWStringBuffer& szBuffer, TeamTypes eMaster, TeamTypes eVassal)
{
if (NO_TEAM == eMaster || NO_TEAM == eVassal)
{
return;
}
if (!GET_TEAM(eVassal).isCapitulated())
{
return;
}
if (GET_TEAM(eMaster).isParent(eVassal))
{
return;
}
CvTeam& kMaster = GET_TEAM(eMaster);
CvTeam& kVassal = GET_TEAM(eVassal);
int iMasterLand = kMaster.getTotalLand(false);
int iVassalLand = kVassal.getTotalLand(false);
if (iMasterLand > 0 && GC.getDefineINT("FREE_VASSAL_LAND_PERCENT") >= 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_VASSAL_LAND_STATS", (iVassalLand * 100) / iMasterLand, GC.getDefineINT("FREE_VASSAL_LAND_PERCENT")));
}
int iMasterPop = kMaster.getTotalPopulation(false);
int iVassalPop = kVassal.getTotalPopulation(false);
if (iMasterPop > 0 && GC.getDefineINT("FREE_VASSAL_POPULATION_PERCENT") >= 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_VASSAL_POPULATION_STATS", (iVassalPop * 100) / iMasterPop, GC.getDefineINT("FREE_VASSAL_POPULATION_PERCENT")));
}
if (GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR") > 0 && kVassal.getVassalPower() > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_VASSAL_AREA_LOSS", (iVassalLand * 100) / kVassal.getVassalPower(), GC.getDefineINT("VASSAL_REVOLT_OWN_LOSSES_FACTOR")));
}
if (GC.getDefineINT("VASSAL_REVOLT_MASTER_LOSSES_FACTOR") > 0 && kVassal.getMasterPower() > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_MASTER_AREA_LOSS", (iMasterLand * 100) / kVassal.getMasterPower(), GC.getDefineINT("VASSAL_REVOLT_MASTER_LOSSES_FACTOR")));
}
}
void CvGameTextMgr::parseGreatPeopleHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
int iTotalGreatPeopleUnitProgress;
int iI;
if (NO_PLAYER == city.getOwnerINLINE())
{
return;
}
CvPlayer& owner = GET_PLAYER(city.getOwnerINLINE());
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_GREAT_PERSON", city.getGreatPeopleProgress(), owner.greatPeopleThreshold(false)));
if (city.getGreatPeopleRate() > 0)
{
int iGPPLeft = owner.greatPeopleThreshold(false) - city.getGreatPeopleProgress();
if (iGPPLeft > 0)
{
int iTurnsLeft = iGPPLeft / city.getGreatPeopleRate();
if (iTurnsLeft * city.getGreatPeopleRate() < iGPPLeft)
{
iTurnsLeft++;
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("INTERFACE_CITY_TURNS", std::max(1, iTurnsLeft)));
}
}
iTotalGreatPeopleUnitProgress = 0;
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
iTotalGreatPeopleUnitProgress += city.getGreatPeopleUnitProgress((UnitTypes)iI);
}
if (iTotalGreatPeopleUnitProgress > 0)
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_PROB"));
std::vector< std::pair<UnitTypes, int> > aUnitProgress;
int iTotalTruncated = 0;
for (iI = 0; iI < GC.getNumUnitInfos(); ++iI)
{
int iProgress = ((city.getGreatPeopleUnitProgress((UnitTypes)iI) * 100) / iTotalGreatPeopleUnitProgress);
if (iProgress > 0)
{
iTotalTruncated += iProgress;
aUnitProgress.push_back(std::make_pair((UnitTypes)iI, iProgress));
}
}
if (iTotalTruncated < 100 && !aUnitProgress.empty())
{
aUnitProgress[0].second += 100 - iTotalTruncated;
}
for (iI = 0; iI < (int)aUnitProgress.size(); ++iI)
{
szBuffer.append(CvWString::format(L"%s%s - %d%%", NEWLINE, GC.getUnitInfo(aUnitProgress[iI].first).getDescription(), aUnitProgress[iI].second));
}
}
// BUG - Building Additional Great People - start
bool bBuildingAdditionalGreatPeople = getBugOptionBOOL("MiscHover__BuildingAdditionalGreatPeople", true, "BUG_BUILDING_ADDITIONAL_GREAT_PEOPLE_HOVER");
if (city.getGreatPeopleRate() == 0 && !bBuildingAdditionalGreatPeople)
// BUG - Building Additional Great People - end
{
return;
}
// BUG - Great People Rate Breakdown - start
if (getBugOptionBOOL("MiscHover__GreatPeopleRateBreakdown", true, "BUG_GREAT_PEOPLE_RATE_BREAKDOWN_HOVER"))
{
bool bFirst = true;
int iRate = 0;
for (int i = 0; i < GC.getNumSpecialistInfos(); i++)
{
int iCount = city.getSpecialistCount((SpecialistTypes)i) + city.getFreeSpecialistCount((SpecialistTypes)i);
if (iCount > 0)
{
iRate += iCount * GC.getSpecialistInfo((SpecialistTypes)i).getGreatPeopleRateChange();
}
}
if (iRate > 0)
{
if (bFirst)
{
szBuffer.append(SEPARATOR);
bFirst = false;
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_SPECIALIST_COMMERCE", iRate, gDLL->getSymbolID(GREAT_PEOPLE_CHAR), L"TXT_KEY_CONCEPT_SPECIALISTS"));
}
iRate = 0;
for (int i = 0; i < GC.getNumBuildingInfos(); i++)
{
int iCount = city.getNumBuilding((BuildingTypes)i);
if (iCount > 0)
{
iRate += iCount * GC.getBuildingInfo((BuildingTypes)i).getGreatPeopleRateChange();
}
}
if (iRate > 0)
{
if (bFirst)
{
szBuffer.append(SEPARATOR);
bFirst = false;
}
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_BUILDING_COMMERCE", iRate, gDLL->getSymbolID(GREAT_PEOPLE_CHAR)));
}
}
// BUG - Great People Rate Breakdown - end
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_GREATPEOPLE_BASE_RATE", city.getBaseGreatPeopleRate()));
szBuffer.append(NEWLINE);
int iModifier = 100;
// Buildings
int iBuildingMod = 0;
for (int i = 0; i < GC.getNumBuildingInfos(); i++)
{
CvBuildingInfo& infoBuilding = GC.getBuildingInfo((BuildingTypes)i);
if (city.getNumBuilding((BuildingTypes)i) > 0 && !GET_TEAM(city.getTeam()).isObsoleteBuilding((BuildingTypes)i))
{
for (int iLoop = 0; iLoop < city.getNumBuilding((BuildingTypes)i); iLoop++)
{
iBuildingMod += infoBuilding.getGreatPeopleRateModifier();
}
}
for (int j = 0; j < MAX_PLAYERS; j++)
{
if (GET_PLAYER((PlayerTypes)j).isAlive())
{
if (GET_PLAYER((PlayerTypes)j).getTeam() == owner.getTeam())
{
int iLoop;
for (CvCity* pLoopCity = GET_PLAYER((PlayerTypes)j).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER((PlayerTypes)j).nextCity(&iLoop))
{
if (pLoopCity->getNumBuilding((BuildingTypes)i) > 0 && !GET_TEAM(pLoopCity->getTeam()).isObsoleteBuilding((BuildingTypes)i))
{
for (int iLoop = 0; iLoop < pLoopCity->getNumBuilding((BuildingTypes)i); iLoop++)
{
iBuildingMod += infoBuilding.getGlobalGreatPeopleRateModifier();
}
}
}
}
}
}
}
if (0 != iBuildingMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_GREATPEOPLE_BUILDINGS", iBuildingMod));
szBuffer.append(NEWLINE);
iModifier += iBuildingMod;
}
// Civics
int iCivicMod = 0;
for (int i = 0; i < GC.getNumCivicOptionInfos(); i++)
{
if (NO_CIVIC != owner.getCivics((CivicOptionTypes)i))
{
iCivicMod += GC.getCivicInfo(owner.getCivics((CivicOptionTypes)i)).getGreatPeopleRateModifier();
if (owner.getStateReligion() != NO_RELIGION && city.isHasReligion(owner.getStateReligion()))
{
iCivicMod += GC.getCivicInfo(owner.getCivics((CivicOptionTypes)i)).getStateReligionGreatPeopleRateModifier();
}
}
}
if (0 != iCivicMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_GREATPEOPLE_CIVICS", iCivicMod));
szBuffer.append(NEWLINE);
iModifier += iCivicMod;
}
// Trait
for (int i = 0; i < GC.getNumTraitInfos(); i++)
{
if (city.hasTrait((TraitTypes)i))
{
CvTraitInfo& trait = GC.getTraitInfo((TraitTypes)i);
int iTraitMod = trait.getGreatPeopleRateModifier();
if (0 != iTraitMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_GREATPEOPLE_TRAIT", iTraitMod, trait.getTextKeyWide()));
szBuffer.append(NEWLINE);
iModifier += iTraitMod;
}
}
}
if (owner.isGoldenAge())
{
int iGoldenAgeMod = GC.getDefineINT("GOLDEN_AGE_GREAT_PEOPLE_MODIFIER");
if (0 != iGoldenAgeMod)
{
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_GREATPEOPLE_GOLDEN_AGE", iGoldenAgeMod));
szBuffer.append(NEWLINE);
iModifier += iGoldenAgeMod;
}
}
int iModGreatPeople = (iModifier * city.getBaseGreatPeopleRate()) / 100;
FAssertMsg(iModGreatPeople == city.getGreatPeopleRate(), "Great person rate does not match actual value");
szBuffer.append(gDLL->getText("TXT_KEY_MISC_HELP_GREATPEOPLE_FINAL", iModGreatPeople));
// BUG - Building Additional Great People - start
if (bBuildingAdditionalGreatPeople && city.getOwnerINLINE() == GC.getGame().getActivePlayer())
{
setBuildingAdditionalGreatPeopleHelp(szBuffer, city, DOUBLE_SEPARATOR);
}
// BUG - Building Additional Great People - end
}
// BUG - Building Additional Great People - start
bool CvGameTextMgr::setBuildingAdditionalGreatPeopleHelp(CvWStringBuffer &szBuffer, CvCity& city, const CvWString& szStart, bool bStarted)
{
CvWString szLabel;
// BUG jdog5000 - need to verify building type is correct for this player to avoid asserts - start
for (int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GET_PLAYER(city.getOwnerINLINE()).getCivilizationType()).getCivilizationBuildings((BuildingClassTypes)i);
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
/*
if (city.canConstruct(eBuilding, false, true, false))
*/
if (city.canConstruct(eBuilding, false, false, false))
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
{
int iChange = city.getAdditionalGreatPeopleRateByBuilding(eBuilding);
if (iChange != 0)
{
if (!bStarted)
{
szBuffer.append(szStart);
bStarted = true;
}
szLabel.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eBuilding).getDescription());
setResumableValueChangeHelp(szBuffer, szLabel, L": ", L"", iChange, gDLL->getSymbolID(GREAT_PEOPLE_CHAR), false, true);
}
}
}
return bStarted;
}
// BUG - Building Additional Great People - end
void CvGameTextMgr::parseGreatGeneralHelp(CvWStringBuffer &szBuffer, CvPlayer& kPlayer)
{
szBuffer.assign(gDLL->getText("TXT_KEY_MISC_GREAT_GENERAL", kPlayer.getCombatExperience(), kPlayer.greatPeopleThreshold(true)));
}
//------------------------------------------------------------------------------------------------
void CvGameTextMgr::buildCityBillboardIconString( CvWStringBuffer& szBuffer, CvCity* pCity)
{
szBuffer.clear();
/************************************************************************************************/
/* TGA_INDEXATION 02/18/08 MRGENIE */
/* */
/* adding link to resources in the Pedia */
/************************************************************************************************/
CvString szDebugBuffer;
/************************************************************************************************/
/* TGA_INDEXATION END */
/************************************************************************************************/
// government center icon
if (pCity->isGovernmentCenter() && !(pCity->isCapital()))
{
szBuffer.append(CvWString::format(L"%c", gDLL->getSymbolID(SILVER_STAR_CHAR)));
}
// happiness, healthiness, superlative icons
if (pCity->canBeSelected())
{
if (pCity->angryPopulation() > 0)
{
szBuffer.append(CvWString::format(L"%c", gDLL->getSymbolID(UNHAPPY_CHAR)));
}
if (pCity->healthRate() < 0)
{
szBuffer.append(CvWString::format(L"%c", gDLL->getSymbolID(UNHEALTHY_CHAR)));
}
if (gDLL->getGraphicOption(GRAPHICOPTION_CITY_DETAIL))
{
if (GET_PLAYER(pCity->getOwnerINLINE()).getNumCities() > 2)
{
if (pCity->findYieldRateRank(YIELD_PRODUCTION) == 1)
{
szBuffer.append(CvWString::format(L"%c", GC.getYieldInfo(YIELD_PRODUCTION).getChar()));
}
if (pCity->findCommerceRateRank(COMMERCE_GOLD) == 1)
{
szBuffer.append(CvWString::format(L"%c", GC.getCommerceInfo(COMMERCE_GOLD).getChar()));
}
if (pCity->findCommerceRateRank(COMMERCE_RESEARCH) == 1)
{
szBuffer.append(CvWString::format(L"%c", GC.getCommerceInfo(COMMERCE_RESEARCH).getChar()));
}
}
}
if (pCity->isConnectedToCapital())
{
if (GET_PLAYER(pCity->getOwnerINLINE()).countNumCitiesConnectedToCapital() > 1)
{
szBuffer.append(CvWString::format(L"%c", gDLL->getSymbolID(TRADE_CHAR)));
}
}
// BUG - Airport Icon - start
//Modified by Afforess 4/30/10
if (getBugOptionBOOL("CityBar__AirportIcon", true, "BUG_CITYBAR_AIRPORT_ICONS"))
{
bool bHasAirport = false;
for (int iBuilding = 0; iBuilding < GC.getNumBuildingInfos(); iBuilding++)
{
if (pCity->getNumActiveBuilding((BuildingTypes)iBuilding) > 0)
{
if (GC.getBuildingInfo((BuildingTypes)iBuilding).getAirlift() > 0)
{
bHasAirport = true;
break;
}
}
}
if (bHasAirport)
{
szBuffer.append(CvWString::format(L"%c", gDLL->getSymbolID(AIRPORT_CHAR)));
}
}
// BUG - Airport Icon - start
}
// religion icons
/************************************************************************************************/
/* TGA_INDEXATION 02/18/08 MRGENIE */
/* */
/* adding link to resources in the Pedia */
/************************************************************************************************/
szDebugBuffer.Format("=== City %S religion icons ===", pCity->getName().GetCString());
gDLL->logMsg("CvGameTextMgr_buildCityBillboardString.log", szDebugBuffer.c_str());
/************************************************************************************************/
/* TGA_INDEXATION END */
/************************************************************************************************/
for (int iI = 0; iI < GC.getNumReligionInfos(); ++iI)
{
if (pCity->isHasReligion((ReligionTypes)iI))
{
if (pCity->isHolyCity((ReligionTypes)iI))
{
/************************************************************************************************/
/* TGA_INDEXATION 02/18/08 MRGENIE */
/* */
/* adding link to resources in the Pedia */
/************************************************************************************************/
/*
szBuffer.append(CvWString::format(L"%c", GC.getReligionInfo((ReligionTypes) iI).getHolyCityChar()));
*/
CvReligionInfo& pInfo = GC.getReligionInfo((ReligionTypes) iI);
szDebugBuffer.Format("Religion %s, TGA index %i.", pInfo.getType(), pInfo.getTGAIndex());
gDLL->logMsg("CvGameTextMgr_buildCityBillboardString.log", szDebugBuffer.c_str());
szBuffer.append(CvWString::format(L"%c", pInfo.getHolyCityChar()));
}
else
{
/************************************************************************************************/
/* TGA_INDEXATION 02/18/08 MRGENIE */
/* */
/* adding link to resources in the Pedia */
/************************************************************************************************/
/*
szBuffer.append(CvWString::format(L"%c", GC.getReligionInfo((ReligionTypes) iI).getChar()));
*/
CvReligionInfo& pInfo = GC.getReligionInfo((ReligionTypes) iI);
szBuffer.append(CvWString::format(L"%c", pInfo.getChar()));
if (GC.isXMLLogging())
{
szDebugBuffer.Format("Religion %s, TGA index %i.", pInfo.getType(), pInfo.getTGAIndex());
gDLL->logMsg("CvGameTextMgr_buildCityBillboardString.log", szDebugBuffer.c_str());
}
/************************************************************************************************/
/* TGA_INDEXATION END */
/************************************************************************************************/
}
}
}
// corporation icons
for (int iI = 0; iI < GC.getNumCorporationInfos(); ++iI)
{
if (pCity->isHeadquarters((CorporationTypes)iI))
{
if (pCity->isHasCorporation((CorporationTypes)iI))
{
szBuffer.append(CvWString::format(L"%c", GC.getCorporationInfo((CorporationTypes) iI).getHeadquarterChar()));
}
}
else
{
if (pCity->isActiveCorporation((CorporationTypes)iI))
{
szBuffer.append(CvWString::format(L"%c", GC.getCorporationInfo((CorporationTypes) iI).getChar()));
}
}
}
if (pCity->getTeam() == GC.getGameINLINE().getActiveTeam())
{
if (pCity->isPower())
{
szBuffer.append(CvWString::format(L"%c", gDLL->getSymbolID(POWER_CHAR)));
}
}
// XXX out this in bottom bar???
if (pCity->isOccupation())
{
szBuffer.append(CvWString::format(L" (%c:%d)", gDLL->getSymbolID(OCCUPATION_CHAR), pCity->getOccupationTimer()));
}
// defense icon and text
//if (pCity->getTeam() != GC.getGameINLINE().getActiveTeam())
{
if (pCity->isVisible(GC.getGameINLINE().getActiveTeam(), true))
{
int iDefenseModifier = pCity->getDefenseModifier(GC.getGameINLINE().selectionListIgnoreBuildingDefense());
if (iDefenseModifier != 0)
{
szBuffer.append(CvWString::format(L" %c:%s%d%%", gDLL->getSymbolID(DEFENSE_CHAR), ((iDefenseModifier > 0) ? L"+" : L""), iDefenseModifier));
}
}
}
/************************************************************************************************/
/* Afforess Start 01/12/10 */
/* */
/* */
/************************************************************************************************/
if (pCity->getCivilizationType() != GET_PLAYER(pCity->getOwnerINLINE()).getCivilizationType())
{
szBuffer.append(CvWString::format(L" (%s)", GC.getCivilizationInfo(pCity->getCivilizationType()).getShortDescription()));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
void CvGameTextMgr::buildCityBillboardCityNameString( CvWStringBuffer& szBuffer, CvCity* pCity)
{
szBuffer.assign(pCity->getName());
if (pCity->canBeSelected())
{
if (gDLL->getGraphicOption(GRAPHICOPTION_CITY_DETAIL))
{
if (pCity->foodDifference() > 0)
{
int iTurns = pCity->getFoodTurnsLeft();
if ((iTurns > 1) || !(pCity->AI_isEmphasizeAvoidGrowth()))
{
if (iTurns < MAX_INT)
{
szBuffer.append(CvWString::format(L" (%d)", iTurns));
}
}
}
// BUG - Starvation Turns - start
else if (pCity->foodDifference() < 0 && getBugOptionBOOL("CityBar__StarvationTurns", true, "BUG_CITYBAR_STARVATION_TURNS"))
{
int iFoodDifference = pCity->foodDifference();
if (pCity->getFood() + iFoodDifference >= 0)
{
int iTurns = pCity->getFood() / -iFoodDifference + 1;
szBuffer.append(CvWString::format(L" (%d)", iTurns));
}
else
{
szBuffer.append(L" (!!!)");
}
}
// BUG - Starvation Turns - end
}
}
}
void CvGameTextMgr::buildCityBillboardProductionString( CvWStringBuffer& szBuffer, CvCity* pCity)
{
if (pCity->getOrderQueueLength() > 0)
{
szBuffer.assign(pCity->getProductionName());
if (gDLL->getGraphicOption(GRAPHICOPTION_CITY_DETAIL))
{
int iTurns = pCity->getProductionTurnsLeft();
if (iTurns < MAX_INT)
{
szBuffer.append(CvWString::format(L" (%d)", iTurns));
}
}
}
else
{
szBuffer.clear();
}
}
void CvGameTextMgr::buildCityBillboardCitySizeString( CvWStringBuffer& szBuffer, CvCity* pCity, const NiColorA& kColor)
{
#define CAPARAMS(c) (int)((c).r * 255.0f), (int)((c).g * 255.0f), (int)((c).b * 255.0f), (int)((c).a * 255.0f)
szBuffer.assign(CvWString::format(SETCOLR L"%d" ENDCOLR, CAPARAMS(kColor), pCity->getPopulation()));
#undef CAPARAMS
}
void CvGameTextMgr::getCityBillboardFoodbarColors(CvCity* pCity, std::vector<NiColorA>& aColors)
{
aColors.resize(NUM_INFOBAR_TYPES);
aColors[INFOBAR_STORED] = GC.getColorInfo((ColorTypes)(GC.getYieldInfo(YIELD_FOOD).getColorType())).getColor();
aColors[INFOBAR_RATE] = aColors[INFOBAR_STORED];
aColors[INFOBAR_RATE].a = 0.5f;
aColors[INFOBAR_RATE_EXTRA] = GC.getColorInfo((ColorTypes)GC.getInfoTypeForString("COLOR_NEGATIVE_RATE")).getColor();
aColors[INFOBAR_EMPTY] = GC.getColorInfo((ColorTypes)GC.getInfoTypeForString("COLOR_EMPTY")).getColor();
}
void CvGameTextMgr::getCityBillboardProductionbarColors(CvCity* pCity, std::vector<NiColorA>& aColors)
{
aColors.resize(NUM_INFOBAR_TYPES);
aColors[INFOBAR_STORED] = GC.getColorInfo((ColorTypes)(GC.getYieldInfo(YIELD_PRODUCTION).getColorType())).getColor();
aColors[INFOBAR_RATE] = aColors[INFOBAR_STORED];
aColors[INFOBAR_RATE].a = 0.5f;
aColors[INFOBAR_RATE_EXTRA] = GC.getColorInfo((ColorTypes)(GC.getYieldInfo(YIELD_FOOD).getColorType())).getColor();
aColors[INFOBAR_RATE_EXTRA].a = 0.5f;
aColors[INFOBAR_EMPTY] = GC.getColorInfo((ColorTypes)GC.getInfoTypeForString("COLOR_EMPTY")).getColor();
}
void CvGameTextMgr::setScoreHelp(CvWStringBuffer &szString, PlayerTypes ePlayer)
{
if (NO_PLAYER != ePlayer)
{
CvPlayer& player = GET_PLAYER(ePlayer);
/************************************************************************************************/
/* Afforess Start 02/02/10 */
/* */
/* */
/************************************************************************************************/
/* if ((GC.getGameINLINE().isOption(GAMEOPTION_DARK_AGES)) && GC.getGameINLINE().isDebugMode())
setDarkAgeDetails(szString, ePlayer);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
int iPop = player.getPopScore();
int iMaxPop = GC.getGameINLINE().getMaxPopulation();
int iPopScore = 0;
if (iMaxPop > 0)
{
iPopScore = (GC.getDefineINT("SCORE_POPULATION_FACTOR") * iPop) / iMaxPop;
}
int iLand = player.getLandScore();
int iMaxLand = GC.getGameINLINE().getMaxLand();
int iLandScore = 0;
if (iMaxLand > 0)
{
iLandScore = (GC.getDefineINT("SCORE_LAND_FACTOR") * iLand) / iMaxLand;
}
int iTech = player.getTechScore();
int iMaxTech = GC.getGameINLINE().getMaxTech();
/************************************************************************************************/
/* BETTER_BTS_AI_MOD 02/24/10 jdog5000 */
/* */
/* Bugfix */
/************************************************************************************************/
int iTechScore = 0;
if( iMaxTech > 0 )
{
/************************************************************************************************/
/* Afforess Start 05/31/10 */
/* */
/* Prevent Divide By Zero */
/************************************************************************************************/
/*
int iTechScore = (GC.getDefineINT("SCORE_TECH_FACTOR") * iTech) / iMaxTech;
*/
iTechScore = (GC.getDefineINT("SCORE_TECH_FACTOR") * iTech) / std::max(1, iMaxTech);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
int iWonders = player.getWondersScore();
int iMaxWonders = GC.getGameINLINE().getMaxWonders();
int iWondersScore = 0;
if( iMaxWonders > 0 )
{
/************************************************************************************************/
/* Afforess Start 05/31/10 */
/* */
/* Prevent Divide By Zero */
/************************************************************************************************/
/*
int iWondersScore = (GC.getDefineINT("SCORE_WONDER_FACTOR") * iWonders) / iMaxWonders;
*/
iWondersScore = (GC.getDefineINT("SCORE_WONDER_FACTOR") * iWonders) / std::max(1, iMaxWonders);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
/************************************************************************************************/
/* BETTER_BTS_AI_MOD END */
/************************************************************************************************/
int iTotalScore = iPopScore + iLandScore + iTechScore + iWondersScore;
int iVictoryScore = player.calculateScore(true, true);
//if (iTotalScore == player.calculateScore())
{
szString.append(gDLL->getText("TXT_KEY_SCORE_BREAKDOWN", iPopScore, iPop, iMaxPop, iLandScore, iLand, iMaxLand, iTechScore, iTech, iMaxTech, iWondersScore, iWonders, iMaxWonders, iTotalScore, iVictoryScore));
}
/************************************************************************************************/
/* Afforess Start 02/24/10 */
/* */
/* */
/************************************************************************************************/
szString.append(gDLL->getText("TXT_KEY_SCORE_DIFFICULTY_LEVEL", GC.getHandicapInfo(player.getHandicapType()).getTextKeyWide()));
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
void CvGameTextMgr::setEventHelp(CvWStringBuffer& szBuffer, EventTypes eEvent, int iEventTriggeredId, PlayerTypes ePlayer)
{
if (NO_EVENT == eEvent || NO_PLAYER == ePlayer)
{
return;
}
CvEventInfo& kEvent = GC.getEventInfo(eEvent);
CvPlayer& kActivePlayer = GET_PLAYER(ePlayer);
EventTriggeredData* pTriggeredData = kActivePlayer.getEventTriggered(iEventTriggeredId);
if (NULL == pTriggeredData)
{
return;
}
CvCity* pCity = kActivePlayer.getCity(pTriggeredData->m_iCityId);
CvCity* pOtherPlayerCity = NULL;
CvPlot* pPlot = GC.getMapINLINE().plot(pTriggeredData->m_iPlotX, pTriggeredData->m_iPlotY);
CvUnit* pUnit = kActivePlayer.getUnit(pTriggeredData->m_iUnitId);
if (NO_PLAYER != pTriggeredData->m_eOtherPlayer)
{
pOtherPlayerCity = GET_PLAYER(pTriggeredData->m_eOtherPlayer).getCity(pTriggeredData->m_iOtherPlayerCityId);
}
CvWString szCity = gDLL->getText("TXT_KEY_EVENT_THE_CITY");
if (NULL != pCity && kEvent.isCityEffect())
{
szCity = pCity->getNameKey();
}
else if (NULL != pOtherPlayerCity && kEvent.isOtherPlayerCityEffect())
{
szCity = pOtherPlayerCity->getNameKey();
}
CvWString szUnit = gDLL->getText("TXT_KEY_EVENT_THE_UNIT");
if (NULL != pUnit)
{
szUnit = pUnit->getNameKey();
}
CvWString szReligion = gDLL->getText("TXT_KEY_EVENT_THE_RELIGION");
if (NO_RELIGION != pTriggeredData->m_eReligion)
{
szReligion = GC.getReligionInfo(pTriggeredData->m_eReligion).getTextKeyWide();
}
eventGoldHelp(szBuffer, eEvent, ePlayer, pTriggeredData->m_eOtherPlayer);
eventTechHelp(szBuffer, eEvent, kActivePlayer.getBestEventTech(eEvent, pTriggeredData->m_eOtherPlayer), ePlayer, pTriggeredData->m_eOtherPlayer);
if (NO_PLAYER != pTriggeredData->m_eOtherPlayer && NO_BONUS != kEvent.getBonusGift())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GIFT_BONUS_TO_PLAYER", GC.getBonusInfo((BonusTypes)kEvent.getBonusGift()).getTextKeyWide(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
if (kEvent.getHappy() != 0)
{
if (NO_PLAYER != pTriggeredData->m_eOtherPlayer)
{
if (kEvent.getHappy() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY_FROM_PLAYER", kEvent.getHappy(), kEvent.getHappy(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY_TO_PLAYER", -kEvent.getHappy(), -kEvent.getHappy(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
}
else
{
if (kEvent.getHappy() > 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY_CITY", kEvent.getHappy(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY", kEvent.getHappy()));
}
}
else
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNHAPPY_CITY", -kEvent.getHappy(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNHAPPY", -kEvent.getHappy()));
}
}
}
}
if (kEvent.getHealth() != 0)
{
if (NO_PLAYER != pTriggeredData->m_eOtherPlayer)
{
if (kEvent.getHealth() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HEALTH_FROM_PLAYER", kEvent.getHealth(), kEvent.getHealth(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HEALTH_TO_PLAYER", -kEvent.getHealth(), -kEvent.getHealth(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
}
else
{
if (kEvent.getHealth() > 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HEALTH_CITY", kEvent.getHealth(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HEALTH", kEvent.getHealth()));
}
}
else
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNHEALTH", -kEvent.getHealth(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNHEALTH_CITY", -kEvent.getHealth()));
}
}
}
}
if (kEvent.getHurryAnger() != 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HURRY_ANGER_CITY", kEvent.getHurryAnger(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HURRY_ANGER", kEvent.getHurryAnger()));
}
}
if (kEvent.getHappyTurns() > 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_TEMP_HAPPY_CITY", GC.getDefineINT("TEMP_HAPPY"), kEvent.getHappyTurns(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_TEMP_HAPPY", GC.getDefineINT("TEMP_HAPPY"), kEvent.getHappyTurns()));
}
}
if (kEvent.getFood() != 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FOOD_CITY", kEvent.getFood(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FOOD", kEvent.getFood()));
}
}
if (kEvent.getFoodPercent() != 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FOOD_PERCENT_CITY", kEvent.getFoodPercent(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FOOD_PERCENT", kEvent.getFoodPercent()));
}
}
if (kEvent.getRevoltTurns() > 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_REVOLT_TURNS", kEvent.getRevoltTurns(), szCity.GetCString()));
}
}
if (0 != kEvent.getSpaceProductionModifier())
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_SPACE_PRODUCTION_CITY", kEvent.getSpaceProductionModifier(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_SPACESHIP_MOD_ALL_CITIES", kEvent.getSpaceProductionModifier()));
}
}
if (kEvent.getMaxPillage() > 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
if (kEvent.getMaxPillage() == kEvent.getMinPillage())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_PILLAGE_CITY", kEvent.getMinPillage(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_PILLAGE_RANGE_CITY", kEvent.getMinPillage(), kEvent.getMaxPillage(), szCity.GetCString()));
}
}
else
{
if (kEvent.getMaxPillage() == kEvent.getMinPillage())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_PILLAGE", kEvent.getMinPillage()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_PILLAGE_RANGE", kEvent.getMinPillage(), kEvent.getMaxPillage()));
}
}
}
for (int i = 0; i < GC.getNumSpecialistInfos(); ++i)
{
if (kEvent.getFreeSpecialistCount(i) > 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FREE_SPECIALIST", kEvent.getFreeSpecialistCount(i), GC.getSpecialistInfo((SpecialistTypes)i).getTextKeyWide(), szCity.GetCString()));
}
}
}
if (kEvent.getPopulationChange() != 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_POPULATION_CHANGE_CITY", kEvent.getPopulationChange(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_POPULATION_CHANGE", kEvent.getPopulationChange()));
}
}
if (kEvent.getCulture() != 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_CULTURE_CITY", kEvent.getCulture(), szCity.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_CULTURE", kEvent.getCulture()));
}
}
if (kEvent.getUnitClass() != NO_UNITCLASS)
{
CivilizationTypes eCiv = kActivePlayer.getCivilizationType();
if (NO_CIVILIZATION != eCiv)
{
UnitTypes eUnit = (UnitTypes)GC.getCivilizationInfo(eCiv).getCivilizationUnits(kEvent.getUnitClass());
if (eUnit != NO_UNIT)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_BONUS_UNIT", kEvent.getNumUnits(), GC.getUnitInfo(eUnit).getTextKeyWide()));
}
}
}
if (kEvent.getBuildingClass() != NO_BUILDINGCLASS)
{
CivilizationTypes eCiv = kActivePlayer.getCivilizationType();
if (NO_CIVILIZATION != eCiv)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(eCiv).getCivilizationBuildings(kEvent.getBuildingClass());
if (eBuilding != NO_BUILDING)
{
if (kEvent.getBuildingChange() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_BONUS_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide()));
}
else if (kEvent.getBuildingChange() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_REMOVE_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide()));
}
}
}
}
if (kEvent.getNumBuildingYieldChanges() > 0)
{
CvWStringBuffer szYield;
for (int iBuildingClass = 0; iBuildingClass < GC.getNumBuildingClassInfos(); ++iBuildingClass)
{
CivilizationTypes eCiv = kActivePlayer.getCivilizationType();
if (NO_CIVILIZATION != eCiv)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(eCiv).getCivilizationBuildings(iBuildingClass);
if (eBuilding != NO_BUILDING)
{
/************************************************************************************************/
/* Afforess Start 07/15/10 */
/* */
/* */
/************************************************************************************************/
if (pCity == NULL || pCity->getNumBuilding(eBuilding) > 0)
{
int aiYields[NUM_YIELD_TYPES];
for (int iYield = 0; iYield < NUM_YIELD_TYPES; ++iYield)
{
aiYields[iYield] = kEvent.getBuildingYieldChange(iBuildingClass, iYield);
}
szYield.clear();
setYieldChangeHelp(szYield, L"", L"", L"", aiYields, false, false);
if (!szYield.isEmpty())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_YIELD_CHANGE_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide(), szYield.getCString()));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
}
}
if (kEvent.getNumBuildingCommerceChanges() > 0)
{
CvWStringBuffer szCommerce;
for (int iBuildingClass = 0; iBuildingClass < GC.getNumBuildingClassInfos(); ++iBuildingClass)
{
CivilizationTypes eCiv = kActivePlayer.getCivilizationType();
if (NO_CIVILIZATION != eCiv)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(eCiv).getCivilizationBuildings(iBuildingClass);
if (eBuilding != NO_BUILDING)
{
/************************************************************************************************/
/* Afforess Start 07/15/10 */
/* */
/* */
/************************************************************************************************/
if (pCity == NULL || pCity->getNumBuilding(eBuilding) > 0)
{
int aiCommerces[NUM_COMMERCE_TYPES];
for (int iCommerce = 0; iCommerce < NUM_COMMERCE_TYPES; ++iCommerce)
{
aiCommerces[iCommerce] = kEvent.getBuildingCommerceChange(iBuildingClass, iCommerce);
}
szCommerce.clear();
setCommerceChangeHelp(szCommerce, L"", L"", L"", aiCommerces, false, false);
if (!szCommerce.isEmpty())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_YIELD_CHANGE_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide(), szCommerce.getCString()));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
}
}
if (kEvent.getNumBuildingHappyChanges() > 0)
{
for (int iBuildingClass = 0; iBuildingClass < GC.getNumBuildingClassInfos(); ++iBuildingClass)
{
CivilizationTypes eCiv = kActivePlayer.getCivilizationType();
if (NO_CIVILIZATION != eCiv)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(eCiv).getCivilizationBuildings(iBuildingClass);
if (eBuilding != NO_BUILDING)
{
/************************************************************************************************/
/* Afforess Start 07/15/10 */
/* */
/* */
/************************************************************************************************/
if (pCity == NULL || pCity->getNumBuilding(eBuilding) > 0)
{
int iHappy = kEvent.getBuildingHappyChange(iBuildingClass);
if (iHappy > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide(), iHappy, gDLL->getSymbolID(HAPPY_CHAR)));
}
else if (iHappy < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide(), -iHappy, gDLL->getSymbolID(UNHAPPY_CHAR)));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
}
}
if (kEvent.getNumBuildingHealthChanges() > 0)
{
for (int iBuildingClass = 0; iBuildingClass < GC.getNumBuildingClassInfos(); ++iBuildingClass)
{
CivilizationTypes eCiv = kActivePlayer.getCivilizationType();
if (NO_CIVILIZATION != eCiv)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(eCiv).getCivilizationBuildings(iBuildingClass);
if (eBuilding != NO_BUILDING)
{
/************************************************************************************************/
/* Afforess Start 07/15/10 */
/* */
/* */
/************************************************************************************************/
if (pCity == NULL || pCity->getNumBuilding(eBuilding) > 0)
{
int iHealth = kEvent.getBuildingHealthChange(iBuildingClass);
if (iHealth > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide(), iHealth, gDLL->getSymbolID(HEALTHY_CHAR)));
}
else if (iHealth < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_HAPPY_BUILDING", GC.getBuildingInfo(eBuilding).getTextKeyWide(), -iHealth, gDLL->getSymbolID(UNHEALTHY_CHAR)));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
}
}
}
}
/************************************************************************************************/
/* Afforess Start 01/27/10 */
/* */
/* */
/************************************************************************************************/
if (kEvent.getRevolutionIndexChange() != 0)
{
if (kEvent.isCityEffect() || kEvent.isOtherPlayerCityEffect())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_REVOLUTION_INDEX_CITY"));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_REVOLUTION_INDEX"));
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (kEvent.getFeatureChange() > 0)
{
if (kEvent.getFeature() != NO_FEATURE)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FEATURE_GROWTH", GC.getFeatureInfo((FeatureTypes)kEvent.getFeature()).getTextKeyWide()));
}
}
else if (kEvent.getFeatureChange() < 0)
{
if (NULL != pPlot && NO_FEATURE != pPlot->getFeatureType())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FEATURE_REMOVE", GC.getFeatureInfo(pPlot->getFeatureType()).getTextKeyWide()));
}
}
if (kEvent.getImprovementChange() > 0)
{
if (kEvent.getImprovement() != NO_IMPROVEMENT)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_IMPROVEMENT_GROWTH", GC.getImprovementInfo((ImprovementTypes)kEvent.getImprovement()).getTextKeyWide()));
}
}
else if (kEvent.getImprovementChange() < 0)
{
if (NULL != pPlot && NO_IMPROVEMENT != pPlot->getImprovementType())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_IMPROVEMENT_REMOVE", GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide()));
}
}
if (kEvent.getBonusChange() > 0)
{
if (kEvent.getBonus() != NO_BONUS)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_BONUS_GROWTH", GC.getBonusInfo((BonusTypes)kEvent.getBonus()).getTextKeyWide()));
}
}
else if (kEvent.getBonusChange() < 0)
{
if (NULL != pPlot && NO_BONUS != pPlot->getBonusType())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_BONUS_REMOVE", GC.getBonusInfo(pPlot->getBonusType()).getTextKeyWide()));
}
}
if (kEvent.getRouteChange() > 0)
{
if (kEvent.getRoute() != NO_ROUTE)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ROUTE_GROWTH", GC.getRouteInfo((RouteTypes)kEvent.getRoute()).getTextKeyWide()));
}
}
else if (kEvent.getRouteChange() < 0)
{
if (NULL != pPlot && NO_ROUTE != pPlot->getRouteType())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ROUTE_REMOVE", GC.getRouteInfo(pPlot->getRouteType()).getTextKeyWide()));
}
}
int aiYields[NUM_YIELD_TYPES];
for (int i = 0; i < NUM_YIELD_TYPES; ++i)
{
aiYields[i] = kEvent.getPlotExtraYield(i);
}
CvWStringBuffer szYield;
setYieldChangeHelp(szYield, L"", L"", L"", aiYields, false, false);
if (!szYield.isEmpty())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_YIELD_CHANGE_PLOT", szYield.getCString()));
}
if (NO_BONUS != kEvent.getBonusRevealed())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_BONUS_REVEALED", GC.getBonusInfo((BonusTypes)kEvent.getBonusRevealed()).getTextKeyWide()));
}
if (0 != kEvent.getUnitExperience())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNIT_EXPERIENCE", kEvent.getUnitExperience(), szUnit.GetCString()));
}
if (0 != kEvent.isDisbandUnit())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNIT_DISBAND", szUnit.GetCString()));
}
if (NO_PROMOTION != kEvent.getUnitPromotion())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNIT_PROMOTION", szUnit.GetCString(), GC.getPromotionInfo((PromotionTypes)kEvent.getUnitPromotion()).getTextKeyWide()));
}
for (int i = 0; i < GC.getNumUnitCombatInfos(); ++i)
{
if (NO_PROMOTION != kEvent.getUnitCombatPromotion(i))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNIT_COMBAT_PROMOTION", GC.getUnitCombatInfo((UnitCombatTypes)i).getTextKeyWide(), GC.getPromotionInfo((PromotionTypes)kEvent.getUnitCombatPromotion(i)).getTextKeyWide()));
}
}
for (int i = 0; i < GC.getNumUnitClassInfos(); ++i)
{
if (NO_PROMOTION != kEvent.getUnitClassPromotion(i))
{
UnitTypes ePromotedUnit = ((UnitTypes)(GC.getCivilizationInfo(kActivePlayer.getCivilizationType()).getCivilizationUnits(i)));
if (NO_UNIT != ePromotedUnit)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_UNIT_CLASS_PROMOTION", GC.getUnitInfo(ePromotedUnit).getTextKeyWide(), GC.getPromotionInfo((PromotionTypes)kEvent.getUnitClassPromotion(i)).getTextKeyWide()));
}
}
}
if (kEvent.getConvertOwnCities() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_CONVERT_OWN_CITIES", kEvent.getConvertOwnCities(), szReligion.GetCString()));
}
if (kEvent.getConvertOtherCities() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_CONVERT_OTHER_CITIES", kEvent.getConvertOtherCities(), szReligion.GetCString()));
}
if (NO_PLAYER != pTriggeredData->m_eOtherPlayer)
{
if (kEvent.getAttitudeModifier() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ATTITUDE_GOOD", kEvent.getAttitudeModifier(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
else if (kEvent.getAttitudeModifier() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ATTITUDE_BAD", kEvent.getAttitudeModifier(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
TeamTypes eWorstEnemy = GET_TEAM(GET_PLAYER(pTriggeredData->m_eOtherPlayer).getTeam()).AI_getWorstEnemy();
if (NO_TEAM != eWorstEnemy)
{
if (kEvent.getTheirEnemyAttitudeModifier() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ATTITUDE_GOOD", kEvent.getTheirEnemyAttitudeModifier(), GET_TEAM(eWorstEnemy).getName().GetCString()));
}
else if (kEvent.getTheirEnemyAttitudeModifier() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ATTITUDE_BAD", kEvent.getTheirEnemyAttitudeModifier(), GET_TEAM(eWorstEnemy).getName().GetCString()));
}
}
if (kEvent.getEspionagePoints() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ESPIONAGE_POINTS", kEvent.getEspionagePoints(), GET_PLAYER(pTriggeredData->m_eOtherPlayer).getNameKey()));
}
else if (kEvent.getEspionagePoints() < 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ESPIONAGE_COST", -kEvent.getEspionagePoints()));
}
}
if (kEvent.isGoldenAge())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLDEN_AGE"));
}
if (0 != kEvent.getFreeUnitSupport())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_FREE_UNIT_SUPPORT", kEvent.getFreeUnitSupport()));
}
if (0 != kEvent.getInflationModifier())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_INFLATION_MODIFIER", kEvent.getInflationModifier()));
}
if (kEvent.isDeclareWar())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_DECLARE_WAR", GET_PLAYER(pTriggeredData->m_eOtherPlayer).getCivilizationAdjectiveKey()));
}
if (kEvent.getUnitImmobileTurns() > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_IMMOBILE_UNIT", kEvent.getUnitImmobileTurns(), szUnit.GetCString()));
}
if (kEvent.isCityEffect())
kEvent.getProperties()->buildChangesString(szBuffer, &szCity);
kEvent.getPropertiesAllCities()->buildChangesAllCitiesString(szBuffer);
if (!CvWString(kEvent.getPythonHelp()).empty())
{
PYTHON_ACCESS_LOCK_SCOPE
CvWString szHelp;
CyArgsList argsList;
argsList.add(eEvent);
argsList.add(gDLL->getPythonIFace()->makePythonObject(pTriggeredData));
PYTHON_CALL_FUNCTION4(__FUNCTION__, PYRandomEventModule, kEvent.getPythonHelp(), argsList.makeFunctionArgs(), &szHelp);
szBuffer.append(NEWLINE);
szBuffer.append(szHelp);
}
CvWStringBuffer szTemp;
for (int i = 0; i < GC.getNumEventInfos(); ++i)
{
if (0 == kEvent.getAdditionalEventTime(i))
{
if (kEvent.getAdditionalEventChance(i) > 0)
{
if (GET_PLAYER(GC.getGameINLINE().getActivePlayer()).canDoEvent((EventTypes)i, *pTriggeredData))
{
szTemp.clear();
setEventHelp(szTemp, (EventTypes)i, iEventTriggeredId, ePlayer);
if (!szTemp.isEmpty())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ADDITIONAL_CHANCE", kEvent.getAdditionalEventChance(i), L""));
szBuffer.append(NEWLINE);
szBuffer.append(szTemp);
}
}
}
}
else
{
szTemp.clear();
setEventHelp(szTemp, (EventTypes)i, iEventTriggeredId, ePlayer);
if (!szTemp.isEmpty())
{
CvWString szDelay = gDLL->getText("TXT_KEY_EVENT_DELAY_TURNS", (GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getGrowthPercent() * kEvent.getAdditionalEventTime((EventTypes)i)) / 100);
if (kEvent.getAdditionalEventChance(i) > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_ADDITIONAL_CHANCE", kEvent.getAdditionalEventChance(i), szDelay.GetCString()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_DELAY", szDelay.GetCString()));
}
szBuffer.append(NEWLINE);
szBuffer.append(szTemp);
}
}
}
if (NO_TECH != kEvent.getPrereqTech())
{
if (!GET_TEAM(kActivePlayer.getTeam()).isHasTech((TechTypes)kEvent.getPrereqTech()))
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_BUILDING_REQUIRES_STRING", GC.getTechInfo((TechTypes)(kEvent.getPrereqTech())).getTextKeyWide()));
}
}
bool done = false;
while(!done)
{
done = true;
if(!szBuffer.isEmpty())
{
const wchar* wideChar = szBuffer.getCString();
if(wideChar[0] == L'\n')
{
CvWString tempString(&wideChar[1]);
szBuffer.clear();
szBuffer.append(tempString);
done = false;
}
}
}
}
void CvGameTextMgr::eventTechHelp(CvWStringBuffer& szBuffer, EventTypes eEvent, TechTypes eTech, PlayerTypes eActivePlayer, PlayerTypes eOtherPlayer)
{
CvEventInfo& kEvent = GC.getEventInfo(eEvent);
if (eTech != NO_TECH)
{
if (100 == kEvent.getTechPercent())
{
if (NO_PLAYER != eOtherPlayer)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_TECH_GAINED_FROM_PLAYER", GC.getTechInfo(eTech).getTextKeyWide(), GET_PLAYER(eOtherPlayer).getNameKey()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_TECH_GAINED", GC.getTechInfo(eTech).getTextKeyWide()));
}
}
else if (0 != kEvent.getTechPercent())
{
CvTeam& kTeam = GET_TEAM(GET_PLAYER(eActivePlayer).getTeam());
int iBeakers = (kTeam.getResearchCost(eTech) * kEvent.getTechPercent()) / 100;
if (kEvent.getTechPercent() > 0)
{
iBeakers = std::min(kTeam.getResearchLeft(eTech), iBeakers);
}
else if (kEvent.getTechPercent() < 0)
{
iBeakers = std::max(kTeam.getResearchLeft(eTech) - kTeam.getResearchCost(eTech), iBeakers);
}
if (NO_PLAYER != eOtherPlayer)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_TECH_GAINED_FROM_PLAYER_PERCENT", iBeakers, GC.getTechInfo(eTech).getTextKeyWide(), GET_PLAYER(eOtherPlayer).getNameKey()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_TECH_GAINED_PERCENT", iBeakers, GC.getTechInfo(eTech).getTextKeyWide()));
}
}
}
}
void CvGameTextMgr::eventGoldHelp(CvWStringBuffer& szBuffer, EventTypes eEvent, PlayerTypes ePlayer, PlayerTypes eOtherPlayer)
{
CvEventInfo& kEvent = GC.getEventInfo(eEvent);
CvPlayer& kPlayer = GET_PLAYER(ePlayer);
int iGold1 = kPlayer.getEventCost(eEvent, eOtherPlayer, false);
int iGold2 = kPlayer.getEventCost(eEvent, eOtherPlayer, true);
/************************************************************************************************/
/* Afforess Start 07/15/10 */
/* */
/* */
/************************************************************************************************/
if (iGold1 != iGold2)
iGold2 = abs(iGold2);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (0 != iGold1 || 0 != iGold2)
{
if (iGold1 == iGold2)
{
if (NO_PLAYER != eOtherPlayer && kEvent.isGoldToPlayer())
{
if (iGold1 > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_FROM_PLAYER", iGold1, GET_PLAYER(eOtherPlayer).getNameKey()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_TO_PLAYER", -iGold1, GET_PLAYER(eOtherPlayer).getNameKey()));
}
}
else
{
if (iGold1 > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_GAINED", iGold1));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_LOST", -iGold1));
}
}
}
else
{
if (NO_PLAYER != eOtherPlayer && kEvent.isGoldToPlayer())
{
if (iGold1 > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_RANGE_FROM_PLAYER", iGold1, iGold2, GET_PLAYER(eOtherPlayer).getNameKey()));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_RANGE_TO_PLAYER", -iGold1, -iGold2, GET_PLAYER(eOtherPlayer).getNameKey()));
}
}
else
{
if (iGold1 > 0)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_RANGE_GAINED", iGold1, iGold2));
}
else
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_EVENT_GOLD_RANGE_LOST", -iGold1, iGold2));
}
}
}
}
}
void CvGameTextMgr::setTradeRouteHelp(CvWStringBuffer &szBuffer, int iRoute, CvCity* pCity)
{
if (NULL != pCity)
{
CvCity* pOtherCity = pCity->getTradeCity(iRoute);
if (NULL != pOtherCity)
{
szBuffer.append(pOtherCity->getName());
int iProfit = pCity->getBaseTradeProfit(pOtherCity);
szBuffer.append(NEWLINE);
CvWString szBaseProfit;
szBaseProfit.Format(L"%d.%02d", iProfit/100, iProfit%100);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_HELP_BASE", szBaseProfit.GetCString()));
int iModifier = 100;
int iNewMod;
for (int iBuilding = 0; iBuilding < GC.getNumBuildingInfos(); ++iBuilding)
{
if (pCity->getNumActiveBuilding((BuildingTypes)iBuilding) > 0)
{
iNewMod = pCity->getNumActiveBuilding((BuildingTypes)iBuilding) * GC.getBuildingInfo((BuildingTypes)iBuilding).getTradeRouteModifier();
if (0 != iNewMod)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_MOD_BUILDING", GC.getBuildingInfo((BuildingTypes)iBuilding).getTextKeyWide(), iNewMod));
iModifier += iNewMod;
}
}
}
iNewMod = pCity->getPopulationTradeModifier();
if (0 != iNewMod)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_MOD_POPULATION", iNewMod));
iModifier += iNewMod;
}
if (pCity->isConnectedToCapital())
{
iNewMod = GC.getDefineINT("CAPITAL_TRADE_MODIFIER");
if (0 != iNewMod)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_MOD_CAPITAL", iNewMod));
iModifier += iNewMod;
}
}
/************************************************************************************************/
/* Afforess Start 03/8/10 */
/* */
/* */
/************************************************************************************************/
iNewMod = GET_TEAM(pCity->getTeam()).getTradeModifier();
if (0 != iNewMod)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_TECH", iNewMod));
iModifier += iNewMod;
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (NULL != pOtherCity)
{
if (pCity->area() != pOtherCity->area())
{
iNewMod = GC.getDefineINT("OVERSEAS_TRADE_MODIFIER");
if (0 != iNewMod)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_MOD_OVERSEAS", iNewMod));
iModifier += iNewMod;
}
}
if (pCity->getTeam() != pOtherCity->getTeam())
{
iNewMod = pCity->getForeignTradeRouteModifier();
/************************************************************************************************/
/* Afforess Start 04/14/10 */
/* */
/* */
/************************************************************************************************/
iNewMod += GET_TEAM(pCity->getTeam()).getForeignTradeModifier();
iNewMod += GET_PLAYER(pCity->getOwnerINLINE()).getForeignTradeRouteModifier();
for (int iI = 0; iI < GC.getNumCivicOptionInfos(); iI++)
{
if (GET_PLAYER(pCity->getOwnerINLINE()).getCivics((CivicOptionTypes)iI) == GET_PLAYER(pOtherCity->getOwnerINLINE()).getCivics((CivicOptionTypes)iI))
{
if (GET_PLAYER(pCity->getOwnerINLINE()).getCivics((CivicOptionTypes)iI) != NO_CIVIC)
{
iNewMod += GC.getCivicInfo(GET_PLAYER(pCity->getOwnerINLINE()).getCivics((CivicOptionTypes)iI)).getSharedCivicTradeRouteModifier();
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
if (0 != iNewMod)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_MOD_FOREIGN", iNewMod));
iModifier += iNewMod;
}
iNewMod = pCity->getPeaceTradeModifier(pOtherCity->getTeam());
if (0 != iNewMod)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_MOD_PEACE", iNewMod));
iModifier += iNewMod;
}
}
}
FAssert(pCity->totalTradeModifier(pOtherCity) == iModifier);
iProfit *= iModifier;
// BUG - Fractional Trade Routes - start
#ifdef _MOD_FRACTRADE
iProfit /= 100;
FAssert(iProfit == pCity->calculateTradeProfitTimes100(pOtherCity));
#else
iProfit /= 10000;
FAssert(iProfit == pCity->calculateTradeProfit(pOtherCity));
#endif
// BUG - Fractional Trade Routes - end
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
// BUG - Fractional Trade Routes - start
#ifdef _MOD_FRACTRADE
CvWString szProfit;
szProfit.Format(L"%d.%02d", iProfit / 100, iProfit % 100);
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_TOTAL_FRACTIONAL", szProfit.GetCString()));
#else
szBuffer.append(gDLL->getText("TXT_KEY_TRADE_ROUTE_TOTAL", iProfit));
#endif
// BUG - Fractional Trade Routes - end
}
}
}
void CvGameTextMgr::setEspionageCostHelp(CvWStringBuffer &szBuffer, EspionageMissionTypes eMission, PlayerTypes eTargetPlayer, const CvPlot* pPlot, int iExtraData, const CvUnit* pSpyUnit)
{
CvPlayer& kPlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CvEspionageMissionInfo& kMission = GC.getEspionageMissionInfo(eMission);
//szBuffer.assign(kMission.getDescription());
int iMissionCost = kPlayer.getEspionageMissionBaseCost(eMission, eTargetPlayer, pPlot, iExtraData, pSpyUnit);
if (kMission.isDestroyImprovement())
{
if (NULL != pPlot && NO_IMPROVEMENT != pPlot->getImprovementType())
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_DESTROY_IMPROVEMENT", GC.getImprovementInfo(pPlot->getImprovementType()).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
}
if (kMission.getDestroyBuildingCostFactor() > 0)
{
BuildingTypes eTargetBuilding = (BuildingTypes)iExtraData;
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_DESTROY_IMPROVEMENT", GC.getBuildingInfo(eTargetBuilding).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getDestroyProjectCostFactor() > 0)
{
ProjectTypes eTargetProject = (ProjectTypes)iExtraData;
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_DESTROY_IMPROVEMENT", GC.getProjectInfo(eTargetProject).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getDestroyProductionCostFactor() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_DESTROY_PRODUCTION", pCity->getProduction()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getDestroyUnitCostFactor() > 0)
{
if (NO_PLAYER != eTargetPlayer)
{
int iTargetUnitID = iExtraData;
CvUnit* pUnit = GET_PLAYER(eTargetPlayer).getUnit(iTargetUnitID);
if (NULL != pUnit)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_DESTROY_UNIT", pUnit->getNameKey()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getBuyUnitCostFactor() > 0)
{
if (NO_PLAYER != eTargetPlayer)
{
int iTargetUnitID = iExtraData;
CvUnit* pUnit = GET_PLAYER(eTargetPlayer).getUnit(iTargetUnitID);
if (NULL != pUnit)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_BRIBE", pUnit->getNameKey()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getBuyCityCostFactor() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_BRIBE", pCity->getNameKey()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getCityInsertCultureCostFactor() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity && pPlot->getCulture(GC.getGameINLINE().getActivePlayer()) > 0)
{
int iCultureAmount = kMission.getCityInsertCultureAmountFactor() * pCity->countTotalCultureTimes100();
iCultureAmount /= 10000;
iCultureAmount = std::max(1, iCultureAmount);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_INSERT_CULTURE", pCity->getNameKey(), iCultureAmount, kMission.getCityInsertCultureAmountFactor()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getCityPoisonWaterCounter() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_POISON", kMission.getCityPoisonWaterCounter(), gDLL->getSymbolID(UNHEALTHY_CHAR), pCity->getNameKey(), kMission.getCityPoisonWaterCounter()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getCityUnhappinessCounter() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_POISON", kMission.getCityUnhappinessCounter(), gDLL->getSymbolID(UNHAPPY_CHAR), pCity->getNameKey(), kMission.getCityUnhappinessCounter()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getCityRevoltCounter() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_REVOLT", pCity->getNameKey(), kMission.getCityRevoltCounter()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getStealTreasuryTypes() > 0)
{
if (NO_PLAYER != eTargetPlayer)
{
int iNumTotalGold = (GET_PLAYER(eTargetPlayer).getGold() * kMission.getStealTreasuryTypes()) / 100;
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
iNumTotalGold *= pCity->getPopulation();
iNumTotalGold /= std::max(1, GET_PLAYER(eTargetPlayer).getTotalPopulation());
}
}
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_STEAL_TREASURY", iNumTotalGold, GET_PLAYER(eTargetPlayer).getCivilizationAdjectiveKey()));
szBuffer.append(NEWLINE);
}
}
if (kMission.getBuyTechCostFactor() > 0)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_STEAL_TECH", GC.getTechInfo((TechTypes)iExtraData).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
if (kMission.getSwitchCivicCostFactor() > 0)
{
if (NO_PLAYER != eTargetPlayer)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_SWITCH_CIVIC", GET_PLAYER(eTargetPlayer).getNameKey(), GC.getCivicInfo((CivicTypes)iExtraData).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
}
if (kMission.getSwitchReligionCostFactor() > 0)
{
if (NO_PLAYER != eTargetPlayer)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_SWITCH_CIVIC", GET_PLAYER(eTargetPlayer).getNameKey(), GC.getReligionInfo((ReligionTypes)iExtraData).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
}
if (kMission.getPlayerAnarchyCounter() > 0)
{
if (NO_PLAYER != eTargetPlayer)
{
int iTurns = (kMission.getPlayerAnarchyCounter() * GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getAnarchyPercent()) / 100;
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_ANARCHY", GET_PLAYER(eTargetPlayer).getNameKey(), iTurns));
szBuffer.append(NEWLINE);
}
}
if (kMission.getCounterespionageNumTurns() > 0 && kMission.getCounterespionageMod() > 0)
{
if (NO_PLAYER != eTargetPlayer)
{
int iTurns = (kMission.getCounterespionageNumTurns() * GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getResearchPercent()) / 100;
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_COUNTERESPIONAGE", kMission.getCounterespionageMod(), GET_PLAYER(eTargetPlayer).getCivilizationAdjectiveKey(), iTurns));
szBuffer.append(NEWLINE);
}
}
/************************************************************************************************/
/* Afforess Start 06/29/10 */
/* */
/* */
/************************************************************************************************/
if (kMission.isNuke())
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_NUKE", pCity->getNameKey()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.isRevolt())
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_REVOLTUTION", pCity->getNameKey()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.isDisablePower())
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
int iTurns = 6;
iTurns *= GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getTrainPercent();
iTurns /= 100;
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_POWER", pCity->getNameKey(), iTurns));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getWarWearinessCounter() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_WAR_WEARINESS", pCity->getNameKey(), kMission.getWarWearinessCounter()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getSabatogeResearchCostFactor() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_SABATOGE_RESEARCH", GET_PLAYER(eTargetPlayer).getNameKey(), GC.getTechInfo(GET_PLAYER(eTargetPlayer).getCurrentResearch()).getTextKeyWide()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getRemoveReligionsCostFactor() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_REMOVE_RELIGIONS", GC.getReligionInfo((ReligionTypes)iExtraData).getTextKeyWide(), pCity->getNameKey()));
szBuffer.append(NEWLINE);
}
}
}
if (kMission.getRemoveCorporationsCostFactor() > 0)
{
if (NULL != pPlot)
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_HELP_REMOVE_RELIGIONS", GC.getCorporationInfo((CorporationTypes)iExtraData).getTextKeyWide(), pCity->getNameKey()));
szBuffer.append(NEWLINE);
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_BASE_COST", iMissionCost));
if (kPlayer.getEspionageMissionCost(eMission, eTargetPlayer, pPlot, iExtraData, pSpyUnit) > 0)
{
int iModifier = 100;
int iTempModifier = 0;
CvCity* pCity = NULL;
if (NULL != pPlot)
{
pCity = pPlot->getPlotCity();
}
if (pCity != NULL && GC.getEspionageMissionInfo(eMission).isTargetsCity())
{
// City Population
iTempModifier = (GC.getDefineINT("ESPIONAGE_CITY_POP_EACH_MOD") * (pCity->getPopulation() - 1));
if (0 != iTempModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_POPULATION_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
// Trade Route
if (pCity->isTradeRoute(kPlayer.getID()))
{
iTempModifier = GC.getDefineINT("ESPIONAGE_CITY_TRADE_ROUTE_MOD");
if (0 != iTempModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_TRADE_ROUTE_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
}
ReligionTypes eReligion = kPlayer.getStateReligion();
if (NO_RELIGION != eReligion)
{
iTempModifier = 0;
if (pCity->isHasReligion(eReligion))
{
if (GET_PLAYER(eTargetPlayer).getStateReligion() != eReligion)
{
iTempModifier += GC.getDefineINT("ESPIONAGE_CITY_RELIGION_STATE_MOD");
}
if (kPlayer.hasHolyCity(eReligion))
{
iTempModifier += GC.getDefineINT("ESPIONAGE_CITY_HOLY_CITY_MOD");
}
}
if (0 != iTempModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_RELIGION_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
}
// City's culture affects cost
iTempModifier = - (pCity->getCultureTimes100(kPlayer.getID()) * GC.getDefineINT("ESPIONAGE_CULTURE_MULTIPLIER_MOD")) / std::max(1, pCity->getCultureTimes100(eTargetPlayer) + pCity->getCultureTimes100(kPlayer.getID()));
if (0 != iTempModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_CULTURE_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
iTempModifier = pCity->getEspionageDefenseModifier();
if (0 != iTempModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_DEFENSE_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
}
// Distance mod
if (pPlot != NULL)
{
int iDistance = GC.getMap().maxPlotDistance();
CvCity* pOurCapital = kPlayer.getCapitalCity();
if (NULL != pOurCapital)
{
if (kMission.isSelectPlot() || kMission.isTargetsCity())
{
iDistance = plotDistance(pOurCapital->getX_INLINE(), pOurCapital->getY_INLINE(), pPlot->getX_INLINE(), pPlot->getY_INLINE());
}
else
{
CvCity* pTheirCapital = GET_PLAYER(eTargetPlayer).getCapitalCity();
if (NULL != pTheirCapital)
{
iDistance = plotDistance(pOurCapital->getX_INLINE(), pOurCapital->getY_INLINE(), pTheirCapital->getX_INLINE(), pTheirCapital->getY_INLINE());
}
}
}
iTempModifier = (iDistance + GC.getMapINLINE().maxPlotDistance()) * GC.getDefineINT("ESPIONAGE_DISTANCE_MULTIPLIER_MOD") / GC.getMapINLINE().maxPlotDistance() - 100;
if (0 != iTempModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_DISTANCE_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
}
// Spy presence mission cost alteration
if (NULL != pSpyUnit)
{
iTempModifier = -(std::min(5,(pSpyUnit->getFortifyTurns() + (pSpyUnit->getUpgradeDiscount()/10))) * GC.getDefineINT("ESPIONAGE_EACH_TURN_UNIT_COST_DECREASE"));
if (0 != iTempModifier)
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_SPY_STATIONARY_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
}
// My points VS. Your points to mod cost
iTempModifier = ::getEspionageModifier(kPlayer.getTeam(), GET_PLAYER(eTargetPlayer).getTeam()) - 100;
if (0 != iTempModifier)
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_EP_RATIO_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
// Counterespionage Mission Mod
CvTeam& kTargetTeam = GET_TEAM(GET_PLAYER(eTargetPlayer).getTeam());
if (kTargetTeam.getCounterespionageModAgainstTeam(kPlayer.getTeam()) > 0)
{
iTempModifier = kTargetTeam.getCounterespionageModAgainstTeam(kPlayer.getTeam()) - 100;
if (0 != iTempModifier)
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_COUNTERESPIONAGE_MOD", iTempModifier));
iModifier *= 100 + iTempModifier;
iModifier /= 100;
}
}
/************************************************************************************************/
/* Afforess 12/7/09 */
/* */
/* */
/************************************************************************************************/
if (pCity != NULL)
{
if (pCity == GET_PLAYER(pCity->getOwnerINLINE()).getCapitalCity() && kTargetTeam.isHasEmbassy(kPlayer.getTeam()))
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_EMBASSY_MOD", -GC.getDefineINT("EMBASSY_ESPIONAGE_MISSION_COST_MODIFIER")));
iModifier *= 100 - 25;
iModifier /= 100;
}
if (kTargetTeam.isFreeTradeAgreement(kPlayer.getTeam()))
{
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_FREE_TRADE_AGREEMENT_MOD", -GC.getDefineINT("FREE_TRADE_AGREEMENT_ESPIONAGE_MISSION_COST_MODIFIER")));
iModifier *= 100 - GC.getDefineINT("FREE_TRADE_AGREEMENT_ESPIONAGE_MISSION_COST_MODIFIER");
iModifier /= 100;
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
FAssert(iModifier == kPlayer.getEspionageMissionCostModifier(eMission, eTargetPlayer, pPlot, iExtraData, pSpyUnit));
iMissionCost *= iModifier;
iMissionCost /= 100;
FAssert(iMissionCost == kPlayer.getEspionageMissionCost(eMission, eTargetPlayer, pPlot, iExtraData, pSpyUnit));
szBuffer.append(SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_COST_TOTAL", iMissionCost));
if (NULL != pSpyUnit)
{
int iInterceptChance = (pSpyUnit->getSpyInterceptPercent(GET_PLAYER(eTargetPlayer).getTeam()) * (100 + kMission.getDifficultyMod())) / 100;
szBuffer.append(NEWLINE);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_ESPIONAGE_CHANCE_OF_SUCCESS", std::min(100, std::max(0, 100 - iInterceptChance))));
}
}
}
void CvGameTextMgr::getTradeScreenTitleIcon(CvString& szButton, CvWidgetDataStruct& widgetData, PlayerTypes ePlayer)
{
szButton.clear();
ReligionTypes eReligion = GET_PLAYER(ePlayer).getStateReligion();
if (eReligion != NO_RELIGION)
{
szButton = GC.getReligionInfo(eReligion).getButton();
widgetData.m_eWidgetType = WIDGET_HELP_RELIGION;
widgetData.m_iData1 = eReligion;
widgetData.m_iData2 = -1;
widgetData.m_bOption = false;
}
}
void CvGameTextMgr::getTradeScreenIcons(std::vector< std::pair<CvString, CvWidgetDataStruct> >& aIconInfos, PlayerTypes ePlayer)
{
aIconInfos.clear();
for (int i = 0; i < GC.getNumCivicOptionInfos(); i++)
{
CivicTypes eCivic = GET_PLAYER(ePlayer).getCivics((CivicOptionTypes)i);
CvWidgetDataStruct widgetData;
widgetData.m_eWidgetType = WIDGET_PEDIA_JUMP_TO_CIVIC;
widgetData.m_iData1 = eCivic;
widgetData.m_iData2 = -1;
widgetData.m_bOption = false;
aIconInfos.push_back(std::make_pair(GC.getCivicInfo(eCivic).getButton(), widgetData));
}
}
void CvGameTextMgr::getTradeScreenHeader(CvWString& szHeader, PlayerTypes ePlayer, PlayerTypes eOtherPlayer, bool bAttitude)
{
CvPlayer& kPlayer = GET_PLAYER(ePlayer);
szHeader.Format(L"%s - %s", CvWString(kPlayer.getName()).GetCString(), CvWString(kPlayer.getCivilizationDescription()).GetCString());
if (bAttitude)
{
szHeader += CvWString::format(L" (%s)", GC.getAttitudeInfo(kPlayer.AI_getAttitude(eOtherPlayer)).getDescription());
}
}
// BUG - Trade Hover - start
void CvGameTextMgr::buildDomesticTradeString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
buildTradeString(szBuffer, ePlayer, NO_PLAYER, true, false, false);
}
void CvGameTextMgr::buildForeignTradeString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer)
{
buildTradeString(szBuffer, ePlayer, NO_PLAYER, false, true, false);
}
void CvGameTextMgr::buildTradeString(CvWStringBuffer& szBuffer, PlayerTypes ePlayer, PlayerTypes eWithPlayer, bool bDomestic, bool bForeign, bool bHeading)
{
if (NO_PLAYER == ePlayer)
{
return;
}
CvPlayer& player = GET_PLAYER(ePlayer);
if (bHeading)
{
if (ePlayer == eWithPlayer)
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_DOMESTIC_TRADE_HEADING"));
}
else if (NO_PLAYER != eWithPlayer)
{
if (player.canHaveTradeRoutesWith(eWithPlayer))
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_FOREIGN_TRADE_HEADING", GET_PLAYER(eWithPlayer).getNameKey(), GET_PLAYER(eWithPlayer).getCivilizationShortDescription()));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_CANNOT_TRADE_HEADING", GET_PLAYER(eWithPlayer).getNameKey(), GET_PLAYER(eWithPlayer).getCivilizationShortDescription()));
}
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_TRADE_HEADING"));
}
szBuffer.append(NEWLINE);
}
if (NO_PLAYER != eWithPlayer)
{
bDomestic = ePlayer == eWithPlayer;
bForeign = ePlayer != eWithPlayer;
if (bForeign && !player.canHaveTradeRoutesWith(eWithPlayer))
{
CvPlayer& withPlayer = GET_PLAYER(eWithPlayer);
bool bCanTrade = true;
if (!GET_PLAYER(eWithPlayer).isAlive())
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_CANNOT_TRADE_DEAD"));
return;
}
if (!player.canTradeNetworkWith(eWithPlayer))
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_CANNOT_TRADE_NETWORK_NOT_CONNECTED"));
bCanTrade = false;
}
if (!GET_TEAM(player.getTeam()).isFreeTrade(withPlayer.getTeam()))
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_CANNOT_TRADE_CLOSED_BORDERS"));
bCanTrade = false;
}
if (player.isNoForeignTrade())
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_CANNOT_TRADE_FOREIGN_YOU"));
bCanTrade = false;
}
if (withPlayer.isNoForeignTrade())
{
szBuffer.append(gDLL->getText("TXT_KEY_BUG_CANNOT_TRADE_FOREIGN_THEM"));
bCanTrade = false;
}
if (!bCanTrade)
{
return;
}
}
}
int iDomesticYield = 0;
int iDomesticRoutes = 0;
int iForeignYield = 0;
int iForeignRoutes = 0;
player.calculateTradeTotals(YIELD_COMMERCE, iDomesticYield, iDomesticRoutes, iForeignYield, iForeignRoutes, eWithPlayer, false);
int iTotalYield = 0;
int iTotalRoutes = 0;
if (bDomestic)
{
iTotalYield += iDomesticYield;
iTotalRoutes += iDomesticRoutes;
}
if (bForeign)
{
iTotalYield += iForeignYield;
iTotalRoutes += iForeignRoutes;
}
CvWString szYield;
// BUG - Fractional Trade Routes - start
#ifdef _MOD_FRACTRADE
szYield.Format(L"%d.%02d", iTotalYield / 100, iTotalYield % 100);
#else
szYield.Format(L"%d", iTotalYield);
#endif
// BUG - Fractional Trade Routes - end
szBuffer.append(gDLL->getText("TXT_KEY_BUG_TOTAL_TRADE_YIELD", szYield.GetCString()));
szBuffer.append(gDLL->getText("TXT_KEY_BUG_TOTAL_TRADE_ROUTES", iTotalRoutes));
if (iTotalRoutes > 0)
{
// BUG - Fractional Trade Routes - start
#ifdef _MOD_FRACTRADE
int iAverage = iTotalYield / iTotalRoutes;
#else
int iAverage = 100 * iTotalYield / iTotalRoutes;
#endif
// BUG - Fractional Trade Routes - end
CvWString szAverage;
szAverage.Format(L"%d.%02d", iAverage / 100, iAverage % 100);
szBuffer.append(gDLL->getText("TXT_KEY_BUG_AVERAGE_TRADE_YIELD", szAverage.GetCString()));
}
}
// BUG - Trade Hover - end
void CvGameTextMgr::getGlobeLayerName(GlobeLayerTypes eType, int iOption, CvWString& strName)
{
switch (eType)
{
case GLOBE_LAYER_STRATEGY:
switch(iOption)
{
case 0:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_STRATEGY_VIEW");
break;
case 1:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_STRATEGY_NEW_LINE");
break;
case 2:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_STRATEGY_NEW_SIGN");
break;
case 3:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_STRATEGY_DELETE");
break;
case 4:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_STRATEGY_DELETE_LINES");
break;
}
break;
case GLOBE_LAYER_UNIT:
switch(iOption)
{
case SHOW_ALL_MILITARY:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_UNITS_ALLMILITARY");
break;
case SHOW_TEAM_MILITARY:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_UNITS_TEAMMILITARY");
break;
case SHOW_ENEMIES_IN_TERRITORY:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_UNITS_ENEMY_TERRITORY_MILITARY");
break;
case SHOW_ENEMIES:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_UNITS_ENEMYMILITARY");
break;
case SHOW_PLAYER_DOMESTICS:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_UNITS_DOMESTICS");
break;
}
break;
case GLOBE_LAYER_RESOURCE:
switch(iOption)
{
case SHOW_ALL_RESOURCES:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_RESOURCES_EVERYTHING");
break;
case SHOW_STRATEGIC_RESOURCES:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_RESOURCES_GENERAL");
break;
case SHOW_HAPPY_RESOURCES:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_RESOURCES_LUXURIES");
break;
case SHOW_HEALTH_RESOURCES:
strName = gDLL->getText("TXT_KEY_GLOBELAYER_RESOURCES_FOOD");
break;
}
break;
case GLOBE_LAYER_RELIGION:
strName = GC.getReligionInfo((ReligionTypes) iOption).getDescription();
break;
case GLOBE_LAYER_CULTURE:
case GLOBE_LAYER_TRADE:
// these have no sub-options
strName.clear();
break;
}
}
void CvGameTextMgr::getPlotHelp(CvPlot* pMouseOverPlot, CvCity* pCity, CvPlot* pFlagPlot, bool bAlt, CvWStringBuffer& strHelp)
{
if (gDLL->getInterfaceIFace()->isCityScreenUp())
{
if (pMouseOverPlot != NULL)
{
CvCity* pHeadSelectedCity = gDLL->getInterfaceIFace()->getHeadSelectedCity();
if (pHeadSelectedCity != NULL)
{
if (pMouseOverPlot->getWorkingCity() == pHeadSelectedCity)
{
if (pMouseOverPlot->isRevealed(GC.getGameINLINE().getActiveTeam(), true))
{
setPlotHelp(strHelp, pMouseOverPlot);
}
}
}
}
}
else
{
if (pCity != NULL)
{
setCityBarHelp(strHelp, pCity);
}
else if (pFlagPlot != NULL)
{
setPlotListHelp(strHelp, pFlagPlot, false, true);
}
if (strHelp.isEmpty())
{
if (pMouseOverPlot != NULL)
{
if ((pMouseOverPlot == gDLL->getInterfaceIFace()->getGotoPlot()) || bAlt)
{
if (pMouseOverPlot->isActiveVisible(true))
{
setCombatPlotHelp(strHelp, pMouseOverPlot);
}
}
}
}
if (strHelp.isEmpty())
{
if (pMouseOverPlot != NULL)
{
if (pMouseOverPlot->isRevealed(GC.getGameINLINE().getActiveTeam(), true))
{
if (pMouseOverPlot->isActiveVisible(true))
{
setPlotListHelp(strHelp, pMouseOverPlot, true, false);
if (!strHelp.isEmpty())
{
strHelp.append(L"\n");
}
}
setPlotHelp(strHelp, pMouseOverPlot);
}
}
}
/************************************************************************************************/
/* Afforess Start 07/19/10 */
/* */
/* */
/************************************************************************************************/
if (pMouseOverPlot != NULL)
{
if (pMouseOverPlot->isRevealed(GC.getGameINLINE().getActiveTeam(), true))
{
if (pMouseOverPlot->isActiveVisible(true))
{
if (pMouseOverPlot->getTeam() != NO_TEAM)
{
if (gDLL->getInterfaceIFace()->getHeadSelectedUnit() != NULL)
{
if (GET_TEAM(pMouseOverPlot->getTeam()).isAtWar(gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getTeam()))
{
if( !gDLL->getInterfaceIFace()->getHeadSelectedUnit()->canMoveInto(pMouseOverPlot))
{
CvWString szTempBuffer;
szTempBuffer.clear();
if (pMouseOverPlot->isCity())
{
int iMinimumDefenseLevel = MAX_INT;
BuildingTypes eBestBuilding = NO_BUILDING;
for (int iI = 0; iI < GC.getNumBuildingInfos(); iI++)
{
if (pMouseOverPlot->getPlotCity()->getNumActiveBuilding((BuildingTypes)iI) > 0)
{
if (GC.getBuildingInfo((BuildingTypes)iI).getNoEntryDefenseLevel() > 0)
{
if (GC.getBuildingInfo((BuildingTypes)iI).getNoEntryDefenseLevel() < iMinimumDefenseLevel)
{
iMinimumDefenseLevel = GC.getBuildingInfo((BuildingTypes)iI).getNoEntryDefenseLevel();
eBestBuilding = (BuildingTypes)iI;
}
}
}
}
if (pMouseOverPlot->getPlotCity()->getDefenseModifier(false) > iMinimumDefenseLevel && eBestBuilding != NO_BUILDING)
{
szTempBuffer.clear();
szTempBuffer.append(gDLL->getText("TXT_KEY_PLOT_HOVER_MAX_CITY_DEFENSES", pMouseOverPlot->getPlotCity()->getNameKey(), GC.getBuildingInfo(eBestBuilding).getDescription(), GC.getBuildingInfo(eBestBuilding).getDescription(), iMinimumDefenseLevel));
}
}
else
{
//Fort ZOC
PlayerTypes eDefender = gDLL->getInterfaceIFace()->getHeadSelectedUnit()->plot()->controlsAdjacentFort(gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getTeam());
if (eDefender != NO_PLAYER)
{
const CvPlot* pZoneOfControl = gDLL->getInterfaceIFace()->getHeadSelectedUnit()->plot()->isInFortControl(true, eDefender, gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getOwnerINLINE());
const CvPlot* pForwardZoneOfControl = pMouseOverPlot->isInFortControl(true, eDefender, gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getOwnerINLINE());
if (pZoneOfControl != NULL && pForwardZoneOfControl != NULL)
{
if (pZoneOfControl == pMouseOverPlot->isInFortControl(true, eDefender, gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getOwnerINLINE(), pZoneOfControl))
{
szTempBuffer.clear();
szTempBuffer.append(gDLL->getText("TXT_KEY_PLOT_HOVER_FORT_ZOC"));
}
}
}
//City ZoC
if (gDLL->getInterfaceIFace()->getHeadSelectedUnit()->plot()->isInCityZoneOfControl(gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getOwnerINLINE()) && pMouseOverPlot->isInCityZoneOfControl(gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getOwnerINLINE()))
{
szTempBuffer.clear();
szTempBuffer.append(gDLL->getText("TXT_KEY_PLOT_HOVER_CITY_ZOC"));
}
//Promotion ZoC
if (gDLL->getInterfaceIFace()->getHeadSelectedUnit()->plot()->isInUnitZoneOfControl(gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getOwnerINLINE()) && pMouseOverPlot->isInUnitZoneOfControl(gDLL->getInterfaceIFace()->getHeadSelectedUnit()->getOwnerINLINE()))
{
szTempBuffer.clear();
szTempBuffer.append(gDLL->getText("TXT_KEY_PLOT_HOVER_UNIT_ZOC"));
}
}
if (szTempBuffer != L"")
{
strHelp.assign(szTempBuffer);
}
}
}
}
}
}
}
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
InterfaceModeTypes eInterfaceMode = gDLL->getInterfaceIFace()->getInterfaceMode();
if (eInterfaceMode != INTERFACEMODE_SELECTION)
{
CvWString szTempBuffer;
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR NEWLINE, TEXT_COLOR("COLOR_HIGHLIGHT_TEXT"), GC.getInterfaceModeInfo(eInterfaceMode).getDescription());
switch (eInterfaceMode)
{
case INTERFACEMODE_REBASE:
getRebasePlotHelp(pMouseOverPlot, szTempBuffer);
break;
case INTERFACEMODE_NUKE:
getNukePlotHelp(pMouseOverPlot, szTempBuffer);
break;
/************************************************************************************************/
/* Afforess Start 09/18/10 */
/* */
/* Advanced Automations */
/************************************************************************************************/
case INTERFACEMODE_SHADOW_UNIT:
{
CvUnit* pHeadSelectedUnit = gDLL->getInterfaceIFace()->getHeadSelectedUnit();
if (NULL != pHeadSelectedUnit && pMouseOverPlot != NULL)
{
CvUnit* pShadowUnit = pMouseOverPlot->getCenterUnit();
if (!pHeadSelectedUnit->getGroup()->canDoInterfaceModeAt(eInterfaceMode, pMouseOverPlot))
{
strHelp.clear();
if (pShadowUnit != NULL)
{
CvUnit* pLoopShadow = NULL;
CLLNode<IDInfo>* pUnitShadowNode = NULL;
int iValidShadowUnits = 0;
pUnitShadowNode = pMouseOverPlot->headUnitNode();
while (pUnitShadowNode != NULL)
{
pLoopShadow = ::getUnit(pUnitShadowNode->m_data);
pUnitShadowNode = pMouseOverPlot->nextUnitNode(pUnitShadowNode);
if (pHeadSelectedUnit->canShadowAt(pMouseOverPlot, pLoopShadow))
{
iValidShadowUnits++;
}
}
if (iValidShadowUnits == 0)
{
bool bFirst = true;
if (pShadowUnit->baseMoves() > pHeadSelectedUnit->baseMoves())
{
if (!bFirst)
strHelp.append(L"\n");
strHelp.append(gDLL->getText("TXT_KEY_CAN_NOT_AUTOMATE_PROTECT_NOT_FAST_ENOUGH", pShadowUnit->getNameKey(), pHeadSelectedUnit->getNameKey(), pShadowUnit->baseMoves(), pShadowUnit->getNameKey()));
bFirst = false;
}
if (pShadowUnit->getTeam() != pHeadSelectedUnit->getTeam())
{
if (!bFirst)
strHelp.append(L"\n");
strHelp.append(gDLL->getText("TXT_KEY_CAN_NOT_AUTOMATE_PROTECT_DIFFERENT_TEAM", pShadowUnit->getNameKey()));
bFirst = false;
}
if (pShadowUnit == pHeadSelectedUnit)
{
if (!bFirst)
strHelp.append(L"\n");
strHelp.append(gDLL->getText("TXT_KEY_CAN_NOT_AUTOMATE_PROTECT_YOURSELF"));
bFirst = false;
}
}
}
}
}
}
break;
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
default:
break;
}
szTempBuffer += strHelp.getCString();
strHelp.assign(szTempBuffer);
}
}
//Calvitix : Test to transfert the Hover text into Python (Goal : to enlarge the width of the hover display)
/*if (pMouseOverPlot != NULL)
{
CyArgsList argsList;
argsList.add(strHelp.getCString());
long lResult=0;
PYTHON_CALL_FUNCTION4(__FUNCTION__, "CvScreensInterface", "showHoverHelpText", argsList.makeFunctionArgs(), &lResult);
}*/
//strHelp.clear();
}
void CvGameTextMgr::getRebasePlotHelp(CvPlot* pPlot, CvWString& strHelp)
{
if (NULL != pPlot)
{
CvUnit* pHeadSelectedUnit = gDLL->getInterfaceIFace()->getHeadSelectedUnit();
if (NULL != pHeadSelectedUnit)
{
if (pPlot->isFriendlyCity(*pHeadSelectedUnit, true))
{
CvCity* pCity = pPlot->getPlotCity();
if (NULL != pCity)
{
int iNumUnits = pCity->plot()->countNumAirUnits(GC.getGameINLINE().getActiveTeam());
bool bFull = (iNumUnits >= pCity->getAirUnitCapacity(GC.getGameINLINE().getActiveTeam()));
if (bFull)
{
strHelp += CvWString::format(SETCOLR, TEXT_COLOR("COLOR_WARNING_TEXT"));
}
strHelp += NEWLINE + gDLL->getText("TXT_KEY_CITY_BAR_AIR_UNIT_CAPACITY", iNumUnits, pCity->getAirUnitCapacity(GC.getGameINLINE().getActiveTeam()));
if (bFull)
{
strHelp += ENDCOLR;
}
strHelp += NEWLINE;
}
}
}
}
}
void CvGameTextMgr::getNukePlotHelp(CvPlot* pPlot, CvWString& strHelp)
{
if (NULL != pPlot)
{
CvUnit* pHeadSelectedUnit = gDLL->getInterfaceIFace()->getHeadSelectedUnit();
if (NULL != pHeadSelectedUnit)
{
for (int iI = 0; iI < MAX_TEAMS; iI++)
{
if (pHeadSelectedUnit->isNukeVictim(pPlot, ((TeamTypes)iI)))
{
if (!pHeadSelectedUnit->isEnemy((TeamTypes)iI))
{
strHelp += NEWLINE + gDLL->getText("TXT_KEY_CANT_NUKE_FRIENDS");
break;
}
}
}
}
}
}
void CvGameTextMgr::getInterfaceCenterText(CvWString& strText)
{
strText.clear();
if (!gDLL->getInterfaceIFace()->isCityScreenUp())
{
if (GC.getGameINLINE().getWinner() != NO_TEAM)
{
strText = gDLL->getText("TXT_KEY_MISC_WINS_VICTORY", GET_TEAM(GC.getGameINLINE().getWinner()).getName().GetCString(), GC.getVictoryInfo(GC.getGameINLINE().getVictory()).getTextKeyWide());
}
else if (!(GET_PLAYER(GC.getGameINLINE().getActivePlayer()).isAlive()))
{
strText = gDLL->getText("TXT_KEY_MISC_DEFEAT");
}
}
}
void CvGameTextMgr::getTurnTimerText(CvWString& strText)
{
strText.clear();
if (gDLL->getInterfaceIFace()->getShowInterface() == INTERFACE_SHOW || gDLL->getInterfaceIFace()->getShowInterface() == INTERFACE_ADVANCED_START)
{
if (GC.getGameINLINE().isMPOption(MPOPTION_TURN_TIMER))
{
// Get number of turn slices remaining until end-of-turn
int iTurnSlicesRemaining = GC.getGameINLINE().getTurnSlicesRemaining();
if (iTurnSlicesRemaining > 0)
{
// Get number of seconds remaining
int iTurnSecondsRemaining = ((int)floorf((float)(iTurnSlicesRemaining-1) * ((float)gDLL->getMillisecsPerTurn()/1000.0f)) + 1);
int iTurnMinutesRemaining = (int)(iTurnSecondsRemaining/60);
iTurnSecondsRemaining = (iTurnSecondsRemaining%60);
int iTurnHoursRemaining = (int)(iTurnMinutesRemaining/60);
iTurnMinutesRemaining = (iTurnMinutesRemaining%60);
// Display time remaining
CvWString szTempBuffer;
szTempBuffer.Format(L"%d:%02d:%02d", iTurnHoursRemaining, iTurnMinutesRemaining, iTurnSecondsRemaining);
strText += szTempBuffer;
}
else
{
// Flash zeroes
if (iTurnSlicesRemaining % 2 == 0)
{
// Display 0
strText+=L"0:00";
}
}
}
if (GC.getGameINLINE().getGameState() == GAMESTATE_ON)
{
int iMinVictoryTurns = MAX_INT;
for (int i = 0; i < GC.getNumVictoryInfos(); ++i)
{
TeamTypes eActiveTeam = GC.getGameINLINE().getActiveTeam();
if (NO_TEAM != eActiveTeam)
{
int iCountdown = GET_TEAM(eActiveTeam).getVictoryCountdown((VictoryTypes)i);
if (iCountdown > 0 && iCountdown < iMinVictoryTurns)
{
iMinVictoryTurns = iCountdown;
}
}
}
if (GC.getGameINLINE().isOption(GAMEOPTION_ADVANCED_START) && !GC.getGameINLINE().isOption(GAMEOPTION_ALWAYS_WAR) && GC.getGameINLINE().getElapsedGameTurns() <= getTreatyLength())
{
if (!strText.empty())
{
strText += L" -- ";
}
strText += gDLL->getText("TXT_KEY_MISC_ADVANCED_START_PEACE_REMAINING", getTreatyLength() - GC.getGameINLINE().getElapsedGameTurns());
}
else if (iMinVictoryTurns < MAX_INT)
{
if (!strText.empty())
{
strText += L" -- ";
}
strText += gDLL->getText("TXT_KEY_MISC_TURNS_LEFT_TO_VICTORY", iMinVictoryTurns);
}
else if (GC.getGameINLINE().getMaxTurns() > 0)
{
if ((GC.getGameINLINE().getElapsedGameTurns() >= (GC.getGameINLINE().getMaxTurns() - 100)) && (GC.getGameINLINE().getElapsedGameTurns() < GC.getGameINLINE().getMaxTurns()))
{
if (!strText.empty())
{
strText += L" -- ";
}
strText += gDLL->getText("TXT_KEY_MISC_TURNS_LEFT", (GC.getGameINLINE().getMaxTurns() - GC.getGameINLINE().getElapsedGameTurns()));
}
}
}
}
}
void CvGameTextMgr::getFontSymbols(std::vector< std::vector<wchar> >& aacSymbols, std::vector<int>& aiMaxNumRows)
{
aacSymbols.push_back(std::vector<wchar>());
aiMaxNumRows.push_back(1);
for (int iI = 0; iI < NUM_YIELD_TYPES; iI++)
{
aacSymbols[aacSymbols.size() - 1].push_back((wchar) GC.getYieldInfo((YieldTypes) iI).getChar());
}
aacSymbols.push_back(std::vector<wchar>());
aiMaxNumRows.push_back(2);
for (int iI = 0; iI < NUM_COMMERCE_TYPES; iI++)
{
aacSymbols[aacSymbols.size() - 1].push_back((wchar) GC.getCommerceInfo((CommerceTypes) iI).getChar());
}
aacSymbols.push_back(std::vector<wchar>());
aiMaxNumRows.push_back(23); // There are 26 rows of 25 icons each from the start of religions to the start of the generic symbols, 23 to the beginning of property symbols
for (int iI = 0; iI < GC.getNumReligionInfos(); iI++)
{
aacSymbols[aacSymbols.size() - 1].push_back((wchar) GC.getReligionInfo((ReligionTypes) iI).getChar());
aacSymbols[aacSymbols.size() - 1].push_back((wchar) GC.getReligionInfo((ReligionTypes) iI).getHolyCityChar());
}
for (int iI = 0; iI < GC.getNumCorporationInfos(); iI++)
{
aacSymbols[aacSymbols.size() - 1].push_back((wchar) GC.getCorporationInfo((CorporationTypes) iI).getChar());
aacSymbols[aacSymbols.size() - 1].push_back((wchar) GC.getCorporationInfo((CorporationTypes) iI).getHeadquarterChar());
}
// AIAndy: Property symbols
aacSymbols.push_back(std::vector<wchar>());
aiMaxNumRows.push_back(3); // There are 3 rows of 25 icons each from the start of property symbols to the start of the generic symbols
for (int iI = 0; iI < GC.getNumPropertyInfos(); iI++)
{
aacSymbols[aacSymbols.size() - 1].push_back((wchar) GC.getPropertyInfo((PropertyTypes) iI).getChar());
}
aacSymbols.push_back(std::vector<wchar>());
aiMaxNumRows.push_back(2);
for (int iI = 0; iI < MAX_NUM_SYMBOLS; iI++)
{
aacSymbols[aacSymbols.size() - 1].push_back((wchar) gDLL->getSymbolID(iI));
}
aacSymbols.push_back(std::vector<wchar>());
aiMaxNumRows.push_back(10);
for (int iI = 0; iI < GC.getNumBonusInfos(); iI++)
{
int iChar = GC.getBonusInfo((BonusTypes) iI).getChar();
aacSymbols[aacSymbols.size() - 1].push_back((wchar) iChar);
}
}
void CvGameTextMgr::assignFontIds(int iFirstSymbolCode, int iPadAmount)
{
int iCurSymbolID = iFirstSymbolCode; // first symbol code = 8483
int i;
// set yield symbols
for (i = 0; i < NUM_YIELD_TYPES; i++)
{
GC.getYieldInfo((YieldTypes) i).setChar(iCurSymbolID);
++iCurSymbolID;
}
do
{
++iCurSymbolID;
} while (iCurSymbolID % iPadAmount != 0);
//8500
// set commerce symbols
for (i = 0;i<GC.getNUM_COMMERCE_TYPES();i++)
{
GC.getCommerceInfo((CommerceTypes) i).setChar(iCurSymbolID);
++iCurSymbolID;
}
do
{
++iCurSymbolID;
} while (iCurSymbolID % iPadAmount != 0);
//8525
if (NUM_COMMERCE_TYPES < iPadAmount)
{
do
{
++iCurSymbolID;
} while (iCurSymbolID % iPadAmount != 0);
}
//8550
for (i = 0; i < GC.getNumReligionInfos(); i++)
{
GC.getReligionInfo((ReligionTypes) i).setChar(iCurSymbolID);
++iCurSymbolID;
GC.getReligionInfo((ReligionTypes) i).setHolyCityChar(iCurSymbolID);
++iCurSymbolID;
}
//int iRel = i; //138
//8826
for (i = 0; i < GC.getNumCorporationInfos(); i++)
{
GC.getCorporationInfo((CorporationTypes) i).setChar(iCurSymbolID);
++iCurSymbolID;
GC.getCorporationInfo((CorporationTypes) i).setHeadquarterChar(iCurSymbolID);
++iCurSymbolID;
}
//int iCorp = i;//138
//9102
do
{
++iCurSymbolID;
} while (iCurSymbolID % iPadAmount != 0);
//9125
if (2 * (GC.getNumReligionInfos() + GC.getNumCorporationInfos()) < iPadAmount)
{
do
{
++iCurSymbolID;
} while (iCurSymbolID % iPadAmount != 0);
}
int iSavePosition=iCurSymbolID;
//int propertyBaseID = iSavePosition; //might have to remove this, might cause troubles, by 45deg
// AIAndy: Property symbols
for (i = 0; i < GC.getNumPropertyInfos(); i++)
{
//int propertyID = propertyBaseID + GC.getPropertyInfo((PropertyTypes) i).getFontButtonIndex(); //might have to remove this, might cause troubles, by 45deg
//GC.getPropertyInfo((PropertyTypes) i).setChar(propertyID); //might have to remove this, might cause troubles, by 45deg */
GC.getPropertyInfo((PropertyTypes) i).setChar(iCurSymbolID);
++iCurSymbolID;
}
// modified Sephi
// Symbol loading adjusted to WoC.
// set bonus symbols
int bonusBaseID = iSavePosition + 125;
//++iCurSymbolID;
for (i = 0; i < GC.getNumBonusInfos(); i++)
{
int bonusID = bonusBaseID + GC.getBonusInfo((BonusTypes) i).getArtInfo()->getFontButtonIndex();
GC.getBonusInfo((BonusTypes) i).setChar(bonusID);
//++iCurSymbolID;
}
// 9206
iCurSymbolID=iSavePosition+125;
iCurSymbolID-=MAX_NUM_SYMBOLS;
do
{
--iCurSymbolID;
} while (iCurSymbolID % iPadAmount != 0);
// modified Sephi
// set extra symbols
for (i=0; i < MAX_NUM_SYMBOLS; i++)
{
gDLL->setSymbolID(i, iCurSymbolID);
++iCurSymbolID;
}
} // 9226
void CvGameTextMgr::getCityDataForAS(std::vector<CvWBData>& mapCityList, std::vector<CvWBData>& mapBuildingList, std::vector<CvWBData>& mapAutomateList)
{
CvPlayer& kActivePlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CvWString szHelp;
int iCost = kActivePlayer.getAdvancedStartCityCost(true);
if (iCost > 0)
{
szHelp = gDLL->getText("TXT_KEY_CITY");
szHelp += gDLL->getText("TXT_KEY_AS_UNREMOVABLE");
mapCityList.push_back(CvWBData(0, szHelp, ARTFILEMGR.getInterfaceArtInfo("INTERFACE_BUTTONS_CITYSELECTION")->getPath()));
}
iCost = kActivePlayer.getAdvancedStartPopCost(true);
if (iCost > 0)
{
szHelp = gDLL->getText("TXT_KEY_WB_AS_POPULATION");
mapCityList.push_back(CvWBData(1, szHelp, ARTFILEMGR.getInterfaceArtInfo("INTERFACE_ANGRYCITIZEN_TEXTURE")->getPath()));
}
iCost = kActivePlayer.getAdvancedStartCultureCost(true);
if (iCost > 0)
{
szHelp = gDLL->getText("TXT_KEY_ADVISOR_CULTURE");
szHelp += gDLL->getText("TXT_KEY_AS_UNREMOVABLE");
mapCityList.push_back(CvWBData(2, szHelp, ARTFILEMGR.getInterfaceArtInfo("CULTURE_BUTTON")->getPath()));
}
CvWStringBuffer szBuffer;
for(int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eBuilding = (BuildingTypes) GC.getCivilizationInfo(kActivePlayer.getCivilizationType()).getCivilizationBuildings(i);
if (eBuilding != NO_BUILDING)
{
if (GC.getBuildingInfo(eBuilding).getFreeStartEra() == NO_ERA || GC.getGameINLINE().getStartEra() < GC.getBuildingInfo(eBuilding).getFreeStartEra())
{
// Building cost -1 denotes unit which may not be purchased
iCost = kActivePlayer.getAdvancedStartBuildingCost(eBuilding, true);
if (iCost > 0)
{
szBuffer.clear();
setBuildingHelp(szBuffer, eBuilding);
mapBuildingList.push_back(CvWBData(eBuilding, szBuffer.getCString(), GC.getBuildingInfo(eBuilding).getButton()));
}
}
}
}
szHelp = gDLL->getText("TXT_KEY_ACTION_AUTOMATE_BUILD");
mapAutomateList.push_back(CvWBData(0, szHelp, ARTFILEMGR.getInterfaceArtInfo("INTERFACE_AUTOMATE")->getPath()));
}
void CvGameTextMgr::getUnitDataForAS(std::vector<CvWBData>& mapUnitList)
{
CvPlayer& kActivePlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CvWStringBuffer szBuffer;
for(int i = 0; i < GC.getNumUnitClassInfos(); i++)
{
UnitTypes eUnit = (UnitTypes) GC.getCivilizationInfo(kActivePlayer.getCivilizationType()).getCivilizationUnits(i);
if (eUnit != NO_UNIT)
{
// Unit cost -1 denotes unit which may not be purchased
int iCost = kActivePlayer.getAdvancedStartUnitCost(eUnit, true);
if (iCost > 0)
{
szBuffer.clear();
setUnitHelp(szBuffer, eUnit);
int iMaxUnitsPerCity = GC.getDefineINT("ADVANCED_START_MAX_UNITS_PER_CITY");
if (iMaxUnitsPerCity >= 0 && GC.getUnitInfo(eUnit).isMilitarySupport())
{
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_WB_AS_MAX_UNITS_PER_CITY", iMaxUnitsPerCity));
}
mapUnitList.push_back(CvWBData(eUnit, szBuffer.getCString(), kActivePlayer.getUnitButton(eUnit)));
}
}
}
}
void CvGameTextMgr::getImprovementDataForAS(std::vector<CvWBData>& mapImprovementList, std::vector<CvWBData>& mapRouteList)
{
CvPlayer& kActivePlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CvWStringBuffer szBuffer;
for (int i = 0; i < GC.getNumRouteInfos(); i++)
{
RouteTypes eRoute = (RouteTypes) i;
if (eRoute != NO_ROUTE)
{
// Route cost -1 denotes route which may not be purchased
int iCost = kActivePlayer.getAdvancedStartRouteCost(eRoute, true);
if (iCost > 0)
{
szBuffer.clear();
setRouteHelp(szBuffer, eRoute);
mapRouteList.push_back(CvWBData(eRoute, szBuffer.getCString(), GC.getRouteInfo(eRoute).getButton()));
}
}
}
for (int i = 0; i < GC.getNumImprovementInfos(); i++)
{
ImprovementTypes eImprovement = (ImprovementTypes) i;
if (eImprovement != NO_IMPROVEMENT)
{
// Improvement cost -1 denotes Improvement which may not be purchased
int iCost = kActivePlayer.getAdvancedStartImprovementCost(eImprovement, true);
if (iCost > 0)
{
szBuffer.clear();
setImprovementHelp(szBuffer, eImprovement);
mapImprovementList.push_back(CvWBData(eImprovement, szBuffer.getCString(), GC.getImprovementInfo(eImprovement).getButton()));
}
}
}
}
void CvGameTextMgr::getVisibilityDataForAS(std::vector<CvWBData>& mapVisibilityList)
{
// Unit cost -1 denotes unit which may not be purchased
int iCost = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).getAdvancedStartVisibilityCost(true);
if (iCost > 0)
{
CvWString szHelp = gDLL->getText("TXT_KEY_WB_AS_VISIBILITY");
szHelp += gDLL->getText("TXT_KEY_AS_UNREMOVABLE", iCost);
mapVisibilityList.push_back(CvWBData(0, szHelp, ARTFILEMGR.getInterfaceArtInfo("INTERFACE_TECH_LOS")->getPath()));
}
}
void CvGameTextMgr::getTechDataForAS(std::vector<CvWBData>& mapTechList)
{
mapTechList.push_back(CvWBData(0, gDLL->getText("TXT_KEY_WB_AS_TECH"), ARTFILEMGR.getInterfaceArtInfo("INTERFACE_BTN_TECH")->getPath()));
}
void CvGameTextMgr::getUnitDataForWB(std::vector<CvWBData>& mapUnitData)
{
CvWStringBuffer szBuffer;
for (int i = 0; i < GC.getNumUnitInfos(); i++)
{
szBuffer.clear();
setUnitHelp(szBuffer, (UnitTypes)i);
mapUnitData.push_back(CvWBData(i, szBuffer.getCString(), GC.getUnitInfo((UnitTypes)i).getButton()));
}
}
void CvGameTextMgr::getBuildingDataForWB(bool bStickyButton, std::vector<CvWBData>& mapBuildingData)
{
int iCount = 0;
if (!bStickyButton)
{
mapBuildingData.push_back(CvWBData(iCount++, GC.getMissionInfo(MISSION_FOUND).getDescription(), GC.getMissionInfo(MISSION_FOUND).getButton()));
}
CvWStringBuffer szBuffer;
for (int i=0; i < GC.getNumBuildingInfos(); i++)
{
szBuffer.clear();
setBuildingHelp(szBuffer, (BuildingTypes)i);
mapBuildingData.push_back(CvWBData(iCount++, szBuffer.getCString(), GC.getBuildingInfo((BuildingTypes)i).getButton()));
}
}
void CvGameTextMgr::getTerrainDataForWB(std::vector<CvWBData>& mapTerrainData, std::vector<CvWBData>& mapFeatureData, std::vector<CvWBData>& mapPlotData, std::vector<CvWBData>& mapRouteData)
{
CvWStringBuffer szBuffer;
for (int i = 0; i < GC.getNumTerrainInfos(); i++)
{
if (!GC.getTerrainInfo((TerrainTypes)i).isGraphicalOnly())
{
szBuffer.clear();
setTerrainHelp(szBuffer, (TerrainTypes)i);
mapTerrainData.push_back(CvWBData(i, szBuffer.getCString(), GC.getTerrainInfo((TerrainTypes)i).getButton()));
}
}
for (int i = 0; i < GC.getNumFeatureInfos(); i++)
{
for (int k = 0; k < GC.getFeatureInfo((FeatureTypes)i).getArtInfo()->getNumVarieties(); k++)
{
szBuffer.clear();
setFeatureHelp(szBuffer, (FeatureTypes)i);
mapFeatureData.push_back(CvWBData(i + GC.getNumFeatureInfos() * k, szBuffer.getCString(), GC.getFeatureInfo((FeatureTypes)i).getArtInfo()->getVariety(k).getVarietyButton()));
}
}
mapPlotData.push_back(CvWBData(0, gDLL->getText("TXT_KEY_WB_PLOT_TYPE_MOUNTAIN"), ARTFILEMGR.getInterfaceArtInfo("WORLDBUILDER_PLOT_TYPE_MOUNTAIN")->getPath()));
mapPlotData.push_back(CvWBData(1, gDLL->getText("TXT_KEY_WB_PLOT_TYPE_HILL"), ARTFILEMGR.getInterfaceArtInfo("WORLDBUILDER_PLOT_TYPE_HILL")->getPath()));
mapPlotData.push_back(CvWBData(2, gDLL->getText("TXT_KEY_WB_PLOT_TYPE_PLAINS"), ARTFILEMGR.getInterfaceArtInfo("WORLDBUILDER_PLOT_TYPE_PLAINS")->getPath()));
mapPlotData.push_back(CvWBData(3, gDLL->getText("TXT_KEY_WB_PLOT_TYPE_OCEAN"), ARTFILEMGR.getInterfaceArtInfo("WORLDBUILDER_PLOT_TYPE_OCEAN")->getPath()));
for (int i = 0; i < GC.getNumRouteInfos(); i++)
{
mapRouteData.push_back(CvWBData(i, GC.getRouteInfo((RouteTypes)i).getDescription(), GC.getRouteInfo((RouteTypes)i).getButton()));
}
mapRouteData.push_back(CvWBData(GC.getNumRouteInfos(), gDLL->getText("TXT_KEY_WB_RIVER_PLACEMENT"), ARTFILEMGR.getInterfaceArtInfo("WORLDBUILDER_RIVER_PLACEMENT")->getPath()));
}
void CvGameTextMgr::getTerritoryDataForWB(std::vector<CvWBData>& mapTerritoryData)
{
for (int i = 0; i <= MAX_CIV_PLAYERS; i++)
{
CvWString szName = gDLL->getText("TXT_KEY_MAIN_MENU_NONE");
CvString szButton = GC.getCivilizationInfo(GET_PLAYER(BARBARIAN_PLAYER).getCivilizationType()).getButton();
if (GET_PLAYER((PlayerTypes) i).isEverAlive())
{
szName = GET_PLAYER((PlayerTypes)i).getName();
szButton = GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)i).getCivilizationType()).getButton();
}
mapTerritoryData.push_back(CvWBData(i, szName, szButton));
}
}
void CvGameTextMgr::getTechDataForWB(std::vector<CvWBData>& mapTechData)
{
CvWStringBuffer szBuffer;
for (int i=0; i < GC.getNumTechInfos(); i++)
{
szBuffer.clear();
setTechHelp(szBuffer, (TechTypes) i);
mapTechData.push_back(CvWBData(i, szBuffer.getCString(), GC.getTechInfo((TechTypes) i).getButton()));
}
}
void CvGameTextMgr::getPromotionDataForWB(std::vector<CvWBData>& mapPromotionData)
{
CvWStringBuffer szBuffer;
for (int i=0; i < GC.getNumPromotionInfos(); i++)
{
szBuffer.clear();
setPromotionHelp(szBuffer, (PromotionTypes) i, false);
mapPromotionData.push_back(CvWBData(i, szBuffer.getCString(), GC.getPromotionInfo((PromotionTypes) i).getButton()));
}
}
void CvGameTextMgr::getBonusDataForWB(std::vector<CvWBData>& mapBonusData)
{
CvWStringBuffer szBuffer;
for (int i=0; i < GC.getNumBonusInfos(); i++)
{
szBuffer.clear();
setBonusHelp(szBuffer, (BonusTypes)i);
mapBonusData.push_back(CvWBData(i, szBuffer.getCString(), GC.getBonusInfo((BonusTypes) i).getButton()));
}
}
void CvGameTextMgr::getImprovementDataForWB(std::vector<CvWBData>& mapImprovementData)
{
CvWStringBuffer szBuffer;
for (int i=0; i < GC.getNumImprovementInfos(); i++)
{
CvImprovementInfo& kInfo = GC.getImprovementInfo((ImprovementTypes) i);
if (!kInfo.isGraphicalOnly())
{
szBuffer.clear();
setImprovementHelp(szBuffer, (ImprovementTypes) i);
mapImprovementData.push_back(CvWBData(i, szBuffer.getCString(), kInfo.getButton()));
}
}
}
void CvGameTextMgr::getRouteDataForWB(std::vector<CvWBData>& mapRouteData)
{
CvWStringBuffer szBuffer;
for (int i=0; i < GC.getNumRouteInfos(); i++)
{
CvRouteInfo& kInfo = GC.getRouteInfo((RouteTypes) i);
if (!kInfo.isGraphicalOnly())
{
szBuffer.clear();
setRouteHelp(szBuffer, (RouteTypes) i);
mapRouteData.push_back(CvWBData(i, szBuffer.getCString(), kInfo.getButton()));
}
}
}
void CvGameTextMgr::getReligionDataForWB(bool bHolyCity, std::vector<CvWBData>& mapReligionData)
{
for (int i = 0; i < GC.getNumReligionInfos(); ++i)
{
CvReligionInfo& kInfo = GC.getReligionInfo((ReligionTypes) i);
CvWString strDescription = kInfo.getDescription();
if (bHolyCity)
{
strDescription = gDLL->getText("TXT_KEY_WB_HOLYCITY", strDescription.GetCString());
}
mapReligionData.push_back(CvWBData(i, strDescription, kInfo.getButton()));
}
}
void CvGameTextMgr::getCorporationDataForWB(bool bHeadquarters, std::vector<CvWBData>& mapCorporationData)
{
for (int i = 0; i < GC.getNumCorporationInfos(); ++i)
{
CvCorporationInfo& kInfo = GC.getCorporationInfo((CorporationTypes) i);
CvWString strDescription = kInfo.getDescription();
if (bHeadquarters)
{
strDescription = gDLL->getText("TXT_KEY_CORPORATION_HEADQUARTERS", strDescription.GetCString());
}
mapCorporationData.push_back(CvWBData(i, strDescription, kInfo.getButton()));
}
}
/************************************************************************************************/
/* Afforess Mountains Start 09/20/09 */
/* */
/* */
/************************************************************************************************/
void CvGameTextMgr::buildCanPassPeaksString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getGameINLINE().isOption(GAMEOPTION_MOUNTAINS))
{
if (GC.getTechInfo(eTech).isCanPassPeaks() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isCanPassPeaks())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_CAN_PASS_PEAKS"));
}
}
}
void CvGameTextMgr::buildMoveFastPeaksString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getGameINLINE().isOption(GAMEOPTION_MOUNTAINS))
{
if (GC.getTechInfo(eTech).isMoveFastPeaks() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isMoveFastPeaks())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_MOVE_FAST_PEAKS"));
}
}
}
void CvGameTextMgr::buildCanFoundOnPeaksString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getGameINLINE().isOption(GAMEOPTION_MOUNTAINS))
{
if (GC.getTechInfo(eTech).isCanFoundOnPeaks() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isCanFoundOnPeaks())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_CAN_FOUND_ON_PEAKS"));
}
}
}
void CvGameTextMgr::buildCanRebaseAnywhereString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getDefineINT("MAX_AIRLIFT_RANGE") > 0)
{
if (GC.getTechInfo(eTech).isRebaseAnywhere() && (!bPlayerContext || !(GET_TEAM(GC.getGameINLINE().getActiveTeam()).isRebaseAnywhere())))
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_CAN_REBASE_ANYWHERE"));
}
}
}
/*
+50% from Buildings
+25% from Wonders
+10% from resources
+25% from Civics
+25% from Culture
+10% from Terrain
=======================
Base Defense: 100%
=======================
Percent Siege Damaged: 25%
Siege Damage 25%
Current Defense: 75%
=======================
Base Bombard Defense: 60%
=======================
* Walls: +30%
*/
void CvGameTextMgr::setDefenseHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
FAssertMsg(NO_PLAYER != city.getOwnerINLINE(), "City must have an owner");
int iBaseRate = 0;
int iI, iJ;
// Buildings
int iBuildingDefense = 0;
int iBombardDefense = 0;
int iWonderDefense = 0;
int iResourceDefense = 0;
bool bWonder = false;
for (iI = 0; iI < GC.getNumBuildingInfos(); iI++)
{
int iCount = city.getNumActiveBuilding((BuildingTypes)iI);
if (isWorldWonderClass((BuildingClassTypes)(GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())))
bWonder = true;
else if (isTeamWonderClass((BuildingClassTypes)(GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())))
bWonder = true;
else if (isNationalWonderClass((BuildingClassTypes)(GC.getBuildingInfo((BuildingTypes)iI).getBuildingClassType())))
bWonder = true;
CvBuildingInfo& kBuilding = GC.getBuildingInfo((BuildingTypes)iI);
if (iCount > 0 && !bWonder)
{
iBuildingDefense += iCount * (kBuilding.getDefenseModifier());
iBombardDefense += iCount * kBuilding.getBombardDefenseModifier();
for (iJ = 0; iJ < GC.getNumBonusInfos(); iJ++)
{
if (city.hasBonus((BonusTypes)iJ))
{
iResourceDefense += kBuilding.getBonusDefenseChanges(iJ);
}
}
}
else if (iCount > 0)
{
iWonderDefense += iCount * (kBuilding.getDefenseModifier());
iBombardDefense += iCount * kBuilding.getBombardDefenseModifier();
for (iJ = 0; iJ < GC.getNumBonusInfos(); iJ++)
{
if (city.hasBonus((BonusTypes)iJ))
{
iResourceDefense += kBuilding.getBonusDefenseChanges(iJ);
}
}
}
bWonder = false;
}
bool bFirst = false;
if (iBuildingDefense != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_BUILDING_DEFENSE_HOVER", iBuildingDefense));
iBaseRate += iBuildingDefense;
}
int iCivicDefense = 0;
for (iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
CivicTypes eCivic;
eCivic = GET_PLAYER(city.getOwnerINLINE()).getCivics((CivicOptionTypes)iJ);
if (GC.getCivicInfo(eCivic).getExtraCityDefense() != 0)
{
iCivicDefense += GC.getCivicInfo(eCivic).getExtraCityDefense();
}
}
iWonderDefense += GET_PLAYER(city.getOwnerINLINE()).getCityDefenseModifier() - iCivicDefense;
if (iWonderDefense != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_WONDER_DEFENSE_HOVER", iWonderDefense));
iBaseRate += iWonderDefense;
}
if (iResourceDefense != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_RESOURCE_DEFENSE_HOVER", iResourceDefense));
iBaseRate += iResourceDefense;
}
if (iCivicDefense != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CIVIC_DEFENSE_HOVER", iCivicDefense));
iBaseRate += iCivicDefense;
}
int iCultureDefense = 0;
iCultureDefense += city.getNaturalDefense();
iCultureDefense -= iBuildingDefense;
if (iCultureDefense > 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CULTURE_DEFENSE_HOVER", iCultureDefense));
iBaseRate += iCultureDefense;
}
int iClaimedDefense = city.getTotalDefense(false);
FAssertMsg(iBaseRate == iClaimedDefense, "City Defense Does Not add up Correctly");
if (iBaseRate > 0)
// ==========================
szBuffer.append(DOUBLE_SEPARATOR);
//if (iBaseRate != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_TOTAL_DEFENSE_HOVER", iBaseRate));
}
int iTerrainDefense = std::max(0, city.plot()->defenseModifier(GET_PLAYER(city.getOwnerINLINE()).getTeam(), false, true));
if (iTerrainDefense != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_TERRAIN_DEFENSE_HOVER", iTerrainDefense));
iBaseRate += iTerrainDefense;
}
if (iBaseRate > 0)
// ==========================
szBuffer.append(DOUBLE_SEPARATOR);
int iDefenseDamagePercent = city.getDefenseDamage();
if (iDefenseDamagePercent != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEFENSE_DAMAGE_PERCENT_HOVER", iDefenseDamagePercent));
}
int iDefenseDamage = ((iBaseRate - iTerrainDefense) * city.getDefenseDamage()) / 100;
if (iDefenseDamage != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_DEFENSE_DAMAGE_HOVER", iDefenseDamage));
}
if (iBaseRate != 0)
{
if (bFirst)
szBuffer.append(NEWLINE);
else
bFirst = true;
szBuffer.append(gDLL->getText("TXT_KEY_MISC_CURRENT_DEFENSE_HOVER", (iBaseRate - iDefenseDamage)));
}
if (iBombardDefense != 0)
{// ==========================
szBuffer.append(DOUBLE_SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_BUILDING_BOMBARD_DEFENSE_HOVER", iBombardDefense));
}
if (city.getOwnerINLINE() == GC.getGame().getActivePlayer())
{
// BUG - Building Additional Defense - start
if (city.getOwnerINLINE() == GC.getGame().getActivePlayer() && getBugOptionBOOL("MiscHover__BuildingAdditionalDefense", true, "BUG_BUILDING_ADDITIONAL_DEFENSE_HOVER"))
{
setBuildingAdditionalDefenseHelp(szBuffer, city, DOUBLE_SEPARATOR);
}
}
}
bool CvGameTextMgr::setBuildingAdditionalDefenseHelp(CvWStringBuffer &szBuffer, const CvCity& city, const CvWString& szStart, bool bStarted)
{
CvWString szLabel;
for (int i = 0; i < GC.getNumBuildingClassInfos(); i++)
{
BuildingTypes eBuilding = (BuildingTypes)GC.getCivilizationInfo(GET_PLAYER(city.getOwnerINLINE()).getCivilizationType()).getCivilizationBuildings((BuildingClassTypes)i);
if (city.canConstruct(eBuilding, false, false, false))
{
int iChange = city.getAdditionalDefenseByBuilding(eBuilding);
if (iChange != 0)
{
if (!bStarted)
{
szBuffer.append(szStart);
bStarted = true;
}
szLabel.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR("COLOR_BUILDING_TEXT"), GC.getBuildingInfo(eBuilding).getDescription());
setResumableValueChangeHelp(szBuffer, szLabel, L": ", L"", iChange, gDLL->getSymbolID(DEFENSE_CHAR), true, true);
}
}
}
return bStarted;
}
void CvGameTextMgr::setEmploymentHelp(CvWStringBuffer &szBuffer, CvCity& city)
{
FAssertMsg(NO_PLAYER != city.getOwnerINLINE(), "City must have an owner");
bool bFirst = true;
for (int iI = 0; iI < GC.getNumBuildingInfos(); iI++)
{
if (city.getNumActiveBuilding((BuildingTypes)iI) > 0)
{
if (GC.getBuildingInfo((BuildingTypes)iI).getNumPopulationEmployed() > 0)
{
if (!bFirst) szBuffer.append(NEWLINE);
szBuffer.append(CvWString::format(L"%s: %d %c", GC.getBuildingInfo((BuildingTypes)iI).getDescription(), GC.getBuildingInfo((BuildingTypes)iI).getNumPopulationEmployed(), gDLL->getSymbolID(CITIZEN_CHAR)));
bFirst = false;
}
}
}
szBuffer.append(DOUBLE_SEPARATOR);
szBuffer.append(NEWLINE);
szBuffer.append(gDLL->getText("TXT_KEY_MISC_TOTAL_EMPLOYED", city.getNumPopulationEmployed()));
szBuffer.append(CvWString::format(L" %c", gDLL->getSymbolID(CITIZEN_CHAR)));
}
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
//DPII < Maintenance Modifiers >
void CvGameTextMgr::buildMaintenanceModifiersString(CvWStringBuffer &szBuffer, TechTypes eTech, bool bList, bool bPlayerContext)
{
if (GC.getTechInfo(eTech).getMaintenanceModifier() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
szBuffer.append(gDLL->getText("TXT_KEY_TECH_MAINT_MOD", GC.getTechInfo(eTech).getMaintenanceModifier()));
}
if (GC.getTechInfo(eTech).getDistanceMaintenanceModifier() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
if (GC.getTechInfo(eTech).getDistanceMaintenanceModifier() <= -100)
{
szBuffer.append(gDLL->getText("TXT_KEY_TECH_DISTANCE_MAINT"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_TECH_DISTANCE_MAINT_MOD", GC.getTechInfo(eTech).getDistanceMaintenanceModifier()));
}
}
if (GC.getTechInfo(eTech).getNumCitiesMaintenanceModifier() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
if (GC.getTechInfo(eTech).getNumCitiesMaintenanceModifier() <= -100)
{
szBuffer.append(gDLL->getText("TXT_KEY_TECH_NUM_CITIES_MAINT"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_TECH_NUM_CITIES_MAINT_MOD", GC.getTechInfo(eTech).getNumCitiesMaintenanceModifier()));
}
}
if (GC.getTechInfo(eTech).getCoastalDistanceMaintenanceModifier() != 0)
{
if (bList)
{
szBuffer.append(NEWLINE);
}
if (GC.getTechInfo(eTech).getCoastalDistanceMaintenanceModifier() <= -100)
{
szBuffer.append(gDLL->getText("TXT_KEY_COASTAL_DISTANCE_MAINT"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_COASTAL_DISTANCE_MAINT_MOD", GC.getTechInfo(eTech).getCoastalDistanceMaintenanceModifier()));
}
}
}
//DPII < Maintenance Modifiers >
void CvGameTextMgr::getGameObjectName(CvWString &szString, GameObjectTypes eObject)
{
switch (eObject)
{
case GAMEOBJECT_GAME:
szString.append(gDLL->getText("TXT_KEY_GAMEOBJECT_GAME"));
break;
case GAMEOBJECT_TEAM:
szString.append(gDLL->getText("TXT_KEY_GAMEOBJECT_TEAM"));
break;
case GAMEOBJECT_PLAYER:
szString.append(gDLL->getText("TXT_KEY_GAMEOBJECT_PLAYER"));
break;
case GAMEOBJECT_CITY:
szString.append(gDLL->getText("TXT_KEY_GAMEOBJECT_CITY"));
break;
case GAMEOBJECT_UNIT:
szString.append(gDLL->getText("TXT_KEY_GAMEOBJECT_UNIT"));
break;
case GAMEOBJECT_PLOT:
szString.append(gDLL->getText("TXT_KEY_GAMEOBJECT_PLOT"));
break;
}
}
void CvGameTextMgr::buildGameObjectRelationString(CvWStringBuffer &szBuffer, GameObjectTypes eObject, RelationTypes eRelation, int iData)
{
if ((eObject == NO_GAMEOBJECT) || (eRelation == NO_RELATION))
return;
CvWString szObject;
getGameObjectName(szObject, eObject);
switch (eRelation)
{
case RELATION_ASSOCIATED:
szBuffer.append(szObject);
break;
case RELATION_TRADE:
szBuffer.append(gDLL->getText("TXT_KEY_RELATION_TRADE"));
break;
case RELATION_NEAR:
szBuffer.append(gDLL->getText("TXT_KEY_RELATION_NEAR", szObject.c_str(), iData));
break;
case RELATION_SAME_PLOT:
szBuffer.append(szObject);
break;
case RELATION_WORKING:
if (eObject == GAMEOBJECT_CITY)
{
szBuffer.append(gDLL->getText("TXT_KEY_RELATION_WORKING_CITY"));
}
else
{
szBuffer.append(gDLL->getText("TXT_KEY_RELATION_WORKING_PLOT"));
}
break;
}
}