Erstmal nur dein Beispiel, in Runde 15 eine Einheit zu platzieren. Könnten Fehler drin sein, ich hab das nicht alles extra ausprobiert.
Weißt die, wie der Python-EventManager aufgebaut ist? Der besteht grundsätzlich aus einem Haufen Methoden wie onUnitMove oder onGreatPersonBorn, die zu einem bestimmten Zeitpunkt aufgerufen werden, was sich meistens aus dem Namen ergibt - onGreatPersonBorn beispielsweise, wenn eine GP geboren wird. Bevor du irgendwas ändern willst, solltest du dir überlegen, in welcher Methode du idealerweise die Änderung machst. Für das Beispiel würd ich onBeginPlayerTurn nehmen.
Die Methode fängt so an:
PHP-Code:
def onBeginPlayerTurn(self, argsList):
'Called at the beginning of a players turn'
iGameTurn, iPlayer = argsList
pPlayer = gc.getPlayer(iPlayer)
def steht vor jedem Methodennamen, das zwischen den ' ist ein Kommentar. iGameTurn und iPlayer werden dieser Methode übergeben, heißt: In iGameTurn ist die Rundenzahl gespeichert und in iPlayer die Nummer des Spielers (also irgendwas zwischen 0 und 17). Die kannst du also schon mal nutzen.
Wie du siehst, steht grade in dieser Methode schon ziemlich viel drin - beispielsweise der gesamte Rebellions- und Versorgungskram. Es wäre sinnvoll, wenn du, wenn du etwas Neues hinzufügst, es entweder an den Anfang oder das Ende setzt, vielleicht besser an den Anfang, weil du dann nicht Gefahr läufst, die Zeileneinrückungen falsch zu machen, die sind nämlich wichtig.
Wenn du diese Methode dann erweitern willst, könntest du so anfangen:
PHP-Code:
def onBeginPlayerTurn(self, argsList):
'Called at the beginning of a players turn'
iGameTurn, iPlayer = argsList
pPlayer = gc.getPlayer(iPlayer)
if iGameTurn == 15:
iUnit = gc.getInfoTypeForString("UNIT_AXEMAN")
x = 10
y = 15
pPlayer.initUnit(iUnit, x, y, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
Erst legst du fest, welche Einheit du platzieren willst, hier den Axtkämpfer. Mit gc.getInfoTypeForString() kommst du an so ziemlich alles ran, da könnte auch BONUS_BIER oder FEATURE_JUNGLE stehen (was uns in diesem Fall natürlich nichts brächte). Was if iGameTurn == 15 bedeutet, erklärt sich eigentlich von selbst: Alles, was innerhalb dieser Bedingung steht (also alles, was hinter dem if eingerückt ist), wird nur ausgeführt, wenn die Bedingung erfüllt ist, also in diesem Fall nur in Runde 15, weil in iGameTurn die Runde gespeichert ist. initUnit() ist der Methodenaufruf, um eine Einheit zu platzieren, du findest alle Python-Methoden auf dieser Seite. Wichtig ist, was dahinter in Klammern steht, in diesem Fall: (UnitType iIndex, INT iX, INT iY, UnitAIType eUnitAI, DirectionType eFacingDirection). Da musst du die Werte reinschreiben, die du haben willst, in diesem Fall Art der Einheit, x-Koordinate, y-Koordinate, UnitAI (laut der verlinkten Seite sollte man immer UnitAITypes.NO_UNITAI nutzen, was wir also tun) und die Blickrichtung der Einheit (da die dir wohl recht egal ist, würd ich da auch immer DirectionTypes.DIRECTION_SOUTH hinschreiben). Das pPlayer vor dem Punkt ist der Spieler, dem die Einheit gehören soll, nicht mit iPlayer verwechseln - grob gesagt ist iPlayer die Nummer des Spielers, also 0-17, und pPlayer der Spieler selbst (auf informatisch: die Instanz der Klasse Player [oder CyPlayer oder wie auch immer die Klasse heißt], aber das kann dir wohl egal sein). pPlayer wird ja schon in der vierten Zeile definiert, das musst du also nicht mehr machen.
Das wär es auch schon, damit hättest du zumindest in Runde 15 eine Einheit platziert (für jeden Spieler), und zwar auf dem Feld x|y, also 10|15. Ist aber so noch relativ primitiv, das sollte man noch um ein paar Bedingungen erweitern:
PHP-Code:
def onBeginPlayerTurn(self, argsList):
'Called at the beginning of a players turn'
iGameTurn, iPlayer = argsList
pPlayer = gc.getPlayer(iPlayer)
if iGameTurn == 15:
iUnit = gc.getInfoTypeForString("UNIT_AXEMAN")
x = 10
y = 15
iSpielerCiv = pPlayer.getCivilizationType()
iAthen = gc.getInfoTypeForString("CIVILIZATION_ATHEN")
pPlot = CyMap().plot(x,y)
eOcean = gc.getInfoTypeForString("TERRAIN_OCEAN")
eCoast = gc.getInfoTypeForString("TERRAIN_COAST")
if iSpielerCiv == iAthen:
if pPlot != None and not pPlot.isNone() and pPlot.getTerrainType() != eOcean and pPlot.getTerrainType() != eCoast:
pPlayer.initUnit(iUnit, x, y, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH)
Als Beispiel. So wird noch zusätzlich geprüft, ob der Spieler Athen ist (und nur dann erhält er die Einheit) und die Einheit auch nur platziert, wenn das Geländefeld existiert (dafür sind pPlot != None and not pPlot.isNone(), frag mich nicht, wieso man beide braucht, ich hab das so von Pie geklaut ) und nicht Küste/Ozean ist. Man könnte mit pPlot.isPeak() jetzt noch prüfen, ob es ein Gipfel ist, wenn man alle nicht passierbaren Geländefelder ausschließen will. Will man die Einheiten auf einem angrenzenden Feld platzieren, sollte das gewünschte besetzt sein, könnte man es so machen:
PHP-Code:
def onBeginPlayerTurn(self, argsList):
'Called at the beginning of a players turn'
iGameTurn, iPlayer = argsList
pPlayer = gc.getPlayer(iPlayer)
if iGameTurn == 15:
iUnit = gc.getInfoTypeForString("UNIT_AXEMAN")
x = 10
y = 15
iSpielerCiv = pPlayer.getCivilizationType()
iAthen = gc.getInfoTypeForString("CIVILIZATION_ATHEN")
pPlot = CyMap().plot(x,y)
eOcean = gc.getInfoTypeForString("TERRAIN_OCEAN")
eCoast = gc.getInfoTypeForString("TERRAIN_COAST")
if iSpielerCiv == iAthen:
if pPlot != None and not pPlot.isNone() and pPlot.getTerrainType() != eOcean and pPlot.getTerrainType() != eCoast:
if pPlot.isUnit():
bDone = False
for i in range (3):
for j in range(3):
pPlot = CyMap.plot(x - 1 + i, y - 1 + j)
if not bDone and not pPlot.isUnit:
pPlayer.initUnit(iUnit, x, y, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH
bDone = True
else:
pPlayer.initUnit(iUnit, x, y, UnitAITypes.NO_UNITAI, DirectionTypes.DIRECTION_SOUTH
Ist wahrscheinlich etwas kompliziert für den Anfang... Allerdings auch mühselig, alles Schritt für Schritt zu erklären. Sag einfach, was davon unklar ist. != steht für ungleich. bDone ist ein Boolean, das heißt, er ist entweder True oder False, Bedeutung ist eigentlich klar. Wahr oder falsch halt. Hier steht in der Bedingung if not bDone, die Bedingung ist also erfüllt, wenn bDone False ist und nicht erfüllt, wenn es True ist. pPlot.isUnit() prüft, ob auf dem Geländefeld irgendeine Einheit draufsteht. Die for-Schleifen werden so oft ausgeführt, wie die Zahl dahinter angibt, hier dreimal. Dabei ist beim ersten Durchlauf die Variable (in der ersten i, in der zweiten j) 0, beim zweiten 1, dann 2. Das benutze ich hier, um die angrenzenden Koordinaten, das 3x3 große Feld um den Plot, durchzugehen. i und j haben in dieser Reihenfolge diese Werte:
i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2
Ist das verständlich? So prüft man mit den Koordinaten (x - 1 + i)|(y - 1 + j) alle angrenzenden Geländefelder.
Als Basis für Python könnte dir das hier vielleicht auch helfen, ist allerdings englisch. Wenn du noch Fragen hast (wahrscheinlich), frag einfach, ist natürlich ein bisschen viel auf einmal und meine Erklärung vielleicht auch grob fahrlässig schlecht, kA