Bei Rome steht, dass de Einheit auf dem Plot 61/43 spawnen soll. Ist das auch der Ort, an dem die Hauptstadt steht? Ich vermute, ja, denn sonst stündte da wohl auch 32/32.
Ja genau, habe die Koordinaten aus der 35 Civ Save Datei übernommen.
Hier die ganze SpawnUnitUtil.py-Datei
Code:
##SpawnUnitUtil
###MODDER READ THIS:
###You do not have to change anything in this file.
###all changes have to be done in the CvEventManager.
###This file has to be in the same folder like the CvEventManager.py.
from CvPythonExtensions import *
import gc as garbage
gc = CyGlobalContext()
SpawnUnitList = []
def process(iTurn):
for entry in SpawnUnitList:
if entry.iTurn == iTurn:
AddUnits(entry)
def AddUnits(entry):
iMaxCiv = gc.getMAX_CIV_PLAYERS ()
for i in range(iMaxCiv):
pPlayer = gc.getPlayer(i)
iCiv = pPlayer.getCivilizationType()
if iCiv == entry.iCiv:
break
else:
return
if not pPlayer.isAlive():
return
if (entry.iX <=-1) or (entry.iY<=-1):
if pPlayer.isBarbarian():
return False
entry.iX = pPlayer.getCapitalCity().getX()
entry.iY = pPlayer.getCapitalCity().getY()
bPlotValid = checkPlot(entry,pPlayer,CyMap().plot(entry.iX,entry.iY))
if not bPlotValid:
for iXLoop in range(entry.iX - 1, entry.iX + 2, 1):
for iYLoop in range(entry.iY - 1, entry.iY + 2, 1):
pPlot = CyMap().plot(iXLoop,iYLoop)
bPlotValid = checkPlot(entry,pPlayer,pPlot)
if bPlotValid:
entry.iX = iXLoop
entry.iY = iYLoop
break
if bPlotValid:
break
if not bPlotValid:
if pPlayer.isBarbarian():
return
entry.iX = pPlayer.getCapitalCity().getX()
entry.iY = pPlayer.getCapitalCity().getY()
cvUnit = gc.getUnitInfo(entry.iUnit)
iUnitDomain = cvUnit.getDomainType ()
if iUnitDomain ==gc.getInfoTypeForString("DOMAIN_SEA"):
if not CyMap().plot(entry.iX,entry.iY).isCoastalLand ():
(loopCity, iter) = pPlayer.firstCity(false)
while(loopCity):
if CyMap().plot(loopCity.getX(),loopCity.getY()).isCoastalLand ():
entry.iX = loopCity.getX()
entry.iY = loopCity.getY()
break
(loopCity, iter) = pPlayer.nextCity(iter, false)
if not CyMap().plot(entry.iX,entry.iY).isCoastalLand ():
return False
for i in range(entry.iNumUnit):
pUnit = pPlayer.initUnit(entry.iUnit, entry.iX,entry.iY, UnitAITypes.NO_UNITAI, DirectionTypes.NO_DIRECTION )
for iProm in entry.lPromotion:
pUnit.setHasPromotion(iProm,True)
CyInterface().addMessage(pPlayer.getID(),False,15,CyTranslator().getText("TXT_KEY_REINFORCEMENT",()),'',0,gc.getUnitInfo(entry.iUnit).getButton(),gc.getInfoTypeForString("COLOR_GREEN") , entry.iX,entry.iY, True,True)
garbage.collect()
def checkPlot(entry,pPlayer,pPlot):
cvUnit = gc.getUnitInfo(entry.iUnit)
iUnitDomain = cvUnit.getDomainType ()
if pPlot.isWater() and (iUnitDomain !=gc.getInfoTypeForString("DOMAIN_SEA")):
return False
if (not pPlot.isWater()) and (iUnitDomain ==gc.getInfoTypeForString("DOMAIN_SEA")):
return False
if (iUnitDomain ==gc.getInfoTypeForString("DOMAIN_AIR") and not pPlot.isCity()):
return False
if pPlot.isImpassable ():
return False
if pPlayer.isBarbarian():
if pPlot.getOwner()>-1 and (pPlayer.getID()!=pPlot.getOwner()):
pOtherPlayer = gc.getPlayer(pPlot.getOwner())
for i in range(gc.getNumBuildingInfos ()):
cvBuilding = gc.getBuildingInfo(i)
if cvBuilding.isAreaBorderObstacle ():
if pOtherPlayer.countNumBuildings(i)>0:
return False
pTeam = gc.getTeam(pPlayer.getTeam())
if (pPlot.getOwner()<=-1) or (pPlot.getOwner()==pPlayer.getID()):
if pPlot.getNumUnits ()<=0:
return True
else:
for i in range(pPlot.getNumUnits ()):
pUnit = pPlot.getUnit(i)
if pTeam.isAtWar(pUnit.getTeam()):
return False
if pPlot.getOwner()>-1:
if pPlayer.getID()!=pPlot.getOwner():
pOtherPlayer = gc.getPlayer(pPlot.getOwner())
pOtherTeam = gc.getTeam(pOtherPlayer.getTeam())
if pTeam.getID()!=pOtherTeam.getID():
if pTeam.isOpenBorders(pOtherTeam.getID()):
return True
elif pTeam.isAtWar(pOtherTeam.getID()):
if pPlot.isCity():
return False
else:
return True
elif pOtherTeam.isVassal(pTeam.getID()):
return True
elif not pTeam.isOpenBorders(pOtherTeam.getID()):
return False
return True
def init(sModName):
MyFile = open("Mods/"+sModName+"/Assets/XML/CustomXML/CIV4SpawnUnitInfos.xml")
del SpawnUnitList[:]
for CurString in MyFile.readlines():
if "UnitType" in CurString:
CurEntry = SpawnEntry()
CurEntry.iUnit = gc.getInfoTypeForString(CutString(CurString))
if ("Promotion" in CurString) and not ("Promotions" in CurString):
CurEntry.lPromotion.append(gc.getInfoTypeForString(CutString(CurString)))
if "iNumUnit" in CurString:
CurEntry.iNumUnit = int(CutString(CurString))
elif "CIVILIZATION" in CurString:
CurEntry.iCiv = gc.getInfoTypeForString(CutString(CurString))
elif "Scenario>" in CurString:
CurEntry.sScenario = str(CutString(CurString)).upper()
elif "iTurn" in CurString:
CurEntry.iTurn = int(CutString(CurString))
elif "StartX" in CurString:
CurEntry.iX = int(CutString(CurString))
elif "StartY" in CurString:
CurEntry.iY = int(CutString(CurString))
SpawnUnitList.append(CurEntry)
MyFile.close()
MapName = CyMap().getMapScriptName ()
bScenario = False
if (".CIV" in MapName.upper()) and (not gc.getGame().isOption(GameOptionTypes.GAMEOPTION_ADVANCED_START)):
bScenario = True
if "civbeyondswordwbsave".upper() in MapName.upper():
MapName = MapName[0:-21]
if "CivWarlordsWBSave".upper() in MapName.upper():
MapName = MapName[0:-18]
if "Civ4WorldBuilderSave".upper() in MapName.upper():
MapName = MapName[0:-21]
MapName = MapName.upper()
lPop = []
del lPop[:]
if bScenario:
for i in range(len(SpawnUnitList)):
if SpawnUnitList[i].sScenario!=MapName:
if i not in lPop:
lPop.append(i)
if not bScenario:
for i in range(len(SpawnUnitList)):
if SpawnUnitList[i].sScenario!="-1":
if i not in lPop:
lPop.append(i)
iMaxCiv = gc.getMAX_CIV_PLAYERS ()
lCivs = []
del lCivs[:]
for i in range(iMaxCiv):
pPlayer = gc.getPlayer(i)
lCivs.append(pPlayer.getCivilizationType())
for i in range(len(SpawnUnitList)):
if SpawnUnitList[i].iCiv not in lCivs:
if i not in lPop:
lPop.append(i)
if SpawnUnitList[i].iTurn<=(CyGame().getGameTurn ()-2):
if i not in lPop:
lPop.append(i)
if SpawnUnitList[i].iCiv==-1:
if i not in lPop:
lPop.append(i)
lPop.sort()
lPop.reverse()
iPop = len(lPop)
for i in range(iPop):
SpawnUnitList.pop(lPop[i])
garbage.collect()
def CutString(string):
string = str(string)
string = string.strip()
string = string[2:-1]
BeginPos=-1
EndPos = -1
for i in xrange(len(string)):
if string[i]==">":
BeginPos=i
elif string[i]=="<":
EndPos=i
break
else:
return "-1"
NewString = string[BeginPos+1:EndPos]
return str(NewString)
class SpawnEntry:
def __init__(self):
self.iUnit = ""
self.iCiv = 0
self.lPromotion = []
self.sScenario = ""
self.iNumUnit = -1
self.iTurn = 0
self.iX = -1
self.iY = -1
Dazu habe ich noch eine Frage: Im Code steht, eine Einheit könne nicht auf gegnerischem Territorium spawnen. Könnte man das, wenn das ganze dann mal funktioniert, auch ändern, so dass die Einheit trotzdem dort spawnt und eventuell gleich Krieg erklärt, oder halt ein Verbündeter wird? So dass die Einheit auch eine Berechtigung hat dort zu sein. Sonst muss ich im Late Game schauen, dass, wenn ich eine neue Ziv "entstehen lassen" will, ich sie auf neutralem Territorium spawnen lasse und so darauf schauen muss, dass jenes Territorium ja bis dann neutral bleibt. Wenn ich das ändern könnte, müsste ich nicht darauf schauen.
Und zum EventManager:
Code:
## Sid Meier's Civilization 4
## Copyright Firaxis Games 2006
##
## CvEventManager
## This class is passed an argsList from CvAppInterface.onEvent
## The argsList can contain anything from mouse location to key info
## The EVENTLIST that are being notified can be found
from CvPythonExtensions import *
import CvUtil
import CvScreensInterface
import CvDebugTools
import CvWBPopups
import PyHelpers
import Popup as PyPopup
import CvCameraControls
import CvTopCivs
import sys
import CvWorldBuilderScreen
import CvAdvisorUtils
import CvTechChooser
###SpawnUnit part 1 start###
import SpawnUnitUtil
###SpawnUnit part 1 end###
import GodsOfOld
import pickle
Ich denke, da muss kein .py hintendran hin, da es sonst auch nirgends steht.