


Zur Zeit online: kein Gast, xanbank |


Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [35] [36] >> |
Autor |
Mitteilung |
|
verfasst am: 15.01.2010, 13:17
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Bin gerade mal am Default-AlienAI Skript was am versuchen.
Und zwar will ich hier konsequent nur ein Schiessen erlauben, wenn das Alien reagiert. Habe dafür die alte Prozedur FindAndAttackTarget ausgebunden und eine neue Prozedur ReactTarget eingebunden.
procedure OnRoundBreak(Sender:TObject);
begin
ReactTarget;
AlienFigure.EndRound;
end;
und hier die ReactTarget
// ---------------------------------------------------------------------- -------
// wenn Alien reagiert, soll es hier nicht laufen dürfen, sondern nur schiessen dürfen
procedure ReactTarget;
begin
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('Call FindAttackTarget');
{$ENDIF}
// wenn m?glich am n?chsten gelegene gesichtete Einheit als neues Gruppenziel setzen
// bei Bedarf vorhandenes Target checken, und gegebenenfalls auf NIL setzen (zweiter Parameter)
GFAITools_FindGroupTarget(AlienFigure, true);
// entweder gerade gefundenes Ziel, oder zuletzt f?r AIGroup gesetztes Ziel angreifen
// wenn Alien auf etwas reagiert, darf es auch nur auf das reagierte Schiessen
// Gruppentarget ist hier falsch und soll noch weg
if (AlienFigure.AIGroup.Target<>Nil) then
begin
// wenn alles richtig l?uft, sollte das eigentlich nie zutreffen:
if ((AlienFigure.AIGroup.Target.HP<=0)) then
game_api_MessageBox('TargetHP<=0 - Bitte im Forum melden');
AlienFigure.ReservedTimeUnits:=0;
GFAItools_FindBestShotModeForHitChance(AlienFigure,AlienFigure.AIGroup .Target,MinHitChance);
GFAItools_ShootGroupTargetAsLongAsPossible(AlienFigure);
// ShotToUnit liefert false, wenn Ziel nicht gesehen wird, daher hier extra pr?fen (calcHitChance ignoriert Sichtkontakt):
end
end;
weiterhin möchte ich noch den Gruppentarget hier raus haben und das Alien soll wirklich nur auf den Soldaten schiessen, wo es reagiert. Das ganze will ich dann auch noch für die Soldaten einführen, wobei ich finale dann auch noch eure Reaktionsformel komplett ausklammern will und jedem Soldaten/Alien, was Move aufgespart hat diese Reaktionfire geben will. Die Reaktion soll dann an anderer Stelle einberechnet werden.
Z.B. wenn auf eine Einheit geschossen wird, könnte er dann den Move/Shot des Feindes geringfügig unterbrechen, um dann entweder zurückschiessen zu dürfen oder sich in Deckung zu werfen. Da kein hinhocken oder hinwerfen existiert, würde ich für in Deckung gehen ein bis zwei Felder Move erlauben, so das die Einheit sich wenigstens hinter ne Ecke stellen kann, wenn sie unter Beschuss steht und reagiert. Aber das ist noch ziemlich weit weg.
Erstmal muss jetzt das Gruppentarget aus der Reacttarget entfernt werden und dann muss ich Soldierreact abfangen und dort eine ähnliche Reacttarget einbinden, nur mit dem unterschied, das der Spieler hier in der Runde davor den Schussmodus vorgibt und nicht die Routine FindBestShotModeForHitChance gestartet wird. |
|
verfasst am: 15.01.2010, 22:53 · Edited by: Kamor
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
So hier bin ich auch ein Schritt weiter, meine Aliens reagieren jetzt auf das Ziel, was sie unterbrochen haben und suchen sich nicht irgendein anderes Ziel.
Die Reacttarget sieht jetzt so aus:
// ---------------------------------------------------------------------- -------
// wenn Alien reagiert, soll es hier nicht laufen dürfen, sondern nur schiessen dürfen
procedure ReactTarget;
begin
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('Call ReactTaregt');
{$ENDIF}
// im Gegensatz zur FindAndAttackTarget, die ein neues nächstes Ziel oder bestes
// Gruppenziel sucht, schiesst hier die Einheit auf das Ziel, wo schon vorhanden ist
// und wahrscheinlich durch die Unterbrechungsroutine gesetzt wurde?
if (AlienFigure.AIGroup.Target=Nil) then
begin
game_api_MessageBox('AI hat kein Target');
end;
if (AlienFigure.AIGroup.Target<>Nil) then
begin
game_api_MessageBox('AI hat Target');
// wenn alles richtig l?uft, sollte das eigentlich nie zutreffen:
if ((AlienFigure.AIGroup.Target.HP<=0)) then
game_api_MessageBox('TargetHP<=0 - Bitte im Forum melden');
AlienFigure.ReservedTimeUnits:=0;
GFAItools_FindBestShotModeForHitChance(AlienFigure,AlienFigure.AIGroup .Target,MinHitChance);
GFAItools_ShootGroupTargetAsLongAsPossible(AlienFigure);
// ShotToUnit liefert false, wenn Ziel nicht gesehen wird, daher hier extra pr?fen (calcHitChance ignoriert Sichtkontakt):
end
end;
Hier habe ich jetzt noch zwei Probleme. Das eine ist ein sekundäres Problem, wo eine reagierende KI kurz mal eben sein Alienkollegen übern Haufen geschossen hat. Das andere ist ein primäres Problem und könnte evtl. auch mit dem Problem was zu tun haben, das reagierende Aliens mit der Default-Ki sich weiter bewegen können, wie sie es eigentlich sollen.
kurze Scenebeschreibung: Nachdem ich den Alienunterbrecher ausgelöst hatte, hat der Alien erstmal wie ich es mir vorstelle geschossen und dann gleich aufn ersten Shoot meinen Trooper exekutiert. Das hätte es sein sollen, aber der Alien meinte noch, sich danach dann ein bischen auf meine andere Trooper zuzubewegen müssen. Ich rufe eigentlich kein Movebefehl auf und frage mich, wo der Alienmove nach dem Schuss dann herkommt? Entweder habe ich ein Denkfehler, oder die Aliens werden noch in einer Shotroutine nach erfolgreichen Kill ein bischen weiterbewegt?
In den beiden Routinen
GFAItools_FindBestShotModeForHitChance(AlienFigure,AlienFigure.AIGroup .Target,MinHitChance);
und
GFAItools_ShootGroupTargetAsLongAsPossible(AlienFigure);
habe ich keine Movebefehle gefunden
bliebe für mich noch die Kernroutine
ShotToUnit
wo der nicht gewollte Move noch ausgelöst wird? |
|
verfasst am: 16.01.2010, 02:03
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Die Frage ist, von wo aus du ReactTarget aufrufst, und was dort dann noch alles gemacht wird. Wenn dir der Ablauf des AI-Skriptes nicht ganz klar ist, solltest du eine globale String-Variable anlegen, in die du an allen wichtigen Skriptstellen einen Eintrag machst. Das ganze dann in FinalizeMission als Textdatei ausgeben. |
|
verfasst am: 16.01.2010, 09:57
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Zitat: Natter Die Frage ist, von wo aus du ReactTarget aufrufst, und was dort dann noch alles gemacht wird. Wenn dir der Ablauf des AI-Skriptes nicht ganz klar ist, solltest du eine globale String-Variable anlegen, in die du an allen wichtigen Skriptstellen einen Eintrag machst. Das ganze dann in FinalizeMission als Textdatei ausgeben.
procedure OnRoundBreak(Sender:TObject);
begin
ReactTarget;
AlienFigure.EndRound;
end;
also der OnRoundBreak, ruft nur die ReactTarget auf und danach soll der Alienmove zuende sein, deshalb verstehe ich nicht, wo der sich aufeinmal noch seine Bewegung herholt?
Mit euren Debugmethoden kenne ich mich noch nicht aus. Bin gewohnt mir meine eigenen Breakpoints und Hilfsausgaben zu setzen. Werde dann ein paar Debugmeldungen einbauen, um die Stelle zu finden, wo der Alien sich bewegt. Geht für mich schneller, anstatt mich mit dem Thema FinalizeMission zu beschäftigen. |
|
verfasst am: 16.01.2010, 12:35
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: Kamor
Mit euren Debugmethoden kenne ich mich noch nicht aus. Bin gewohnt mir meine eigenen Breakpoints und Hilfsausgaben zu setzen. Werde dann ein paar Debugmeldungen einbauen, um die Stelle zu finden, wo der Alien sich bewegt. Geht für mich schneller, anstatt mich mit dem Thema FinalizeMission zu beschäftigen.
Zu FinilizeMission gibts nicht viel zu sagen - das wird bei jedem Skript automatisch aufgerufen (sofern vorhanden), sobald das Skript beendet wird. Für AISkripte also bei Tod oder Ende des Bodeneinsatzes. Du kannst natürlich auch mit Nachrichten arbeiten. |
|
verfasst am: 17.01.2010, 13:01 · Edited by: Kamor
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Weil es spieltechnisch einfacher ist, mit Soldaten die Aliens zu unterbrechen, versuche ich das jetzt auch mal von der anderen Seite. Leider habe ich hier zwei Probleme, ich fange zwar die Unterbrechung ab, und kann z.b. den Soldaten der unterbricht testweise sterben lassen, aber ich bekomme nicht das Ziel mitgeliefert, wieso er unterbrochen hat.
Wenn ein Alien unterbricht, hat es sein Ziel, weswegen es unterbricht in der AIGroup.Target, unterbricht aber ein Soldat, fehlt mir dort das Target. Das Target nachträglich über z.B. AIGroup.GetNearestEnemy abzufragen ist inakzeptabel, weil es zu Situationen führt wo die Reaktion durch ein Distanzalien ausgelöst wird, der Soldier dann aber ein nahes Alien wegpusten kann.
Ein zweites Problem habe ich noch, das ich nur einen Soldaten über das Object Sender durch den Eventaufruf OnRoundBreak bekomme, obwohl da z.b. dann 3 oder 4 Soldaten im Unterbrechungsmodus schiessen dürfen. Die müsste ich dann in meiner OnRoundBreak über eine andere Metheode herausfinden, wie mal eben schnell das Senderobject abzufragen.
Mein Code ist eigentlich noch ziemlich einfach, ich binde den OnRoundBreak in der ersten Spielerrunde auf alle meine Soldaten. Und will dann dementsprechend auch reagieren. Testweise gebe ich aus, ob der Soldat ein Ziel hat und kille ihn dann.
program Versuch;
var Flag : Boolean;
procedure OnRoundBreak(Sender: TObject);
var
Figure : TGameFigure;
begin
game_api_MessageBox('OnRoundBreak');
Figure:=TGameFigure(Sender);
if (Figure.AIGroup.Target=Nil) then
begin
game_api_MessageBox('Soldier hat kein Target');
end
else
begin
game_api_MessageBox('Soldier hat Target');
end;
// Figure.EndRound;
Figure.KillUnit;
end;
procedure NewPlayerRound(Sender: TObject);
var i : integer;
var Figure : TGameFigure;
begin
// game_api_MessageBox('NewplayerRound');
if (flag=false) then
begin
flag:=true;
if (groundAI_api_GetEnemyAIGroup.EnemyCount)>0 then
begin
for i:=groundAI_api_GetEnemyAIGroup.EnemyCount-1 downto 0 do
begin
Figure := groundAI_api_GetEnemyAIGroup.GetEnemy(i);
register_event(@OnRoundBreak,Figure,EVENT_FIGURE_ROUNDBREAK);
end;
end;
end;
end;
procedure StartMission;
begin
Flag := false;
register_special_event(@NewPlayerRound,EVENT_SPECIAL_ONNEWPLAYERROUND) ;
end;
begin
MissionName:='Versuch';
MissionType:=mzUser;
end.
|
|
verfasst am: 17.01.2010, 13:22 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: Kamor Wenn ein Alien unterbricht, hat es sein Ziel, weswegen es unterbricht in der AIGroup.Target
Das Target hängt aber auch da nicht mit der Rundenunterbrechung zusammen, sondern wird vorher an anderer Stelle im Skript gesetzt. Ist also nicht anders als bei Soldaten.
Zitat: Kamor
Ein zweites Problem habe ich noch, das ich nur einen Soldaten über das Object Sender durch den Eventaufruf OnRoundBreak bekomme, obwohl da z.b. dann 3 oder 4 Soldaten im Unterbrechungsmodus schiessen dürfen. Die müsste ich dann in meiner OnRoundBreak über eine andere Metheode herausfinden, wie mal eben schnell das Senderobject abzufragen.
Wieso? Jeder Soldat hat doch sein eigenes AI-Skript, und wird folglich auch eigenständig auf die Unterbrechung reagieren. Wieso willst du das mit einem Gesamtskript regeln? |
|
verfasst am: 17.01.2010, 14:07
|
Admin, Spielsatz GalWar
Registrierdatum: 31.08.2005, 21:51
Beiträge: 5596
 |
Zitat: Kamor Ein zweites Problem habe ich noch, das ich nur einen Soldaten über das Object Sender durch den Eventaufruf OnRoundBreak bekomme, obwohl da z.b. dann 3 oder 4 Soldaten im Unterbrechungsmodus schiessen dürfen. Die müsste ich dann in meiner OnRoundBreak über eine andere Metheode herausfinden, wie mal eben schnell das Senderobject abzufragen.
Etwas genauer erklärt als Natter das getan hat:
Das Event wird an alle gerade zutreffenden Soldatenobjekte gesendet. Bei jedem Soldat wird kontrolliert, ob das zugeordnete Skript dieses Event einer Funktion zugewiesen hat. Wenn ja, dann wird diese Funktion mit dem Soldaten als Objekt aufgerufen.
D.h. Das AI-Skript läuft genausooft wie Soldaten das Event erhalten haben, jedesmal mit einem anderen Soldaten als Übergabeobjekt.
Im Falle der Aliens kann man sogar jedem Alienmodell ein anderes Skript zuweisen und damit die verschiedenen Aliens auch unterschiedlich auf die Unterbrechung reagieren lassen. |
|
verfasst am: 17.01.2010, 14:49 · Edited by: Kamor
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Zitat: Natter Das Target hängt aber auch da nicht mit der Rundenunterbrechung zusammen, sondern wird vorher an anderer Stelle im Skript gesetzt. Ist also nicht anders als bei Soldaten.
Daran hatte ich dann auch schon gedacht, damit stehe ich aber vor einen noch größeren Problem, weil ich kein Gruppentarget brauche oder auch kein alle sichtbaren Ziele durchsuchen mir hilft, sondern ich genau die Einheit als Target brauche, die unterbrochen wurde. Die weiss aber nur der Code und ob der an der Stelle, wo der Unterbrecher ausgelöst wird, das irgendwo in einer globalen Variablen speichert, die ich dann abfragen kann, weiss ich noch nicht. Soweit bin im Code noch nicht reingelesen.
Zitat: Natter Wieso? Jeder Soldat hat doch sein eigenes AI-Skript, und wird folglich auch eigenständig auf die Unterbrechung reagieren. Wieso willst du das mit einem Gesamtskript regeln?
und
Zitat: DirkF Das Event wird an alle gerade zutreffenden Soldatenobjekte gesendet. Bei jedem Soldat wird kontrolliert, ob das zugeordnete Skript dieses Event einer Funktion zugewiesen hat. Wenn ja, dann wird diese Funktion mit dem Soldaten als Objekt aufgerufen.
D.h. Das AI-Skript läuft genausooft wie Soldaten das Event erhalten haben, jedesmal mit einem anderen Soldaten als Übergabeobjekt.
Davon bin ich auch ausgegangen, aber meine OnRoundbreak schlägt nur einmal an, selbst wenn dann mehrere Soldaten noch in der Unterbrechung danach schiessen dürfen? Hm, vielleicht habe ich da in meinem Skript noch ein Denkfehler? Also meine For-Schleife die den Soldaten den Roundbreakzuteilt funktioniert einwandfrei. An dieser Stelle hatte ich schon zu Testzwecken das ganze Platoon gekilled. Naja, werde ich nochmal weitere Tests machen. |
|
verfasst am: 17.01.2010, 16:09 · Edited by: Kamor
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Zitat: Natter Wieso? Jeder Soldat hat doch sein eigenes AI-Skript, und wird folglich auch eigenständig auf die Unterbrechung reagieren. Wieso willst du das mit einem Gesamtskript regeln?
Ich versuche jetzt mal einen anderen Weg und schalte andere AI-Skripte für die Soldaten. Das dies möglich ist, war mir vorher nicht bewusst.
Edit:
Ne lustige Sache, die Skripte für die Spielereinheiten ein- und auszuschalten. |
|
verfasst am: 18.01.2010, 14:19 · Edited by: Kamor
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
So, wieder ein Schritt weiter.
Ich schalte am Spielerrundenanfang immer die ergänzenden SoldierAI-Skripte aus, am Alienrundenanfang schalte ich die Soldierskripte wieder ein.
Der Roundbreak hat jetzt sauber unterbrochen und einer meiner Soldaten hat über das Soldierskript dann sein Magazin leergeschossen, ohne das der Spieler was gemacht hat. Leider wurden noch zwei weitere Soldaten in der Unterbrechung für den Spieler aktiv gesetzt, die vom Roundbreak aber unterschlagen werden. Also wieso ich schon vorher vermutet hatte, schlägt der Roundbreak nur einmal an, wenn ein Alien unterbrochen wird und setzt irgendwo noch die weiteren Soldaten, die mitunterbrechen auf aktiv.
Also bleibt mir nichts anderes übrig, wie alle aktiv gesetzten Soldaten in der Unterbrechungsrunde irgendwie anders zu orten und dort dann schnell noch mein ergänzendes Soldierskript zu aktivieren.
Eure Aussagen das jeder Soldat sein eigenes Soldiersskript hat, sind zwar richtig, aber der OnRoundBreak ruft definitiv maximal nur einen Soldaten pro unterbrochenes Alien auf, die anderen Soldaten werden irgendwo nebenbei aktiv geschaltet. |
|
verfasst am: 18.01.2010, 18:36
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: Kamor
Eure Aussagen das jeder Soldat sein eigenes Soldiersskript hat, sind zwar richtig, aber der OnRoundBreak ruft definitiv maximal nur einen Soldaten pro unterbrochenes Alien auf, die anderen Soldaten werden irgendwo nebenbei aktiv geschaltet.
Wenn das tatsächlich so sein sollte, dann ist das ein Bug (sollte dann aber für die Aliens genauso sein - also würde auch immer nur ein Alien reagieren). |
|
verfasst am: 18.01.2010, 23:07
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Ich denke, ich hab die Fehlerursache gefunden. Da es kein schwerer Fehler ist, werde ich das aber erst für die 917 fixen - erfahrungsgemäß führen kleinste Änderungen am Bodeneinsatz schnell mal zu größeren Problemen (Bodeneinsatz bleibt z.B. hängen). Vielleicht kann mal jemand ein Mantis-Ticket dafür erstellen, damit ich das nicht vergesse. |
|
verfasst am: 19.01.2010, 13:34 · Edited by: Kamor
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Mit eurem Mantis und Bugmeldesystem habe ich mich noch nicht beschäftigt.
Ansonsten habe ich jetzt erreicht, das ein zweiter Soldat mit reagiert hat. Leider finde ich keine globale Variable, wo ich abfragen kann, welche Soldaten noch aktiv geschaltet sind. Da blieb mir erstmal nur die radikale Lösung, alle Soldaten durch mein Reaktionsskript zu jagen. Es schiessen aber nur die, die aktiv sind, die anderen werden durch die Shotroutine ignoriert, was schonmal gut ist. Soldaten die in die falsche Richtung gucken, verursachen aber noch ein Fehler. Auch fehlt mir noch ein Beenden dieser Reaktionsrunde, damit der Spieler nicht noch seine restlichenn Zeiteinheiten agieren kann. Leider macht hier der GameFigure.EndRound die Soldaten nicht inaktiv, sodass der Spieler noch weiter dran rumklicken kann.
Hier fehlt sowieso, für eine saubere Endlösung ein konseqenter Eingriff, das wenn Einheiten über KI-Skripte gesteuert werden, der Spieler da nicht eingreifen kann. Theoretisch wäre es nämlich möglich, wenn der Spieler schnell genug ist, die Automatisation seiner Figuren zu canceln, insbesondere wenn die Automatik z.B. das Panikskript laufen lässt, kann der schnelle Spieler seinen Paniksoldaten abfangen.
Trotz allem fehlt mir immer noch die wichtigste Abfragemöglichkeit, welche Einheit denn nun unterbrochen wurde. Evtl. schaffe ich das noch, wenn ich mir ein Alien mit dem OnGetSpotted schnappe und das ins Target nehme? Aber das ist alles eher Fusch, wie schön. Es fehlt hier eine wichtige Kommunikation zwischen Sourcecode und X-Skript, bzw. habe ich sie noch nicht gefunden. Mir fehlt die Verbindung zwischen unterbrochener Einheit und der(den) unterbrechenden Einheit(en). |
|
verfasst am: 20.01.2010, 00:24
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Habe glaube jetzt die Verbindung hergestellt. Auf den Aliens liegen zusätzliche OnGetSpottedtimer, die eine globale Variable 'gTarget' speisen. Schlägt dann OnRoundBreak zu, kann ich das letzte entdeckte Alien aus 'gTarget' lesen und meine Trooper können auf das reagieren, weshalb sie unterbrochen haben.
Zusätzlich zum TGamefigure.Endround setze ich dann auch noch die übriggebliebenen ZE auf 0, so das der Benutzer dann wirklich nichts mehr in der Alienrunde machen kann, ausser Endturn zu klicken. Fehlt noch Schussmodevorgabe durch den Benutzer und dann müsste das passen und evtl. noch ne IF Sicherheitsklausel, wenn Soldaten in die falsche Richtung gucken, falls ich da noch Fehlermeldungen bekomme.
Probleme gibt es dann nur noch in den Bereichen, wo ich per X-Skript nichts ändern kann. Das Sichtfeld ist nicht identisch mit dem Schussfeld. Hier gibts übrigens auch ein Bug. Stellt euch mal bischen weiter von einem Busch, am besten diagonal (also x und y entfernt) und checkt dann mal die Felder hinter dem Busch mit der Shifttaste ab.
Und die Reaktionsformel selber hatte ich ja schon an anderer Stelle gesagt, finde ich persönlich sehr zum Nachteil für ein gutes taktisches Defensivspiel, wo man sich auch mal trauen kann im Anschlag hinter ner Häuserwand zu warten. |
|
verfasst am: 22.01.2010, 00:34
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
So, meine Skriptlösung ist jetzt glaube fertig. Für die Soldaten wird kein Schussmode mehr durch die KI bestimmt, sondern der Modus genommen, den der Spieler in der Vorrunde eingestellt hat. Fehler habe ich soweit auch keine mehr gefunden. Ich werde jetzt noch im Skript eine Schleife basteln, die diese alternative Reaktionski auf die Aliens im Bodensatz Runde 1 per Skript bindet. Dann braucht ihr nicht eure Aliens manuell auf die alternativen KI´s verbiegen, wenn ihr euch das nur mal anschauen wollt.
Ein Problem fällt mir gerade noch ein, ich benutze ein Flag, um nicht unnötig jede Runde neue Timer zu setzen. Das ist aber global und wird es nicht mitbekommen, wenn im Einsatz danach ein neuer Kampf beginnt. Hier muss ich mein Skript noch irgendwie verklickern, das es jeden Bodenkampf in Runde 1 die alternativen Skripte lädt. |
|
verfasst am: 22.01.2010, 16:33
|
Registrierdatum: 22.08.2008, 15:51
Beiträge: 403
 |
Zitat: Kamor Hier muss ich mein Skript noch irgendwie verklickern, das es jeden Bodenkampf in Runde 1 die alternativen Skripte lädt.
Die meiner Meinung nach einfachste Möglichkeit ist ein eigenes Skript, welches zu Spielbeginn startet und das Event EVENT_ONGROUNDFINISHED abfängt, darin kannst du alles handhaben.
Für den Fall dass, du es noch nicht gefunden hast:
http://doc.xforce-online.de/ger_pages/XSkriptReferenz/KonstantenTEvent ID.html
das ist die Liste der abfangbaren Events. Sind sehr hilfreich wenn man auf eine Besonderheit reagieren will. |
|
verfasst am: 29.01.2010, 17:15 · Edited by: Kamor
|
Registrierdatum: 20.07.2005, 00:01
Beiträge: 203
 |
Jo, habe ich jetzt mit dem EVENT_ONGROUNDFINISHED versucht. Nur zu Spielbegin geht nicht, weil der Event ein Objekt Tground braucht, also habe ich den Event mit Runnigground gekoppelt und starte den Timer dann immer in Runde 1. Der Code sieht jetzt so aus:
// alternative_Reaktion
// in Bodeneinsatz SpielerRunde 1 werden notwendige Initschritte ausgeführt
// um die Wiederholung der Initschritte zu vermeiden wird ein Flag auf true gesetzt
// was erst bei Bodeneinsatzende wieder auf false gesetzt wird
// in der Spielerrunde werden die Soldierskripte deaktiviert
// in der Alienrunde werden die Soldierskripte aktiviert
// das Kernstück der alternativen_Reaktion liegt in den jeweiligen Skripten
// SoldierKI und AlienKI, die derzeit nur eine Kopie der originalen Skripte sind
// und nur um die Procedure ReactTarget erweitert wurden
// TODO: Eine erweiterte Skript An- und Ausschaltlogic, damit auch andere Skripte
// für Spieler oder Aliens aktiv sein können.
// z.b. Panic, Stun oder Friendlyattackskripte
program alternative_Reaktion;
var Flag : Boolean;
procedure Groundfinished(Sender: TObject);
begin
// wenn Bodeneinsatz zuende Flag wieder auf false setzen
Flag := false;
end;
procedure GetSpotted(Sender: TObject);
begin
// game_api_MessageBox('AlienSpotted');
game_api_SetObject('gTarget',Sender);
end;
procedure NewAlienRound(Sender: TObject);
var i : integer;
var Figure : TGameFigure;
begin
// game_api_MessageBox('NewalienRound');
// wenn Alienrunde anfängt ergänzende Soldierskripte aktiveren
if (groundAI_api_GetEnemyAIGroup.EnemyCount)>0 then
begin
for i:=groundAI_api_GetEnemyAIGroup.EnemyCount-1 downto 0 do
begin
Figure := groundAI_api_GetEnemyAIGroup.GetEnemy(i);
Figure.SetAIScript('SoldierKI');
end;
end;
end;
procedure NewPlayerRound(Sender: TObject);
var i : integer;
var Figure : TGameFigure;
var Ground : TGround;
begin
// game_api_MessageBox('NewplayerRound');
// wenn Spielerrunde anfängt Soldierskripte deaktivieren
if (groundAI_api_GetEnemyAIGroup.EnemyCount)>0 then
begin
for i:=groundAI_api_GetEnemyAIGroup.EnemyCount-1 downto 0 do
begin
Figure := groundAI_api_GetEnemyAIGroup.GetEnemy(i);
Figure.SetAIScript('');
end;
end;
// erste Runde Spottedtimer auf Aliens setzen um dadurch das fehlende Target
// für die Reactunterbrechung vorher zu ermitteln und zu speichern
// ausserdem für den runningground den ongroundfinishedevent setzen,
// um das flag später wieder auf false zu setzen.
if (flag=false) then
begin
flag:=true;
Ground := groundAI_api_GetRunningGround;
if (Ground=Nil) then
begin
game_api_MessageBox('Warning: No RunningGround found in Skript alternative Reaction');
end
else
begin
register_event(@Groundfinished,Ground,EVENT_ONGROUNDFINISHED);
end;
if (groundAI_api_GetPlayerAIGroup.EnemyCount)>0 then
begin
for i:=groundAI_api_GetPlayerAIGroup.EnemyCount-1 downto 0 do
begin
Figure := groundAI_api_GetPlayerAIGroup.GetEnemy(i);
register_event(@GetSpotted,Figure,EVENT_FIGURE_GETSPOTTED);
// optionale Einbindung der AlienAISkripte per Skript in der ersten Runde
// kann auch weggelassen werden, wenn die Skripte direkt mit dem Alientypen
// im Skript Studio gebunden sind.
Figure.SetAIScript('AlienKI');
end;
end;
end;
end;
procedure StartMission;
begin
// globale Variable 'gtarget' registrieren
game_api_RegisterObject('gTarget');
Flag := false;
register_special_event(@NewPlayerRound,EVENT_SPECIAL_ONNEWPLAYERROUND) ;
register_special_event(@NewAlienRound,EVENT_SPECIAL_ONNEWALIENROUND);
end;
begin
MissionName:='alternative Reaktion';
MissionType:=mzUser;
end.
Muss ich aber erst noch testen, ob die Änderungen auch praktisch funktionieren. |
|
verfasst am: 01.12.2023, 12:00
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 321785
 |
|
|
verfasst am: 01.02.2024, 18:18
|
Registrierdatum: 22.11.2023, 07:10
Beiträge: 321785
 |
|
Seite: 1 [2] [3] [4] [5] [6] [7] [8] [9] [10] .. [35] [36] >> |
Du musst dich registrieren um auf dieses Thema zu antworten.
|
|



|