[Deutsch] Überblick über die KI

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • [Deutsch] Überblick über die KI

      Bei meiner Arbeit am Mod "Trade, War, Politics" (TWP) habe ich mich sehr viel mit der KI aus Gilde 2 befasst. Ich beschreibe hier, welche Ebenen der KI im Spiel zur Verfügung stehen, wofür sie eingesetzt werden (Vanilla) und worüf sie genutzt werden können (TWP).


      Dynastie-KI

      Die Dynastie-KI ist gewissermaßen das Pendant zum Spieler, wenn es um die Geschicke der eigenen Dynastie geht. Hier werden weitreichende Entscheidungen getroffen und die eigenen Dynastie-Mitglieder mit Aufgaben betraut.

      Die Dynastie-KI verwendet eine baumartige Struktur zur Entscheidungsfindung, diese beginnt im Ordner Scripts/AI/BaseTree. Die dortigen Skript folgen diesem Ablauf:
      1. Der Alias "dynasty" wird initialisiert mit der aktuellen Dynastie (Schattendynastie oder Farbdynastie).
      2. Alle Weight()-Funktionen des ersten Ordners werden ausgeführt. Diese Funktionen geben einen Wert zwischen 0 und 100 zurück -- die Gewichtung.
      3. Aus den Skripten, deren Gewichtung größer 0 ist, wird ein Skript ausgewählt. Je höher die Gewichtung eines Skripts, desto wahrscheinlicher ist die Auswahl dieses Skriptes. Es kann aber nur ein Skript ausgewählt werden.
      4. Die execute()-Funktion des ausgewählten Skripts wird ausgeführt.
      5. Falls es einen Ordner mit demselben Namen gibt, wiederholt sich der Ablauf ab (2) für diesen Ordner. Falls das Skript Aliase initialisiert hat, stehen diese auch den weiteren Skripten zur Verfügung.
      Generell gilt: Jede Dynastie (außer Spieler) durchläuft nacheinander diese Skripte. Damit ist die Rechenlast durch diese KI bei größeren Karten nicht höher, aber die einzelnen Dynastien treffen weniger Entscheidungen und wirken dadurch ggf. weniger aktiv. ABER: Die Skripte sind recht ineffizient, wenn zuviel Logik in der Weight-Funktion steckt.

      Die Dynasty-KI ist gut geeignet für Entscheidungen, die die gesamte Dynastie betreffen. Gerade Aktionen, die die Gunst zu anderen Dynastien beeinflussen sind hier gut aufgehoben. Diese KI ist nicht geeignet für Entscheidungen, die den aktuellen Zustand von Familienmitgliedern oder Angestellten betreffen. In Vanilla wurde hier z.B. die KI der Schergen implementiert. Auch Heilung und Gebäudereparatur sind in anderen Skripten besser aufgehoben.

      TWP: Der Entscheidungsbaum wurde aufwendig überarbeitet und beinhaltet jetzt diese Entscheidungsebenen:
      • Was steht an? -> Wahl, Gericht, Fehde, Duell, Arbeit, Dynastie
      • Was ist zu tun? -> z.B. Angreifen/Verteidigen, Gunst gewinnen, Kinder kriegen, Arbeiten, Expandieren
      • Wer kann das erledigen? -> z.B. einer der Ehepartner, der Angeklagte, der Besitzer eines Betriebs, jemand der nichts zu tun hat
      Vanilla: Die Entscheidungen sind teilweise recht einfach gestrickt und gehen nach dem Muster:
      Wer? -> Was? -> Warum?

      Gebäude-KI

      TODO

      SIM-KI

      Die meisten Skripte des Spiels enthalten Aktivitäten einzelner SIMs. Wenn ein SIM im Spiel etwas tut, dann ist das auf diese Arten von Skripten zurückzuführen:
      • Measures beschreiben Aktionen, die der SIM aktiv ausführt. Als Spieler wählt man die meisten dieser Aktionen durch Knopfdruck aus. Auch das Bewegen per Mausklick ist ein Measure.
      • States beschreiben Zustände des SIM. Ein SIM kann zu einem Zeitpunkt in mehreren States sein und durchläuft dabei jeweils das State-Script. Wird ein State durch eine Aktion unterbrochen, so wird der State anschließend fortgesetzt.
      • Behaviours sind Reaktionen der SIMs auf ihre Umwelt. Hier finden sich z.B. die Reaktionen auf Diebstahl, Feuer oder das Schwarze Brett.


      Wenn ein SIM "nichts" tut, durchläuft er tatsächlich ein Measure. Für die meisten SIMs ist das das Measure Idle, bei festen NPCs ist es in der Tabelle BuildingNPC.dbt vorgegeben (Spalte behaviour verweist auf ID in Measures.dbt).

      Scripts/Measures/Behaviour/std_idle.lua
      Das Skript wird für die meisten SIMs ausgeführt, wenn diese nichts anderes zu tun haben. Der SIM wird dann v.a. seine Bedürfnisse erfüllen wie Einkaufen oder einen Gottesdienst besuchen.

      TWP: Das Idle-Skript kann sehr gut verwendet werden, um untätige Angestellte mit Arbeitsaufträgen zu versorgen. In TWP ist damit die KI für Gauner-Berufe implementiert, z.B. für Dieb und Dirne. Für diese Berufe greifen die Gebäude-Skripte nicht, weil die KI-Einstellung für "Produktion" nicht aktiviert werden können.

      The post was edited 1 time, last by ThreeOfMe: Ergänzungen von Fajeth und zu Idle-Measure ().

    • ThreeOfMe wrote:

      Generell gilt: Jede Dynastie (außer Spieler) durchläuft nacheinander diese Skripte. Damit ist die Rechenlast durch diese KI bei größeren Karten nicht höher, aber die einzelnen Dynastien treffen weniger Entscheidungen und wirken dadurch ggf. weniger aktiv. ABER: Die Skripte sind recht ineffizient, wenn zuviel Logik in der Weight-Funktion steckt.
      Du meinst, die Dynastien führen das nicht paralell durch? Wie kommst du darauf? Oder falsch verstanden?`


      ThreeOfMe wrote:

      tates beschreiben Zustände des SIM. Ein SIM kann zu einem Zeitpunkt in nur einem State sein und durchläuft dabei das State-Script. Wird ein State durch eine Aktion unterbrochen, so wird der State anschließend fortgesetzt.
      Das ist so nicht richtig, ein SIM kann mehrere States haben, die alle gleichzeitig berechnet werden. Bzw. haben die meisten Sims sogar mehrere States aktiv. Die Anzahl der State-Scripte ist übrigens begrenzt auf IDs 0-63. Mehr hinzufügen geht nicht, bzw. führt zu Problemen.


      ThreeOfMe wrote:

      Wenn ein SIM "nichts" tut, befindet er sich meist im Idle-State. In diesem Zustand werden die meisten SIMs den eigenen Bedürfnissen nachgehen, siehe Scripts/Measures/Behaviour/std_idle.lua
      SIMs haben unterschiedliche Idle-Scripte. Behaviors werden mit dem Befehl Boolean SimSetBehavior(String SimAlias, String Behavior) festgelegt. Das sind alle Scripte im Behaviour-Ordner mit behavior_ vorn dran. bs_ sind die Observerscripts, die bei Actions (
      Boolean CommitAction(String ActionName, Alias ( of type guildobject) pActor, [Alias ( of type sim) or Alias ( of type building) pVictim], [Alias ( of type guildobject) pLocation], Alias ( of type actiondata) ret_Action) ) getriggert werden.

      Die std_ scripte werden glaube ich bei Char-Erstellung in nem Template festgelegt, wenn ich mich richtig erinnere.
    • @Fajeth Danke für die Ergänzung, ich arbeite das mal in den Text ein.


      Fajeth wrote:



      ThreeOfMe wrote:

      Generell gilt: Jede Dynastie (außer Spieler) durchläuft nacheinander diese Skripte. Damit ist die Rechenlast durch diese KI bei größeren Karten nicht höher, aber die einzelnen Dynastien treffen weniger Entscheidungen und wirken dadurch ggf. weniger aktiv. ABER: Die Skripte sind recht ineffizient, wenn zuviel Logik in der Weight-Funktion steckt.
      Du meinst, die Dynastien führen das nicht parallel durch? Wie kommst du darauf? Oder falsch verstanden?`
      Korrekt. Die Dynastien durchlaufen den KI-BaseTree nacheinander in einer festen Reihenfolge. Allerdings werden die Skripte i.A. so schnell durchlaufen, dass das dem Spieler nicht auffallen würde.

      Den Ablauf habe ich mithilfe von Debug-Meldungen (Log und Ingame) analysiert. So habe ich auch die Auswertung der Gewichtung herausgefunden.