Um den Kram mal aus der Story auszulagern (für irgendwas muss der Thread hier ja gut sein ):
Zitat von
Pie
-) also das mit dem Array hat natürlich was. klar wär das möglich (kann ich dir dann machen).
Ok, ich bekomm's nicht hin Da die Arrays (die alle Tundrafelder/alle Eisfelder/etc. speichern, damit alle 40 Runden nur noch die Arrays und nicht das gesamte Spielfeld überprüft werden müssen) in der ersten Runde angelegt werden und natürlich auch in den späteren Runden noch verfügbar sein soll, müssen sie global angelegt werden (oder?). Das habe ich getan (glaub ich zumindest), indem ich sie hier dazu geschrieben hab:
PHP-Code:
# globals
###################################################
class CvEventManager:
def __init__(self):
#################### ON EVENT MAP ######################
#print "EVENTMANAGER INIT"
# PAE - Great General Names
self.GG_UsedNames = []
# PAE - Ice Age map Arrays
self.SchneeArray = []
self.TundraArray = []
self.EisArray = []
self.KuestenArray = []
self.DesertArray = []
self.SeeTrockArray = []
...
Hab es einfach so gemacht, wie es bei dem für benutzte Generalsnamen auch gemacht ist. Der restliche Kram bei onEndGameTurn sieht dann so aus:
PHP-Code:
#----------------------Schmelzen (Eiskarten)----------------------------
sScenarioScriptData = CyMap().plot(0, 0).getScriptData()
#Normal alle 40 Runden (insg. 940 Runden)
#Schnell alle 32 Runden (insg. 770 Runden)
#Episch alle 45 Runden (insg. 1095 Runden)
#Marathon alle 52 Runden (insg. 1220 Runden)
iTurnSchmelzIntervall = 1
if gc.getGame().getGameSpeedType() == gc.getInfoTypeForString("GAMESPEED_QUICK"): iTurnSchmelzIntervall = 32
elif gc.getGame().getGameSpeedType() == gc.getInfoTypeForString("GAMESPEED_EPIC"): iTurnSchmelzIntervall = 45
elif gc.getGame().getGameSpeedType() == gc.getInfoTypeForString("GAMESPEED_MARATHON"): iTurnSchmelzIntervall = 52
if sScenarioScriptData == "SchmelzEuro" or sScenarioScriptData == "SchmelzWelt":
if iGameTurn == 0:
iXLaenge = CyMap().getGridWidth()
iYLaenge = CyMap().getGridHeight()
eTundra = gc.getInfoTypeForString("TERRAIN_TUNDRA")
eSnow = gc.getInfoTypeForString("TERRAIN_SNOW")
eGras = gc.getInfoTypeForString("TERRAIN_GRASS")
eEbene = gc.getInfoTypeForString("TERRAIN_PLAINS")
eEis = gc.getInfoTypeForString("FEATURE_ICE")
eCoast = gc.getInfoTypeForString("TERRAIN_COAST")
eDesert = gc.getInfoTypeForString("TERRAIN_DESERT")
for x in xrange(iXLaenge):
for y in xrange(iYLaenge):
pPlot = CyMap().plot(x,y)
if pPlot.getTerrainType() == eSnow: self.SchneeArray.append(pPlot)
elif pPlot.getTerrainType() == eTundra: self.TundraArray.append(pPlot)
elif pPlot.getFeatureType() == eEis: self.EisArray.append(pPlot)
elif pPlot.isCoastalLand() and not pPlot.isCity() and not pPlot.isHills() and not pPlot.isPeak() and pPlot.getBonusType(pPlot.getOwner()) == -1: self.KuestenArray.append(pPlot)
elif pPlot.getTerrainType() == eEbene and not pPlot.isCoastalLand() and not pPlot.isCity() and not pPlot.isRiver(): self.DesertArray.append(pPlot)
elif pPlot.getTerrainType() == eCoast and y <=6 and x >= 2 and x <= 60: self.SeeTrockArray.append(pPlot)
elif iGameTurn % iTurnSchmelzIntervall == 0:
iWahrscheinlichkeit = 8
iXLaenge = CyMap().getGridWidth()
iYLaenge = CyMap().getGridHeight()
eTundra = gc.getInfoTypeForString("TERRAIN_TUNDRA")
eSnow = gc.getInfoTypeForString("TERRAIN_SNOW")
eGras = gc.getInfoTypeForString("TERRAIN_GRASS")
eEbene = gc.getInfoTypeForString("TERRAIN_PLAINS")
eEis = gc.getInfoTypeForString("FEATURE_ICE")
eCoast = gc.getInfoTypeForString("TERRAIN_COAST")
eDesert = gc.getInfoTypeForString("TERRAIN_DESERT")
iLaengeSchnee = len(self.SchneeArray)
iLaengeTundra = len(self.TundraArray)
iLaengeEis = len(self.EisArray)
iLaengeKueste = len(self.KuestenArray)
iLaengeDesert = len(self.DesertArray)
iLaengeSeeTrock = len(self.SeeTrockArray)
for i in range(iLaengeSchnee):
pPlot = self.SchneeArray[i] #Index out of range error
iX = pPlot.getX()
iY = pPlot.getY()
if sScenarioScriptData == "SchmelzEuro" and iX >= 42 and iY >= 49: iRand = self.myRandom(iWahrscheinlichkeit*3, None)
else: iRand = self.myRandom(iWahrscheinlichkeit, None)
if iRand == 1:
pPlot.setTerrainType(eTundra,1,1)
self.SchneeArray.remove(self.SchneeArray[i])
for i in range(iLaengeTundra):
pPlot = self.TundraArray[i]
iX = pPlot.getX()
iY = pPlot.getY()
if sScenarioScriptData == "SchmelzEuro" and iX >= 42 and iY >= 49: iRand = self.myRandom(iWahrscheinlichkeit*12, None)
else: iRand = self.myRandom(iWahrscheinlichkeit*4, None)
if iRand == 1:
pPlot.setTerrainType(eGras,1,1)
self.TundraArray.remove(self.TundraArray[i])
elif iRand == 2 or iRand == 3 or iRand == 4:
pPlot.setTerrainType(eEbene,1,1)
self.TundraArray.remove(self.TundraArray[i])
for i in range(iLaengeEis):
pPlot = self.EisArray[i]
iRand = self.myRandom(iWahrscheinlichkeit, None)
if iRand == 1:
pPlot.setFeatureType(-1, 0)
self.EisArray.remove(self.EisArray[i])
for i in range(iLaengeKueste):
pPlot = self.KuestenArray[i]
iRand = self.myRandom(50, None)
iY = pPlot.getY()
if iRand == 1:
if sScenarioScriptData == "SchmelzWelt" or (sScenarioScriptData == "SchmelzEuro" and iY >= 28):
pPlot.setTerrainType(eCoast,1,1)
self.KuestenArray.remove(self.KuestenArray[i])
for i in range(iLaengeDesert):
pPlot = self.DesertArray[i]
iRand = self.myRandom(iWahrscheinlichkeit, None)
if iRand == 1:
pPlot.setTerrainType(eDesert,1,1)
pPlot.setImprovementType(-1)
self.DesertArray.remove(self.DesertArray[i])
for i in range(iLaengeSeeTrock):
pPlot = SeeTrockArray[i]
iRand = self.myRandom(iWahrscheinlichkeit, None)
if iRand == 1:
pPlot.setTerrainType(eEbene,1,1)
self.DesertArray.append(self.SeeTrockArray[i])
self.SeeTrockArray.remove(self.SeeTrockArray[i])
Erst werden in der ersten Runde die Arrays gefüllt und sollten dann alle iTurnSchmelzIntervall (zum Test auf 1) Runden durchgegangen werden. Ist das Feld umgewandelt, wird es aus dem Array gekickt. Nur hab ich jetzt schon bei pPlot = self.SchneeArray[i] (erste for-Schleife) schon einen index out of range error. Hm. Ich denk mal, die Werte in den Arrays wurden nicht gespeichert und deshalb existiert self.SchneeArray[i] nicht? Dann müsste die Länge des Arrays ja eigentlich 0 sein. Würde die for-Schleife dann überhaupt ausgeführt? Das wäre dann ja quasi for i in range(0).
Naja, ich bin ratlos. Muss ich für die globale Definition noch irgendwas machen? Übrigens, ich bin mir auch gar nicht so sicher, ob GG_UsedNames funktioniert, ich hatte nämlich auch schon Generalsnamen doppelt...
Mal davon abgesehen, selbst wenn ich das zum Laufen bekomme, beim Beenden und Neustarten des Spiels bleibt das wohl nicht gespeichert? Könnte man das Füllen der Arrays noch in die onLoadGame-Methode schreiben? Das wär ne Lösung.
Edit: Oder meinetwegen sind die Dinger Listen und keine Arrays (wobei ich mir da nichtmal sicher bin )