Hooks
static bool BeforeCvUnitCombat_GenerateAirCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void AfterCvUnitCombat_GenerateAirCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);static void ReplaceCvUnitCombat_GenerateAirCombatInfo(void (*original)(CvUnit&, CvUnit*, CvPlot&, CvCombatInfo*), CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo);CivRegisterBefore<CivHooks::CvUnitCombat_GenerateAirCombatInfo>(host, &BeforeCvUnitCombat_GenerateAirCombatInfo);CivRegisterAfter<CivHooks::CvUnitCombat_GenerateAirCombatInfo>(host, &AfterCvUnitCombat_GenerateAirCombatInfo);CivRegisterReplace<CivHooks::CvUnitCombat_GenerateAirCombatInfo>(host, &ReplaceCvUnitCombat_GenerateAirCombatInfo);
Code
1371void CvUnitCombat::GenerateAirCombatInfo(CvUnit& kAttacker, CvUnit* pkDefender, CvPlot& plot, CvCombatInfo* pkCombatInfo)1372{1373 BATTLE_STARTED(BATTLE_TYPE_AIR, plot);1374 int iExperience = 0;13751376 pkCombatInfo->setUnit(BATTLE_UNIT_ATTACKER, &kAttacker);1377 pkCombatInfo->setUnit(BATTLE_UNIT_DEFENDER, pkDefender);1378 pkCombatInfo->setPlot(&plot);13791380 //////////////////////////////////////////////////////////////////////13811382 // Any interception to be done?1383 CvUnit* pInterceptor = kAttacker.GetBestInterceptor(plot, pkDefender);1384 int iInterceptionDamage = 0;13851386 if(pInterceptor != NULL && pInterceptor != pkDefender)1387 {1388 pkCombatInfo->setUnit(BATTLE_UNIT_INTERCEPTOR, pInterceptor);1389 // Does the attacker evade?1390 if(GC.getGame().getJonRandNum(100, "Evasion Rand") >= kAttacker.evasionProbability())1391 {1392 // Is the interception successful?1393 if(GC.getGame().getJonRandNum(100, "Intercept Rand (Air)") < pInterceptor->currInterceptionProbability())1394 {1395 iInterceptionDamage = pInterceptor->GetInterceptionDamage(&kAttacker);1396 }1397 }1398 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_INTERCEPTOR, iInterceptionDamage); // Damage inflicted this round1399 }14001401 //////////////////////////////////////////////////////////////////////14021403 bool bBarbarian = false;1404 int iMaxXP = 0;14051406 int iAttackerDamageInflicted;1407 int iDefenderDamageInflicted;14081409 int iAttackerTotalDamageInflicted;1410 int iDefenderTotalDamageInflicted;14111412 PlayerTypes eDefenderOwner;14131414 // Target is a Unit1415 if(!plot.isCity())1416 {1417 CvAssert(pkDefender != NULL);1418 if(!pkDefender)1419 return;14201421 eDefenderOwner = pkDefender->getOwner();14221423 iExperience = /*4*/ GC.getEXPERIENCE_ATTACKING_UNIT_AIR();1424 if(pkDefender->isBarbarian())1425 bBarbarian = true;1426 iMaxXP = pkDefender->maxXPValue();14271428 // Calculate attacker damage1429 iAttackerDamageInflicted = kAttacker.GetAirCombatDamage(pkDefender, /*pCity*/ NULL, /*bIncludeRand*/ true, iInterceptionDamage);14301431#if defined(MOD_UNITS_MAX_HP)1432 if(iAttackerDamageInflicted + pkDefender->getDamage() > pkDefender->GetMaxHitPoints())1433 {1434 iAttackerDamageInflicted = pkDefender->GetMaxHitPoints() - pkDefender->getDamage();1435 }1436#else1437 if(iAttackerDamageInflicted + pkDefender->getDamage() > GC.getMAX_HIT_POINTS())1438 {1439 iAttackerDamageInflicted = GC.getMAX_HIT_POINTS() - pkDefender->getDamage();1440 }1441#endif14421443 iAttackerTotalDamageInflicted = std::max(pkDefender->getDamage(), pkDefender->getDamage() + iAttackerDamageInflicted);14441445 // Calculate defense damage1446 iDefenderDamageInflicted = pkDefender->GetAirStrikeDefenseDamage(&kAttacker);14471448#if defined(MOD_UNITS_MAX_HP)1449 if(iDefenderDamageInflicted + kAttacker.getDamage() > kAttacker.GetMaxHitPoints())1450 {1451 iDefenderDamageInflicted = kAttacker.GetMaxHitPoints() - kAttacker.getDamage();1452 }1453#else1454 if(iDefenderDamageInflicted + kAttacker.getDamage() > GC.getMAX_HIT_POINTS())1455 {1456 iDefenderDamageInflicted = GC.getMAX_HIT_POINTS() - kAttacker.getDamage();1457 }1458#endif14591460 iDefenderTotalDamageInflicted = std::max(kAttacker.getDamage(), kAttacker.getDamage() + (iDefenderDamageInflicted + iInterceptionDamage));1461 }1462 // Target is a City1463 else1464 {1465 CvCity* pCity = plot.getPlotCity();1466 CvAssert(pCity != NULL);1467 if(!pCity) return;1468 BATTLE_JOINED(pCity, BATTLE_UNIT_DEFENDER, true);1469 1470 CUSTOMLOG("Bombing %s by %s", pCity->getName().GetCString(), kAttacker.getName().GetCString());1471 if(pInterceptor != NULL && pInterceptor != pkDefender) {1472 CUSTOMLOG(" intercption being done by %s for %i damage", pInterceptor->getName().GetCString(), iInterceptionDamage);1473 }14741475 eDefenderOwner = plot.getOwner();14761477 /* iDefenderStrength = pCity->getStrengthValue() / 2;1478 iOldDamage = pCity->getDamage();*/14791480 iExperience = /*4*/ GC.getEXPERIENCE_ATTACKING_CITY_AIR();1481 if(pCity->isBarbarian())1482 bBarbarian = true;1483 iMaxXP = 1000;14841485 iAttackerDamageInflicted = kAttacker.GetAirCombatDamage(/*pUnit*/ NULL, pCity, /*bIncludeRand*/ true, iInterceptionDamage);14861487 // Cities can't be knocked to less than 1 HP1488 if(iAttackerDamageInflicted + pCity->getDamage() >= pCity->GetMaxHitPoints())1489 {1490 iAttackerDamageInflicted = pCity->GetMaxHitPoints() - pCity->getDamage() - 1;1491 }14921493 iAttackerTotalDamageInflicted = std::max(pCity->getDamage(), pCity->getDamage() + iAttackerDamageInflicted);14941495 // Calculate defense damage1496 iDefenderDamageInflicted = pCity->GetAirStrikeDefenseDamage(&kAttacker);14971498 if(iDefenderDamageInflicted + kAttacker.getDamage() > pCity->GetMaxHitPoints())1499 {1500#if defined(MOD_BUGFIX_MINOR)1501 // Surely!!!1502 iDefenderDamageInflicted = pCity->GetMaxHitPoints() - kAttacker.getDamage();1503#else1504 iDefenderDamageInflicted = GC.getMAX_HIT_POINTS() - kAttacker.getDamage();1505#endif1506 }15071508 iDefenderTotalDamageInflicted = std::max(kAttacker.getDamage(), kAttacker.getDamage() + (iDefenderDamageInflicted + iInterceptionDamage));15091510#if !defined(NO_ACHIEVEMENTS)1511 //Achievement for Washington1512 CvUnitEntry* pkUnitInfo = GC.getUnitInfo(kAttacker.getUnitType());1513 if(pkUnitInfo)1514 {1515 if(kAttacker.isHuman() && !GC.getGame().isGameMultiPlayer() && _stricmp(pkUnitInfo->GetType(), "UNIT_AMERICAN_B17") == 0)1516 {1517 gDLL->UnlockAchievement(ACHIEVEMENT_SPECIAL_B17);1518 }1519 }1520#endif1521 }1522 //////////////////////////////////////////////////////////////////////15231524 pkCombatInfo->setFinalDamage(BATTLE_UNIT_ATTACKER, iDefenderTotalDamageInflicted); // Total damage to the unit1525 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_ATTACKER, iAttackerDamageInflicted); // Damage inflicted this round1526 pkCombatInfo->setFinalDamage(BATTLE_UNIT_DEFENDER, iAttackerTotalDamageInflicted); // Total damage to the unit1527 pkCombatInfo->setDamageInflicted(BATTLE_UNIT_DEFENDER, iDefenderDamageInflicted); // Damage inflicted this round15281529 // Fear Damage1530 pkCombatInfo->setFearDamageInflicted(BATTLE_UNIT_ATTACKER, 0);1531 // pkCombatInfo->setFearDamageInflicted( BATTLE_UNIT_DEFENDER, 0 );15321533 pkCombatInfo->setExperience(BATTLE_UNIT_ATTACKER, iExperience);1534 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_ATTACKER, iMaxXP);1535 pkCombatInfo->setInBorders(BATTLE_UNIT_ATTACKER, plot.getOwner() == eDefenderOwner);1536#if defined(MOD_BUGFIX_BARB_GP_XP)1537 bool bGeneralsXP = !kAttacker.isBarbarian();1538 if (MOD_BUGFIX_BARB_GP_XP) {1539 if (!plot.isCity()) {1540 bGeneralsXP = !pkDefender->isBarbarian();1541 } else {1542 bGeneralsXP = !plot.getPlotCity()->isBarbarian();1543 }1544 }1545#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1546 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || bGeneralsXP);1547#else1548 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, bGeneralsXP);1549#endif1550#else1551#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1552 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, kAttacker.isGGFromBarbarians() || !kAttacker.isBarbarian());1553#else1554 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_ATTACKER, !kAttacker.isBarbarian());1555#endif1556#endif15571558 iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_UNIT_AIR();1559 pkCombatInfo->setExperience(BATTLE_UNIT_DEFENDER, iExperience);1560 pkCombatInfo->setMaxExperienceAllowed(BATTLE_UNIT_DEFENDER, MAX_INT);1561 pkCombatInfo->setInBorders(BATTLE_UNIT_DEFENDER, plot.getOwner() == kAttacker.getOwner());1562#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1563 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, (!plot.isCity() && pkDefender->isGGFromBarbarians()) || !bBarbarian);1564#else1565 pkCombatInfo->setUpdateGlobal(BATTLE_UNIT_DEFENDER, !bBarbarian);1566#endif15671568 if (iInterceptionDamage > 0)1569 {1570 iExperience = /*2*/ GC.getEXPERIENCE_DEFENDING_AIR_SWEEP_GROUND();1571 pkCombatInfo->setExperience( BATTLE_UNIT_INTERCEPTOR, iExperience );1572 pkCombatInfo->setMaxExperienceAllowed( BATTLE_UNIT_INTERCEPTOR, MAX_INT );1573 pkCombatInfo->setInBorders( BATTLE_UNIT_INTERCEPTOR, plot.getOwner() == kAttacker.getOwner() );1574#if defined(MOD_TRAITS_GG_FROM_BARBARIANS) || defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)1575 pkCombatInfo->setUpdateGlobal( BATTLE_UNIT_INTERCEPTOR, pInterceptor->isGGFromBarbarians() || !bBarbarian );1576#else1577 pkCombatInfo->setUpdateGlobal( BATTLE_UNIT_INTERCEPTOR, !bBarbarian );1578#endif1579 }15801581 pkCombatInfo->setAttackIsBombingMission(true);1582 pkCombatInfo->setDefenderRetaliates(true);15831584 GC.GetEngineUserInterface()->setDirty(UnitInfo_DIRTY_BIT, true);1585}