Angriffs-KI

Fragen zum Szenarienbau und Mapdesign

Moderatoren: Henning, Björn_Jernside

Die Zeit rennt und W-Män soll fertig werden. Kann jemand ne Mini-Ki hochladen die alles, was sie hat an die Front wirft und auch die Tore des Gegners angreift.

DANKE!!
Keiner? :tieftraurig:
Das Problem ist, dass immer noch keine Lösung gefunden wurde, einer KI "beizubringen", Tore anzugreifen.
Mein letzter Stand ist, dass das bis dato noch keinem gelungen ist ... :(

Vermute, du musst da auf Schalter zurückgreifen.
Vielleicht irgendwie ein geloopter Schalter, der in regelmäßigen Intervallen die Belagerungswaffen des PCs zuweist ...
Ja gut muss ich dann so probieren. Und wie sieht der "Immer Alles an die Front" Befehl aus?

Code: Alles auswählen

(defrule ;bei Feindlichkeit beginnt der Kampf
(players-stance 1 enemy)
=>
(attack-now)
)
Könnte zum Beispiel so aussehen.
Wenn ichs schaffe, bastle ich nachher noch schnell ein Mini-Skript. attack-now ist zwar gut, wirft aber nicht sofort *alles* nach vorne.

@Tore: Wenn ich mich richtig erinnere, müsste dieser Bug im Userpatch längst behoben sein. Eine weitere Möglichkeit ist vielleicht diese SN (k.A., was die jetzt aber genau macht): http://www.xomicron.com/tracker/view.php?id=303

Habe leider gerade keine Zeit, mich damit weiter zu beschäftigen, vielleicht schaff ichs bis heut Abend nochmal, spätestens nächsten Samstag (leider).
Ist es denn in Ordnung, wenn die Map den Patch erfordert? Ich glaube, man kann aber auch die KI so basteln, dass sie sowohl auf 1.1- als auch 1.0c-Installationen läuft, d.h. die 1.1-Funktionen werden nur bei Vorhandensein des Patches geladen und sonst ignoriert.
Bin mir nich 100% sicher obs mit UPatch geht, da u.a. Heuhaufen entfernt werden.
Wichtig wäre halt nur dass alle Einheiten immer losmarschieren, da das Spiel immer erst weitergehen soll wenn die vorigen tot sind
Björn_Jernside hat geschrieben:dass alle Einheiten immer losmpopoieren
:D
Janworks hat geschrieben:attack-now ist zwar gut, wirft aber nicht sofort *alles* nach vorne
Gibts denn da noch andere Möglichkeiten mit dem normalen Skript? :confused:
Ansonsten hätte ich jetzt versucht, das zusätzlich mit

Code: Alles auswählen

(set-strategic-number sn-minimum-attack-group-size [hohe Zahl])
,

Code: Alles auswählen

(set-strategic-number sn-number-attack-groups 1)
= damit alles in einem kommt und/ oder

Code: Alles auswählen

(set-strategic-number sn-percent-attack-soldiers 100)
zu ergänzen. In Verbindung mit wiederholtem "attack-now" sollte die KI dann doch eigentlich alles grade Verfügbare an die Front werfen oder?
Jürgen hat geschrieben:In Verbindung mit wiederholtem "attack-now" sollte die KI dann doch eigentlich alles grade Verfügbare an die Front werfen oder?
Jep, korrekt. :)
Außerdem die Zahl der Verteidigungssoldaten auf 0 setzen. Mach du doch die KI, ich schaff das leider heut nicht mehr... :(
Janworks hat geschrieben:Außerdem die Zahl der Verteidigungssoldaten auf 0 setzen.
Sollte eigentlich automatisch 0 sein, wenn die Angriffsgruppe bereits 100 Prozent bekommt? Aber hast schon recht: sicher ist sicher! ^^
Janworks hat geschrieben:Mach du doch die KI, ich schaff das leider heut nicht mehr...
Was ist denn da soviel zu machen? Sind doch nur ein paar Zeilen! ;)
Haha, aber so kann man die Arbeit auch verteilen! :D
Ok dann mach ich mich mal nützlich! Hab noch etwas mehr ergänzt: Die KI greift auf jeden Fall ständig volle Lotte an, solang sie irgendwie Nachschub bekommt, aber tut sonst halt nichts. Nicht mal aufklären.

Tor-Problem:
Ich hab es schon erlebt das aggressive KIs auch Tore angreifen.
Mit dieser rule kann man zumindest bevorzugte Ziele festlegen:

Code: Alles auswählen

(set-strategic-number sn-special-attack-type1 [ID eingeben])
Das klappt normal ganz gut. Mit den Toren hab ich das aber noch nie ausprobiert.
Gehen leider auch nur maximal drei Spezialziele pro KI, es gibt aber vier verschiedene Tore. Die Tor-IDs sind:
64 (Nord-West)
88 (Nord)
659 (West)
667 (Nord-Ost)

@Björn:
Musst halt noch schaun welche du brauchst. Vielleicht benutzt ja nur 2 oder 3 verschiedene Himmelsrichtungen? :)


Angriffs-KI

Code: Alles auswählen

(defrule
(true)
=>
(set-strategic-number sn-minimum-attack-group-size 40) ; k.A. wieviel, hab jetzt mal mit 40 getestet
(set-strategic-number sn-number-attack-groups 1)
(set-strategic-number sn-percent-attack-soldiers 100)
(set-strategic-number sn-maximum-defend-group-size 0)
(set-strategic-number sn-number-defend-groups 0)
(set-strategic-number sn-attack-intelligence 1)
(set-strategic-number sn-enemy-sighted-response-distance 144) ; Maximalwert, quasi die ganze Karte
(set-strategic-number sn-special-attack-type1 64)
(set-strategic-number sn-special-attack-type2 88)
(set-strategic-number sn-special-attack-type3 659)
)

; Dauerangriff sobald über 40 Soldaten
(defrule
(military-population > 40) ; je nachdem wie gross die Armee sein soll
(not (town-under-attack)) ; kann man auch weglassen, aber vielleicht is es sinnvoll falls man die KI spaeter belagert
=>
(attack-now) 
)
Sorry Björn, hätte ich das mal früher gesehen... :(
Hoffe "Weihnachtsmän IV" schafft es dennoch noch rechtzeitig.

Aber die Lösung von Jürgen sieht schon echt gut aus, hätte ich jetzt auch nicht viel anders gemacht.
Die Idee mit den 40 Soldaten als Grenze ist bei nur 1 Angriffsgruppe sehr sinnvoll, da bei ~44 ja glaube auch das Limit für eine zusammengefasste Formation liegt.
Henning hat geschrieben:Vermute, du musst da auf Schalter zurückgreifen.
Vielleicht irgendwie ein geloopter Schalter, der in regelmäßigen Intervallen die Belagerungswaffen des PCs zuweist ...
Wäre zumindest ne Behelfslösung, solange Björn lediglich bereits gesetzte Tore meint.
Das mit den IDs von Jürgen SOLLTE aber theoretisch funktionieren. Mit den IDs hatte ich da auch schonmal zufriedenstellend in "Arcanea" experimentiert, allerdings mit anderen Objekten (Burgen etc).
Ich korrigiere:

Code: Alles auswählen

(defrule
(true)
=>
(set-strategic-number sn-minimum-attack-group-size 40) ; k.A. wieviel, hab jetzt mal mit 40 getestet
(set-strategic-number sn-number-attack-groups 1)
(set-strategic-number sn-percent-attack-soldiers 100)
(set-strategic-number sn-maximum-defend-group-size 0)
(set-strategic-number sn-number-defend-groups 0)
(set-strategic-number sn-attack-intelligence 1)
(set-strategic-number sn-enemy-sighted-response-distance 144) ; Maximalwert, quasi die ganze Karte
(set-strategic-number sn-special-attack-type1 64)
(set-strategic-number sn-special-attack-type2 88)
(set-strategic-number sn-special-attack-type3 659)
[b](disable-self) ; Regel braucht nur einen Aufruf[/b]
)

; Dauerangriff sobald über 40 Soldaten
(defrule
(military-population > 40) ; je nachdem wie gross die Armee sein soll
(not (town-under-attack)) ; kann man auch weglassen, aber vielleicht is es sinnvoll falls man die KI spaeter belagert
=>
(attack-now)
)
Nach dem attack-now sollte eigentlich auch ein disable-self erfolgen - in AoE ist nämlich ein Bug, der bei einmaligem Aufruf von attack-now dies als Endlosschleife wertet und den Angriff nie wieder abbricht.

Falls du den Userpatch verwenden möchtest, gibt es dort aber eine wunderbare neue Funktion (dieses Skript ist eine verbesserte Version des obigen):

Code: Alles auswählen

(defconst MIN_SOLDIER_COUNT 20)
(defconst ATTACK_GOAL_ID 1)
(defconst NO 0)
(defconst YES 1)

(defrule
(true)
=>
(set-goal ATTACK_GOAL_ID NO)
(chat-to-all "Ich bin da!")
(disable-self)
)

(defrule
(true)
=>
(set-strategic-number sn-minimum-attack-group-size 10)
(set-strategic-number sn-number-attack-groups 2)
(set-strategic-number sn-percent-attack-soldiers 100)
(set-strategic-number sn-maximum-defend-group-size 0)
(set-strategic-number sn-number-defend-groups 0)
(set-strategic-number sn-attack-intelligence 1)
(set-strategic-number sn-enemy-sighted-response-distance 144) ; Maximalwert, quasi die ganze Karte
(set-strategic-number sn-special-attack-type1 64)
(set-strategic-number sn-special-attack-type2 88)
(set-strategic-number sn-special-attack-type3 659)
(disable-self)
)

; Dauerangriff sobald über MIN_SOLDIER_COUNT Soldaten
(defrule
(military-population >= MIN_SOLDIER_COUNT)
(not (town-under-attack))
(goal ATTACK_GOAL_ID NO) ; Dieses Ziel umgeht einen wiederholten Aufruf von attack-now
=>
(attack-now)
(set-goal ATTACK_GOAL_ID YES)
(chat-to-all "Angriff!!!")
)

; Angriff bei unter MIN_SOLDIER_COUNT Soldaten abbrechen und alle zurückpfeifen
; ggf. bei Angriff auf die eigene Stadt auch abbrechen (sonst das "or" einfach löschen)
(defrule
(goal ATTACK_GOAL_ID YES)
(or
(military-population < MIN_SOLDIER_COUNT)
(town-under-attack)
)
=>
(up-reset-attack-now) ; Angriff beenden
(up-retreat-now) ; Alle Leute zum eigenen DZ zurückschicken
(set-goal ATTACK_GOAL_ID NO)
(chat-to-all "Rueckzug!!!")
)
Die chat-to-all-Befehle ruhig rausnehmen, die dienen nur zum Testen.