Hooks
static bool BeforeCvUnitCombat_AttackAir(CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION arg2, CvUnitCombat::ATTACK_RESULT& result);static void AfterCvUnitCombat_AttackAir(CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION arg2, CvUnitCombat::ATTACK_RESULT& result);static CvUnitCombat::ATTACK_RESULT ReplaceCvUnitCombat_AttackAir(CvUnitCombat::ATTACK_RESULT (*original)(CvUnit&, CvPlot&, ATTACK_OPTION), CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION arg2);// CivHooks.h gives this hook point no types, so nothing checks these hooks' parameters.host->RegisterHook(host->pluginIndex, CivHooks::CvUnitCombat_AttackAir::ID, CIV_HOOK_BEFORE, (void*)&BeforeCvUnitCombat_AttackAir);host->RegisterHook(host->pluginIndex, CivHooks::CvUnitCombat_AttackAir::ID, CIV_HOOK_AFTER, (void*)&AfterCvUnitCombat_AttackAir);host->RegisterHook(host->pluginIndex, CivHooks::CvUnitCombat_AttackAir::ID, CIV_HOOK_REPLACE, (void*)&ReplaceCvUnitCombat_AttackAir);
Code
3375CvUnitCombat::ATTACK_RESULT CvUnitCombat::AttackAir(CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION /* eOption */)3376{3377 //VALIDATE_OBJECT3378 CvAssert(kAttacker.getCombatTimer() == 0);33793380 CvUnitCombat::ATTACK_RESULT eResult = CvUnitCombat::ATTACK_ABORTED;33813382 // Can we actually hit the target?3383 if(!kAttacker.canRangeStrikeAt(targetPlot.getX(), targetPlot.getY()))3384 {3385 return eResult;3386 }33873388 bool bDoImmediate = CvPreGame::quickCombat();3389 kAttacker.SetAutomateType(NO_AUTOMATE);3390 kAttacker.setMadeAttack(true);33913392 // Bombing a Unit3393 if(!targetPlot.isCity())3394 {3395 CvUnit* pDefender = kAttacker.airStrikeTarget(targetPlot, true);33963397#if defined(MOD_EVENTS_UNIT_RANGEATTACK)3398 if (!pDefender) {3399 if (MOD_EVENTS_UNIT_RANGEATTACK) {3400 int iValue = 0;3401 if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_UnitRangeAttackAt, kAttacker.getOwner(), kAttacker.GetID(), targetPlot.getX(), targetPlot.getY()) == GAMEEVENTRETURN_VALUE) {3402 if (iValue) {3403 return CvUnitCombat::ATTACK_COMPLETED;3404 }34053406 return CvUnitCombat::ATTACK_ABORTED;3407 }3408 }3409 }3410#endif34113412 CvAssert(pDefender != NULL);3413 if(!pDefender) return CvUnitCombat::ATTACK_ABORTED;34143415 pDefender->SetAutomateType(NO_AUTOMATE);3416#if defined(MOD_BUGFIX_UNITS_AWAKE_IN_DANGER)3417 if (MOD_BUGFIX_UNITS_AWAKE_IN_DANGER) {3418 pDefender->SetActivityType(ACTIVITY_AWAKE, false); 3419 }3420#endif34213422 CvCombatInfo kCombatInfo;3423 CvUnitCombat::GenerateAirCombatInfo(kAttacker, pDefender, targetPlot, &kCombatInfo);3424 CvAssertMsg(!kAttacker.isDelayedDeath() && !pDefender->isDelayedDeath(), "Trying to battle and one of the units is already dead!");34253426 uint uiParentEventID = 0;3427 if(!bDoImmediate)3428 {3429 // Center camera here!3430 bool isTargetVisibleToActivePlayer = targetPlot.isActiveVisible(false);3431 if(isTargetVisibleToActivePlayer)3432 {3433 auto_ptr<ICvPlot1> pDllTargetPlot = GC.WrapPlotPointer(&targetPlot);3434 GC.GetEngineUserInterface()->lookAt(pDllTargetPlot.get(), CAMERALOOKAT_NORMAL);3435 }3436 kCombatInfo.setVisualizeCombat(isTargetVisibleToActivePlayer);34373438 auto_ptr<ICvCombatInfo1> pDllCombatInfo(new CvDllCombatInfo(&kCombatInfo));3439 uiParentEventID = gDLL->GameplayUnitCombat(pDllCombatInfo.get());34403441 // Set the combat units so that other missions do not continue until combat is over.3442 kAttacker.setCombatUnit(pDefender, true);3443 pDefender->setCombatUnit(&kAttacker, false);3444 CvUnit* pDefenderSupport = kCombatInfo.getUnit(BATTLE_UNIT_INTERCEPTOR);3445 if(pDefenderSupport)3446 pDefenderSupport->setCombatUnit(&kAttacker, false);34473448 eResult = ATTACK_QUEUED;3449 }3450 else3451 eResult = ATTACK_COMPLETED;34523453 ResolveCombat(kCombatInfo, uiParentEventID);3454 }3455 // Bombing a City3456 else3457 {3458 CvCombatInfo kCombatInfo;3459 GenerateAirCombatInfo(kAttacker, NULL, targetPlot, &kCombatInfo);3460 CvAssertMsg(!kAttacker.isDelayedDeath(), "Trying to battle and the attacker is already dead!");34613462 uint uiParentEventID = 0;3463 if(!bDoImmediate)3464 {3465 // Center camera here!3466 bool isTargetVisibleToActivePlayer = targetPlot.isActiveVisible(false);3467 if(isTargetVisibleToActivePlayer)3468 {3469 auto_ptr<ICvPlot1> pDllTargetPlot = GC.WrapPlotPointer(&targetPlot);3470 GC.GetEngineUserInterface()->lookAt(pDllTargetPlot.get(), CAMERALOOKAT_NORMAL);3471 }34723473 kCombatInfo.setVisualizeCombat(isTargetVisibleToActivePlayer);3474 auto_ptr<ICvCombatInfo1> pDllCombatInfo(new CvDllCombatInfo(&kCombatInfo));3475 uiParentEventID = gDLL->GameplayCityCombat(pDllCombatInfo.get());34763477 CvCity* pkDefender = targetPlot.getPlotCity();3478 kAttacker.setCombatCity(pkDefender);3479 if(pkDefender)3480 pkDefender->setCombatUnit(&kAttacker);3481 CvUnit* pDefenderSupport = kCombatInfo.getUnit(BATTLE_UNIT_INTERCEPTOR);3482 if(pDefenderSupport)3483 pDefenderSupport->setCombatUnit(&kAttacker, false);3484 eResult = ATTACK_QUEUED;3485 }3486 else3487 eResult = ATTACK_COMPLETED;34883489 ResolveCombat(kCombatInfo, uiParentEventID);3490 }34913492 return eResult;3493}