jumpToNearestValidPlot()
ja, den befehl verwend ich auch einmal irgendwo.
jumpToNearestValidPlot()
ja, den befehl verwend ich auch einmal irgendwo.
Anstelle von
oder ab wo?PHP-Code:
for iXLoop in xrange(iX-1,iX+2,1):
for iYLoop in xrange(iY-1,iY+2,1):
NewPlot = CyMap().plot(iXLoop,iYLoop)
if not NewPlot.isWater():
pGroup = pPlotUnit.getGroup ()
pGroup.pushMoveToMission(iXLoop,iYLoop)
break
Und bezüglich der Zeile:
Wie sieht bei Python eine zulässige OR-Verknüpfung aus? Einfach so?PHP-Code:
if iGoodyType == gc.getInfoTypeForString("GOODY_WARRIOR"):
Oder muss ich noch etwas beachten?PHP-Code:
if iGoodyType == gc.getInfoTypeForString("GOODY_WARRIOR") or if iGoodyType == gc.getInfoTypeForString("GOODY_SETTLER") :
Denn ich muss ja alle Goodys erfassen, die Einheiten erzeugen.
1.
2. nur OR, nicht or if .
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Danke, ich teste es gerade.
Edit: Der Test hat ergeben, dass die Einheiten weiter auf dem Wasser schwimmen. Ist vielleicht irgendwo noch eine Abfrage enthalten, die nach der geänderten Situation keinen Sinn mehr bringt?
Aber es ergibt sich eine weitere Frage. Bei Barbaren stehen diese auch auf dem Wasser, aber leider nicht auf pPlot. Wie kann ich diese am besten an Land setzen oder - besser - Triremen umwandeln?
Ich denke, man muss von pPlot aus mit iX = PlotX-1, iY=PlotY-1 einmal um den pPlot herumgehen, bei jeder Unit abchecken: isBarbarian, dann Feld isWater, dann checken ob die Domain = Land ist und dann den Einheitentyp auf UNIT_TRIREME umändern.
Eigentlich nicht .
Nimm aber mal if not pPlotUnit.isCargo (): raus (und natürlich nächste Zeile neu einrücken).
PHP-Code:
def onGoodyReceived(self, argsList):
'Goody received'
iPlayer, pPlot, pUnit, iGoodyType = argsList
### barb transform start
if iGoodyType == gc.getInfoTypeForString("GOODY_BARBARIANS_WEAK"):
iX = pPlot.getX()
iY = pPlot.getY()
for iXLoop in xrange(iX-1,iX+2,1):
for iYLoop in xrange(iY-1,iY+2,1):
NewPlot = CyMap().plot(iXLoop,iYLoop)
if NewPlot.isUnit() and NewPlot.isWater():
iMaxPlotUnit = NewPlot.getNumUnits ()-1
for i in xrange(iMaxPlotUnit,-1,-1):
pPlotUnit = NewPlot.getUnit(i)
if pPlotUnit.isBarbarian() and pPlotUnit.getDomainType ()==gc.getInfoTypeForString("DOMAIN_LAND"):
newUnit = gc.getPlayer(gc.getBARBARIAN_PLAYER ()).initUnit(gc.getInfoTypeForString("UNIT_TRIREME"), iXLoop,iYLoop, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
pPlotUnit.setDamage(100, False)
###barb transform end
if (not self.__LOG_GOODYRECEIVED):
return
CvUtil.pyPrint('%s received a goody' %(gc.getPlayer(iPlayer).getCivilizationDescription(0)),)
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Bei mir sieht jetzt jetzt so aus:
Bei keinem Ereignis im Testspiel gingen keine Einheiten an Land.PHP-Code:
####An Land gehen start
if pPlot.isWater():
if iGoodyType == gc.getInfoTypeForString("GOODY_WARRIOR") or iGoodyType == gc.getInfoTypeForString("GOODY_SETTLER") or iGoodyType == gc.getInfoTypeForString("GOODY_ENTDECKER") or iGoodyType == gc.getInfoTypeForString("GOODY_SCHRIFTSTUECKE") or iGoodyType == gc.getInfoTypeForString("GOODY_KUNSTWERK") or iGoodyType == gc.getInfoTypeForString("GOODY_ARTEFAKT") or iGoodyType == gc.getInfoTypeForString("GOODY_RELIC") or iGoodyType == gc.getInfoTypeForString("GOODY_SCHATZ") or iGoodyType == gc.getInfoTypeForString("GOODY_SCOUT") or iGoodyType == gc.getInfoTypeForString("GOODY_WORKER") or iGoodyType == gc.getInfoTypeForString("GOODY_SLAVE"):
iMaxPlotUnit = pPlot.getNumUnits ()-1
for i in xrange(iMaxPlotUnit,0,-1):
pPlotUnit = pPlot.getUnit(i)
if pPlotUnit.getDomainType ()==gc.getInfoTypeForString("DOMAIN_LAND"):
iX = pPlot.getX()
iY = pPlot.getY()
pUnit.jumpToNearestValidPlot()
###An Land gehen end
### barb transform start
if iGoodyType == gc.getInfoTypeForString("GOODY_BARBARIANS_WEAK") or iGoodyType == gc.getInfoTypeForString("GOODY_BARBARIANS_STRONG"):
iX = pPlot.getX()
iY = pPlot.getY()
for iXLoop in xrange(iX-1,iX+2,1):
for iYLoop in xrange(iY-1,iY+2,1):
NewPlot = CyMap().plot(iXLoop,iYLoop)
if NewPlot.isUnit() and NewPlot.isWater():
iMaxPlotUnit = NewPlot.getNumUnits ()-1
for i in xrange(iMaxPlotUnit,-1,-1):
pPlotUnit = NewPlot.getUnit(i)
if pPlotUnit.isBarbarian() and pPlotUnit.getDomainType ()==gc.getInfoTypeForString("DOMAIN_LAND"):
newUnit = gc.getPlayer(gc.getBARBARIAN_PLAYER ()).initUnit(gc.getInfoTypeForString("UNIT_TRIREME"), iXLoop,iYLoop, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_NORTH)
pPlotUnit.setDamage(100, False)
###barb transform end
Ich glaube, ich habe es. Bei pPlotUnit=LAND versucht er, pUnit (also das Schiff, das das Feld aufgedeckt hat) auf den nächsten gültigen Platz zu versetzen, es bliebt also an Ort uns stelle.
Geändert von Kathy (25. Mai 2010 um 20:50 Uhr)
Zunächst einmal die gute Nachricht: Die Barbaren funktionieren, ich konnte bei meinen Tests viele Triremen aufdecken.
Allerdings bleiben die Einheiten trotz meiner Änderung in der letzten Spalte noch auf dem Ozean stehen, was ja nicht Sinn der Sache ist.
ich denke so:
(ich weiß nämlich nicht was das mit dem xrange 0,-1 soll,
drum ändere ich dies nach meinen kenntnissen)
und du hast pUnit statt pPlotUnit geschrieben. is ja klar, warum dir die einheit nicht ans land geht. pUnit hab ich nur deshalb geschrieben, damit du dich auskennst und eben deine unit vor den jump-befehl hinschreibst. wusste ja nicht, dass du deine einheit pPlotUnit nennst.
PHP-Code:
for i in pPlot.getNumUnits ():
pPlotUnit = pPlot.getUnit(i)
if pPlotUnit.getDomainType()== gc.getInfoTypeForString("DOMAIN_LAND"):
pPlotUnit.jumpToNearestValidPlot()
Das mit dem pPlotUnit habe ich, siehe letzte Zeile im vorletzten Post, schon bemerkt und korrigiert. Das andere probiere ich dann einmal.
Edit:
Diese Zeile verursacht einen Fehler.
Der Fehler lautet:PHP-Code:
for i in pPlot.getNumUnits ():
Type error: iteration over non sequence.
Geändert von Kathy (25. Mai 2010 um 21:57 Uhr)
Lass das mal, wie es vorher war, ändere nur pUnit.jumpToNearestValidPlot() in pPlotUnit.jumpToNearestValidPlot() um.
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
ups. warum geht dieses for i in plot.getNumUnits() nicht, J?
Einmal weil du das range vergessen hast (das hab' ich gestern nichtmal gesehen ).
Und das Ende der Schleife muss während eines Durchlaufes konstant bleiben und darf nicht verändert werden, was aber bei einem dynamischen Aufruf nicht unbedingt gegeben sein muss und deswegen wahrscheinlich rumgenörgelt wird -> einfach vorher in ne Variable speichern.
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
aja... hehe... ich hab das range auch nicht bemerkt.
und dass das mit der vorher definierten variable glaub ich dir gern, vc ist genauso sch...ön.
Ich habe das Gefühl, dass diese Zeile nicht verstanden worden ist:
Darin schreibe ich doch, dass ich es korrigiert habe. Trotzdem haben ich danach einen neuen Post gesetzt, in dem ich schreibe, dass es nicht funktioniert. Deinen Vorschlag habe ich also schon durchgeführt. Das scheint das Problem also nicht zu beheben. Ich stelle es trotzdem wieder her, da Pies Vorschlag ja offenbar nicht ganz funktioniert.Ich glaube, ich habe es. Bei pPlotUnit=LAND versucht er, pUnit (also das Schiff, das das Feld aufgedeckt hat) auf den nächsten gültigen Platz zu versetzen, es bliebt also an Ort und Stelle.
Es sieht jetzt so aus, und ich teste es jetzt noch einmal.
PHP-Code:
####An Land gehen start
if pPlot.isWater():
if iGoodyType == gc.getInfoTypeForString("GOODY_WARRIOR") or iGoodyType == gc.getInfoTypeForString("GOODY_SETTLER") or iGoodyType == gc.getInfoTypeForString("GOODY_ENTDECKER") or iGoodyType == gc.getInfoTypeForString("GOODY_SCHRIFTSTUECKE") or iGoodyType == gc.getInfoTypeForString("GOODY_KUNSTWERK") or iGoodyType == gc.getInfoTypeForString("GOODY_ARTEFAKT") or iGoodyType == gc.getInfoTypeForString("GOODY_RELIC") or iGoodyType == gc.getInfoTypeForString("GOODY_SCHATZ") or iGoodyType == gc.getInfoTypeForString("GOODY_SCOUT") or iGoodyType == gc.getInfoTypeForString("GOODY_WORKER") or iGoodyType == gc.getInfoTypeForString("GOODY_SLAVE"):
iMaxPlotUnit = pPlot.getNumUnits ()-1
for i in xrange(iMaxPlotUnit,0,-1):
pPlotUnit = pPlot.getUnit(i)
if pPlotUnit.getDomainType ()==gc.getInfoTypeForString("DOMAIN_LAND"):
pPlotUnit.jumpToNearestValidPlot()
###An Land gehen end
#
Ne Idee zum Problem habe ich nicht, ich kann nur sowas in der Art vorschlagen:
Macht das gleiche, ist etwas weniger schmerzhaft zu lesen und eventuell sogar schneller. Löst aber keine ProblemeCode:if iGoodyType in (gc.getInfoTypeForString("A"), gc.getInfoTypeForString("B"), gc.getInfoTypeForString("C"), gc.getInfoTypeForString("D"), gc.getInfoTypeForString("E"), gc.getInfoTypeForString("F"), usw): #...