Benötigte Vorkenntnisse: Leichte Scriptkenntnisse, eine Gegner KI aus einem Szenario
Schwierigkeit:
*****
Hallo,und Herzlich willkommen zu meinem Tutorial "Howto: Ein Adventure Szen mit KIs erstellen".
Dieses Tutorial ist in einzelne, leicht nachvollziehbare Schritte eingeteilt.
Dann fangen wir gleichmal an mit dem ersten Schritt
VorbereitungenEs sei denn, ihr wollt eure eigen gescriptete KI nicht hier einsetzten, kopiert euch bitte die Enemy.c4d aus einem Beliebigen Szenario.
Diese Datei ist beispielsweise in Drachenfels zu finden oder im Assasinen-Tutorial von M&M (nur verwenden wenn ihr M&M Typen als KIs haben wollt!)
Wir nehmen mal hier in diesem Tutorial an, das wir hier nur das Knights Pack verwenden wollen, und keine Paladine oder Assasinen haben wollen.
Was auch noch bei der Gestaltung wichtig ist, diese Ganzen Tempel-Anlagen, also die Tore und Schalter zu kopieren. Befindet sich alles im Standart-Szenario Drachenfels.
Als nächstes erstellt ihr ein neues Szenario und kopiert die Enemy.c4d sowie die Tempel-Objekte alle da rein und stellt Objects.c4d und Knights.c4d als Vorgabe ein.
Danach geht ihr in das Eigenschaften Fenster, wählt "Meele" als Spielziel aus und als Regel "Enemy-AI". (AI und KI ist übrigens das gleiche.)
Gut, soweit so gut.
Was wir noch für die KIs brauchen, ist ein Szenariospieler, dem die ganzen KIs gehören. Ohne den gehts leider nicht.
Geht in das Szenario "Drachenfels". Ihr findet dort die .c4p Datei "ScriptPlr-1". Außerdem findet ihr die Datei "SavePlayerInfos.txt" und die Teams.txt. All diese Dateien kopiert ihr in euer neues Szenario. Dann öffnet ihr nochmals die SavePlayerInfos.txt und löscht in der Zeile
- SavePlayerInfos schrieb:
- Flags=Joined|AttributesFixed|NoScenarioInit|NoEliminationCheck
das "NoEliminationCheck" raus. Speichern nicht vergessen.
Und wo wir gerade dabei sind, kopiert auch noch gleich die Materials.c4g in euer Szenario.
Das Umscripten einiger ObjekteDas führe ich jetzt nochmal hier als ein Extrapunkt auf.
Wir haben nämlich ein Problem, diese Tore können nur von diesen Gewichtsplatten aktiviert werden. Damit man sie auch mit einem Schalter aktivieren kann, Scriptet ihr das Tor bitte so um:
- Spoiler:
- Code:
-
/*-- Steintor --*/
#strict
local iSwitchDir;
protected func Initialize()
{
SetAction("Gate");
SetComDir(iSwitchDir=COMD_Down);
}
public func ControlUp(object pController)
{
[$DescUp$]
// 2do: sound
if (GetComDir() != COMD_Up) Sound("Elevator");
// Schalter schalten dauerhaft; der Benutzer nur für max. 30 Frames
if (pController && pController->~IsSwitch())
iSwitchDir = COMD_Down;
else
Schedule("SetComDir(iSwitchDir)", 30);
return(SetComDir(COMD_Down));
}
public func ControlDown(object pController)
{
[$DescDown$]
// 2do: sound
if (GetComDir() != COMD_Down) Sound("Elevator");
// Schalter schalten dauerhaft; der Benutzer nur für max. 30 Frames
if (pController && pController->~IsSwitch())
iSwitchDir = COMD_Up;
else
Schedule("SetComDir(iSwitchDir)", 30);
return(SetComDir(COMD_Up));
}
public func ControlLeft(object pClonk){return(ControlUp(pClonk));}
public func ControlRight(object pClonk){return(ControlDown(pClonk));}
protected func Hit()
{
Sound("Discharge");
// 2do: sound
}
Wollt ihr auch noch, das Zugbrücken mit den Schalter bedienbar werden, macht in der System.c4g (als Neuen Ordner ersteleln) ein Script mit folgendem Inhalt:
- Code:
-
/*-- Turm-per-Schalter-steuern Fix --*/
#strict
#appendto CPBL
func ControlRight(){return(ControlDown());}
func ControlLeft(){return(ControlUp());}
Das Gestalten der Karte und das Einsetzen der ObjekteNun, da wir endlich alle Vorbereitungen getroffen haben, startet euer Szenario im Entwicklermodus ohne Spieler und macht ein neues Sichtfenster auf.
Zuersteinmal löscht ihr Alle Objekte mit RemoveAll() (in die Eingabezeile schreiben).
Zuersteinmal gestaltet die Karte des Szenarios. Gestaltet sie so, das später noch Türen und Schalter platz haben wird. Ich hab meine wie einen "Tempel" gestaltet.
So sieht die aus:
Als nächstes wollen wir doch mal einen Schalter und ein Tor einsetzen. (Vorher den weißen Pfeil auswählen im Enginefenster!)
Zieht dazu das Gate.c4d und die Switch.c4d (sollten bei den Tempelobjekten dabei sein) in euer Szenario und platziert sie.
Dann ruft im Tor den Befehl ObjectNumber() auf. Das ist, damit wir das Objekt gleich als Ziel für den Schalter setzen können.
Wenn ihr Enter drückt, bekommt ihr im Log die Ausgabe des Befehls. Bei mir ist das:
- Zitat :
- -> Tor::ObjectNumber()
= 546
Diese Nummer merken.
Danach gehen wir bei dem Schalter in die Eigenschaften.
Dort sucht ihr in der Liste ganz oben nach dem Befehl "AddTarget()"
Klickt auf den Befehl und schreibt folgendes hinein und drückt Enter:
Nun hat der Schalter das Tor als Ziel, und kann das Tor kann nun mit dem Schalter geöffnet werden.
Beweis:
Toll, nicht?
Tipp: Wenn man den Steinklotz, Block.c4d, als Ziel für den Schalter setzt, kann man diesen Bewegen. Nützlich für Rätsel KIs einfügenSo, jetzt wirds spannend. Ihr wollt jetzt bestimmt wissen, wie man jetzt die KIs einsetzen kann.
Zualler erst zieht ihr den Clonk, den ihr als KI haben wollt, ins Szenario. Er ist ein ganz normaler Clonk. Durch die aktivierte Regel jedoch wurden in ihm Funktion inkludiert.
So sieht der aus:
In diesem Clonk sind jetzt auch einige Funktionen verfügbar. Unter diesen die Funktion
SetAI()Diese Rufen wir jetzt noch ihm Clonk auf.
So sieht das danach aus:
Aber ohne Waffen ist der ja langweilig.Vorab mal die IDs der Wichtigsten Waffen:
Waffe | ID |
Bogen | BOW1 |
Axt | AXE1 |
Schwert | SWOR |
Schild | SHIE |
Pfeilpacket | ARWP |
Teraflint | EFLN |
Rüstung | ARMR |
|
Nun können wir mit dem Befehl
CreateContents(id ID) in dem Clonk Waffen erstellen.
Geben wir ihm mal z.B einen Schild.
Das wird so gemacht: Als erstes geben wir ihm mittels CreateContents(SHIE) einen Schild.
Damit er ihn auch anzieht, müssen wir in ihm nochmals
ControlDigDouble aufrufen.
So sieht das am Ende aus:
Und zu guter letzt geben wir ihm noch ein normales Schwert mittels CreateContents(SWOR)
So sieht nun der fertige KI aus:
Und jetzt machen wir nurnoch etwas mehr Schalter und Türen rein, das dann zu einem Gesamten Szenario zusammenwirkt.
So sieht bei mir dann die Gegnerverteilung aus:'
Aber wenn wir nun das Szenario mit einem Spieler starten, stellen wir fest, dass man irgentwo startet. Man hat auch keine Waffen. Das ändern wir jetzt.Öffnen wir den Script des Szenarios, so ist der erstmal recht leer.
Wir fügen eine InitializePlayer() Funktion hinzu. So könnte eine aussehen:
- Code:
-
func InitializePlayer(int iPlr){
SetPosition(50,800,GetCrew(iPlr)); //Wo man startet
CreateContents(AXE1,GetCrew(iPlr)); //Wir kriegen eine Axt
CreateContents(BOW1,GetCrew(iPlr)); //und einen Bogen
CreateContents(ARWP,GetCrew(iPlr),2); //und 2 Pfeilpackete.
return(1);
}
ENDE
Ich würde mich freuen, eure KI Szenarien zu sehen