#############################################################################################
# Starbase Stuff
#############################################################################################
def onUnitBuildImprovement(self, argsList):
'Unit begins enacting a Build (building an Improvement or Route)'
pUnit, iBuild, bFinished = argsList
iBuildStarbaseID = CvUtil.findInfoTypeNum(gc.getBuildInfo,gc.getNumBuildInfos(),'BUILD_STARBASE')
# Starbase WAS built
if (iBuild == iBuildStarbaseID):
pUnit.setScriptData("BuildingStarbase")
def onImprovementBuilt(self, argsList):
'Improvement Built'
iImprovement, iX, iY = argsList
iImprovementStarbaseID = CvUtil.findInfoTypeNum(gc.getImprovementInfo,gc.getNumImprovementInfos(),'IMPROVEMENT_STARBASE')
iUnitConstructShipID = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_CONSTRUCT_SHIP')
# Starbase finished
if (iImprovement == iImprovementStarbaseID):
pPlot = CyMap().plot(iX, iY)
pPlot.setImprovementType(-1)
# Look for Construction Ship on this plot
for iUnitLoop in range(pPlot.getNumUnits()):
pUnit = pPlot.getUnit(iUnitLoop)
if (pUnit.getScriptData() == "BuildingStarbase"):
self.doMakeStarbase(pUnit.getOwner(), iX, iY)
self.aiKillTimerData = [3, pUnit.getOwner(), pUnit.getID()]
# pUnit.kill(true, -1)
def doMakeStarbase(self, iPlayer, iX, iY):
pPlayer = gc.getPlayer(iPlayer)
pPlot = CyMap().plot(iX, iY)
# Create Starbase Unit
iUnitStarbaseID = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_STARBASE_I')
pPlayer.initUnit(iUnitStarbaseID, iX, iY, UnitAITypes.UNITAI_ATTACK, DirectionTypes.NO_DIRECTION)
self.updateStarbaseCulture(iPlayer, iX, iY)
def updateStarbaseCulture(self, iPlayer, iX, iY):
# Create culture around unit
for iXLoop in range(iX-2, iX+3):
for iYLoop in range(iY-2, iY+3):
iActiveX = iXLoop
iActiveY = iYLoop
if (iActiveX < 0):
iActiveX = CyMap().getGridWidth() + iActiveX
if (iActiveY < 0):
iActiveY = CyMap().getGridHeight() + iActiveY
pLoopPlot = CyMap().plot(iActiveX, iActiveY)
# pPlotLoop = CyMap().plot(iXLoop, iYLoop)
# printd("Setting Player %d as the owner of %d, %d" %(iPlayer, iXLoop, iYLoop))
# Don't override culture that's already here
if (pLoopPlot.getOwner() == -1):
pLoopPlot.setOwner(iPlayer)
def updateAllStarbases(self):
# Update Starbase culture
iUnitStarbaseID = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_STARBASE_I')
iUnitStarbaseIID = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_STARBASE_II')
iUnitStarbaseIIID = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_STARBASE_III')
iUnitMissileI = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_MISSILE_I')
iUnitMissileII = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_MISSILE_II')
iUnitMissileIII = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_MISSILE_III')
# List made to preserve culture of units built first
aaiStarbaseList = []
for iPlayerLoop in range(gc.getMAX_CIV_PLAYERS()):
pPlayer = gc.getPlayer(iPlayerLoop)
pTeam = gc.getTeam(pPlayer.getTeam())
pyPlayer = PyPlayer(iPlayerLoop)
iUnitToCreate = -1
aiPossibleUnitList = [iUnitMissileI, iUnitMissileII, iUnitMissileIII]
for iUnitLoop in aiPossibleUnitList:
pUnitInfo = gc.getUnitInfo(iUnitLoop)
iNeededTech = pUnitInfo.getPrereqAndTech()
if (pTeam.isHasTech(iNeededTech)):
iUnitToCreate = iUnitLoop
apUnitList = pyPlayer.getUnitList()
for pUnitLoop in apUnitList:
if (pUnitLoop.getUnitType() == iUnitStarbaseID or pUnitLoop.getUnitType() == iUnitStarbaseIID or pUnitLoop.getUnitType() == iUnitStarbaseIIID):
aaiStarbaseList.append([pUnitLoop.getGameTurnCreated(), iPlayerLoop, pUnitLoop.getX(), pUnitLoop.getY()])
# Need appropriate tech to create Missile
if (iUnitToCreate != -1):
# Need appropriate turn to create
iTurnCreated = pUnitLoop.getGameTurnCreated()
iCurrentTurn = CyGame().getGameTurn()
if (iTurnCreated != iCurrentTurn):
iTurnsSinceCreation = iCurrentTurn - iTurnCreated
# Produce Missile every 15 turns
if (iTurnsSinceCreation % 15 == 0):
pPlayer.initUnit(iUnitToCreate, pUnitLoop.getX(), pUnitLoop.getY(), UnitAITypes.NO_UNITAI, DirectionTypes.NO_DIRECTION)
# printd("\n\nXXX: There are %d Starbases on the map" %(len(aaiStarbaseList)))
# printd(aaiStarbaseList)
if (len(aaiStarbaseList) > 0):
# Make order such that units built first get culture preference
aaiStarbaseList.sort()
aaiStarbaseList.reverse()
for iStarbaseLoop in range(len(aaiStarbaseList)):
self.updateStarbaseCulture(aaiStarbaseList[iStarbaseLoop][1], aaiStarbaseList[iStarbaseLoop][2], aaiStarbaseList[iStarbaseLoop][3])
def canBuildStarbase(self, pPlot, iOffset=0):
# Starbase restriction
iBuildStarbase = CvUtil.findInfoTypeNum(gc.getBuildInfo,gc.getNumBuildInfos(),'BUILD_STARBASE')
# Can't build on a Solar System
iFeatureIDSolarSystem = CvUtil.findInfoTypeNum(gc.getFeatureInfo,gc.getNumFeatureInfos(),'FEATURE_SOLAR_SYSTEM')
if (pPlot.getFeatureType() == iFeatureIDSolarSystem):
return 0
# Can't build on top of another Starbase
iUnitStarbaseI = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_STARBASE_I')
iUnitStarbaseII = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_STARBASE_II')
iUnitStarbaseIII = CvUtil.findInfoTypeNum(gc.getUnitInfo,gc.getNumUnitInfos(),'UNIT_STARBASE_III')
iNumUnits = iOffset # Offset so that Interface can disable button
# Loop through all units on the plot
for iUnitLoop in range(pPlot.getNumUnits()):
pUnit = pPlot.getUnit(iUnitLoop)
# Can't build on top of another Starbase
if (pUnit.getUnitType() == iUnitStarbaseI or pUnit.getUnitType() == iUnitStarbaseII or pUnit.getUnitType() == iUnitStarbaseIII):
return 0
# if there are any Construction Ships already building a Starbase then disallow more
if (pUnit.getBuildType() == iBuildStarbase):
iNumUnits += 1
if (iNumUnits > 1): # Account for the one unit actually performing the mission
return 0
return 1
#############################################################################################