#
#
#
from CvPythonExtensions import *
import CvUtil
import CvScreensInterface
import CvDebugTools
import CvWBPopups
import PyHelpers
import Popup as PyPopup
import CvCameraControls
import CvTopCivs
import sys
gc = CyGlobalContext()
# class ffhZoc:
def zoc(pPlot, pUnit, pPlayer):
szIcon = "Art/Interface/Buttons/Actions/fortify.dds"
iDamage = 0
iX = pPlot.getX()
iY = pPlot.getY()
# Check each plot surrounding the current plot for enemy forts
for iiX in range(iX-1, iX+2, 1):
for iiY in range(iY-1, iY+2, 1):
pCurrentPlot = CyMap().plot(iiX,iiY)
if (pCurrentPlot.getImprovementType() == gc.getInfoTypeForString("IMPROVEMENT_FORT") and pCurrentPlot.getNumVisibleEnemyDefenders(pPlayer.getID()) > 0):
# Stop the unit
if (pUnit.canMove() or pUnit.getMoves() != 0): #Should only happen once per unit
pUnit.finishMoves()
CyInterface().addMessage(pUnit.getOwner(),True,25,pUnit.getName() + " had it's movement halted by a fort.",'AS2D_DISCOVERBONUS',1,szIcon,ColorTypes(8),pUnit.getX(),pUnit.getY(),True,True)
# If the moving unit is mounted or has the appropriate counter promotions, stop here
if (pUnit.isHasPromotion(gc.getInfoTypeForString('PROMOTION_INVISIBLE')) or
pUnit.isHasPromotion(gc.getInfoTypeForString('PROMOTION_COVER')) or
pUnit.isHasPromotion(gc.getInfoTypeForString('PROMOTION_COVER2')) or
pUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_MOUNTED') ) :
return;
# For each unit in an enemy fort, attack the moving unit once as if it were attacking the fort
for iUnit in range(pCurrentPlot.getNumUnits()):
pFortUnit = pCurrentPlot.getUnit(iUnit)
iOdds = (1000-getCombatOdds(pUnit, pFortUnit)) # Fort Defender's odds
# print "iOdds=",iOdds
# print "STR=",pFortUnit.currCombatStr(pPlot, pFortUnit)
iDamage += (iOdds*pFortUnit.currCombatStr(pPlot, pFortUnit)/100000)*CyGame().getSorenRandNum(100, "Fort")/100 or 1
if (pFortUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_ARCHER') or pFortUnit.getUnitCombatType() == gc.getInfoTypeForString('UNITCOMBAT_SIEGE')) :
iDamage += 1 # archers and siege do extra damage...
if (iDamage > 0):
if (iDamage > 99): # cap damage at 99
iDamage = 99
# print "iDamage=",iDamage
pUnit.NotifyEntity(gc.getInfoTypeForString("MISSION_DAMAGE"))
pUnit.setDamage(iDamage, True)
message1 = "%s hit for " %(pUnit.getName())
message2 = "%d damage." %(iDamage)
strMessage = message1 + message2
CyInterface().addMessage(pUnit.getOwner(),True,25,strMessage,'AS2D_DISCOVERBONUS',1,szIcon,ColorTypes(8),pUnit.getX(),pUnit.getY(),True,True)
CyInterface().addMessage(pCurrentPlot.getOwner(),True,25,strMessage,'AS2D_DISCOVERBONUS',1,szIcon,ColorTypes(8),pUnit.getX(),pUnit.getY(),True,True)
# TODO notify player what happens in forts that are occupied in enemy lands