Banner left   Banner center   Banner right

Germanenglish Home · News · Diary · Screenshots · Documentation (Wiki) · Downloads · Guestbook · Forum

Home · Benutzer registrieren · Suchen · Statistik · FAQ · Benutzerliste

Zur Zeit online: keiner ausser dir

 X-Force - Fight For Destiny - Forum —› X-Skript / Developer-Pack —› Alien AI-Default

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
You're so thoughtful. https://doulaaustin.com
verfasst am: 06.05.2022, 13:10
Registrierdatum: 28.02.2022, 13:12

 Beiträge: 25
Thankful To You For Sharing Amazing And Unique Content On Your Web Blog. Please also check our website at https://polishedconcretenewcastle.com/



Du musst dich registrieren um auf dieses Thema zu antworten.
Login :: » Name » Passwort

Ladezeit (sec.): 0.006 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003