Autor |
Mitteilung |
|
verfasst am: 16.07.2009, 10:21
|
Registrierdatum: 22.08.2008, 15:51
Beiträge: 403
 |
Kann man bitte das AlienAI-Default Skript bitte irgendwo Online stellen, dann muss nicht jeder das Rad neu erfinden. |
|
verfasst am: 16.07.2009, 12:19 · Edited by: Natter
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
|
|
verfasst am: 17.07.2009, 10:16
|
Registrierdatum: 22.08.2008, 15:51
Beiträge: 403
 |
Sehr praktisch, Danke! |
|
verfasst am: 06.11.2009, 16:36
|
Registrierdatum: 22.08.2008, 15:51
Beiträge: 403
 |
Ich mach hier mal weiter.
Da sich die AI Skripte sehr schwer überprüfen lassen, brauch ich jemanden, der folgende zwei Punkte mit mir durch denkt:
1) Scharfschütze: Es soll nur auf den Kopf gezielt werden, daher ersetze ich im Default Skript alle brtorso durch brhead.
2) Möglichst viele Verletzten: Wenn ich in FindAndAttackTarget ein Array von allen möglichen Zielen (die ich treffe) anlege und dann per Random Funktion eines Auswähle und das solange wiederhole, wie ich Zeiteinheiten habe, dann habe ich möglichst viele Soldaten verletzt.
Habe ich Denkfehler begangen oder kann ich zu programmieren anfangen? |
|
verfasst am: 06.11.2009, 16:43
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
1) sollte stimmen. Natürlich muss dann die Waffe auch gezielten Schuss erlauben ;)
Was das andere angeht - du musst dann auf jedenfall sicherstellen, dass dein Array mit möglichen Zielen immer aktuell ist. Insbesondere könnten ja einzelne Einheiten aus dem Array nach dem ersten Schuss nicht mehr gültig sein (weil Alien getötet). |
|
verfasst am: 06.11.2009, 16:59
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
 |
Zu 2.: Da der Array ohnehin immer wieder neu erstellt werden muss (zwecks Aktualität/Validität der Ziele), würde ich direkt TAIGroup.GetVisibleEnemy(Random(VisibleEnemyCount)); nehmen. |
|
verfasst am: 06.11.2009, 17:02
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: sujin TAIGroup.GetVisibleEnemy(Random(VisibleEnemyCount));
Das hängt halt von der genauen Zielsetzung ab. Ein sichtbares Ziel muss nicht immer auch ein tatsächliches Ziel sein, z.B. wenn man auch die Reichweite der Waffe beachten will. |
|
verfasst am: 06.11.2009, 17:06
|
Spielsatz Alliances
Registrierdatum: 14.07.2004, 14:47
Beiträge: 1185
 |
Kann man ja in eine repeat-while-Schleife setzen, wenn man z.B. ein Ziel haben will, dass zwischen 5 und 15 Felder entfernt ist. |
|
verfasst am: 07.11.2009, 08:33
|
Registrierdatum: 23.09.2008, 00:25
Beiträge: 67
 |
Dann muss man aber noch aufpassen, dass man keine Endlosschleife bekommt. Könnte ja sein, dass der letzte nahe Alien stirbt und dann würde er ewig die sichtbaren Einheiten durchgehen, da er keine findet, die nahe genug ist. |
|
verfasst am: 07.11.2009, 11:11
|
Registrierdatum: 22.08.2008, 15:51
Beiträge: 403
 |
Das Array muss sowieso jeden Durchlauf neu aufgebaut werden, sonst hab ich irgendwann NullPointerExceptions. Danke fürs mitdenken. |
|
verfasst am: 21.11.2009, 11:51
|
Registrierdatum: 22.08.2008, 15:51
Beiträge: 403
 |
Das Zeug will nicht ganz so wie ich will. Meine Drohne soll möglichst viele verletzen. Dazu hab ich nur in der Funktion FindAndAttackTarget herumgepfuscht (ich bin mir nicht hundertprozentig sicher, wie diese GFAITools funktionieren). Alien kommt auf mich zu, verschießt seine Zeiteinheiten und macht nichts mehr. Was habe ich übersehen?
{
+********************************************************************* **********
* Version 0.1 created by: *
* - Nathanael J?hrmann *
* for: *
* - X-Force Version 0.915a05 *
* Gameset: *
* - skripts.pak (all gamesets) *
********************************************************************** **********
* edited by: *
* - *
* for: *
* - *
********************************************************************** **********
* Description: *
* This AI shall hurt as many soldiers as possible,a high firerate is adviseable*
* Used by the drone because of its high firerate *
* *
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++
}
// Abfrage auf NIL bei Target-Einheit klappt im allgemeinen nicht!!! Auch get?tete Einheiten sind noch im Spiel.
// FindVisibleEnemy liefert aber NIL zur?ck, falls keine Einheit gesehen wird, damit wird, daher ist
// die Abfrage nach diesen Methoden zul?ssig
program AlienAI_default;
uses GFAItools;
const
MinHitChance=80;
var
EnemyFound:Boolean;
AlienFigure:TGameFigure;
procedure FindAndAttackTarget; forward;
procedure LookAround; forward;
procedure OnGetSpotted(Sender: TObject); forward;
procedure OnReachedReservedTU(Sender: TObject); forward;
procedure OnReachedDest(Sender: TObject); forward;
procedure OnSeeUnit(Sender: TOBJECT); forward;
procedure OnRoundBreak(Sender:TObject); forward;
procedure OnNewRound(Sender: TOBJECT); forward;
// LookAround scheint noch nicht richtig zu funktionieren
// habe im Logfile noch keinen Fall gefunden, wo es zu einer Sichtung gef?hrt hat
procedure LookAround;
var
Point:TPoint;
begin
if not(AlienFigure.AIGroup.Target<>NIL) and AlienFigure.CanSeeUnit(AlienFigure.AIGroup.Target) then
begin
if (AlienFigure.SeeCount>0) then
AlienFigure.AIGroup.Target:=AlienFigure.GetNearestVisibleEnemy
else
begin
EnemyFound:=false;
Point:=AlienFigure.GetPosition;
Point.x:=Point.x+1;
AlienFigure.ViewTo(Point);
if (not EnemyFound) then
begin
Point:=AlienFigure.GetPosition;
Point.y:=Point.y+1;
AlienFigure.ViewTo(Point);
end;
if (not EnemyFound) then
begin
Point:=AlienFigure.GetPosition;
Point.x:=Point.x-1;
AlienFigure.ViewTo(Point);
end;
if (not EnemyFound) then
begin
Point:=AlienFigure.GetPosition;
Point.x:=Point.y-1;
AlienFigure.ViewTo(Point);
end;
end;
end;
end;
procedure FindAndAttackTarget;
var
enemies : array of TGameFigure;
target : TGameFigure;
i,l : LongInt;
begin
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('Call FindAttackTarget');
{$ENDIF}
setarraylength(enemies,groundAI_api_GetPlayerAIGroup.EnemyCount);//to avoid size casting, enemies is able to store all enemies
l := 0;//stores the count of used slots in enemies
// 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
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;
// ShotToUnit liefert false, wenn Ziel nicht gesehen wird, daher hier extra pr?fen (calcHitChance ignoriert Sichtkontakt):
//array creation
for i := 0 to groundAI_api_GetPlayerAIGroup.EnemyCount - 1 do begin
target := groundAI_api_GetPlayerAIGroup.GetEnemy(i);
if ((AlienFigure.CalcHitChance(target,brtorso) >= MinHitChance)
and AlienFigure.CanSeeUnit(target)) then begin //find everyone who is in range and visible
enemies[l] := target;
inc(l);
end;
end;
if (l > 0) then begin
AlienFigure.ShootToUnit(enemies[random(l - 1)],brtorso);
if (AlienFigure.AIGroup.Target=Nil) or (AlienFigure.AIGroup.Target.HP<=0) then FindAndAttackTarget; // Falls Ziel get?tet, n?chstes Ziel suchen
end
else
begin
// bei <0 wird automatisch 0 gesetzt
// TimeUnits-10, um sich dem Ziel erstmal nur ein St?ck zu n?hern:
AlienFigure.ReservedTimeUnits:=AlienFigure.TimeUnits-10;
AlienFigure.MoveNextTo(AlienFigure.AIGroup.Target.GetPosition);
end;
end
else
begin
AlienFigure.ReservedTimeUnits:=round(AlienFigure.TimeUnits/2);
// Anmerkung: Durch das st?ndige erneute Aufrufen von MoveToRandomPosition
// sammeln sich die Aliens besonders auf gr??eren Karten tendenziell in der Kartenmitte.
// Will man das vermeiden, muss man ein zuf?lliges Ziel ermitteln, dieses f?r sp?tere Aufrufe
// in einer Variablen speichern, und erst in OnReachedDest ein neues Zufallsziel setzen
AlienFigure.MoveToRandomPosition(0); // 0 bedeutet kein Entfernungslimit
end;
end;
procedure OnGetSpotted(Sender: TObject);
begin
// allwissende AI
if AlienFigure.SeeCount=0 then
begin
LookAround;
if AlienFigure.SeeCount=0 then
begin
AlienFigure.MoveToRandomPosition(0);
end;
end;
end;
// um Endlosschleifen zu vermeiden, sollte mehrfacher Aufruf von OnReachedReservedTU
// ReservedTimeUnits irgendwann auf einen Wert <= 0 setzen (dann wird das Event nicht mehr aufgerufen)
procedure OnReachedReservedTU(Sender: TObject);
begin
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('Call OnReachedReserverTU');
{$ENDIF}
if (AlienFigure.AIGroup.Target<>NIL) and (AlienFigure.ReservedTimeUnits>0) and (AlienFigure.CanSeeUnit(AlienFigure.AIGroup.Target)) then
begin
GFAItools_FindBestShotModeForHitChance(AlienFigure,AlienFigure.AIGroup .Target,MinHitChance);
if (AlienFigure.CalcHitChance(AlienFigure.AIGroup.Target,brtorso)>=MinHit Chance) then
begin
AlienFigure.ReservedTimeUnits:=0;
GFAItools_ShootGroupTargetAsLongAsPossible(AlienFigure);
if (AlienFigure.AIGroup.Target=Nil) then FindAndAttackTarget;
end
else
begin
AlienFigure.ReservedTimeUnits:=AlienFigure.ReservedTimeUnits-10;
AlienFigure.MoveNextTo(AlienFigure.AIGroup.Target.GetPosition);
end;
end
// Ziel aus den Augen verloren
else if (AlienFigure.AIGroup.Target<>NIL) and (AlienFigure.AIGroup.Target.HP>0) and (AlienFigure.ReservedTimeUnits>0) then
begin
AlienFigure.ReservedTimeUnits:=AlienFigure.ReservedTimeUnits-10;
// Hint: Falls man schon neben Ziel steht, aber in falsche Richtung schaut,
// f?hrt dies zu Blick Richtung Ziel
AlienFigure.MoveNextTo(AlienFigure.AIGroup.Target.GetPosition);
end
// kein Ziel oder ReservedTimeUnits=0
else
begin
AlienFigure.ReservedTimeUnits:=0;
LookAround;
end;
end;
procedure OnReachedDest(Sender: TObject);
begin
FindAndAttackTarget;
end;
procedure OnSeeUnit(Sender: TOBJECT);
begin
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('Call OnSeeUnit');
{$ENDIF}
AlienFigure.AIGroup.Target:=AlienFigure.GetNearestVisibleEnemy;
if (AlienFigure.AIGroup.Target<>Nil) then
begin
EnemyFound:=true; // ben?tigt f?r LookAround;
end;
FindAndAttackTarget;
end;
procedure OnRoundBreak(Sender:TObject);
begin
FindAndAttackTarget;
AlienFigure.EndRound;
end;
procedure OnNewRound(Sender: TOBJECT);
begin
// Bodeneinsatz wird immer erst am Ende einer Runde beendet
// damit Aliens nicht unn?tig nach Einsatzende weitermachen,
// hier gegebenenfalls Skript abbrechen (gab ohne Abbruch sogar einige Freezes)
if (AlienFigure.AIGroup.EnemyCount<=0) then
mission_abort;
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('OnNewRound AlienAI_default');
{$ENDIF}
FindAndAttackTarget;
end;
procedure StartMission;
begin
AlienFigure:=TGameFigure(MissionObject);
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('Start AlienAI_default');
{$ENDIF}
register_event(@OnSeeUnit,AlienFigure,EVENT_FIGURE_SEEUNIT);
register_event(@OnRoundBreak,AlienFigure,EVENT_FIGURE_ROUNDBREAK);
register_event(@OnNewRound,AlienFigure,EVENT_FIGURE_NEWROUND);
register_event(@OnGetSpotted,AlienFigure,EVENT_FIGURE_GETSPOTTED);
register_event(@OnReachedDest,AlienFigure,EVENT_FIGURE_ONREACHEDDEST);
register_event(@OnReachedReservedTU,AlienFigure,EVENT_FIGURE_REACHEDRE SERVEDTU);
end;
procedure FinalizeMission;
begin
{$IFDEF DEBUGMODE}
// Game_api_MessageBox('FinilizeMission AlienAI_default');
{$ENDIF}
end;
begin
MissionName:='AlienAI_drone';
MissionType:=mzUser;
end.
|
|
verfasst am: 21.11.2009, 23:31
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: Kreks if ((AlienFigure.CalcHitChance(target,brtorso) >= MinHitChance)
Ich kenne natürlich die Werte im Spielsatz nicht, aber gibt es denn viele mögliche Ziele, die Trefferchance über 80% haben?
Zitat: Kreks if (AlienFigure.CalcHitChance(AlienFigure.AIGroup.Target,brtorso)>=MinHit Chance) then begin AlienFigure.ReservedTimeUnits:=0; GFAItools_ShootGroupTargetAsLongAsPossible(AlienFigure); if (AlienFigure.AIGroup.Target=Nil) then FindAndAttackTarget; end
In ReachedReservedTU wird FindAndAttackTarget garnicht aufgerufen, falls es schon ein gültiges Ziel gibt. Das würde auch erklären, warum das Alien alle Schüsse aufbraucht, denn in deiner Variante wird ja nur einmal pro FindAndAttack geschossen, oder hab ich was übersehen? Ist die Frage, ob es danach überhaupt nochmal zum Aufruf kommt. Eventuell solltest du dir mal ein Logfile erstellen, um nachzuvollierhen, wie dein Skript arbeitet. Ist glaube noch etwas durcheinander (z.B. wird an vielen Stellen das Gruppenziel abgefragt, obwohl du dieses nicht verwendest). |
|
verfasst am: 22.11.2009, 10:42 · Edited by: Kreks
|
Registrierdatum: 22.08.2008, 15:51
Beiträge: 403
 |
Zitat: Natter Ist glaube noch etwas durcheinander (z.B. wird an vielen Stellen das Gruppenziel abgefragt, obwohl du dieses nicht verwendest).
Das ist es ja, ich kenne nicht alle Befehle. Was bewirken diese GFAItools_ Befehle wie zB FindGroupTarget?
Mir ist grad nochwas aufgefallen: Ich hab keine Möglichkeit vom aktuellen Alien die aktuelle Waffe abzufragen, oder? |
|
verfasst am: 22.11.2009, 14:05
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: Kreks Das ist es ja, ich kenne nicht alle Befehle. Was bewirken diese GFAItools_ Befehle wie zB FindGroupTarget?
Schau mal in die GroundAI_default. |
|
verfasst am: 27.11.2009, 05:59
|
Programmierer, allgemeines
Registrierdatum: 06.06.2004, 17:19
Beiträge: 3186
 |
Zitat: Kreks Ich hab keine Möglichkeit vom aktuellen Alien die aktuelle Waffe abzufragen, oder?
Nein. Hängt letztlich mit der Forschungsliste zusammen ^^
Hatte den Zugriff per ID schonmal umgesetzt, aber dann gemerkt, das man in der Itemliste nur Items findet, die schon erforscht oder wenigstens entdeckt sind. Die Alienwaffen gibt es folglich zu Anfang noch garnicht als Item. |
|
verfasst am: 27.01.2022, 13:21
|
Registrierdatum: 27.01.2022, 13:07
Beiträge: 318
 |
|
|
verfasst am: 06.05.2022, 13:10
|
Registrierdatum: 28.02.2022, 13:12
Beiträge: 25
 |
|