Forum



diggad am 11.03.2023 02:48 #16147


Ich bin an einem Versuch für eine Mehrspieler Kampagnenkarte (2 Menschen, 3 AI)
Wenn jemand mit Wissen über den RTTR Code oder das LUA Scripting Auskunft geben kann, würde mich
das freuen. :D

Ich plane einen AI Trader der ungeduldig ist. Die AI ist in diesem Fall Player 2.
Die Idee ist eine super starke AI die mit vielen Generälen startet, sich aber nicht gross
ausbreitet, solange sie der Spieler glücklich hält. Dies geschieht mittels Erfüllung von immer
neuen, teilweise zeitlich befristeten, Aufträgen. (sende mir dies, baue das, erhalte dafür
etwas)

Dabei sind einige Fragen aufgetaucht:

  • Wie bringe ich die AI dazu einen Friedensvertrag aufzulösen?
    Ich kann zwar rttr:GetPlayer(2):CancelPact(0, 1) machen, dann kommt aber für
    Spieler 0 eine anfrage, dass die AI anfragt den Vertrag vorzeitig aufzulösen.
    Es sollte nicht ein Vorschlag sein, sondern direkt passieren.
    In umgekehrter Form passiert nichts.

  • Ich kann einen zeitlich befristeten Friedensvertrag mit rttr:GetPlayer(2):SuggestPact(0, 0,
    12000) machen bzw. vorschlagen, kann den dann aber nicht vorzeitig in einen
    permanenten Vertrag umwandeln oder in einen Vertrag mit neuem timer.
    Die AI ist so platziert, dass sie ziemlich schnell bzw. sofort angreifen würde, wenn der Vertrag
    ausläuft. Warten bis der Vertrag abläuft und einen neuen vorschlagen ist daher nicht wirklich
    eine Option.

  • Wie kann ich die Funktionen IsAlly(otherPlayerId) und
    IsAttackable(otherPlayerId) verstehen?
    Sind das eher Abfragen oder sind die zum setzten des status?
    Ich konnte mit ihnen keine ergebnisse erzielen.




Spike am 11.03.2023 12:19 #16148

Im Ruhestand
Ist so wie du dir das vorstellst aktuell nicht möglich, dazu müsste es folgendes geben: https://github.com/Return-To-The-Roots/s25client/issues/743

Verträge können nicht via Script Aufgehoben oder gesetzt werden, nur angefragt.

---



diggad am 11.03.2023 22:50 #16149


Ok, schade. Ist es evtl. möglich die AI am angreifen zu hindern obwohl sie könnte?

Oder vielleicht anders... Kann man die AI hindern anzugreifen weil z.B. Steine den weg
blockieren? Und wenn man dann per Script die AI angreifen lassen will, schaltet man für sie den
Steinbruch frei o.ä.?

Edit:
Ok. Mit steinen blockieren geht. Dann geht aber der Handel wiederum nicht

Editiert von diggad am 11.03.2023 23:15

Spike am 12.03.2023 11:15 #16150

Im Ruhestand
Also mir fallen nur folgende Lösungen ein:
1) Gib der AI nur so viele Soldaten, wie sie für die Besetzung von Gebäuden benötigt, so kann die AI erstmal nicht selbst angreifen
2) Lege einen Hafenpunkt in den nicht gesperrten Bereich, der nur zum handeln existiert, dann stört die Steinbarriere nicht gegen Handel

---



diggad am 12.03.2023 17:15 #16151


Das mit den Soldaten ist doch was, gute Idee.

Wie meinst du das mit dem Hafen? Kann man mit Schiffen auch handeln?

Als Option habe ich noch überlegt:
Steinbarrierre am direkten kontaktpunkt aber einen langen, offenen weg der nicht per Gebäudebesetzung eingenommen werden kann zum handeln.

Ich bin mal am testen...


Spike am 13.03.2023 10:40 #16152

Im Ruhestand
Es ist möglich mit jedem Lager zu handeln - der Hafen ist ein Lager.

Wenn du also den Hafen der AI erreichen kannst via Landweg, dann kannst du darüber Handel betreiben.

Alternativ zu deinem Stein Ansatz kannst du auch einfach unsichtbare static objects platzieren - so hast du volle Kontrolle über Durchgänge und bist nicht von Steinmetzen oder ähnliches der AI abhängig.

---



diggad am 14.03.2023 15:30 #16154


Häfen
Also soviel habe ich verstanden. Wenn aber der Landweg geblockt ist, müsste die AI 2 Häfen haben. Einen den sie auf ihrem Gebiet baut und einen 2. wenn sie das Wasser überquert hat. War das so gemeint?

Static objects
Habe das im Wiki gesehen, aber nicht ganz verstanden:
Code:
AddStaticObject(x, y, id, file = 0xFFFF, size = 0)
Adds new static object. Only environment/static objects and empty space can be overwritten. id: id in file file: 0xFFFF map_?_z.lst, 0-5 mis?bobs.lst size: 0: Block nothing (destructible), 1: Block single spot, 2: Block spots like castle-sized buildings


Ich gehe davon aus dass hier die id werte definiert sind:
https://github.com/Return-To-The-Roots/s25client/blob/master/libs/s25main/world/MapLoader.cpp#L279

Und file wird wohl immer "0xFFFF" sein.

Was wäre denn ein Befehl für ein unsichtbares Objekt?
Und was wäre denn der entsprechende Befehl um es zu entfernen?

Zur Info
  • Das mit den Soldaten geht ganz gut. Ich gebe der AI einen Soldaten zum Start. Dann für jedes Militärgebäude das sie baut einen weiteren. So greift sie nicht an.

  • Steinbarriere mit späterem Steinmetz freischalten habe ich auch hinbekommen.

  • Ich habe eine kleine "ai_trader" Klasse geschrieben mit einer "Quest Funktion". Der Kern dreht sich um zeitlich beschränkte Friedensverträge. Vielleicht kann ich bis nächste Woche eine Testmap teilen.




diggad am 14.03.2023 18:53 #16155


Häfen
Also soviel habe ich verstanden. Wenn aber der Landweg geblockt ist, müsste die AI 2 Häfen haben. Einen den sie auf ihrem Gebiet baut und einen 2. wenn sie das Wasser überquert hat. War das so gemeint?

Static objects
Habe das im Wiki gesehen, aber nicht ganz verstanden:
Code:
AddStaticObject(x, y, id, file = 0xFFFF, size = 0)
Adds new static object. Only environment/static objects and empty space can be overwritten. id: id in file file: 0xFFFF map_?_z.lst, 0-5 mis?bobs.lst size: 0: Block nothing (destructible), 1: Block single spot, 2: Block spots like castle-sized buildings


Ich gehe davon aus dass hier die id werte definiert sind:
https://github.com/Return-To-The-Roots/s25client/blob/master/libs/s25main/world/MapLoader.cpp#L279

Und file wird wohl immer "0xFFFF" sein.

Was wäre denn ein Befehl für ein unsichtbares Objekt?
Und was wäre denn der entsprechende Befehl um es zu entfernen?

Zur Info
  • Das mit den Soldaten geht ganz gut. Ich gebe der AI einen Soldaten zum Start. Dann für jedes Militärgebäude das sie baut einen weiteren. So greift sie nicht an.

  • Steinbarriere mit späterem Steinmetz freischalten habe ich auch hinbekommen.

  • Ich habe eine kleine "ai_trader" Klasse geschrieben mit einer "Quest Funktion". Der Kern dreht sich um zeitlich beschränkte Friedensverträge. Vielleicht kann ich bis nächste Woche eine Testmap teilen.




Spike am 14.03.2023 20:46 #16156

Im Ruhestand
Hafen: Ja genau

Mir ist sogar noch eine alternative eingefallen, du könntest 2 AIs nutzen, eine die nur das HQ hat auf der Spielerseite für den Handel (und nix bauen darf etc, ggf. Zelt als HQ nehmen) und eine, die du aggressiv schalten kannst.

AddStaticObject: macht so ziemlich das was da steht.
0xFFFF ist immer die MAP_0-2 (also Wasteland Datei etc). 1-5 sind die MISSBOBS1-5.

Id=Id in der Datei (ggf. entpacken)

Beispiele: https://github.com/Spikeone/RttR_Campaigns/blob/master/Campaign_Spike/m_spike01.lua

---



diggad am 14.03.2023 20:52 #16157


Häfen
Also soviel habe ich verstanden. Wenn aber der Landweg geblockt ist, müsste die AI 2 Häfen haben. Einen den sie auf ihrem Gebiet baut und einen 2. wenn sie das Wasser überquert hat. War das so gemeint?

Static objects
Habe das im Wiki gesehen, aber nicht ganz verstanden:
Code:
AddStaticObject(x, y, id, file = 0xFFFF, size = 0)
Adds new static object. Only environment/static objects and empty space can be overwritten. id: id in file file: 0xFFFF map_?_z.lst, 0-5 mis?bobs.lst size: 0: Block nothing (destructible), 1: Block single spot, 2: Block spots like castle-sized buildings


Ich gehe davon aus dass hier die id werte definiert sind:
https://github.com/Return-To-The-Roots/s25client/blob/master/libs/s25main/world/MapLoader.cpp#L279

Und file wird wohl immer "0xFFFF" sein.

Was wäre denn ein Befehl für ein unsichtbares Objekt?
Und was wäre denn der entsprechende Befehl um es zu entfernen?

Zur Info
  • Das mit den Soldaten geht ganz gut. Ich gebe der AI einen Soldaten zum Start. Dann für jedes Militärgebäude das sie baut einen weiteren. So greift sie nicht an.

  • Steinbarriere mit späterem Steinmetz freischalten habe ich auch hinbekommen.

  • Ich habe eine kleine "ai_trader" Klasse geschrieben mit einer "Quest Funktion". Der Kern dreht sich um zeitlich beschränkte Friedensverträge. Vielleicht kann ich bis nächste Woche eine Testmap teilen.




diggad am 14.03.2023 21:00 #16158


Leider kann man keine weiteren Pakte anbieten, sobald der erste Pakt abgelaufen ist (zumindest nicht seitens der ai)

Das wäre ein kleiner Fix so wie ich das im Code sehe.

Ich habe habe versucht das s25client repo in vscode aufzusetzen, aber ich habe ehrlich gesagt keinen Plan wie ich das Spiel dort kompilieren sollte. Gibt es dazu eine Anleitung?


Spike am 14.03.2023 23:18 #16159

Im Ruhestand
Ich hoffe du hast meine andere Antwort gelesen.

Ja, könnte ein Bug sein, mit einer 2ten dummmy ai die nur waren annimmt könntest du das Problem aber umgehen. Die ai kann dauerhaft im Player team sein, während die andere nie einen Pakt braucht.

Die Anleitung steht in der readme.md, direkt im repo - du brauchst visual studio, ka ob cmake auch einen vscode workspace erzeugen kann.

---



diggad am 14.03.2023 23:43 #16160


Danke für die Antworte(n). Da ging beim editieren was schief.
Ich hab einiges gelesen. Im prinzip gibt es ein offizielles cmake plugin aber bekomme 2 Fehlende includes angezeigt in der CMakeLists.txt.

Ich schaue morgen mal in in die readme.md rein.


diggad am 15.03.2023 23:25 #16164


Ok. Danke für den Hinweis auf readme.md, habs hinbekommen und einen pull request gemacht.
Mal schauen was passiert :D
https://github.com/Return-To-The-Roots/s25client/pull/1563

Wo ich schon alles eingerichtet habe...
Wie realistisch denkst du wäre die Annahme, wenn ich ein paar LUA Funktionen mache wie z.B.:
- eine Möglichkeit Verträge ohne Nachfrage zu kündigen (nur per LUA)
- onPactDeclined, onPactExpired


diggad am 16.03.2023 22:27 #16167


Nochmals bezüglich AddStaticObject

Zitat:
AddStaticObject: macht so ziemlich das was da steht.
0xFFFF ist immer die MAP_0-2 (also Wasteland Datei etc). 1-5 sind die MISSBOBS1-5.


Also das sagt mir jetzt nicht mehr.
Welche ID hätte den ein dieses unsichtbare Objekt?
Was sind MISSBOBS1-5?
Wie ich von 0xFFFF auf MAP_0-2 komme ist mir auch schleierhaft.

Sorry für all die Fragen. Musst es auch nicht im detail beantworten, es reicht wenn du einen ausgefüllten befehl nennen würdest im Stil von:
Code:
rttr:GetWorld():AddStaticObject(73, 186, 0, 2, 1)

Die Map auf der ich es einsetzen will ist eine Grasland biom, wenn das darauf ankommt.


Spike am 16.03.2023 23:23 #16168

Im Ruhestand
Zitat:
AddStaticObject(x, y, id, file = 0xFFFF, size = 0)
Place a new static object. Only environment/static objects and empty space can be overwritten.

    id: id in file
    file: 0xFFFF = map_?_z.lst, 0-5 = mis?bobs.lst
    size: 0: Block nothing (destructible), 1: Block single spot, 2: Block spots like castle-sized buildings


Das beschreibt das eigentlich ganz gut.

Trägst du 0xFFFF ein, so wird aus einer Grünlandkarte eine Grafik Id aus der MAP_0_Z.LST genommen, im Ödland (oder Winterwelt, was immer als nächstes kam) wird eine Grafik Id aus der MAP_1_Z.LST genommen, wenn du 0xFFFF als File einträgst.

Außerdem kannst du z.B. 2 eintragen, dann wird die Id aus der MIS2BOBS.LST genommen.

Um die Grafiken anzuschauen (und die IDs zu finden) einfach den lstpacker nutzen (siehe libsiedler projekt).

https://github.com/Return-To-The-Roots/libsiedler2/releases

Zitat:
Wo ich schon alles eingerichtet habe...
Wie realistisch denkst du wäre die Annahme, wenn ich ein paar LUA Funktionen mache wie z.B.:
- eine Möglichkeit Verträge ohne Nachfrage zu kündigen (nur per LUA)
- onPactDeclined, onPactExpired

Klingt für mich gut, alles was man so braucht ;)

https://github.com/Return-To-The-Roots/s25client/issues?q=is%3Aissue+is%3Aopen+LUA ist ansonsten einiges was für LUA noch nett wäre, abgesehen von dem Doku kram.

Dabei ist https://github.com/Return-To-The-Roots/s25client/issues/1177 wohl der wichtigste Teil

---



diggad am 17.03.2023 18:42 #16172


Hey, danke für die Inputs. Ich schau mir die Lua Punkte mal an.

Achso, jetzt verstehe ich das. Die bezeichngung MAP hat mich irritiert.
D.h. jedes Biom hat sein Set von Grafikdaten, die es verwendet. Damit sind dann z.B. die Bäume Weiss in einer Schneewelt.
D.h. der Parameter file kann entweder [0xFFFF, 0, 1, 2, 3, 4, 5] sein.

Ich konnte das erfolgreich in einer Grasland Karte testen.
Zum blockieren:
rttr:GetWorld():AddStaticObject(41, 104, 3105, 0xFFFF, 1)
Zum aufheben:
rttr:GetWorld():AddStaticObject(41, 104, 3105, 0xFFFF, 0)
3105 ist die Grafik des letzten Frames eines Katapulteinschlags. (nur noch etwas Steinstaub sichtbar)


Spike am 17.03.2023 21:37 #16173

Im Ruhestand
Vielleicht für dich auch spannend: https://drive.google.com/file/d/1JaU7qVORfWBGYwHrXUJ2xufTZaigH2F0/view?usp=sharing

Da sind ein paar animierte Objekte verwendet, also via LUA-Scripting noch ein wenig mehr gemacht, sozusagen ein kleines Framework ;)

---



diggad am 20.03.2023 02:06 #16174


Danke. Schaue mir das noch an.

Habe am Wochenende mit einer Tower Defense Idee herumgespielt.
https://easyupload.io/a2h1tm
Sie ist weder Fehlerfrei noch fertig, aber ich finde das Konzept interessant.

Catapult Highway:

  • 2 Spieler links und rechts versuchen eine vorerst eingesperrte AI in der Mitte mit Katapulten zu besiegen

  • Die AI bekommt immer mehr Generäle/Minute, je mehr Militärgebäude sie hat

  • Sobald entweder die AI oder einer der Spieler den Kartenboden erreicht haben, wird die Einsperrung stufenweise von unten nach oben
    aufgehoben (damit beide Spieler Zugang zur Mitte haben)

  • Man kann auch Singleplayer spielen, leider habe ich das mit dem Katapult bauen für die AI nicht hinbekommen (AIConstructionOrder)


Mit einer ausgereiften Version könnte man einen Thread mit einem Leaderboard machen. Speedrun mässig :D


Spike am 20.03.2023 17:07 #16175

Im Ruhestand
Also die AI hat dadurch Probleme, dass der Bauplatz so sehr am Rand ist - und die AI dort erstmal selbst etwas in die Nähe baut. Zum Zeitpunkt wenn die ConstructionOrder kommt (was eher ein "guck mal ob du das dort in der Nähe gerade bauen kannst" ist), ist der Bauplatz ggf. nicht verfügbar. Zumal man immer aufpassen muss, wenn ein Militärgebäude in der Nähe ist, wie dort der Weg verläuft. Die AI versucht nämlich meistens die Wege zu Militärgebäude getrennt vom restlichen System zu halten.

Zusammengefasst: ConstructionOrder ist ungenau, es braucht mehr "gute" Bauplätze in der Nähe, damit es vielleicht klappt. In meiner Kampagne habe ich auch unzählige Durchläufe gebraucht, Bäume versetzt, Steine neu Platziert, Bauplätze angepasst, bis es endlich so aussah am Ende wie ich das will ;)

---





Feel free to post in English!

Antwort schreiben

Username:
Security code:
Text:

   
  Convert smilies like :), ;) etc. into small graphics?
  Convert WWW-addresses into clickable links?
  Soll Boardcode in ihrer Nachricht aktiviert werden?