Spezielle Kampf-KI?

Fragen zum Szenarienbau und Mapdesign

Moderatoren: Henning, Björn_Jernside

Hallihallo für eine bestimmte Map brauche ich eine ganz bestimmte KI,
hab nur keine Ahnung wie die Code-Zeilen dafür aussehen. Wäre euch sehr dankbar, wenn die mir eben jemand hier reinkopieren könnte.

Ist eine sehr kleine KI.

Ein Spieler hat von allen Rohstoffen unendlich (also bei Spieler eingestellt) und soll in jedem Gebäude, dass er hat auf KI Signal nonstop Einheiten produzieren. Auf einen anderen KI Befehl, den man per Schalter auslösen kann, soll er damit aufhören Einheiten zu produzieren.
Die Einheiten sollen einfach angreifen, und zwar sofort. Nicht gruppieren oder so, sondern direkt nach dem Ausbilden sollen sie angreifen. Der KI-Spieler hat keine Dorfbewohner und braucht auch keine, er hat nur viele Kampfgebäude, wo halt Einheiten ausgebildet werden sollen. Die sollen per KI NICHT upgegraded werden, das würde ich dann per Schalter zu gewissen Zeitpunkten übernehmen.
Sonst wäre es auch ganz gut, einzstellen, dass er immer genug Rohstoffe hat um Einheiten zu produzieren, alternativ mach ich das sonst wie oben beschrieben (gebe ihm 99999 Rohstoffe). Die KI kann auch gerne erkunden, ist mir egal, sie soll nur alle Einheiten sofort auf den Gegner schicken!


Der Hintergrund:
Ich will eine Defend the Spot Karte bauen, wo es bestimmte Zeiten gibt, wo man nciht angegriffen wird und in der Zeit kann man die gegnerischen Gebäude Stück für Stück einreißen. Dann kommt wieder eine Angriffsphase, man muss in sein Lager zurück und sie greifen an.

Per Schalter wäre es sehr mühsam für JEDES Kampfgebäude einen Schalter zu erstellen, das es Einheiten produziert und keine mehr, wenn es zerstört wird.
defrule
true
=>
train militia-line
train scout-calvary-line
train knight-line
train spearman-line
train camel-line

Ich weiß, ist jetzt nicht so toll geraten. Ich hab schon lange nix mehr mit KI gemacht. Seit mir der Editor von Janworks bei nem Festplattencrash flöten gegeangen ist. :(
Dann noch Häuder/Burgen und Zuweisungsschalter.

Die Pausen kann man mit Tor Abschließen/Aufschließen regeln.
Danke für die Antwort, Kampi! :)
Das mit den Toren wäre ansich ne Idee. Nur lassen sich die Gebäude nicht einfach abriegeln per Wall. Das würde zur Map nicht passen. Also muss es da einen anderen Weg geben...
The_Chevalier hat geschrieben:Ein Spieler hat von allen Rohstoffen unendlich (also bei Spieler eingestellt) und soll in jedem Gebäude, dass er hat auf KI Signal nonstop Einheiten produzieren. Auf einen anderen KI Befehl, den man per Schalter auslösen kann, soll er damit aufhören Einheiten zu produzieren.
Das würde ich so machen:

(defrule
(event-detected trigger 10)
(can-train militiaman-line)
=>
(train militiaman-line)
)

(defrule
(event-detected trigger 11)
=>
(acknowledge-event trigger 10)
(acknowledge-event trigger 11)
)

Mit dem KI-Signal 10 kannst du die Ausbildung aktivieren und mit KI-Signal 11 deaktivieren. Du brauchst dann halt für jeden Einheitentyp eine Regel.

The_Chevalier hat geschrieben:Die Einheiten sollen einfach angreifen, und zwar sofort. Nicht gruppieren oder so, sondern direkt nach dem Ausbilden sollen sie angreifen.
Das Nicht-Gruppieren kannst du durch eine Angriffsgruppengröße von 1 simulieren, also so:

(defrule
(true)
=>
(set-strategic-number sn-minimum-attack-group-size 1)
(set-strategic-number sn-maximum-attack-group-size 1)
(attack-now)
)

The_Chevalier hat geschrieben:Sonst wäre es auch ganz gut, einzstellen, dass er immer genug Rohstoffe hat um Einheiten zu produzieren
Dafür nimmt man die Rohstoffe-ercheaten KI-Zeile, die so aussieht.

(defrule
(food-amount less-than 1000)
=>
(cc-add-resource food 1000)
)

Das Gleiche einfach nochmal für wood, gold und stone an Stelle von food, dann hat der Spieler immer alle nötigen Rohstoffe (stein kannst du dir eigentlich sparen, wenn es nur um das Ausbilden von Einheiten geht).

Ich hoffe das funktioniert halbwegs :)
Danke, für deine ausführliche Antwort, Falke!
Noch eine Sache:
Wie mach ich das mit allen Einheitentypen? Du hast ja jetzt nur Militaman geschrieben, könntest du das wohl für alle gängen Standardeinheiten (also alles außer Burg) angeben bzw. mit dem KI Signal 10 und 11. Das wäre brilliant. Sozusagen: KI-Signal 10 = Alle Einheiten egal aus welchem Gebäude ausbilden / KI-Signal 11 = abbrechen.
Sähe das dann so aus?

(defrule
(event-detected trigger 10)
(can-train militiaman-line)
(can-train scout-cavalary-line)
(can-train knight-line)
(can-train spearman-line)
(can-train camel-line)
=>
(train militiaman-line)
(train scout-cavalary-line)
(train knight-line)
(train spearman-line)
(train camel-line)
)

(defrule
(event-detected trigger 11)
=>
(acknowledge-event trigger 10)
(acknowledge-event trigger 11)
)

Bei KI-Signal 10 werden alle Einheiten produziert, bei KI Signal 11 abgebrochen?! Fehlt da was oder ist da ne Klammer zu viel?

Achja, das mit dem angreifen, dafür braucht man nur diese eine Regel von dir. Die wäre dann immer aktiv oder?

PS: Ich bin mir nicht sicher ob die Lines von El Cid stimmen, irgendwie weiß ich nicht ob man Kavallerie so schreibt?!
Hier die Lines, damit die KI sich permanent Ressourcen cheatet:

Code: Alles auswählen

(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)
)
Und die Lines, damit Soldaten ausgebildet werden, müssen so aussehen:

Code: Alles auswählen

(defrule
(unit-type-count-total militiaman-line < 8)
(can-train militiaman-line)
=>
(train militiaman-line)
(chat-local-to-self "Infanterist")
)
Ausbildungsanzahl kann natürlich beliebig geändert werden.
Ah Henni du bist's :D
Kannst du mir vielleicht sagen wie das jetzt alles genau geht?
Du hast da jetzt nur Militiaman und keine generellen Militäreinheiten genommen?!
Wie geht das mit ALLEN Militäreinheiten und auch mit KI Signal, hab das von Falke ausprobiert. Aber das funktioniert irgendwie nicht.

EDIT: Was soll das mit Chat?
So meine KI sieht bis jetzt so aus:

(defrule
(unit-type-count-total militiaman-line < 50)
(can-train militiaman-line)
=>
(train militiaman-line)
)

defrule
(unit-type-count-total spearman-line < 50)
(can-train spearman-line)
=>
(train spearman-line)
)

(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)
)

Ich verstehe nicht, warum IMMER Fehlermeldungen kommen!
Das ist die jetzige:

"Player 2
File Kampf.per
Line 8: ERR3001: Invalid preprocessor directive: defrule"

Was soll das heißen?

Code: Alles auswählen

(defrule
(unit-type-count-total knight-line < 8)
(can-train knight-line)
=>
(train knight-line)
(chat-local-to-self "Ritter")
)
... wäre das gleiche für Ritter, du musst nur die entsprechende "Einheiten-Line" einsetzen.
Chat: Das ist nur eine Kontrolle, kannst du weglassen.

Wenn eine Einheit ausgebildet werden soll auf Chatbefehl, muss das als Bedingung mit rein:

Code: Alles auswählen

(defrule
(event-detected trigger 10)
(unit-type-count-total knight-line < 8)
(can-train knight-line)
=>
(train knight-line)
(acknowledge-event trigger 10)
(chat-local-to-self "Ritter")
)
[/s]

Das wird aber nur einemal funktionieren. Danach bleibt der Chatbefehl wirkungslos, wenn ich mich recht entsinne.

EDIT:
Via Chatbefehl müsste aber eigentlich so aussehen:

Code: Alles auswählen

(defrule
(taunt-detected any-ally 125) 
=>
(set-signal 125)
(disable-self)
)
ARRGHAHGAHGHAghaklhsdgklahsdgkl!
Was für ein Schei.ß Aiedit Programm!

Ich öffne die AI, ändere eben die vergessene Klammer (siehe geradigen Fehler) klicke auf das Speichersymbol oben und verlassen das Programm ohne untiteled1 zu speichern. Was für ein untiteled1 überhaupt? Die AI heißt Kampf.per!

Und dann gehe ich ins Spiel und starte und dann kommt:

Error: No rules!

WTF???? :mad:

EDIT:
Henni, kannst du mir vielleicht bitte eine KI schreiben, die die ganze Befehle macht.
Sie soll nur Soldaten produzieren (alle Sorten auch belagerung) und das auf KI Signal an und aus machen können (nicht per Chatbefehl) und soll Rohstoffe cheaten. Mehr nicht.
Es geht hier gar nichts mehr, immer wenn ich eine AI Datei editiere und danach abspeichere(!) wird sie gelöscht und ist danach leer!
Das mit den Chatbefehlen ist das problematische an der Sache, ich hätte eine ganz gute Lösung ohne Chtabefehle, wenn du die hören willst, sag an!
NEIN! Keine Chatbefehle! KI-Signale!!! Also per Schalter aktivieren!
Ich möchte einfach die Angriffe an- bzw. aus machen können.
Per Schalter, nicht per Chatbefehl

Boah regt mich AIEdit auf! :D

Okay sag an.
Danke :)
Chatbefehle werden auch per Schalter aktiviert, wenn man es genau nimmt. ;)
Ich hätte nur eine KI/Schalter Lösung ohne KI-Signal und Chatbefehle.
Auch in Ordung! :)
Okay, bitte etwas Geduld, werde das ganze selber mal testen, dir dann eventuell direkt ein .scx mit den Schaltern + die KI schicken.
Kriegst du das auch so hin, dass er generell ALLe Einheiten macht, weil hier steht immer nur spearman-line?! Wird dann nur der Pikinier oder auch der Hellebardier ausgebildet? Weil es sollen nicht nur die Grundtypen ausgebildet werden.
Spearman-Line heißt, dass er Speerkämper ausbildet, sind diese jedoch zu Pikenieren geupgradet, bildet er Pikeniere aus bzw. Hellebardiere. Daher auch "xxx-LINE". Damit sind Einheiten-Linien gemeint, also upgradefähige Basiseinheiten.
Militiaman-line umschließt alle Einheiten von Milizsoldat bis Elitekämpfer.
The_Chevalier hat geschrieben:Wie geht das mit ALLEN Militäreinheiten und auch mit KI Signal, hab das von Falke ausprobiert. Aber das funktioniert irgendwie nicht.
Was genau funktioniert denn nicht. Hab's grad getestet, bei mir klappt's. Nur um mal den einfachsten Fehler auszuschliesen: Hat der Spieler genug Häuser/Hütten/Zelte, also genug Platz unterm Bevölkerungslimit um Einheiten auszubilden?

The_Chevalier hat geschrieben: (defrule
(event-detected trigger 10)
(can-train militiaman-line)
(can-train scout-cavalary-line)
(can-train knight-line)
(can-train spearman-line)
(can-train camel-line)
=>
(train militiaman-line)
(train scout-cavalary-line)
(train knight-line)
(train spearman-line)
(train camel-line)
)
Du brauchst eine eigene Regel für jeden Einheitentyp, also

(defrule
(event-detected trigger 10)
(can-train militiaman-line)
=>
(train militiaman-line)
)

(defrule
(event-detected trigger 10)
(can-train spearman-line)
=>
(train spearman-line)
)

usw.


Die Bezeichnungen für alle Einheiten-Linien findest du im CPSB, das du im KI-FAQ-Artikel runterladen kannst, auf Seite 58.


So, jetzt solltest du aber genug Informationen haben um das selber zu machen und nicht von Henning machen zu lassen. :klopfklopf: ;)