Hooks
static bool BeforeCvUnit_canAcquirePromotion(const CvUnit* self, PromotionTypes ePromotion, bool& result);static void AfterCvUnit_canAcquirePromotion(const CvUnit* self, PromotionTypes ePromotion, bool& result);static bool ReplaceCvUnit_canAcquirePromotion(bool (*original)(const CvUnit*, PromotionTypes), const CvUnit* self, PromotionTypes ePromotion);CivRegisterBefore<CivHooks::CvUnit_canAcquirePromotion>(host, &BeforeCvUnit_canAcquirePromotion);CivRegisterAfter<CivHooks::CvUnit_canAcquirePromotion>(host, &AfterCvUnit_canAcquirePromotion);CivRegisterReplace<CivHooks::CvUnit_canAcquirePromotion>(host, &ReplaceCvUnit_canAcquirePromotion);
Code
20567bool CvUnit::canAcquirePromotion(PromotionTypes ePromotion) const20568{20569 VALIDATE_OBJECT20570 CvAssertMsg(ePromotion >= 0, "ePromotion is expected to be non-negative (invalid Index)");20571 CvAssertMsg(ePromotion < GC.getNumPromotionInfos(), "ePromotion is expected to be within maximum bounds (invalid Index)");2057220573 CvPromotionEntry* pkPromotionInfo = GC.getPromotionInfo(ePromotion);20574 if(pkPromotionInfo == NULL)20575 {20576 return false;20577 }2057820579 if(isHasPromotion(ePromotion))20580 {20581 return false;20582 }2058320584 // AND prereq20585 if(pkPromotionInfo->GetPrereqPromotion() != NO_PROMOTION)20586 {20587 if(!isHasPromotion((PromotionTypes)(pkPromotionInfo->GetPrereqPromotion())))20588 {20589 return false;20590 }20591 }2059220593 // OR prereqs20594 bool bLacksOrPrereq = false;2059520596 PromotionTypes ePromotion1 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion1();20597 if(ePromotion1 != NO_PROMOTION)20598 {20599 if(!isHasPromotion(ePromotion1))20600 bLacksOrPrereq = true;20601 }2060220603 // OR Promotion 220604 if(bLacksOrPrereq)20605 {20606 PromotionTypes ePromotion2 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion2();20607 if(ePromotion2 != NO_PROMOTION)20608 {20609 if(isHasPromotion(ePromotion2))20610 bLacksOrPrereq = false;20611 }20612 }2061320614 // OR Promotion 320615 if(bLacksOrPrereq)20616 {20617 PromotionTypes ePromotion3 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion3();20618 if(ePromotion3 != NO_PROMOTION)20619 {20620 if(isHasPromotion(ePromotion3))20621 bLacksOrPrereq = false;20622 }20623 }2062420625 // OR Promotion 420626 if(bLacksOrPrereq)20627 {20628 PromotionTypes ePromotion4 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion4();20629 if(ePromotion4 != NO_PROMOTION)20630 {20631 if(isHasPromotion(ePromotion4))20632 bLacksOrPrereq = false;20633 }20634 }2063520636 // OR Promotion 520637 if(bLacksOrPrereq)20638 {20639 PromotionTypes ePromotion5 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion5();20640 if(ePromotion5 != NO_PROMOTION)20641 {20642 if(isHasPromotion(ePromotion5))20643 bLacksOrPrereq = false;20644 }20645 }2064620647 // OR Promotion 620648 if(bLacksOrPrereq)20649 {20650 PromotionTypes ePromotion6 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion6();20651 if(ePromotion6 != NO_PROMOTION)20652 {20653 if(isHasPromotion(ePromotion6))20654 bLacksOrPrereq = false;20655 }20656 }2065720658 // OR Promotion 720659 if(bLacksOrPrereq)20660 {20661 PromotionTypes ePromotion7 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion7();20662 if(ePromotion7 != NO_PROMOTION)20663 {20664 if(isHasPromotion(ePromotion7))20665 bLacksOrPrereq = false;20666 }20667 }2066820669 // OR Promotion 820670 if(bLacksOrPrereq)20671 {20672 PromotionTypes ePromotion8 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion8();20673 if(ePromotion8 != NO_PROMOTION)20674 {20675 if(isHasPromotion(ePromotion8))20676 bLacksOrPrereq = false;20677 }20678 }2067920680 // OR Promotion 920681 if(bLacksOrPrereq)20682 {20683 PromotionTypes ePromotion9 = (PromotionTypes) pkPromotionInfo->GetPrereqOrPromotion9();20684 if(ePromotion9 != NO_PROMOTION)20685 {20686 if(isHasPromotion(ePromotion9))20687 bLacksOrPrereq = false;20688 }20689 }2069020691 if(bLacksOrPrereq)20692 {20693 return false;20694 }2069520696 if(pkPromotionInfo->GetTechPrereq() != NO_TECH)20697 {20698 if(!(GET_TEAM(getTeam()).GetTeamTechs()->HasTech((TechTypes)(pkPromotionInfo->GetTechPrereq()))))20699 {20700 return false;20701 }20702 }2070320704 if(!isPromotionValid(ePromotion))20705 {20706 return false;20707 }20708 20709#if defined(MOD_EVENTS_UNIT_UPGRADES)20710 if (MOD_EVENTS_UNIT_UPGRADES) {20711 if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_CanHavePromotion, getOwner(), GetID(), ePromotion) == GAMEEVENTRETURN_FALSE) {20712 return false;20713 }2071420715 if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_UnitCanHavePromotion, getOwner(), GetID(), ePromotion) == GAMEEVENTRETURN_FALSE) {20716 return false;20717 }20718 } else {20719#endif20720 ICvEngineScriptSystem1* pkScriptSystem = gDLL->GetScriptSystem();20721 if (pkScriptSystem) 20722 {20723 CvLuaArgsHandle args;20724 args->Push(((int)getOwner()));20725 args->Push(GetID());20726 args->Push(ePromotion);2072720728 bool bResult = false;20729 if (LuaSupport::CallTestAll(pkScriptSystem, "CanHavePromotion", args.get(), bResult))20730 {20731 if (bResult == false) 20732 {20733 return false;20734 }20735 }20736 }20737#if defined(MOD_EVENTS_UNIT_UPGRADES)20738 }20739#endif2074020741 return true;20742}