KI

Fragen zum Szenarienbau und Mapdesign

Moderatoren: Henning, Björn_Jernside

Hi Björn:
Ja klar, is sogar ganz wichtig, wenn es auch an den betreffenden Spieler gehen soll ...
:)
Habe mal wieder n KI-Problem
Verborgener Text:
#load-if-defined DIFFICULTY-MODERATE
(defconst kas1 7)
(defconst kas2 7)
(defconst sch1 7)
(defconst sch2 7)
(defconst sta1 10)
(defconst sta2 5)
(defconst bur1 7)
(defconst waf1 4)
(defconst waf2 3)
(defconst haf1 2)
(defconst haf2 2)
(defconst min-Angriffstrupp 15)
(defconst max-Angriffstrupp 25)
(defconst Prozent-Angriff 90)
(defconst Angriffs-Intervall 180)
#end-if
#load-if-defined DIFFICULTY-HARD
(defconst kas1 10)
(defconst kas2 10)
(defconst sch1 10)
(defconst sch2 10)
(defconst sta1 13)
(defconst sta2 10)
(defconst bur1 15)
(defconst waf1 5)
(defconst waf2 5)
(defconst haf1 3)
(defconst haf2 3)
(defconst min-Angriffstrupp 15)
(defconst max-Angriffstrupp 25)
(defconst Prozent-Angriff 90)
(defconst Angriffs-Intervall 120)
#end-if

(defrule
(true)
=>
(set-strategic-number sn-maximum-food-drop-distance 0)
(set-strategic-number sn-maximum-wood-drop-distance 0)
(set-strategic-number sn-maximum-gold-drop-distance 0)
(set-strategic-number sn-maximum-hunt-drop-distance 0)
(set-strategic-number sn-maximum-stone-drop-distance 0)
(set-strategic-number sn-food-gatherer-percentage 0)
(set-strategic-number sn-wood-gatherer-percentage 0)
(set-strategic-number sn-gold-gatherer-percentage 0)
(set-strategic-number sn-stone-gatherer-percentage 0)
(set-strategic-number sn-cap-civilian-explorers 0)
(set-strategic-number sn-percent-civilian-explorers 0)
(set-strategic-number sn-percent-civilian-builders 0)
(set-strategic-number sn-cap-civilian-explorers 0)
(disable-self))
(defrule
(true)
=>
(set-strategic-number sn-percent-enemy-sighted-response 100)
(set-strategic-number sn-enemy-sighted-response-distance 100)
(set-strategic-number sn-hits-before-alliance-change 25)
(set-strategic-number sn-percent-attack-boats 0)
(set-strategic-number sn-percent-attack-soldiers 0)
(set-strategic-number sn-task-ungrouped-soldiers 0)
(set-strategic-number sn-consecutive-idle-unit-limit 0)
(set-difficulty-parameter ability-to-maintain-distance 100)
(set-difficulty-parameter ability-to-dodge-missiles 100)
(disable-self))
(defrule
(true)
=>
(set-strategic-number sn-number-explore-groups 0)
(set-strategic-number sn-minimum-explore-group-size 0)
(set-strategic-number sn-maximum-explore-group-size 0)
(disable-self))
(defrule
(true)
=>
(set-strategic-number sn-number-boat-explore-groups 0)
(set-strategic-number sn-minimum-boat-explore-group-size 0)
(set-strategic-number sn-maximum-boat-explore-group-size 0)
(disable-self))


(defrule
(event-detected trigger 2)
=>
(set-goal 10 1)
(disable-self))

(defrule
(goal 10 1)
=>
(set-strategic-number sn-maximum-food-drop-distance 0)
(set-strategic-number sn-maximum-wood-drop-distance 0)
(set-strategic-number sn-maximum-gold-drop-distance 0)
(set-strategic-number sn-maximum-hunt-drop-distance 0)
(set-strategic-number sn-maximum-stone-drop-distance 0)
(set-strategic-number sn-food-gatherer-percentage 0)
(set-strategic-number sn-wood-gatherer-percentage 0)
(set-strategic-number sn-gold-gatherer-percentage 0)
(set-strategic-number sn-stone-gatherer-percentage 0)
(set-strategic-number sn-cap-civilian-explorers 0)
(set-strategic-number sn-percent-civilian-explorers 0)
(set-strategic-number sn-percent-civilian-builders 0)
(disable-self))
(defrule
(goal 10 1)
=>
(set-strategic-number sn-number-explore-groups 0)
(set-strategic-number sn-minimum-explore-group-size 0)
(set-strategic-number sn-maximum-explore-group-size 0)
(disable-self))
(defrule
(goal 10 1)
=>
(set-strategic-number sn-percent-attack-soldiers Prozent-Angriff)
(set-strategic-number sn-attack-intelligence 100)
(set-strategic-number sn-defense-distance 100)
(set-strategic-number sn-sentry-distance 100)
(set-strategic-number sn-target-evaluation-siege-weapon 100)
(set-strategic-number sn-target-evaluation-damage-capability 100)
(set-strategic-number sn-number-attack-groups 2)
(set-strategic-number sn-minimum-attack-group-size min-Angriffstrupp)
(set-strategic-number sn-maximum-attack-group-size max-Angriffstrupp)
(attack-now)
(enable-timer 1 Angriffs-Intervall)
(enable-timer 3 6)
(enable-timer 4 6)
(enable-timer 5 6)
(disable-self))

(defrule
(timer-triggered 1)
=>
(disable-timer 1)
(enable-timer 1 Angriffs-Intervall)
(attack-now))


(defrule
(goal 10 1)
(unit-type-count-total militiaman-line less-than kas1)
(can-train militiaman-line)
=>
(train militiaman-line))
(defrule
(goal 10 1)
(unit-type-count-total spearman-line less-than kas2)
(can-train spearman-line))
=>
(train spearman-line))

(defrule
(goal 10 1)
(unit-type-count-total archer-line less-than sch1)
(can-train archer-line)
=>
(train archer-line))
(defrule
(goal 10 1)
(unit-type-count-total skirmisher-line less-than sch2)
(can-train archer-line)
=>
(train skirmisher-line))

(defrule
(goal 10 1)
(unit-type-count-total knight-line less-than sta1)
(can-train knight-line)
=>
(train knight-line))
(defrule
(goal 10 1)
(unit-type-count-total scout-cavalry-line less-than sta2)
(can-train scout-cavalry-line)
=>
(train scout-cavalry-line))

(defrule
(goal 10 1)
(unit-type-count my-unique-unit-line less-than bur1)
(can-train my-unique-unit-line)
=>
(train my-unique-unit-line))

(defrule
(goal 10 1)
(unit-type-count-total battering-ram-line less-than waf1)
(can-train battering-ram-line)
=>
(train battering-ram-line))
(defrule
(goal 10 1)
(unit-type-count-total scorpion-line less-than waf2)
(can-train scorpion-line)
=>
(train scorpion-line))

(defrule
(goal 10 1)
(unit-type-count-total fire-ship less-than haf1)
(can-train fire-ship)
=>
(train fire-ship))
(defrule
(goal 10 1)
(unit-type-count-total galley-line less-than haf2)
(can-train galley-line)
=>
(train galley-line))

Leider kommt immer ne Fehlermeldung... und der Spieler baut keine Einheiten

Zusatzfragen:
1. Wie bekomme ich das hin, dass all diese Aktionen erst ab einem bestimmten Zeitpunkt (KI-Skripziel) wirksam werden
2. Das die Dorfis nix machen
3. Das der Spieler nur verteidigt
4. Das der Spieler schön angreift (ähnliche KI)
Hi Björn,

was steht in der Fehlermeldung?


zu 1. hierfür ist das KI-Skritpziel im Editor. Du machst einfach unter dem Spieler, dessen KI das Skriptziel erhalten, soll sagen wir mal Spieler3 KI-Skriptziel 99.
In der KI von Spieler3 schreibst du dann die Bedingung event-detected trigger 99. Alle Anweisungen, die in diesem Trigger enthalten sind, werden dann erst nach erfüllen des Schalters ausgeführt.
Um den Trigger für mehrere KI-Regeln geltend zu machen kannst du die goals verwenden.
In deinem Beispiel ist das folgende Zeile:

Code: Alles auswählen

(defrule
(event-detected trigger 2)
=>
(set-goal 10 1)
(disable-self))
trigger 2 bedeutet hier, du musst per Schalter das KI-Skriptziel 2 aktivieren. Dann erst wird die KI aktiv. Das goal 10 wurde auf 1 gesetzt.
Es werden nun alle rules, welche mit dem goal 10 verknüpft sind aktiviert.
disable-self hebt den trigger auf, er kann somit nicht mehr verwendet werden.
Dafür ist nun das goal zuständig.

Dein Code:

Code: Alles auswählen

(defrule
(goal 10 1)
(weitere Bedingungen)
=>
(Aktionen)
(disable-self))
Es können jetzt zum Beispiel die Angriffe gestartet werden.
Wenn die Angriffe später wieder gestoppt werden sollen kann das goal 10 mit 2 überschrieben werden und der Attack-Timer mittels event-detected trigger 3 ausgeschaltet werden, Angriffstrupps auf 0.



zu 2. ganz einfach immobile units

zu 3. indem du keine attack-rule schreibst. Verteidung erfolgt normalerweise automatisch. Du musst nur deine Verteidigungstruppen bauen lassen.

zu 4. Wiederspricht sich zwar mit 3 aber in dem Fall genau umgekehrt, nämlich indem du eine attack-rule erstellst. Hier kannst du dann die min- max-Anzahl der Einheiten einstellen.
Damit bekommst du schöne Angriffsformationen.
Die Anfgriffsabstände kannst du mittels Timer erledigen.
Ich hätte da mal wieder eine Frage:

Ich habe eine Zusammenarbeit aus KI und Schaltern zusammengestellt.

Bei eingabe eines bestimmten Taunts soll (per schalter) etwas bestimmtes passieren.
Das habe ich bisher bewerkstelligt indem ich in der KI als fact "taunt-detected..." geschrieben habe. Die KI wiederum sendet ein Signal, welches der Schalter der die gewünschte Aktion ausführt als Bedingung hat.
Das funktioniert auch prima soweit. Das problem, das ich aber habe ist, dass sobald das signal zum ersten mal gegeben wird, die Bedingung ständig erfüllt ist und die Aktion folglich ständig stattfindet und nicht nur immer dann wenn der taunt eingegeben wird (triggerschleife ist an). Was ich aber will ist eben dass NUR jedesmal wenn der taunt eingegeben die aktion stattfindet.

daher meine Frage: wie kann ich das lösen ? Ich vermute, dass das problem das Signal ist welches ja nicht wieder "deaktiviert" und "reaktiviert" werden kann. Gibt es eine andere Möglichkeit von KI zu Schalter zu kommunizieren?
Hi Ivan,

hast du schon versucht, mit disable-self den KI-Trigger, der das Signal auszuschalten?
Also in diversen Szenarien wurde das so gelöst....

KI:
Wenn Taunt 100 ... dann bekommt Spieler X zb 1 Holz

Schalter: (Triggerschleife an)
Bed: Spieler 2 hat 1 Holz
Effekt: was auch immer passieren soll
Effekt: Tribut - Spieler 2 - Holz an Gaia
kann ich "dann bekommt Spieler X 1 Holz" in KI umsetzen ? Dachte das geht nur per Schalter ?!
(...)
=>
(cc-add-resource wood 1)
)
Super Danke! Gibt es da noch andere Möglichkeiten ? Kann man z.b. irgendwie per KI einheiten setzen lassen (also nicht in ner ausbildungsstätte ausbilden lassen, sondern einfach aufploppen lassen) ?



Edit: Irgendwie besteht mein Problem immer noch. Jetzt ist es so, dass der Effekt ständig eintritt. Es scheint so als ob der KI fact sobald ich den entsprechenden Taunt zum ersten Mal eingegeben habe ständig erfüllt ist, weswegen der Spieler mit der KI 1 Holz pro Zeiteinheit erhält.
Nein, derartige Dinge gehen leider nur per Schalter.
Kannst es höchstens indirekt, etwa über ein KI-Signal, steuern bzw auslösen, aber letzten Endes muß die Aktion "neue Einheit setzen" selbst mit einem Schalter erfolgen.

KI-Skripte regeln im Grunde vereinfacht gesagt nur die "(Inter)aktion von PC-Spielern anhand ihrer auf der jeweiligen Map vorgegebenen Möglichkeiten". Du kannst einer KI befehlen, bei Event A oder je Zeitgeber B iwelche Einheiten unter Bedingung C auszubilden. Sofern aber die praktischen Voraussetzungen dafür nicht existent sind oder erstellt werden können (etwa: das benötigte Gebäude) wird das schlicht nicht passieren.
Hier nochmal als Inspiration für alle Nichtsahnenden und Unwissenden die guten alten KI Cheat-Lines, damit spart man sich viele Tributschalter und vergleichbares, um das "Ausbluten" der KI zu verhindern.

Könnte zum Beispiel so aussehen:

; Cheat

(defrule
(food-amount < 500)
=>
(cc-add-resource food 800)
)

(defrule
(wood-amount < 200)
=>
(cc-add-resource wood 500)
)

(defrule
(gold-amount < 500)
=>
(cc-add-resource gold 1000)
)
ja was würden deine MAyas nur ohne diese Zeilen machen ^^
ja was würden deine MAyas nur ohne diese Zeilen machen
Ziemlich alt aussehen! ;)
Ivan hat geschrieben: Edit: Irgendwie besteht mein Problem immer noch. Jetzt ist es so, dass der Effekt ständig eintritt. Es scheint so als ob der KI fact sobald ich den entsprechenden Taunt zum ersten Mal eingegeben habe ständig erfüllt ist, weswegen der Spieler mit der KI 1 Holz pro Zeiteinheit erhält.
Falls das Problem noch nicht gelöst ist:
Du musst in dieselbe Regel, wo als Bedingung taunt-detected drinsteht als Effekt acknowledge taunt reinschreiben, damit der Zähler für den Taunt immer wieder zurückgesetzt wird

Als kleines Beispiel eine KI, die immer, wenn der Taunt 1 ("Ja") eingegeben wird mit "Nein" antwortet:

(defrule
(taunt-detected 1 1)
=>
(acknowledge-taunt 1 1)
(chat-to-all "NEIN!")
)
Falke hat geschrieben: Falls das Problem noch nicht gelöst ist:
Du musst in dieselbe Regel, wo als Bedingung taunt-detected drinsteht als Effekt acknowledge taunt reinschreiben, damit der Zähler für den Taunt immer wieder zurückgesetzt wird

Als kleines Beispiel eine KI, die immer, wenn der Taunt 1 ("Ja") eingegeben wird mit "Nein" antwortet:

(defrule
(taunt-detected 1 1)
=>
(acknowledge-taunt 1 1)
(chat-to-all "NEIN!")
)
Ahh super ! Das müsste die Lösung sein. Ich hatte die Idee schon verworfen, aber jetzt mal sehen hm...
Danke auf jeden Fall.
Ich hab ein kleines KI-Problem

Die Situation auf der Map ist folgende:

Es gibt mehrere Dörfer, die alle dem selben Spieler gehören. Damit das ganze ein bisschen lebendig aussieht, sammeln die Dorfis auch fleißig Rohstoffe. Das Problem ist, dass die Dorfis auch ständig zwischen den Dörfern hin- und herlaufen, was sie eigentlich nicht tun sollten. Ist es irgendwie möglich der KI zu sagen, dass sie die Dorfis in dem Dorf lassen soll, wo sie platziert wurden?
Hab's schon mit Heruntertsetzen der dropsite-distance versucht, aber das funktioniert nicht.
Ein paar Fragen zu dem Spieler, dem die KI zugeordnet ist:

- Bleibt (ist) dieser mit Spieler 1 verbündet?

- Muss er ausser Eyecandy-Zwecken noch anderweitige Funktionen erfüllen oder ist er eher nur reine Dekoration?
-Ja, der Spieler ist und bleibt mit Spieler 1 verbündet

-Der Spieler erhält im Laufe des Spiels (per Besitzwechsel) auch Soldaten und Türme, die auch angreifen sollen, wenn feindliche Einheiten in der Nähe sind (was auch funktioniert). Die Dorfis sind aber nur Dekoration, sollen also nichts bauen oder so (ausser Farmen).
Ändere die Ki doch so, dass die Dorfis nichts tun und weise sie per Schalter den Aufgaben zu
Ändere die Ki doch so, dass die Dorfis nichts tun und weise sie per Schalter den Aufgaben zu
Würde ich auch so machen. Da der Spieler aber wohl Feinde hat (ging jetzt aus deiner Beschreibung so hervor) würde ich entsprechende Gegner auf neutral stellen, damit sie sich nur mit den Soldaten der Dörfer beulen und nicht die ganzen Dorfis schlachten.