Ergebnis 1 bis 11 von 11

Thema: HOW TO - Feature: Kulturveränderung nach einem Kampf

  1. #1
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    13.366

    Feedbackforum HOW TO - Feature: Kulturveränderung nach einem Kampf

    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(selfargsList): 

    Das Original sieht so aus:

    PHP-Code:
      def onCombatResult(selfargsList):
        
    '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(selfargsList):
        
    '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 

    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.
    Geändert von Pie (17. März 2010 um 22:59 Uhr)

  2. #2
    Registrierter Benutzer Avatar von .:Den:.
    Registriert seit
    07.02.10
    Ort
    Zwischen Italien und Deutschland
    Beiträge
    137
    Sehr intressant!

    Wie siehts denn aus, wenn es eine Stadt ist?
    Und wenn noch andere Gegnerische Einheiten auf dem Feld stehen?

    Ich denke ich werde den Code im Art of War Mod einfügen, natürlich kommst du dafür auf die Dankesliste/Credits!
    "Man kann nicht sagen, die Menschheit mache keine Fortschritte, denn sie tötet in jedem Krieg mit neueren Methoden."

  3. #3
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    13.366
    hi DEN,
    sorry, das forum hatte mir diesen thread nicht automatisch abonniert...

    Stadt = wird trotzdem berechnet. kann ja dann auch ne kulturelle revolte daraus resultieren
    andere einheiten = egal. der, gegen den du gerade kämpfst muss kultur auf dem feld besitzen. wenn es ein grenzfeld ist, aber einer dritten partei gehört, dann wird ebenfalls kultur addiert. da aber nur 20% vom verlierer addiert wird, ist es in diesem fall kaum der rede wert.

    wenn du es bei einer stadt deaktiviern willst, dann kannst du

    if iCulture > 0:
    ändern zu
    if iCulture > 0 and not pPlot.isCity():

    Natürlich kannst du diesen code in dein Mod einfügen, dafür ist er ja auch da!

    und ich finde ihn praktisch, da keinerlei sdk oder sonstwas notwendig ist.

  4. #4
    Registrierter Benutzer Avatar von .:Den:.
    Registriert seit
    07.02.10
    Ort
    Zwischen Italien und Deutschland
    Beiträge
    137
    Zitat Zitat von pie Beitrag anzeigen
    hi DEN,
    sorry, das forum hatte mir diesen thread nicht automatisch abonniert...

    Stadt = wird trotzdem berechnet. kann ja dann auch ne kulturelle revolte daraus resultieren
    andere einheiten = egal. der, gegen den du gerade kämpfst muss kultur auf dem feld besitzen. wenn es ein grenzfeld ist, aber einer dritten partei gehört, dann wird ebenfalls kultur addiert. da aber nur 20% vom verlierer addiert wird, ist es in diesem fall kaum der rede wert.

    wenn du es bei einer stadt deaktiviern willst, dann kannst du

    if iCulture > 0:
    ändern zu
    if iCulture > 0 and not pPlot.isCity():

    Natürlich kannst du diesen code in dein Mod einfügen, dafür ist er ja auch da!

    und ich finde ihn praktisch, da keinerlei sdk oder sonstwas notwendig ist.
    Ich denke, Stadt werde ich deaktivieren, da man sonst eine Millionene Stadt mit Superarmee inerhalb 4-6 Angriffen einnehmen kann! Und was passiert eigentlich mit den Feindlichen Einheiten, wenn man eine Stadt dann Kulturell übernimmt?

    Ohne SDK ist immer praktisch und es ist für eine Kriegsveränderung ein sehr intressanter Faktor!
    "Man kann nicht sagen, die Menschheit mache keine Fortschritte, denn sie tötet in jedem Krieg mit neueren Methoden."

  5. #5
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    13.366
    nein, eine stadt kannst du so NIE einnehmen.

    grund:
    -) wenn die kultur eines feldes einer nation auf über 50% steigt, ändert sich dessen besitzer (das plot ändert die farbe der neuen nation)
    -) bei einer stadt ändert sich zwar die kultur, aber nicht der besitzer. also tritt da vorher eine revolte auf.

    aber: pro runde bekommt so ein feld - vor allem ein stadtfeld - wieder sehr viele eigene kulturpunkte addiert. da kannst du bei einer stadt lange angreifen bis das zu einer revolte führt!

    somit sind solche übergenommen kulturfelder meist nur kurze zeit im besitz des siegers. die kultur der nachbarstädte werden diese dann bald kulturell wieder übernehmen.

  6. #6
    Registrierter Benutzer Avatar von .:Den:.
    Registriert seit
    07.02.10
    Ort
    Zwischen Italien und Deutschland
    Beiträge
    137
    Ah ja, dumm von mir übersehen

    Kann ich auch eine Feld übernehmen, wenn keine Feindliche Einheit darauf steht?

    Sonst fände ich das etwas komisch. Nur bekommt man dann Probleme, weil man dann eine neue KI bräuchte, die ihre Einheiten auf die Grenze stellt um die Kultur zu beschützen!
    "Man kann nicht sagen, die Menschheit mache keine Fortschritte, denn sie tötet in jedem Krieg mit neueren Methoden."

  7. #7
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    13.366
    Kann ich auch eine Feld übernehmen, wenn keine Feindliche Einheit darauf steht?
    nö. du musst ja eine einheit besiegen, damit du überhaupt kulturpunkte auf das feld gutgeschrieben bekommst. und wie gesagt, der besitzer dieser einheit muss auch selbst kulturpunkte auf diesem feld besitzen.

    vom herumstehen bekommt man keine kulturpunkte.

  8. #8
    Registrierter Benutzer Avatar von .:Den:.
    Registriert seit
    07.02.10
    Ort
    Zwischen Italien und Deutschland
    Beiträge
    137
    Eben, finde ich etwas komisch, aber werde ich so lassen
    "Man kann nicht sagen, die Menschheit mache keine Fortschritte, denn sie tötet in jedem Krieg mit neueren Methoden."

  9. #9
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    13.366
    Helgi hat mich darauf aufmerksam gemacht, dass sich die Felder nicht unbedingt verfärben müssen. Nach einem Test bin ich drauf gekommen, dass sich diese NUR im Einflussbereich einer eigenen Stadt umfärbeln. Die Kultur wird zwar gutgeschrieben, aber das Land bleibt beim alten Besitzer, wenn dieses Feld weit weg von der eigenen Nation ist.

    Die Info hab ich oben hinzugefügt. Für mich eigentlich kein Grund etwas umzuprogrammieren (geht auch gar nicht, den "besitzer" zu wechseln, das macht CIV selbst), da es für mich sehr in Ordnung ist, dass ich am Ende der Welt zwar Einfluss gewinne, aber mir der Plot nicht gehören KANN, weil die einheimische Bevölkerung ja nicht mal meine Sprache spricht. Anders ist es in Grenzgebieten. Da kann natürlich schon ein Mischvolk leben.

    Großen Dank an Helgi!

  10. #10
    Registrierter Benutzer
    Registriert seit
    20.04.10
    Beiträge
    9
    Hi,
    finde das recht interessant.

    Ist es eventuell möglich im Gengebieten auch Felder zu übernehmen die nicht im direktem Stadteinfluss liegen als z.B. das besagte Feld ist 3 von der Stadt entfernt und es hat folgende Kulturwerte: Fraktion A 50% und Fraktion B 50%
    Das sich dann auch hier die Kultur ändert bei Kämpfen auf dem Feld.

    Leider kenne ich mit mit Python nicht aus um da selbst etwas zu tüfteln.

  11. #11
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    13.366
    Natürlich! Der kulturelle Einfluss einer Stadt kann über 2 Felder hinaus gehen! In diesem Fall sind ja die Kulturgrenzen gemeint und nicht der Stadtbebauungsradius. Also wenn deine Stadt schon auf die Kulturgröße von mindestens 3 Plots gewachsen ist, gehört der Plot bei 51% dir.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •