KI-Skriptziel 1-256 usw.

Fragen zum Szenarienbau und Mapdesign

Moderatoren: Henning, Björn_Jernside

Hallo liebe Agearena-Community :) ,

habe mich mal gestern hier registriert - ist etwas spät aber besser als nie^^. Kenne AoK seid der Anfangszeit, habe also mehr als genug Erfahrung mit Mapping und dem Spiel selbst :super: .

Nun zur meiner Frage: Einige kennen sicherlich im Triggersystem den Effekt "KI-Skriptziel", wie kann ich nun in meiner selbst erstellten KI abfragen, ob z.B. "KI-Schalter 1" aktiviert ist?

Ich brauche das Ganze, um über das Triggersystem einen Angriff der KI zu erzwingen.

Die deutsche Tutorial-Doc hat mir nicht wirklich weitergefolfen und hätte mir auch fast mit meinen Tests mein Szenario zerschossen - konnte sie aber noch retten, wobei dieser Bug mehr als merkwürdig war, naja...

Vielen Dank für jede Hilfe eurerseits.

~ Draygon

Edit: Manchmal frage ich, was hier ab geht. Interessanterweise funktioniert meine vorherige Variante. Dann stelle ich mal schnell eine andere Logikfrage. Hier erstmal der Code:

Code: Alles auswählen

;================================================================================;
; Trigger Attacks
;================================================================================;
(defrule
(event-detected trigger 1)
;(military-population >= 10)
;(not
;(town-under-attack)
;)
=>
;(acknowledge-event trigger 1)
;(set-strategic-number sn-percent-attack-soldiers 100)
(attack-now)
(chat-to-all "attack now")
)
Den "unnötigen" Rest habe ich zu Testzwecken auskommentiert. Aber reintheoretisch kann ich mit "(acknowledge-event trigger 1)" den KI-Schalter wieder auf [aus/false] stellen, oder?
Genau, acknowledge-event bestätigt das Ereignis, d.h., dass es dessen Wert wieder auf false setzt. Wenn du das nicht tust, bleibt dessen Wert auf true und die Regel wird ununterbrochen ausgelöst.
Danke für die Antwort ;) .

Noch ein Frage, die sich im Prinzip für kein neues Thema lohnt: Ich suche eine KI, die sich im Prinzip ähnlich der Standard-KI verhählt. Sie muss sich aber dem eingestellten Schwierigkeitsgrad anpassen.

Ich habe schon auf http://www.aok.heavengames.com/ mal nachgeschaut und mir die empfohlenen KI's wie Kosmos usw. angeschaut. Leider sind sie keineswegs bei Standard leichter, als bei schwierig. Die Standard-KI kann ich nämlich nicht bearbeiten, deshalb mein Anliegen. Halt einen guten Allrounder, der auch, wenn es der Spieler einstellt leicht spielen kann. Gerade für die Kampagne wichtig.

~ Draygon
Auf der AOC-CD(vielleicht auch die von AOK) liegt die sogenannte Sample-AI, was soweit ich weiß die Satndard KI sein müsste.
Ähm... eigentlich nicht, denn mit gerade mal 40KB ist die bissel klein... Wenn man bedenkt, dass die Petersen-Files von AoK schon allein 300KB groß sind.

Das was auf der CD ist, kann man als gute Beispiel-KI sehen. Gibt es eigentlich einen AI-Extractor für AoC? Denn diese Petersen-Files die mit dem Tool von der Agearena entpackt werden können, müssten ja aus Aok sein, stimmts?

Ich fasse mal zusammen: Entweder eine gute Alternativ-Allround-KI (die auch den Schwierigkeitsgrad berücksichtigt) oder einen AI-Extractor für AoC. Ich freue mich über jede noch so kleine Hilfe ;) .

~ Draygon
KI-Extractor? Was ist denn das? Wenn du eine KI brauchst, die sich dem Schwierigkeitsgrad anpasst, dann kann dir Janworks weiterhelfen.
Der AI-Extractor funktioniert nur bei AoK, da hast du Recht.

Aber du hast Glück:

Ich hab die Standard-KI von TC rein zufällig auf meiner Festplatte liegen, da ich da ja auch die Änderungen fürs AddOn vornehmen muss. ;)

Hab die Dateien mit dem DRS-Explorer aus der gamedata_x1.drs extrahiert und den richtigen Namen zu geordnet. Du musst die KI also nur noch in den AI-Ordner kopieren und im Spiel als KI "random game" auswählen (so heißt die KI ja eigentlich).

Soll ich sie dir schicken?

Habe leider gerade genug um die Ohren, als noch eine KI schreiben zu müssen... ;)
Würde mich wirklich freuen, wenn du die unveränderte KI mal posten könntest. Wäre ja wirklich ideal.
Habe leider gerade genug um die Ohren, als noch eine KI schreiben zu müssen...
Keine Sorge, dies wollte ich sowieso nicht ;) . Weil ich vielleicht sogar für jedes Szenario die Computerspieler (wie es das große ES gemacht hat :D ) selbst schreiben will.

Und vielleicht brauche ich bei irgendeinem Szenario doch eben mal die Standard-KI, aber die ist mir halt ein bisschen zu gesprächig und beeinflussbar. Weshalb ich die Original-Files bräuchte. Wenn du sie schickst, bitte mal irgendwo hochladen... und mir den Link per PM oder vielleicht als Beitrag hier schicken, bin mir nicht sicher in wie weit das wieder legal ist (es öffentlich zu posten). Ich lass mich überraschen.
___________________

Nochmal zum selbst-schreiben von KI's. Ich habe mal die KI von den ES-Kampagnen studiert. Und im grundegenommen sind die schön gegliedert, wovon ich mir einige Idee "klauen" möchte, also zumindest die Gliederung der Dateien.

Also wer die Files kennt, im Prinzip würden sie doch vom Syntax her ausreichen, oder? Also ich habe das jetzt so gemacht. @Janworks würde mich freuen, wenn du mal ein Auge drauf werfen würdest:

Code: Alles auswählen

;==============================================================================
; ** TOKUGAWA SCENARIO 1 / VILLAGE PLAYERS (YELLOW AND CYAN)
;------------------------------------------------------------------------------
; LAST UPDATE: 2009-11-13 (YYYY-MM-DD)
; VERSION:     1.0 (X.Y - X: CORE-CODE, Y: BUGFIXES)
;==============================================================================

;==============================================================================
; * GROUP SETTINGS
;==============================================================================
(defrule
(true)
=>
(set-strategic-number sn-maximum-food-drop-distance 7)
(set-strategic-number sn-maximum-wood-drop-distance 7)
(set-strategic-number sn-maximum-gold-drop-distance 7)
(set-strategic-number sn-maximum-hunt-drop-distance 7)
(set-strategic-number sn-maximum-stone-drop-distance 7)
(disable-self)
)

(defrule
(true)
=>
(set-strategic-number sn-food-gatherer-percentage 60)
(set-strategic-number sn-wood-gatherer-percentage 40)
(set-strategic-number sn-gold-gatherer-percentage 30)
(set-strategic-number sn-stone-gatherer-percentage 20)
(disable-self)
)

(defrule
(true)
=>
(set-strategic-number sn-percent-civilian-gatherers 70)
(set-strategic-number sn-percent-civilian-builders 30)
(set-strategic-number sn-percent-civilian-explorers 0)
(set-strategic-number sn-minimum-boar-hunt-group-size 201)
(set-strategic-number sn-cap-civilian-explorers 0)
(set-strategic-number sn-task-ungrouped-soldiers 0)
(disable-self)
)

;==============================================================================
; * PROVIDE WOOD
;==============================================================================
(defrule
(or
(or
(idle-farm-count < 1)
(building-type-count-total farm < 6)
)
(or
(dropsite-min-distance food > 4)
(building-type-count-total mill < 4)
)
)
(unit-type-count villager > 0)
(wood-amount < 100)
=>
(chat-local-to-self "provide wood")
(cc-add-resource wood 100)
)

;==============================================================================
; * TRAIN VILLAGER
;==============================================================================
(defrule
(unit-type-count-total villager < 6)
(can-train villager)
=>
(train villager)
(chat-local-to-self "train villager")
)

;==============================================================================
; * BUILD HOUSE
;==============================================================================
(defrule
(housing-headroom < 3)
(population-headroom > 0)
(can-build house)
=>
(build house)
(chat-local-to-self "build house")
)

;==============================================================================
; * BUILD FARMS
;==============================================================================
(defrule
(or
(idle-farm-count < 1)
(building-type-count-total farm < 6)
)
(can-build farm)
=>
(build farm)
(chat-local-to-self "build farm")
)

;==============================================================================
; * BUILD MINING-CAMP
;==============================================================================
(defrule
(resource-found gold)
(building-type-count-total mining-camp < 1)
(dropsite-min-distance gold > 7)
(can-build mining-camp)
=>
(build mining-camp)
(chat-local-to-self "build mining-camp")
)

(defrule
(resource-found stone)
(building-type-count-total mining-camp < 1)
(dropsite-min-distance stone > 7)
(can-build mining-camp)
=>
(build mining-camp)
(chat-local-to-self "build mining-camp")
)

;==============================================================================
; * BUILD MILL
;==============================================================================
(defrule
(dropsite-min-distance food > 4)
(building-type-count-total mill < 4)
(can-build mill)
=>
(build mill)
(chat-local-to-self "build mill")
)
Im Prinzip macht diese KI nichts anderes als Rohstoffe im gewissen Maß abzubauen und Felder anzulegen - gegebenenfalls auch neue nötige Gebäude errichtet.
___________

Nun zur einer angreifenden KI, die will ich erst heute schreiben, aber ich möchte mal hierzu ein Beispiel aus der ES-Kampagne zeigen.

Also vom Prinzip her könnte ich es doch so ähnlich machen, oder? Der Rest wird in den "scenario *"-Files erledigt, wie Technolgien, Marktplatz-Rules usw.

Ich muss demzufolge eigentlich nur das Erschaffen von Einheiten, das Bauen von Gebäuden und die Angriffe schreiben und regeln, oder? Auch hier würde ich mich über ein ja oder nein freuen ;) .

Code: Alles auswählen

;Conquerors scn 7 player 3
;Koyoto - green Japanese

(load "scenario market")
(load "scenario upgrades")
(load "scenario difficulty")

; GROUPS

(defrule
(true)
=>
(set-strategic-number sn-minimum-boar-hunt-group-size 4)
(set-strategic-number sn-maximum-town-size 18)
(set-strategic-number sn-camp-max-distance 30)
(set-strategic-number sn-mill-max-distance 30)
(set-strategic-number sn-percent-enemy-sighted-response 100)
(set-strategic-number sn-enemy-sighted-response-distance 25)
(set-strategic-number sn-blot-exploration-map 1)
(set-strategic-number sn-task-ungrouped-soldiers 1)
(set-strategic-number sn-number-explore-groups 1)
(set-strategic-number sn-number-boat-explore-groups 1)
(disable-self)
)

(defrule
(game-time > 600)
=>
(set-strategic-number sn-task-ungrouped-soldiers 0)
(disable-self)
)

(defrule
(true)
=>
(set-strategic-number sn-percent-civilian-explorers 0)
(set-strategic-number sn-percent-civilian-builders  15)
(set-strategic-number sn-percent-civilian-gatherers 85)
(set-strategic-number sn-cap-civilian-explorers 0)
(set-strategic-number sn-cap-civilian-gatherers 100)
(set-strategic-number sn-food-gatherer-percentage  33)
(set-strategic-number sn-gold-gatherer-percentage  33)
(set-strategic-number sn-stone-gatherer-percentage 0)
(set-strategic-number sn-wood-gatherer-percentage  34)
(set-strategic-number sn-maximum-gold-drop-distance 20)
(set-strategic-number sn-maximum-stone-drop-distance 20)
(set-strategic-number sn-maximum-food-drop-distance 20)
(disable-self)
)

(defrule
(true)
=>
(enable-timer 1 3500)
(enable-timer 2 2500)
(enable-timer 4 2500)
(disable-self)
)

(defrule
(difficulty <= moderate)
(timer-triggered 4)
=>
(chat-local-to-self "I think I need some resources")
(cc-add-resource food 300)
(cc-add-resource wood 300)
(cc-add-resource gold 200)
(cc-add-resource stone 200)
(disable-timer 4)
(enable-timer 4 2400)
)

(defrule
(event-detected trigger 35)
(difficulty <= moderate)
=>
(cc-add-resource food 1000)
(cc-add-resource wood 1000)
(cc-add-resource gold 1000)
(cc-add-resource stone 200)
(set-goal 3 1)
(disable-self)
)

(defrule
(timer-triggered 1)
(unit-type-count-total transport-ship > 1)
(defend-soldier-count >= 9)
=>
(set-strategic-number sn-percent-attack-soldiers 70)
(set-strategic-number sn-percent-attack-boats 0)
(attack-now)
(chat-local-to-self "attack")
(disable-timer 1)
(enable-timer 1 1020)
)

(defrule
(timer-triggered 2)
(defend-warboat-count >= 5)
=>
(set-strategic-number sn-percent-attack-soldiers 0)
(set-strategic-number sn-percent-attack-boats 100)
(attack-now)
(disable-timer 2)
(enable-timer 2 400)
)

(defrule
(difficulty <= moderate)
(unit-type-count-total villager less-than 18)
(can-train villager)
=>
(train villager)
(chat-local-to-self "villager")
)

(defrule
(difficulty == easy)
(unit-type-count-total villager less-than 8)
(can-train villager)
=>
(train villager)
(chat-local-to-self "villager")
)


(defrule
(unit-type-count-total fishing-ship < 8)
(can-train fishing-ship)
=>
(train fishing-ship)
(chat-local-to-self "fishing ship")
)

;maintain housing
(defrule
(housing-headroom less-than 4)
(population-headroom greater-than 0)
(can-build house)
=>
(build house)
(chat-local-to-self "house")
)

(defrule
(building-type-count-total market less-than 1)
(can-build market)
=>
(build market)
(chat-local-to-self "market")
)

;construct farms if food getting short.
(defrule
(game-time > 400)
(building-type-count-total farm less-than 10)
(can-build farm)
=>
(build farm)
)

(defrule
(resource-found wood)
(building-type-count-total lumber-camp < 5)
(dropsite-min-distance wood > 5)
(can-build lumber-camp)
=>
(build lumber-camp)
(chat-local-to-self "wood place")
)

(defrule
(resource-found gold)
(building-type-count-total mining-camp < 5)
(dropsite-min-distance gold > 7)
(can-build mining-camp)
=>
(build mining-camp)
(chat-local-to-self "gold place")
)

(defrule
(resource-found stone)
(building-type-count-total mining-camp < 5)
(dropsite-min-distance stone > 7)
(can-build mining-camp)
=>
(build mining-camp)
(chat-local-to-self "rock place")
)

(defrule
(dropsite-min-distance food greater-than 4)
(building-type-count-total mill less-than 4)
(can-build mill)
=>
(build mill)
(chat-local-to-self "mill")
)

; MILITARY UNITS

(defrule
(unit-type-count-total spearman-line < 6)
(can-train spearman-line)
=>
(train spearman-line)
(chat-local-to-self "spearman")
)

(defrule
(goal 3 1)
(unit-type-count-total militiaman-line < 10)
(can-train militiaman-line)
=>
(train militiaman-line)
(chat-local-to-self "swordsman")
)

(defrule
(goal 3 1)
(unit-type-count-total archer-line < 10)
(can-train archer-line)
=>
(train archer-line)
(chat-local-to-self "archer")
)

(defrule
(difficulty == easy)
(unit-type-count-total knight-line < 1)
(can-train knight-line)
=>
(train knight-line)
(chat-local-to-self "knight")
)

(defrule
(difficulty <= moderate)
(unit-type-count-total knight-line < 4)
(can-train knight-line)
=>
(train knight-line)
(chat-local-to-self "knight")
)

(defrule
(event-detected trigger 13)
(difficulty <= moderate)
(game-time > 1200)
(unit-type-count-total monk < 2)
(can-train monk)
=>
(train monk)
(chat-local-to-self "monk")
)

(defrule
(difficulty <= moderate)
(unit-type-count-total my-unique-unit-line < 6)
(can-train my-unique-unit-line)
=>
(train my-unique-unit-line)
(chat-local-to-self "samurai")
)

(defrule
(event-detected trigger 13)
(unit-type-count-total scorpion-line < 2)
(can-train scorpion-line)
=>
(train scorpion-line)
(chat-local-to-self "scorpion")
)

(defrule
(event-detected trigger 13)
(unit-type-count-total trebuchet < 1)
(can-train trebuchet)
=>
(train trebuchet)
(chat-local-to-self "trebuchet")
)

(defrule
(difficulty <= moderate)
(unit-type-count-total cannon-galleon-line < 3)
(can-train cannon-galleon-line)
=>
(train cannon-galleon-line)
(chat-local-to-self "cannon galleon")
)

(defrule
(difficulty <= moderate)
(unit-type-count-total galley-line < 3)
(can-train galley-line)
=>
(train galley-line)
(chat-local-to-self "war galley")
)

(defrule
(unit-type-count-total fire-ship-line < 3)
(can-train fire-ship-line)
=>
(train fire-ship-line)
(chat-local-to-self "fire ship")
)

(defrule
(unit-type-count-total transport-ship < 2)
(can-train transport-ship)
=>
(train transport-ship)
(chat-local-to-self "transport-ship")
)
Wenn das Veröffentlichen des letzten KI-Codes in irgendeiner Weise nicht legal sein sollte, dann bitte den Code entfernen oder zenzieren. Aber über ein Statement würde ich mich trotzdem freuen. Wobei ich denke es geht in Ordnung ;) .

~ Draygon
Doch, sicher ist dat legal!
Du darfst dir ja auch die dat-files anschauen!
Wo hast du denn die KI-Dateien her?? :eek:


Sehen ja ganz ordentlich aus (auch wenn das nichts mit dem Wort "Syntax" zu tun hat :P ), aber ob die zu deinem Szenario passen, kannst nur du ordentlich beurteilen...aber wo zum Teufel hast du die KIs her?? Aus den cpx-Dateien??

@Standard-KI:

Warum soll ich die denn posten? Ich kann sie dir doch auch einfach per E-Mail schicken, oder?

EDIT: @El_Cid:

Warum sollte das immer legal sein, spielinterne Dateien öffentlich zu posten? Anschauen darf man die sich natürlich, aber das hat nichts damit zu tun, das es einfach so erlaubt ist diese Dateien öffentlich in ein Forum zu schreiben! :rolleyes:
Wo hast du denn die KI-Dateien her?? [...] aber wo zum Teufel hast du die KIs her?? Aus den CPX-Dateien??
Um genau zu sein ;) :
1. CPN/CPX-File entpacken.
2. Szenario mit dem Trigger-Studio öffnen und die eingebetteten AI-Files (wie bei den selbsterstellten Szenarien) exportieren.
3. Sich freuen und die Files (*.per) bewundern :super: .

Zitat von Janworks: Sehen ja ganz ordentlich aus (auch wenn das nichts mit dem Wort "Syntax" zu tun hat ), aber ob die zu deinem Szenario passen, kannst nur du ordentlich beurteilen...

Ich will keine KI einfach kopieren, ich meinte eigentlich indirekt das Schema. Ist ja nicht so wichtig... (Bevor wir aneinander vorbeireden [kann ja vorkommen ;) ]: In meinem Beitrag oben war KI-1 von mir und KI-2 von ES) Also war in meiner KI oben schon mal alles richtig , wenn ich es richtig verstanden habe.

Jedenfalls habe ich mir heute die Mühe gemacht, die KI für den Gegner von Scn1 zu schreiben. Und nach langer Arbeit funktioniert alles perfekt. Ehrlich gesagt noch besser, als es die Standard-KI je machen könnte - vielleicht auch ein bisschen zu schwer... aber das werde ich noch anpassen.

Ich bin bei meiner KI übrigens nach demselben Schema vorgegangen wie ES und es klappt alles wunderbar.

An sich hat sich die Arbeit heute gelohnt und ich denke, dass ich anscheinend doch keine Standard-KI brauche - trotzdem danke für dieses sehr gute Angebot :D . Habe mich relativ gut in die Thematik eingearbeitet und für Szenarien unterschiedlichster Art reicht es jetzt alle mal.

Und wenn ich es mit meinen Augen richtig sehe, sind die ES-KI's auch nicht so tiefgründig.

Und da man die KI's ja sowieso in die Szenarien/Kampagnen einbetten kann, wird es beim Veröffentlichen der Kampagne so gut wie keine Probleme geben :D - mit dem Dateiwirrwarr :) .

Also so langsam gefällt mir das mit der KI-Erstellung :D . Nunja...

Wobei eine Frage hätte ich noch: Ist es eigentlich möglich die Entfernung für das Bauen von Häusern in irgendeiner Weise festzulegen? Standardmäßig werden die ja immer schön um das Dorfzentrum herum gebaut. Kann man das irgendwie ändern?

~ Draygon
Kannste mir mal die KIs von Lepanto schicken?
Ich wollte das nochmal schaltermäßig tunen.
Ach so - ich hab das Trigger Studio noch nie benutzt, deswegen ist mir das auch entgangen... :rolleyes:

@Entfernung von Häusern:

Das kann man leider nicht bestimmen, auch nicht mit der Stadtgröße. Wenn du genau hinguckst, siehst du auch, dass die Häuser in einem ganz bestimmten Abstand zum Dorfzentrum sind, nämlich so, dass da noch Felder drumherum passen. Die werden nämlich auch immer ums Dorfzentrum gebaut.
Kannste mir mal die KIs von Lepanto schicken?
Ich wollte das nochmal schaltermäßig tunen.
Ich kann sie hochladen, aber im Prinzip kannst du sie dir doch ganz einfach selbst exportieren:

1. Gewünschte CPN/CPX-File mit dem Kampagnen-Manager entpacken: \Programme\Microsoft Games\Age of Empires II\CAMPAIGN\xcam4.cpx (bei dir müsste es die hier sein)
2. Szenario mit dem Triggerstudio (dort aokts-0.3.10.zip runterladen) öffnen.
3. Dann geht es Scenario/Dump .per Files.... Nun werden alle KI-Dateien in dem Ordner dump des Triggerstudio geschrieben.
4. Dann hast du sie - um diese jetzt nutzen zu können musst die zugehörigen *.ai-Files zur den richtigen *.per-Files erstellen, z.B. scenario non-combat.per wäre dann noch eine leere scenario non-combat.ai hinzuzufügen.

Die anderen scenario*.per-Files ebenfalls hinzu packen, da diese evt. von den KI-Dateien benötigt werden. Anonsten brauchst zu den (außer für scenario non-combat.per) keine scenario*.ai-Files erstellen.

Ich hoffe es ist verständlich^^.
_________

Nun habe ich noch 2 Fragen ;) . Wie kann man der KI richtig sagen, das die Bergarbeiteranlagen richtig platziert werden. Und wenn ich sie im Limit nicht beschränke, auch nicht jedes dritte Feld eine Bergarbeiteranlage platziert wird.

Denn des öfteren werden die meilenweit irgendwo in der Pampa gesetzt, natürlich innerhalb des erlaubten Radius vom Hauptdorfzentrum.

Kann man das mit so einem Strategiewert (welchen ich nicht finde) beeinflussen, wie weit von einer Gold- bzw. Steinquelle die Anlage max. entfernt sein darf?

Dann noch die nächste Frage: Ich habe einen Spieler der als Farmer fungieren soll und demzufolge nur Felder anlegen darf - klappt soweit gut. Holz er-cheated er sich, wenn es benötigt wird. Wenn das Spiel aber länger geht, will die KI einfach keine Felder anlegen - obwohl mein Test-Chat kommt "build farm".

Ich vermute mal, dass die KI glaubt, dass die untätigen Bauern gar nicht untätig sind. Kann man das irgendwie lösen? Momentan ist es so, dass ich 2 Dorfbewohner für Holz-Sammeln reserviere. Mit denen dann auch die KI die nötigen Felder anlegt - eines bessere Lösung ist mir nicht eingefallen. Oder könnte es auch daran liegen, dass dieser Spieler nur 2 Mühlen als Gebäude hat und kein Dorfzentrum?

Genug geschwafelt^^ - ich freue mich über jede Antwort ;) .

~ Draygon
Ich habs jetzt versucht! Aber die per. Dateien sind LEER!!!
Was hab ich denn bloß falsch gemacht?
Leer dürften KI-Files eigentlich nicht sein... Hast du wirklch alles so gemacht, wie ich es geschrieben habe? Du darfst auch nicht das entpacke Szenario nachträglich im AoE-internen Editor speichern, dann sind die KI-Datei weg.

Egal... ich habe sie dir mal hochgeladen:

http://rapidshare.de/files/48711138/C4_ ... o.zip.html

Viel Spaß damit^^.

~ Draygon