Befreiungsscript

  • Hier mal wieder ein neues Tutorial zu Thema Scripten. Oder besser, was man noch so machen kann.
    Ich habe es Befreiungsscript genannt, weil es einst dafür gedacht war. Wer einen besseren Titel weiß, kann ihn gerne vorschlagen. :P


    Grundidee des Scripts ist es, dass Stadteroberungen nicht nur einfach darum gehen sollte eine weitere Stadt seinem Reich hinzu zu fügen, sondern es vielleicht einen „richtigen“ Grund dafür geben sollte.
    So in diesem Fall, wenn wir eine Nachricht bekommen würden, dass eine wichtige historische Person von einer anderen Fraktion gefangen genommen wurde.


    Wichtig!!! Dies bezieht sich nicht auf eine Gefangennahme von Generälen während einer Schlacht. Es geht hier um Charaktere welche nicht als bei einer Fraktion vorhanden waren aber doch eine Rolle gespielt haben.
    Das ganze mal anhand einer möglichen eigenen Kreuzzugskampagne. Dort könnte man anhand eines Kreuzzugs der Barone auch Walter IV. von Brienne erwähnen, welcher 1244 in Gefangenschaft der Choresmiern geriet, an Ägypten übergeben wurde und in deren Gefangenschaft er 1246 starb.


    Was währe nun, wenn man statt diesen Charakter tatsächlich erscheinen zu lassen, das Ereignis seiner Gefangennahme nur mit einem Event erwähnt, in dem z.B. alle christlichen Reiche darüber informiert werden, dass diese Mann gefangen genommen wurde und man ihn versuchen solle ihn zu befreien.



    Benötigte Dateien:
    campaign_script.txt im Ordner data/world/maps/campaign/imperial_campaign
    historic_events im Ordner data/text



    Wie immer erstmal das gesamte Script und dann die Aufschlüsselung.





    Aber im Einzelnen.



    Zuerst benennen wir einige Counter, welche wir später noch benötigen werden.
    Es ginge natürlich auch mit Eventcountern. Dann kann man sich das sparen ;)


    Code
    declare_counter befreiung_walter
    declare_counter walter_befreiung_durch



    Als nächstes die Meldung über die Gefangennahme des „Helden“ Walter.
    Hier wird zum Start der Runde 1244. :D ein Event für die Fraktionen jerusalem und antioch gemacht, welches mitteilt dass Walter gefangen genommen wurde.
    Dann setzen wir einen der zuvor definierten Counter (befreiung_walter) auf 1. Wird gleich klar wofür.


    Code
    monitor_event FactionTurnStart FactionIsLocal
    and I_TurnNumber >= 1244
    historic_event befreiung { jerusalem, antioch, } 
    set_counter befreiung_walter 1
    terminate_monitor	
    end_monitor


    Nun wissen Jerusalem und Antiochia dass Walter ein Gefangener Ägyptens ist. Je nach Text des Events kann man das ausschmücken und ihre „Aufgabe“ der Befreiung von Walter konkretisieren. Sagen wir, es würde etwa heißen, dass man ägyptische Städte erobern soll, bis man Walter gefunden hat.
    Darum müssen wir nun entweder bestimmen in welcher Stadt Walter ist. Dazu vielleicht mal in einer späteren Abschnitt. Oder wir machen es zufällig.
    Immer wenn eine Siedlung durch Jerusalem erobert wird und die Siedlung zuvor in ägyptischer Hand war und eben auch der von uns zuvor gesetzte Counter ‚befreiung_walter’ auf 1 steht, wird 1. ein weiterer Counter geschaltet, welchen wir später nutzen werden und 2. ein Zufallscounter geschaltet. In dem Fall mit einer Chance von 1 2 was = 50:50 ist. Nun noch den zufallscounter wieder auf 0 setzten, damit es später nicht zu einem Fehler kommt, wenn das Ereignis erneut eintreten sollen (keine Sorge, dies hat keine Auswirkung daruaf ob der zufallscounter auf 1 oder 2 geschaltet wird) und fertig.


    Code
    monitor_event GeneralCaptureSettlement FactionType jerusalem
    and TargetFactionType egypt
    and I_CompareCounter befreiung_walter = 1
    set_counter walter_befreiung_durch 1
    generate_random_counter zufallscounter 1 2
    set_event_counter zufallscounter 0
    end_monitor


    Das Ganze jetzt noch für jede Fraktion für die wir möchten. Hier mal nur noch für Antiochia.
    Dabei kann alles kopiert werden. Es müssen allerdings folgende Dinge geändert werden.
    Zum einen der Name der Fraktion, welche die Stadt erobert hat. Was ja logisch ist, da wir Jerusalem bereits erledigt haben. ;)
    Zum anderen muss der Counter ‚walter_befreiung_durch’ nicht auf 1 sondern auf 2, 3 usw. gesetzt werden.
    Damit dürfte auch ersichtlich sein, wofür dieser Counter zuständig ist. Über diesen bestimmen wir nämlich im Anschluss die Fraktion welche den Helden befreit hat.


    Code
    monitor_event GeneralCaptureSettlement FactionType antioch
    and TargetFactionType egypt	
    and I_CompareCounter befreiung_walter = 1
    set_counter walter_befreiung_durch 2
    generate_random_counter zufallscounter 1 2
    end_monitor



    Nun ist aber noch nicht klar, ob bei einer möglichen Eroberung der Siedlung Walter überhaupt da war. Er könnte eben so gut in einer anderen Siedlung gewesen sein.
    Darum auch der obige Zufallscounter.
    Hab die Chance nun auf 1 2 was 50:50 ist gemacht. Aber das ist beliebig erweiterbar. ;)
    Jedenfalls, hatte man Glück und der Counter schaltet richtig (hier 2) wird Walter befreit.
    Bei 1 passiert derzeit garnichts. Selbstverständlich währe hier auch etwas möglich.
    Aber durch wen? Richtig, wir haben ja den Counter ‚walter_befreit_durch’. Dieser bestimmte ja die Fraktion welche die Stadt eroberte. Schön ist dabei auch, wir können die ganzen Möglichkeiten mit ‚if’ untereinander schalten.
    Ist der Counter ‚walter_befreiung_durch’ = 1 war es Jerusalem. Bei 2 Antiochia usw.
    Nun machen wir noch ein paar schöne Events um aller Welt zu verkünden, dass Walter befreit wurde. Einmal für die Fraktion welche Walter befreit hat und einmal für die anderen Fraktionen welche ebenfalls die Chance dazu hatten. Soll ja alles seine Ordnung haben. Schließlich hat auch die KI, ohne es zu wissen, eine Chance darauf. :D
    Nun kommen wir zu Belohnung. Hierbei sind der Fantasie keine Grenzen gesetzt- den Typ als General, Einheiten, Spezialeinheiten, Geld, Begleitpersonen usw. sind alles möglich.
    Zuletzt noch den Conter ‚befreiung_walter’ auf 2 setzen, damit das Ereignis nicht wieder erscheint bzw. man es womöglich wieder benutzen kann. Hier währe auch ein terminate_monitor möglich. Dann währe es nach erfolgter Befreiung das ganze raus aus dem Script.





    Wenn man dies alles gemacht hat braucht es nur noch einige Texte für die Events:


    Code
    {BEFREIUNG_BODY} Walter IV. Brienne wurde von Ägypten gefangen genommen. Befreit ihn. 
    {BEFREIUNG_TITLE}   Gefangennahme
    {BEFREIUNG_DURCH_JERUSALEM_BODY} Walter IV. Brienne wurde durch die Truppen des Königreichs Jerusalem befreit.
    {BEFREIUNG_DURCH_JERUSALEM_TITLE}   Geglückte Befreiung
    {BEFREIUNG_NICHT_DURCH_ANTIOCH_BODY} Walter IV. Brienne wurde nicht durch die glorreichen Truppen Antiochias sondern durch die Truppen des Königreichs Jerusalem befreit.
    {BEFREIUNG_NICHT_DURCH_ANTIOCH_TITLE}   Befreiung
    {BEFREIUNG_DURCH_ANTIOCH_BODY} Walter IV. Brienne wurde durch die Truppen Antiochias befreit.
    {BEFREIUNG_DURCH_ANTIOCH_TITLE}   Geglückte Befreiung
    {BEFREIUNG_NICHT_DURCH_JERUSALEM_BODY} Walter IV. Brienne wurde nicht durch die glorreichen Truppen Jerusalems sondern durch die Truppen Antiochias befreit.
    {BEFREIUNG_NICHT_DURCH_JERUSALEM_TITLE}   Befreiung



    Für ein eigenes Bildchen im Eventfenster (nicht notwendig da das Spiel einfach auf das Bild des historischen Ereignisses zurückgreift) einfach eines im den Ordner eventpics in data/ui/southern_european hinterlegen.



    Es ist natürlich möglich das Ganze individuell für den Spieler und die jeweilige Mod anzupassen.
    So ist es möglich die Belohnungen zu verändern, die Vorraussetzungen anzupassen, Die Stadt in welcher Walter gefangen gehalten wird genau zu bestimmen, Walter auch zu töten wenn die Stadt erobert würd, ihn irgendwann frei zu lassen oder auch Lösegeld zu fordern/zahlen usw. Muß aber jeder selbst machen.
    Das hier ist nur ein mögliches Grundgerüst.


    Viel Spaß damit.

    :D

  • Das mit dem random_counter klingt mir nicht so richtig.Dieser eintrag "generate_random_counter zufallscounter 1 2" erstellt einen counter mit dem namen 'zufallscounter' und einem wert von 1 oder 2. Dieser counter ist weiter nicht erwaehnt im script, zB if I_CompareCounter zufallscounter = 1 mit einem anschliessenden befehl. Erklaer mal genauer bitte.

  • :D
    Du hast recht.
    Ich hab den random_counter zufall nicht mit 'if' im selben Monitor angehängt.
    Schau dir aber mal den nachfolgenden Monitor an.


    Code
    monitor_event EventCounter EventCounterType zufallscounter
    and EventCounter = 2


    Dieser übernimmt ja dieselbe Funktion wie das if.
    Nur wenn der zufallscounter auf 2 geht tritt das Ereignis ein.
    Ich habe es damals so gemacht, da es da nicht nur 2 Fraktionen waren sondern 5 oder 6. Mir persönlich fällt es leichter da den Überblick zu behalten.
    Es ist selbstverständlich möglich es auch anders zu machen und sofort mit if zu machen.



    Hab aber was anderes gestern vergessen bzw. rausgelöscht.


    Nachdem man random_conter zufallscounter gamacht hat, sollte man ihn danach sofort wieder auf 0 setzen.
    Die Auswertung ob 1 oder 2 wird davon nicht betroffen, da diese sofort ausgeführt wird, wenn man den Befehl dazu gibt.
    Allerdings, habe ich bei Tests festgestellt, daß wenn das Ereignis nicht eintritt aber die Vorraussetzungen später erneut eintreten, der zufallscounter nicht schaltet btw. sich zuerst wohl auf 0 zurückschaltet und erst darauffolgendend, wenn wieder die Vorraussetzungen erfüllt sind greifft.
    Beim 1. mal = läuft.
    Beim 2. mal = läuft nicht (zurück auf 0)
    Beim 3. mal = läuft
    Beim 4. mal = läuft nicht (zurück auf 0)
    usw.


    Das wurde jetzt korrigiert.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!