Hooks
static bool BeforeCvCity_CanRangeStrikeNow(const CvCity* self, bool& result);static void AfterCvCity_CanRangeStrikeNow(const CvCity* self, bool& result);static bool ReplaceCvCity_CanRangeStrikeNow(bool (*original)(const CvCity*), const CvCity* self);CivRegisterBefore<CivHooks::CvCity_CanRangeStrikeNow>(host, &BeforeCvCity_CanRangeStrikeNow);CivRegisterAfter<CivHooks::CvCity_CanRangeStrikeNow>(host, &AfterCvCity_CanRangeStrikeNow);CivRegisterReplace<CivHooks::CvCity_CanRangeStrikeNow>(host, &ReplaceCvCity_CanRangeStrikeNow);
Code
16001bool CvCity::CanRangeStrikeNow() const16002{16003 if(!canRangeStrike())16004 {16005 return false;16006 }1600716008#if defined(MOD_EVENTS_CITY_BOMBARD)16009 bool bIndirectFireAllowed; // By reference, yuck!!!16010 int iRange = getBombardRange(bIndirectFireAllowed);16011 16012 if (iRange == 0) return false;16013#else16014 int iRange = GC.getCITY_ATTACK_RANGE();16015 bool bIndirectFireAllowed = GC.getCAN_CITY_USE_INDIRECT_FIRE();16016#endif16017 CvPlot* pPlot = plot();16018 int iX = getX();16019 int iY = getY();16020 TeamTypes eTeam = getTeam();16021 PlayerTypes eActivePlayer = GC.getGame().getActivePlayer();16022 int iGameTurn = GC.getGame().getGameTurn();1602316024 for(int iDX = -iRange; iDX <= iRange; iDX++)16025 {16026 for(int iDY = -iRange; iDY <= iRange; iDY++)16027 {16028 CvPlot* pTargetPlot = plotXY(iX, iY, iDX, iDY);16029 bool bCanRangeStrike = true;1603016031 if(!pTargetPlot)16032 {16033 continue;16034 }1603516036 if(!bIndirectFireAllowed)16037 {16038#if defined MOD_BUGFIX_NAVAL_TARGETING16039 if (!pPlot->canSeePlot(pTargetPlot, eTeam, iRange, NO_DIRECTION, DOMAIN_LAND))16040#else16041 if (!pPlot->canSeePlot(pTargetPlot, eTeam, iRange, NO_DIRECTION))16042#endif16043 {16044 bCanRangeStrike = false;16045 }16046 }160471604816049 if(bCanRangeStrike)16050 {16051 if(pTargetPlot->isVisible(eTeam))16052 {16053 int iTargetPlotX = pTargetPlot->getX();16054 int iTargetPlotY = pTargetPlot->getY();16055 int iPlotDistance = plotDistance(iX, iY, iTargetPlotX, iTargetPlotY);16056 if(iPlotDistance <= iRange)16057 {16058 if(canRangeStrikeAt(iTargetPlotX, iTargetPlotY))16059 {16060 if(m_eOwner == eActivePlayer)16061 {16062 if(iGameTurn != m_bombardCheckTurn)16063 {16064 m_bombardCheckTurn = iGameTurn;16065 }16066 }1606716068 return true;16069 }16070 }16071 }16072 }16073 }16074 }1607516076 return false;16077}