Code:
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 */
/************************************************************************************************/
CvUnit* pAttacker;
CvUnit* pDefender;
CvWString szTempBuffer;
CvWString szOffenseOdds;
CvWString szDefenseOdds;
bool bValid;
int iModifier;
if (gDLL->getInterfaceIFace()->getLengthSelectionList() == 0)
{
return false;
}
bValid = false;
// rucivfan_bug_fix rbf[
// old code[
//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;
//}
// ] old code
// ]rucivfan_bug_fix rbf
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)
{
// rucivfan_bug_fix rbf[
// new code[
bValid = false;
switch (gDLL->getInterfaceIFace()->getSelectionList()->getDomainType())
{
case DOMAIN_SEA:
// bValid = pPlot->isWater(); //Original Coce
//Kathy beginn Riverboat
bValid = pPlot->isWater() || pAttacker->isAmphib() && pPlot->isRiver();
//Kathy End Riverboat
break;
case DOMAIN_AIR:
bValid = true;
break;
case DOMAIN_LAND:
bValid = !(pPlot->isWater()) || pAttacker->canMoveAllTerrain();
break;
case DOMAIN_IMMOBILE:
break;
default:
FAssert(false);
break;
}
if (!bValid)
{
return false;
}
// ] new code
// ]rucivfan_bug_fix rbf
pDefender = pPlot->getBestDefender(NO_PLAYER, pAttacker->getOwnerINLINE(), pAttacker, false, NO_TEAM == pAttacker->getDeclareWarMove(pPlot));
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);
}
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS", szTempBuffer.GetCString()));
}
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);
}
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS_RETREAT", szTempBuffer.GetCString()));
}
//szTempBuffer.Format(L"AI odds: %d%%", iOdds);
//szString += NEWLINE + szTempBuffer;
}
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));
}
//Kathy Beginn Eifer
iModifier = pAttacker->getReligiousBonus();
if (iModifier != 0)
{
if ( GET_PLAYER(pAttacker->getOwnerINLINE()).getStateReligion() != GET_PLAYER(pDefender->getOwnerINLINE()).getStateReligion())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_RELIGIOUS_MOD", iModifier));
}
}
//Kathy End Eifer
//Kathy Beginn Original Owner
if ( pAttacker->getOriginalOwner() != pAttacker->getOwner() )
{
if ( pAttacker->getOriginalOwner() == pDefender->getOwner() )
{
iModifier = -25;
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_ORIGINAL_OWNER_MOD", iModifier));
}
}
//Kathy End Original Owner
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()));
}
//Kathy Beginn Eifer
iModifier = pDefender->getReligiousBonus();
if (iModifier != 0)
{
if ( GET_PLAYER(pAttacker->getOwnerINLINE()).getStateReligion() != GET_PLAYER(pDefender->getOwnerINLINE()).getStateReligion())
{
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_RELIGIOUS_MOD", iModifier));
}
}
//Kathy End Eifer
//Kathy Beginn Original Owner
if ( pDefender->getOriginalOwner() != pDefender->getOwner() )
{
if ( pDefender->getOriginalOwner() == pAttacker->getOwner() )
{
iModifier = -25;
szString.append(NEWLINE);
szString.append(gDLL->getText("TXT_KEY_COMBAT_ORIGINAL_OWNER_MOD", iModifier));
}
}
//Kathy End Original Owner
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()));
}
/************************************************************************************************/
/* 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;
}
Wichtig ist hier der Teil, der mit "Riverboat" gekennzeichnet ist, andere Änderungen von mir beziehen sich auf Variablen, die nicht jeder hat.