Im Mod Pie's Antikes Europa verändert sich der Kulturanteil eines Feldes nach einem Kampf.
Ich bin irgendwann mal über ein Mod gestolpert, das dieses System eingebaut hatte (weiß nicht mehr welches und ich kanns nicht rückvollziehen, da es schon mehrere davon gibt), welches mich auf die Idee gebracht hat. Leider war das Script irgendwie eigentartig nachzuvollziehen (mehrere Einflüsse werden berechnet), sodass ich mir nach meinen eigenen Vorstellungen dieses Script geschrieben habe.
Kulturveränderung eines Feldes/Plots nach einem gewonnenen Kampf
Hinweis: Das Feld wechselt den Besitzer/die Farbe nur dann, wenn sich das Feld auch im Einflussbereich einer eigenen Stadt befindet !!! Die Kulturpunkte werden trotzdem hinzugefügt, falls ja eine Stadt in dessen Nähe erobert wird, ist dieses Feld schon mal kulturell gesichert.
Was war/ist die Aufgabe?
Sobald eine Einheit auf einem Feld verliert, soll auf diesem Feld Kultur zugunsten des Gewinners addiert werden.
Sonst sollen keine weitere Einflüsse berechnet werden.
Was war/ist zu beachten?
Auf Kulturplots eines friedlichen Nachbarn soll natürlich keine eigene Kultur hinzukommen! Auch nicht irgendwo am anderen Ende der Welt (=auch auf neutralen Feldern keine Kulturveränderung).
----- Kurzer Sicherheitshinweis -----
BITTE: bevor ihr anfängt etwas zu modden, kopiert die zu ändernden Dateien in ein eigens erstelltes Mod.
Wer zum ersten Mal modded, bitte hier informieren: http://www.civforum.de/showpost.php?...39&postcount=2
Da ist kurz und bündig beschrieben was man tun kann, bevor man loslegt.
Falls jemand trotzdem ein Beispiel möchte, kann ich das gern posten.
-------------------------------------
Welche Script/Programmiersprache wird verwendet:
-) Python
Was für Dateien werden bearbeitet:
-) Assets/Python/CvEventManager.py
Man öffne die Datei (in einem besseren Texteditor) und gehe zur Definition
PHP-Code:
def onCombatResult(self, argsList):
Das Original sieht so aus:
PHP-Code:
def onCombatResult(self, argsList):
'Combat Result'
pWinner,pLoser = argsList
playerX = PyPlayer(pWinner.getOwner())
unitX = PyInfo.UnitInfo(pWinner.getUnitType())
playerY = PyPlayer(pLoser.getOwner())
unitY = PyInfo.UnitInfo(pLoser.getUnitType())
if (not self.__LOG_COMBAT):
return
if unitX and playerX and unitY and playerY:
CvUtil.pyPrint('Player %d Civilization %s Unit %s has defeated Player %d Civilization %s Unit %s'
%(playerX.getID(), playerX.getCivilizationName(), unitX.getDescription(),
playerY.getID(), playerY.getCivilizationName(), unitY.getDescription()))
onCombatResult ist die ausführende Funktion dafür, die Einheiten (Gewinner und Verlierer) nach einem Kampf noch zu beeinflussen.
Die neue Funktion sieht so aus:
PHP-Code:
def onCombatResult(self, argsList):
'Combat Result'
pWinner,pLoser = argsList
playerX = PyPlayer(pWinner.getOwner())
unitX = PyInfo.UnitInfo(pWinner.getUnitType())
playerY = PyPlayer(pLoser.getOwner())
unitY = PyInfo.UnitInfo(pLoser.getUnitType())
#####################################################
# ------- Change Culture Percent on the Plots after a battle
# Choose Plot and add 20% culture to the winner
pPlot = CyMap().plot(pLoser.getX(),pLoser.getY())
iCulture = pPlot.getCulture(pLoser.getOwner())
# only if the loser has culture on this plot, the winner gets culture points (eg. neutral area or 3rd civ area)
if iCulture > 0:
if iCulture >= 5:
Calc = iCulture/5
iCalc = int(round(Calc,0))
else:
iCalc = 1
pPlot.changeCulture(pWinner.getOwner(),iCalc,1)
#####################################################
if (not self.__LOG_COMBAT):
return
if unitX and playerX and unitY and playerY:
CvUtil.pyPrint('Player %d Civilization %s Unit %s has defeated Player %d Civilization %s Unit %s'
%(playerX.getID(), playerX.getCivilizationName(), unitX.getDescription(),
playerY.getID(), playerY.getCivilizationName(), unitY.getDescription()))
Was hab ich gemacht / Was kann man selbst noch ändern, wenn man will:
pPlot ist das Feld, wo der Verlierer draufgestanden ist.
Egal ob Verteidiger oder Angreifer (=sind 2 unterschiedliche Felder).
Bsp:
Verteidiger steht auf 1,1 und Angreifer auf 2,2 (X,Y)
Verteidiger verliert: pPlot = 1,1
Angreifer verliert: pPlot = 2,2
mit iCulture hol ich mir die Kulturpunkte des Verlierers auf diesem pPlot.
Besitzt der Verlierer auf diesem Feld Kultur (also ist es nicht ein Feld einer dritten CIV, oder neutral), dann gehts weiter.
if iculture > 0
Dann habe ich es so programmiert, dass ich ein Fünftel der derzeitigen Verliererkultur dem Gewinner zuschreibe. Dabei überprüfe ich, ob der Verlierer mehr als 4 Kulturpunkte besitzt, denn sonst gewinnt der Gewinner durch die
Rundung immer 1 ganzen Punkt und das Feld könnte bei 1 oder 2 Siegen schon dem neuen Besitzer gehören.
Ich wollte, dass man ungefähr 4 mal braucht, um ein Feld einzuverleiben. Deshalb ein Fünftel (siehe Beispiel weiter unten).
Bei Feldern, wo bereits schon eigene Kultur vorhanden ist (Grenzfelder), kann es auch vorkommen, dass man weniger als 4 Angriffe benötigt. Das soll auch so sein.
PHP-Code:
if iCulture >= 5:
Calc = iCulture/5
iCalc = int(round(Calc,0))
else:
iCalc = 1
Hier ein Rechenbeispiel, wie oft der Sieger ohne eigener Kultur gegen den Verlierer mit 100% Kultur gewinnen muss, bis das Feld kulturell wechselt:
1. Kampf: 100% - 0% -> ein Fünftel von 100% = +20%
2. Kampf: 80% - 20% -> ein Fünftel von 80% = +16%
3. Kampf: 64% - 36% -> ein Fünftel von 64% = +12.8%
4. Kampf: 51.8% - 48.8% -> ein Fünftel von 51.8% = ca. 10%
-> 41% - 58% -> Kulturveränderung nach 4 Kämpfen
Dieses kann man auch gern zB mit einem Drittel programmieren und die zwei 5er mit 3er tauschen. Dann siehts so aus:
1. Kampf: 100% - 0% -> ein Drittel von 100% = +33%
2. Kampf: 67% - 33% -> ein Drittel von 67% = +22%
-> 45% - 55% -> da ist schon der Wechsel nach dem 2ten Kampf
so, und dann müssen wir noch dem Feld sagen, dass es die Kultur des Siegers einfügen soll
PHP-Code:
pPlot.changeCulture(pWinner.getOwner(),iCalc,1)
Bitte auf die Einrückungen achten! Python besitzt keine Anweisungsabgrenzungen wie bspw { }.
Also diese pPlot.changeculture muss in der iCulture > 0 aber ausserhalb der if-else Anweisung stehen.
Deshalb diese Zickzack-Einrückungen.
Das wars und viel Spaß mit diesem einfach Code.
Ich freue mich natürlich, wenn ich dafür als Credit belohnt werde, sofern jemand dies wie folgt umsetzen möchte.