Künstliche Inteligenz steuern

Fragen zum Szenarienbau und Mapdesign

Moderatoren: Henning, Björn_Jernside

Hey, nach längerer Zeit wiedereinmal eine Frage meinerseits zu KI's...

Ist es möglich, mit der Eingabefunktion (Enter->Eingabe) die Künstliche Inteligenz im Spiel mit Hilfe von Schaltern zu beeinflussen?

Beispiel: Ich möchte, dass Spieler XXX mit meiner KI ein Haus baut, da ich nicht in der Lage bin.... Wie sähe da der Befehl aus?
Ja, du kannst über das Chateingabefenster Befehle an Computerspieler geben.

Das geht so:

Speichere eine *.ai und eine *.per für CS-Spieler xy.
Kopiere folgenden Befehl in die *.per datei:

(defrule
(taunt-detected xy 101)
=>
(acknowledge-taunt xy 101)
(build house))

Immer wenn du nun in das Chat-Fenster "101" eingibts baut Spieler xy ein Haus, vorausgesetzt er hat genug Holz.
Mit einem Schalter kannst du nun das Haus in deinen Besitz wechseln.

So ist es z.B. möglich, einen anderen Spieler für sich arbeiten zu lassen. Dann hat man selbst mehr Einheiten für die Armee.
Hi Leuts, bin gerade (gezwungenermaßen, da entnervt :D )dabei mich in das Thema KI-Skripten einzuarbeiten, und stelle fest daß zumindest das Verändern von KI-Skripten (was mir für meine Zwecke völlig reicht!) gar nicht mal so schwer scheint.
Soll heißen die KI funktionierte hinterher noch wie gewohnt - mit den gewünschten Modifikationen. ;)

Würde nur mal gerne was wissen, was mich schon länger brennend interessiert:
1.) kann man einer Ki effektiv befehlen, verschiedene Formationen einzunehmen?
Habe bis dato noch keine KI erlebt, die was anderes außer Reihe konnte.

2.) wenn man gewisse Standard-defrule-Befehle nicht mehr haben möchte, z.B.

(defrule
(building-type-count-total university == 0)
(current-age > feudal-age)
(can-build university)
=>
(build university)
)

genügt es sie zu löschen oder muß man sie um Ki-Behinderungen vorzubeugen inaktiv schalten? Z.B. "cannot-build university" o.s.ä.???
Wo wir schon beim Thema KI sind: Gibt es eine KI, die wenn man sie fast besiegt hat (zB keine Militärgebäude mehr) verbündet wird und fortan Tribut leistet? Das hört sich jetzt erstmal schlicht an aber man könnte das auch noch ausbauen, zB das man die Steuern auf Wunsch erhöhen kann, dass die Provinz auch Truppen für einen ausbildet oder so. Und zur Krönung: Wenn die Provinz stark geworden ist, könnte sie doch versuchen den Spieler zu stürzen und sich eigenständig zu machen... Gibts sowas?
Klar, wäre überhaupt kein Problem.

Du kannst in einer KI jederzeit die Anzahl von jedem Gebäude oder Einheit abfragen und dementsprechend darauf reagieren (z.B. Diplomatie ändern, aufgeben, usw.).

Genauso kann man danach das alles natürlich auch wieder ändern.

Die entsprechende KI dazu müsste natürlich wahrscheinlich erst noch geschrieben werden.
Ich hab übrigens keinene Action für Diplomatieänderungen gefunden... und gibt es irgendeinen timer-fact?
Z.B alle 5 Minuten Tribut?
Öhm, wollte nur mal anfragen ob einer ne Antwort auf meine ursprüngliche Frage hat. :rolleyes:
Befehle für die Formation sind mir nicht bekannt, geht imo auch nicht.
Nicht benötigte Regeln kannst du löschen.
Günter! Da bist du ja! Kannst du auch meine frage beantworten? :)
Befehle für die Formation sind mir nicht bekannt, geht imo auch nicht.
Nicht benötigte Regeln kannst du löschen.
Danke für die Antworten.
Zu 1) Ah, schade! Hab ich mir fast gedacht. Hätte mich sonst auch sehr gewundert, da von den zahllosen KI's auf Aok Heaven keine etwas derartiges bietet. :(

zu 2) Jepp! Das hab ich mittlerweile durch learning-by-doing rausgefunden. Man muß ja immer nur auf die Klammern achten.
So änderst du die Diplomatie:

<code>
(defrule
(true)
=>
(set-stance 1 enemy)
(disable-self))
</code>

Hier ein Beispiel für einen Timer:
So änderst du die Diplomatie:

<pre>
(defrule
(true)
=>
(set-stance 1 enemy)
(disable-self))
</pre>

Hier 2 Beispiele aus dem AI-Editor von Stoyan Ratchev für die Verwendung eines Timers:

Example 1
<pre>
Here is an example of how tribute demand can be handled using timers. After 10 minutes of playing the computer player asks for tribute and waits 5 minutes to get it.

; After 10 minutes of playing ask for tribute, start 5 minute timer

(defrule
(game-time greater-than 600)
=>
(chat-to-player 1 "Give me 500 gold in the next 5 minutes")
(clear-tribute-memory 1 gold)
(enable-timer 1 300)
(disable-self))

; Tribute not received in time, declare player 1 to be an enemy

; Note that explicit disabling of timer is necessary even after it
; triggers

(defrule
(timer-triggered 1)
=>
(disable-timer 1)
(chat-to-player 1 "Time is up. We are enemies now")
(set-stance 1 enemy))

; Tribute received in time. Disable the timer

(defrule
(players-tribute-memory 1 gold greater-or-equal 500)
=>
(disable-timer 1)
(clear-tribute-memory 1 gold)
(chat-to-player 1 "Thanks"))
</pre>
Example 2
<pre>
Here is even better example that uses two timers. Every 15 minutes throughout the game the computer player asks for tribute and waits 5 minutes to get it.

; Schedule 15 minute timer for the first time

(defrule
(true)
=>
(enable-timer 2 900)
(disable-self))

; Every 15 minutes ask for tribute and wait 5 minutes to get it.
; Restart 15 minute timer.

(defrule
(timer-triggered 2)
=>
(disable-timer 2)
(enable-timer 2 900)
(chat-to-player 1 "Give me 500 gold in the next 5 minutes.")
(clear-tribute-memory 1 gold)
(enable-timer 1 300))

; Tribute not received in time, declare player 1 to be an enemy.

; No need to ask for tribute again - disable both timers.

(defrule
(timer-triggered 1)
=>
(disable-timer 1)
(disable-timer 2)
(chat-to-player 1 "Time is up. We are enemies now")
(set-stance 1 enemy))

; Tribute received in time. Disable the 5 minute timer

(defrule
(players-tribute-memory 1 gold greater-or-equal 500)
=>
(disable-timer 1)
(clear-tribute-memory 1 gold)
(chat-to-player 1 "Thanks"))
</pre>
Hm, mal wieder zwei kleinere Fragen zum Thema KI:

auch nach längerem Studieren der AI-Bibel und der AI.Editor-Hilfe bin ich nirgendwo auf eine Lösung gestoßen:

1) Ist es möglich, einer AI vorzugeben, mit einem bestimmten Spieler keinen Handel zu treiben (auch wenn dieser neutral oder gar verbündet ist)?
Damit meine ich, daß er keine Marktkarren zu diesem schicken soll, zu anderen Spielern aber schon. :confused:

2) Gibt es einen Befehl, der das genaue Gegenteil von <attack-now> darstellt?
Also daß die KI nicht angreift?
(Hintergrund: meine KI greift manchmal mit zuwenigen Einheiten und zu früh an, obwohl ich eine minimale Angriffstruppengröße vorgegeben habe).

Der Befehl <do-nothing> bewirkt ja eine komplette Stagnation, inkl. Dorfis etc. oder?

Danke für Antworten!
Hmmm ... Günnie müsste eigentlich mal wieder helfend vorbei schauen, zumal ich eine simple frage habe, naja ... eigentlich 2 ... :D
1. Wie kann eine ai aussehen, die recht simpel ist, rumsteht, keine wirtschaft hat, aber soldaten ausbildet und alle 6 minuten mit diesen angreift. wenn möglich mit nur 80% der verfügbaren soldaten ....?

2. Das selbe im Prinzip, allerdings darf der spieler bauen, dorfbewohner ausbilden, wirtschaften, nur seine soldaten sollen ansich regungslos sein und alle 5 minuten attackieren. Weiss jemand Rat? :confused:
@Henning

Aufbauend auf der "IMMOBILE AI" kannst Du es mal so probieren:

1. Wirtschaft steht still, zivile u. milit. Einheiten verharren, etc.

IMMOBILE AI - ALLE EINHEITEN VERHARREN

(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-stone-drop-distance 0)
(set-strategic-number sn-maximum-hunt-drop-distance 0)
(set-strategic-number sn-food-gatherer-percentage 0)
(set-strategic-number sn-gold-gatherer-percentage 0)
(set-strategic-number sn-minimum-civilian-explorers 0)
(set-strategic-number sn-wood-gatherer-percentage 0)
(set-strategic-number sn-cap-civilian-explorers 0)
(set-strategic-number sn-percent-civilian-explorers 0)
(disable-self)
)

(defrule
(true)
=>
(set-strategic-number sn-percent-enemy-sighted-response 100)
(set-strategic-number sn-hits-before-alliance-change 25)
(set-strategic-number sn-number-explore-groups 0)
(set-strategic-number sn-percent-attack-soldiers 0)
(set-strategic-number sn-task-ungrouped-soldiers 0)
(set-strategic-number sn-number-attack-groups 0)
(set-strategic-number sn-enemy-sighted-response-distance 10)
(set-strategic-number sn-total-number-explorers 0)
(set-strategic-number sn-relic-return-distance 0)
(disable-self)
)

--- PRODUKTION VON MILIT-EINHEITEN ----

(defrule
(unit-type-count-total EINHEIT XY < MENGE XY)
(can-train EINHEIT XY)
=>
(train EINHEIT XY)
)

... etc.

--- ANGRIFFS-TIMER UND VERHALTENSAENDERUNG DER MILIT-EINHEITEN ---

(defrule
(game-time > 355)
=>
(enable-timer 1 5); ANGRIFFSTIMER
(set-strategic-number sn-enemy-sighted-response-distance 30)
(set-strategic-number sn-percent-attack-soldiers 80)
(set-strategic-number sn-task-ungrouped-soldiers 1)
(set-strategic-number sn-number-attack-groups GRUPPENANZAHL XY)
(set-strategic-number minimum-attack-group-size MIN. GROESSE XY)
(set-strategic-number maximum-attack-group-size MAX. GROESSE XY)
(disable-self)
)

(defrule
(timer-triggered 1)
=>
(attack-now)

(disable timer 1 5)
(enable timer 1 360)
(enable-timer 2 60); STELLT MILIT-EINHEITEN WIEDER STILL
(enable-timer 3 355); STELLT MILIT-EINHEITEN WIEDER AUF ANGRIFF

(defrule
(timer-triggered 2)
=>
(set-strategic-number sn-enemy-sighted-response-distance 10)
(set-strategic-number sn-percent-attack-soldiers 0)
(set-strategic-number sn-task-ungrouped-soldiers 0)
(set-strategic-number sn-number-attack-groups 0)
(set-strategic-number minimum-attack-group-size 0)
(set-strategic-number maximum-attack-group-size 0)
(disable-timer 2)
(disable-self)
)

(defrule
(timer-triggered timer 3)
=>
(set-strategic-number sn-enemy-sighted-response-distance 30)
(set-strategic-number sn-percent-attack-soldiers 80)
(set-strategic-number sn-task-ungrouped-soldiers 1)
(set-strategic-number sn-number-attack-groups MENGE XY)
(set-strategic-number minimum-attack-group-size MIN. GROESSE XY)
(set-strategic-number maximum-attack-group-size MAX. GROESSE XY)
(disable-timer 3)
(disable-self)
)

(defrule
(timer-triggered 1)
=>
(attack-now)
(enable-timer 2 60)
(enable-timer 3 355)
)

Dadurch, dass Du TIMER 1 beim zweiten Mal nicht mehr abstellst, d.h. nach 6 Minuten wird "geloopt", und immer wenn TIMER 1 geloopt wird, schalten die anderen beiden timer 2 und 3 sich automatisch mit ein und aendern kurz vor dem Angriff die Eigenschaften der gegnerischen Milit-Einheiten auf "Agressiv" und eine Minute (ist natuerlich variabel) nach einem Angriff wieder auf "Passiv". ANMERKUNG: Wenn Du den Angriffstimer nicht von Anfang an haben willst, aenderst Du nur die erste Bedingung

(defrule
(game-time > 355)

ab in z.B.

(defrule
(event-detected trigger 0)

dass Du von einem der Schalter im Spiel abfeuern laesst, sobald eine bestimmte Bedingung erfuellt ist.

2. Wirtschaft steht still, zivile u. milit. Einheiten verharren, etc.

IMMOBILE AI - ALLE MILIT-EINHEITEN VERHARREN - ZIVILE BEV. ARBEITET, HANDELT WIRD BETRIEBEN, ETC.

Du blockierst anfangs lediglich die milit. Population mittels IMMOBILE UNITS AI, die Bloackade der zivilen Population laesst Du weg:

(defrule
(true)
=>
(set-strategic-number sn-percent-enemy-sighted-response 100)
(set-strategic-number sn-hits-before-alliance-change 25)
(set-strategic-number sn-number-explore-groups 0)
(set-strategic-number sn-percent-attack-soldiers 0)
(set-strategic-number sn-task-ungrouped-soldiers 0)
(set-strategic-number sn-number-attack-groups 0)
(set-strategic-number sn-enemy-sighted-response-distance 10)
(set-strategic-number sn-total-number-explorers 0)
(set-strategic-number sn-relic-return-distance 0)
(disable-self)
)

Die Timer zum Umstellen der Eigenschaften der milit. Einheiten sowie zum Angreifen kannst Du von oben uebernehmen, lediglich die Zeit von 6 Minuten auf 5 Minuten stellen, oder welche Aenderungen Du sonst haben moechtest...

Hoffentlich klappt's ;)
:super: Juhhuu ... danke! Sieht gut aus ...
Mal was anderes:

Was jemand wo man diese ominöse "Master-ID" für Objekte herkriegt, in der in der KI-Bibel immer die Rede ist? :confused:

Danach müßten alle Objekte, die man als Primärziele angeben kann, eine ID-Nummer haben.
Die Namen akzeptiert das Skript scheinbar nicht immer.
Der König beim Regicide hat z.B. glaube "434".
Die findest du z.B. in GeniEd.
Sie steht da immer beim jeweiligen Objekt ganz oben als Unit-ID.
Die findest du z.B. in GeniEd.
Sie steht da immer beim jeweiligen Objekt ganz oben als Unit-ID.
Echt? Dachte die wäre identisch mit der slp-Nummer im MPS!

Die frißt das Skript nämlich nicht!

Aber danke für den Tip, dann werd ichs doch noch mal mit der versuchen!
:)

Ach so, wo ich dich gerade "erwische":

Weißt du worauf sich der Befehl "sn-special-attack-type" bezieht?
Ich war mir anhand der deutschen Beschreibung sicher (bin ich auch immer noch) daß diese "types" der KI primäre Zielobjekte (feindlicher König, Burg etc.) setzen.
(Dafür brauche ich übrigens ja auch die Master-ID, weil er z.B. "king" als Wort nicht erkennt.)

Die englische Formulierung dazu mit "wants the ai to" ist aber doppeldeutig und könnte auch so ausgelegt werden, daß damit die EIGENE Einheit gemeint ist, mit der die AI speziell angreifen soll (was bei "König" aber keinen Sinn machen würde). :confused:
@Barbarossa: Sei bloss vorsichtig mit den "sn-specialattack-type" befehl! Irgendwie funktioniert der nicht richtig, was ich bei meiner KI fuer Heinrich der Seefahrer I ja gemerkt habe --> Hast Du selbst getestet und selbst auf schwierig waren die Belagerer nicht allzu schwer zu schlagen OBWOHL ich mit dem Befehl gearbeitet habe!!
Es gibt im Uebrigen eine Liste mit den Master-ID auf Heaven, sodass Du hier nicht immer ueber GeniEd gehen musst.