DATprogram AlienAI; var Log : String; EnemyFound:Boolean; procedure LookAround(GameFigure:TGameFigure); var Point:TPoint; begin EnemyFound:=false; Point:=GameFigure.GetPosition; Point.x:=Point.x+1; GameFigure.ViewTo(Point); if (not EnemyFound) then begin Point:=GameFigure.GetPosition; Point.y:=Point.y+1; GameFigure.ViewTo(Point); end; if (not EnemyFound) then begin Point:=GameFigure.GetPosition; Point.x:=Point.x-1; GameFigure.ViewTo(Point); end; if (not EnemyFound) then begin Point:=GameFigure.GetPosition; Point.x:=Point.y-1; GameFigure.ViewTo(Point); end; end; procedure ReachedReservedTU(Sender: TObject); var GameFigure: TGameFigure; begin GameFigure:=TGameFigure(Sender); GameFigure.ReservedTimeUnits:=0; LookAround(GameFigure); end; procedure NewRound(Sender: TOBJECT); forward; procedure ReachedDest(Sender: TObject); var GameFigure: TGameFigure; begin GameFigure:=TGameFigure(Sender); LookAround(GameFigure); Log:=Log + GameFigure.Name + ': ' + 'RechedDest' + #13#10; Log:= Log + #13#10 + '--------------------------------' + #13#10; end; procedure GETSPOTTED(Sender: TObject); var GameFigure: TGameFigure; begin GameFigure:=TGameFigure(Sender); Log:=Log + GameFigure.Name + ': ' + 'GetSpoted' + #13#10; Log:= Log + #13#10 + '--------------------------------' + #13#10; end; procedure SEEUNIT(Sender: TOBJECT); var AlienFigure:TGameFigure; dummy : Integer; Target:TGameFigure; begin if (Sender=NIL) then mission_win; EnemyFound:=true; //benötigt, damit LookAround funktioniert dummy:=Integer(MissionObject); AlienFigure:=TGameFigure(dummy); Log:=Log + AlienFigure.Name + ': ' + 'SEEUNIT' + #13#10; Target:=AlienFigure.GetSeeUnit(0); if (Target<>Nil) then begin AlienFigure.ReservedTimeUnits:=0; AlienFigure.StopMove; // Schießen in Bewegung führt zu starken Abzügen bei Treffsicherheit (-40 auf Trefferchance) Log:=Log + ' CalcHitChance: ' + IntToStr(AlienFigure.CalcHitChance(Target)) + #13#10; if (AlienFigure.CalcHitChance(Target)>=50) then begin for dummy:=0 to 1000 do begin if AlienFigure.ShootToUnit(Target) then begin Log:=Log + ' ShootToUnit' + #13#10; end else break; end; end else begin AlienFigure.MoveNextTo(Target.GetPosition); Log:=Log + ' MoveNextTo(Target.GetPosition)' + #13#10; end; Log:= Log + #13#10 + '--------------------------------' + #13#10; end; end; procedure NewRound(Sender: TOBJECT); var AlienFigure:TGameFigure; Target:TGameFigure; dummy : Integer; begin if (Sender=NIL) then mission_win; dummy:=Integer(MissionObject); AlienFigure:=TGameFigure(dummy); Log:=Log + AlienFigure.Name + ': ' + 'NewRound' + #13#10; Target:=AlienFigure.GetSeeUnit(0); if (Target<>Nil) then begin AlienFigure.ReservedTimeUnits:=0; AlienFigure.StopMove; // Schießen in Bewegung führt zu starken Abzügen bei Treffsicherheit (-40 auf Trefferchance) Log:=Log + ' CalcHitChance: ' + IntToStr(AlienFigure.CalcHitChance(Target)) + #13#10; if (AlienFigure.CalcHitChance(Target)>=50) then begin for dummy:=0 to 1000 do begin if AlienFigure.ShootToUnit(Target) then begin Log:=Log + ' ShootToUnit' + #13#10; end else break; end; end else begin AlienFigure.MoveNextTo(Target.GetPosition); Log:=Log + ' MoveNextTo(Target.GetPosition)' + #13#10; end; end else begin AlienFigure.ReservedTimeUnits:=round(AlienFigure.MaxTimeUnits/2); AlienFigure.MoveToRandomPosition(0); // 0 bedeutet kein Entfernungslimit end; AlienFigure.EndRound; Log:= Log + 'EndRound' + #13#10; Log:= Log + #13#10 + '--------------------------------' + #13#10; end; procedure ROUNDBREAK(Sender:TObject); var AlienFigure:TGameFigure; dummy : Integer; Target:TGameFigure; begin if (Sender=NIL) then mission_win; dummy:=Integer(MissionObject); AlienFigure:=TGameFigure(dummy); Log:=Log + AlienFigure.Name + ': ' + 'NewRound' + #13#10; Target:=AlienFigure.GetSeeUnit(0); if (Target<>Nil) then begin AlienFigure.ReservedTimeUnits:=0; AlienFigure.StopMove; // Schießen in Bewegung führt zu starken Abzügen bei Treffsicherheit (-40 auf Trefferchance) AlienFigure.ShootToUnit(Target); Log:=Log + ' ShootToUnit' + #13#10; end; AlienFigure.EndRound; Log:= Log + 'EndRound' + #13#10; Log:= Log + #13#10 + '--------------------------------' + #13#10; end; procedure StartMission; var AlienFigure:TGameFigure; begin AlienFigure:=TGameFigure(MissionObject); Log:=AlienFigure.Name + #13#10 + 'MaxTimeUnits: ' + IntToStr(AlienFigure.MaxTimeUnits) + #13#10 + 'TimeUnits: ' + IntToStr(AlienFigure.TimeUnits) + #13#10; register_event(@NewRound,AlienFigure,EVENT_FIGURE_NEWROUND); register_event(@SEEUNIT,AlienFigure,EVENT_FIGURE_SEEUNIT); register_event(@ROUNDBREAK,AlienFigure,EVENT_FIGURE_ROUNDBREAK); register_event(@GETSPOTTED,AlienFigure,EVENT_FIGURE_GETSPOTTED); register_event(@ReachedDest,AlienFigure,EVENT_FIGURE_ONREACHEDDEST); register_event(@ReachedReservedTU,AlienFigure,EVENT_FIGURE_REACHEDRESERVEDTU); end; procedure ONMISSIONWIN; begin game_api_GenerateScriptedTextFile(Log+#13#10+ '------------------' + #13#10+'MissionWin'); end; begin MissionName:='AlienAI'; MissionType:=mzUser; end. // ******************************************************* // GEN general skript functions: Global Variables // // Skriptname: GEN01globalv // X-Force-Version: 0.915 // Skripter: Dirk Feldermann (xforce@avarion.de) // ******************************************************* // Skriptfunktion: // Stellt verschiedene Skripte zur vereinfachten Verwendung globaler Variablen bereit // // ******************************************************* unit GEN01globalv; // Zählt die namentlich angegebene globale Variable mit jedem Aufruf um +1 weiter // und gibt das Ergebnis zurück. Existiert die Variable nicht, dann wird sie angelegt function GEN01counter(name:string):integer; begin if game_api_CheckGlobalVar('GEN01'+name)=gvtNotDefined then begin game_api_registerInteger('GEN01'+name); game_api_setinteger('GEN01'+name,0); end; result:=1+game_api_getInteger('GEN01'+name); game_api_setInteger('GEN01'+name,result); end; // Listet die Namen aller globalen Variablen auf procedure GEN01ShowAllGVs; var Vars: TStringArray; Dummy : Integer; Text : String; begin game_api_GetGlobalVars(Vars); Text:=''; for Dummy:=0 to getarraylength(Vars)-1 do Text:=Format('%s%d. %s'#13#10,[Text,Dummy+1,Vars[Dummy]]); savegame_api_Message(Text,lmMissionMessage,NIL); end; end. // ******************************************************* // GEN general skript functions: String-Oberationen // // Skriptname: GEN02string // X-Force-Version: 0.915 // Skripter: Dirk Feldermann (xforce@avarion.de) // ******************************************************* // Skriptfunktion: // Verschiedene Funktionen zur besseren Bearbeitung von // Usertag-Daten. // Vorraussetzung: Semikolon ; ist Standarttrenner // // ******************************************************* unit GEN02string; function GEN02getsegment(text:string; segment:Integer):String; var DS:TStringArray; begin DS:=string_utils_explode(';',text); result:=DS[segment-1]; end; function GEN02getpart(text:string; trenner:string; segment:Integer):String; var DS:TStringArray; begin DS:=string_utils_explode(trenner,text); result:=DS[segment-1]; end; function GEN02containsstring(seek:string; intarget:string):boolean; var dummy, count1, count2: Integer; begin result:=false; if (seek=intarget) then begin result:=true; exit; end; count1:=length(seek); count2:=length(intarget); if (count1=0) then begin result:=true; exit; end; if (count1>=count2) then exit; for dummy:=1 to count2-count1 do begin if (seek=copy(intarget,dummy,count1)) then result:=true; end; end; end. // ******************************************************* // GEN general skript functions: Usercall-Events // // Skriptname: GEN03usercall // X-Force-Version: 0.915 // Skripter: Dirk Feldermann (xforce@avarion.de) // ******************************************************* // Skriptfunktion: // Stellt verschiedene Skripte zur Kontrolle und Bearbeitung der Userevents bereit // Es werden auch einige Konstanten definiert, um die Verwendung der Userevents bei // mehreren Einsatzgebieten zu unterscheiden. // // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // ! W I C H T I G ! // ! ! // ! Jedes Skript das diese Unit einbindet muss einmal ! // ! den Befehl GEN03init zu Beginn der StartMission ! // ! aufrufen (keine Sorge, Doppelaufrufe sind möglich) ! // ! ! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // // ******************************************************* unit GEN03usercall; var GEN03EData:TDataHolder; const // Event-Code Konstanten: Zur Zieldefinition noEVENT = 0; // Keine Funktion sollte hier reagieren - kann zur Initialisierung genutzt werden. TechEvent = 1; RaceEvent = 2; GroundEvent = 3; StoryEvent = 4; AlienTL =5; DailyEvent = 10; CheatEvent = 90; // Spielsatzbezogene Events sollten Codeziffern ab 100 erhalten // interne Daten für Event-Speicherung // Speichername für die Adresse des DataHolders GEN03globdata = 'GEN03EventControl'; // Usercall-Daten GEN03Ecode = 'GEN03EventCode'; // Name der Speicherzelle für die Art des Events (Integer) GEN03EInteger = 'GEN03EventInteger'; // Name der Speicherzelle für den ersten Integer-Datenwert GEN03Edouble = 'GEN03EventDouble'; // Name der Speicherzelle für einen Fließkomme-Datenwert GEN03Estring = 'GEN03EventString'; // Name der Speicherzelle für einen String-Datenwert // Überprüfe ob das Event den angegebenen Daten (code und text) entspricht function GEN03checktarget(event:integer; target:String):Boolean; var temp,count: integer; tempstr: string; strtrue: boolean; begin result:=false; strtrue:=false; temp:=game_api_GetInteger(GEN03globdata); GEN03EData:=TDataHolder(temp); tempstr:=GEN03EData.GetString(GEN03Estring); temp:=length(tempstr); if (temp=0) then strtrue:=true; if (temp=1) then begin for count:=1 to temp do if (tempstr[count]=target) then strtrue:=true; end else begin if (tempstr=target) then strtrue:=true; end; temp:=GEN03EData.GetInteger(GEN03Ecode); if (temp=event) AND (strtrue) then result:=true; end; // Überprüfe ob das Event das gewünschte ist (nur code) function GEN03checkEvent(event:integer):Boolean; var temp: integer; begin result:=false; temp:=game_api_GetInteger(GEN03globdata); GEN03EData:=TDataHolder(temp); temp:=GEN03EData.GetInteger(GEN03Ecode); if (temp=event) then result:=true; end; // Erzeuge ein Userevent mit den übergebenen Daten procedure GEN03sendcall(event:Integer;data1:Integer;fdata:double;text:string); var temp: integer; begin temp:=game_api_GetInteger(GEN03globdata); GEN03EData:=TDataHolder(temp); GEN03EData.SetInteger(GEN03Ecode,event); GEN03EData.SetInteger(GEN03Einteger,data1); GEN03EData.SetDouble(GEN03Edouble,fdata); GEN03EData.SetString(GEN03Estring,text); register_calluserspecialevent; end; function GEN03getInteger:Integer; var temp: integer; begin temp:=game_api_GetInteger(GEN03globdata); GEN03EData:=TDataHolder(temp); result:=GEN03EData.GetInteger(GEN03EInteger); end; function GEN03getDouble:Double; var temp: integer; begin temp:=game_api_GetInteger(GEN03globdata); GEN03EData:=TDataHolder(temp); result:=GEN03EData.GetDouble(GEN03Edouble); end; function GEN03getText:String; var temp: integer; begin temp:=game_api_GetInteger(GEN03globdata); GEN03EData:=TDataHolder(temp); result:=GEN03EData.GetString(GEN03Estring); end; // Initialisiere den DataHolder procedure GEN03init; var temp:Integer; begin if game_api_CheckGlobalVar(GEN03globdata)=gvtNotDefined then begin GEN03EData:=TDataHolder.Create; GEN03EData.RegisterInteger(GEN03Ecode); GEN03EData.RegisterInteger(GEN03Einteger); GEN03EData.RegisterDouble(GEN03Edouble); GEN03EData.RegisterString(GEN03Estring); temp:=integer(GEN03EData); game_api_registerInteger(GEN03globdata); game_api_setinteger(GEN03globdata,temp); end; end; end. // ******************************************************* // GEN general skript functions: Geoscape // // Skriptname: GEN20geo // X-Force-Version: 0.915 // Skripter: Dirk Feldermann (xforce@avarion.de) // ******************************************************* // Skriptfunktion: // Sammlung von Standartfunktionen für Berechnungen im Geoscape // // Befehlsbeschreibung: // function PositionNear(pos:TFloatPoint; Radius:Integer):TFloatPoint; // Gibt eine Zufallsposition im Umkreis von Radius um pos zurück. // // function nearestBase(pos:TFloatPoint):TBasis; // Ergibt die zur Position nächstgelegenen XForce-Basis. // // ******************************************************* unit GEN20geo; // Ermittelt eine Zufallsposition im Umkreis um die angegebene Position function GEN20PositionNear(posit:TFloatPoint; radius:integer):TFloatPoint; var dist:Integer; direc:Integer; dummyp:TFloatPoint; begin direc:=random(360); if (radius<1) then radius:=1; dist:=random(radius)+1; dummyp.y:=abs(posit.y+dist*sin(direc)); // Kleinere Ergebnisse als Südpol inklusive direkter Umgebung des Südpols verhindern if (dummyp.y<3) then dummyp.y:=6-dummyp.y; // Größere Ergebnisse als Nordpol inklusive direkter Umgebung des Norpols verhindern if dummyp.y>177 then dummyp.y:=354-dummyp.y; dummyp.x:=360+posit.x+dist*cos(direc); while dummyp.x>360 do dummyp.x:=dummyp.x-360; // alle vielfachen von 360 (=1x um die Erde) werden entfernt result:=dummyp; end; // Gibt einen gültigen FlyToPoint heraus für den Fall, das man nicht identische Zielpunkte sucht. // Dieser Punkt darf nicht identisch sein mit der eigenen Position, deshalb eine Prüfung... function GEN20EscortPoint(start:TFloatPoint;target:TFloatPoint;range:Integer):TFloatpoint; var dummyp:Tfloatpoint; begin dummyp:=start; while (start.x=dummyp.x) do dummyp:=GEN20PositionNear(target,range); result:=dummyp; end; // Ermittelt die nächstgelegene Basis function GEN20nearestBase(pos:tfloatpoint):TBase; var lrange:Integer; dummy:Integer; dummybase:TBase; begin lrange:=50000; // unmöglich hoher Startwert zur Initialisierung for dummy:=0 to base_api_GetBaseCount-1 do begin dummybase:=base_api_GetBaseByIndex(dummy); if (earth_api_Distance(pos,dummybase.Position)min zu allen XF-Basen (land ja/nein) // z.B. damit ein UFO nicht im Schussfeld einer Basis auftaucht function GEN20randomPointfaraway(min:Integer; land:Boolean):TFloatPoint; var dummybase:TBase; dummypoint:TFloatPoint; minrange:Integer; begin minrange:=0; while (minrange177 then point.y:=354-point.y; while point.x>360 do point.x:=point.x-360; // alle vielfachen von 360 (=1x um die Erde) werden entfernt result:=GEN20PositionNear(Point,2); end; end. // ******************************************************* // GEN general skript functions: Pfadauswahl // // Skriptname: GEN90path // X-Force-Version: 0.915 // Skripter: Dirk Feldermann (xforce@avarion.de) // ******************************************************* // Skriptfunktion: // Auswahl eines Pfades für ein Geoscape-Fahrzeug // // Befehlsbeschreibung: // function earth_api_getpath(code:string):string; // Ermittelt eine zum erhaltenen Code passenden Pfad // // Muss noch Sicherheitsabfragen erhalten für Special-Code-Fälle // Namensgebung ist gewählt, um den Befehl später einfach durch einen Delphi-Zugriff // auf eine Resourcendatei ersetzen zu können. // (Ich rechne damit das es später einmal viele Dutzend Pfade geben dürfte) // // ******************************************************* unit GEN90path; const // Die folgende Konstante speichert alle absoluten Pfade für UFO-Bewegungen. // Jede Zeile entspricht einem neuen Pfad mit einer beliebigen Anzahl von Wegpunkten. // Jeder Wegpunkt besteht aus zwei mit Komma getrennten Integer-Koordinaten im Koordinatensystem von XForce // Es wird keine Bruchzahlen hier geben, da über den Punkten sowieso ein Zufallsgenerator läuft. // Die Wegepunkte werden voneinander durch Semikolons getrennt. UKI_BBpA = 'RW01,O2;0,0;10,3;20,9;30,5;40,1;50,-2;60,-8;70,-4;80,0;90,-3;100,4;110,10;120,8;130,6;140,2;150,6;160,-1;170,-5;180,-8;190,-10;200,-6;210,-4;220,-1;230,0;240,3;250,9;260,-8;270,-5;280,-2;290,1;300,4;310,7;320,10;330,6;340,2;350,-2' + 'ZRW02,O2;1,0;1,2;-2,2;-4,-1;-1,-5;5,-3;6,4;-2,8;-9,2;-6,-8;5,-10;12,1;4,12;-10,10;-14,-6;0,-16;15,-7;14,12;-5,18;20,0' + 'ZRW03,O2;2,0;5,8;10,16;15,32;20,64;25,96;30,128;35,150;40,182;45,214;50,246;55,278;60,246;65,214;70,182' + 'ZRW04,O2;10,2;30,4;50,6;70,8;90,10;110,12;130,14;150,16;170,18;190,17;210,15;230,13;250,11;270,9;290,7;310,5;330,3;350,2' //Äquatorflug + 'ZRW05,O2;10,20;30,40;50,60;70,80;90,100;110,120;130,140;150,160;170,180;190,170;210,150;230,130;250,110;270,90;290,70;310,50;330,30;350,20' //Schrägflug + 'ZRW06,O2;0,0;10,10;30,30;50,50;70,70;90,90;70,70;50,50;30,30;10,10' // '<' Kleiner-als Zeichen Flug + 'ZRW07,O2;0,0;10,10;30,30;50,50;70,70;90,90;70,-70;50,-50;30,-30;10,-10' // '<>' Raute-Kurs + 'ZRW08,O2;0,0;20,5;40,10;60,30;80,70;70,80;50,70;30,60;10,30' // '()' Fast O-Krus, hat noch ein paar Zick-zacks drin(evtl. wegen Zufallszahlen) + 'ZRW09,O2;5,5;10,2;20,1;30,0;40,1;50,5;60,20;70,50;80,70;75,80;70,90;60,88;50,85;40,60;30,50;10,40' // Wassertropfenkurs mit Spizte zu den Polen + 'ZRW10,O2;140,140;150,130;170,120;180,115;190,120;200,150;190,170;180,180;170,175;160,170;150,155;' + '9,19;-15,16;-22,-7;-3,-24;22,-13;21,15;-5,26;-27,6;-17,-23;14,-24;27,2;8,25;-18,17;-22,-9;-1,-23;20,-9;16,14;-6,19;19,0;7,16;' + '-11,13;-15,-5;-2,-15;12,-7;11,8;-2,12;-11,2;-6,-8;4,-8;8,1;2,7;-4,4;-5,-2;0,-4;3,-1;2,1;0,1' + 'ZRW11,O2;0,0;5,10;20,17;30,20;40,33;45,45;50,55;60,70;65,90;71,100;57,112;52,123;44,144;39,153;32,167;25,175;30,181;37,189;50,190;63,182;71,176;67,155;43,141;30,118;20,94;10,85;-1,73;-14,59;-26,42;-12,38;-7,19;-3,8' // 8ter Kurs, mit 32 Wegpunkten + 'ZRW12,O2;0,0;21,23;44,47;65,74;90,83;105,77;111,45;95,27;75,33;63,48;79,65;93,78;120,91;113,117;85,123;64,98;51,78;34,56;22,45;8,19' // Schnörkel-Kurs 20 Wegpunkte + 'ZRW13,O2;0,0;10,22;30,33;45,45;46,63;44,79;40,90;26,102;19,117;21,124;30,130;45,147;60,165;90,178;130,130;145,115;163,90;139,75;126,46;133,33;114,27;93,15;45,0;23,-10' // M-Kurs 24 Wegpunkte + 'ZRW14,O2;150,0;155,10;170,17;180,20;190,33;195,45;200,55;210,70;215,90;211,100;207,112;202,123;194,144;189,153;182,167;175,175;180,180;187,189;200,190;213,182;213,182;221,176;217,155;193,141;180,118;170,94;160,85;149,73;136,59;124,42;138,38;143,19;147,8' //'&-Kurs + 'ZRW15,O2;50,0;55,10;70,17;80,20;90,33;95,45;100,55;110,70;115,90;111,100;107,112;102,123;94,144;89,153;82,167;75,175;80,180;87,189;200,90;213,182;113,182;121,176;117,155;93,141;80,118;70,94;60,85;49,73;36,59;24,42;38,38;43,19;47,8' + 'ZRW16,O2;0,0;10,3;20,9;30,5;40,1;50,-2;60,-8;70,-4;80,0;90,-3;100,4;110,10;120,8;130,6;140,2;150,6;160,-1;170,-5;180,-8;190,-10;200,-6;210,-4;220,-1;230,0;240,3;250,9;260,-8;270,-5;280,-2;290,1;300,4;310,7;320,10;330,6;340,2;350,-2'; function earth_api_getpath(code:string):string; var DS:TStringArray; select:TStringArray; dummy:Integer; clen,alen:Integer; test:String; begin DS:=string_utils_explode('Z',UKI_BBpA); clen:=length(code); alen:=getarraylength(DS); if (clen>0) then for dummy:=0 to alen-1 do begin test:=DS[dummy]; setlength(test,clen); if (test=code) then string_utils_AddString(select, DS[dummy]); end; alen:=getarraylength(select); if (alen=0) then select:=DS; alen:=getarraylength(select); dummy:=random(alen); result:=select[dummy]; end; end. // ******************************************************* // GEN general skript functions: Tester/Cheater-Funktionen // // Skriptname: GEN99test // X-Force-Version: 0.915 // Skripter: Dirk Feldermann (xforce@avarion.de) // ******************************************************* // Skriptfunktion: // Stellt verschiedene Skripte zur Datenabfrage und Datenmanipulation // zur Verfügung. Vorgesehen für Testspielsätze // // ******************************************************* unit GEN99test; // Listet die Namen aller globalen Variablen auf procedure GEN99ShowAllGVs; var Vars: TStringArray; Dummy : Integer; Text : String; begin game_api_GetGlobalVars(Vars); Text:=''; for Dummy:=0 to getarraylength(Vars)-1 do Text:=Format('%s%d. %s'#13#10,[Text,Dummy+1,Vars[Dummy]]); savegame_api_Message(Text,lmMissionMessage,NIL); end; end. program SoldierAI; var Log : String; procedure OnDestroy(Sender: TObject); var GameFigure: TGameFigure; begin GameFigure:=TGameFigure(Sender); Log:=Log + GameFigure.Name + ': ' + 'OnDestroy' + #13#10; mission_win; end; procedure NextRound(Sender: TObject); var GameFigure: TGameFigure; begin GameFigure:=TGameFigure(Sender); GameFigure.EndRound; Log:=Log + GameFigure.Name + ': ' + 'NewRound' + #13#10; end; procedure SEEUNIT(Sender: TOBJECT); var SoldierFigure:TGameFigure; dummy : Integer; Target:TGameFigure; begin if (Sender=NIL) then mission_win; dummy:=Integer(MissionObject); SoldierFigure:=TGameFigure(dummy); Log:=Log + SoldierFigure.Name + ': ' + 'SEEUNIT' + #13#10; SoldierFigure.StopMove; end; procedure StartMission; var SoldierFigure:TGameFigure; dummy : Integer; begin dummy:=Integer(MissionObject); SoldierFigure:=TGameFigure(dummy); Log:=SoldierFigure.Name + #13#10; register_event(@SEEUNIT,SoldierFigure,EVENT_FIGURE_SEEUNIT); register_event(@NextRound,SoldierFigure,EVENT_FIGURE_NEWROUND); register_event(@OnDestroy,SoldierFigure,EVENT_FIGURE_ONDESTROY); end; procedure ONMISSIONWIN; begin game_api_GenerateScriptedTextFile(Log+#13#10+ '------------------' + #13#10+'MissionWin'); end; begin MissionName:='SoldierAI'; MissionType:=mzUser; end. // ************************************************ // UFO-AI-Skript: armed Scout // // Skriptname: UFOAI_armedscout // X-Force-Version: 0.912 // Skripter: Dirk Feldermann (xforce@avarion.de) // ************************************************ // Funktion: Skript für Alien-Fahrzeuge // Fliegt den gewählten (meist zufälligen) Kurs über die Erde // Geortete Flugzeuge werden angegriffen solange UFO >50% Hitpoints hat. // Fluchtkurse zur Reparatur, wenn weniger als 50% Hitpoints // Vor Basen wird immer geflohen // // ************************************************ program UFOAI_armedscout; uses GEN90path, GEN20geo; const KIrandomsearch = 0; // Normalfall, sucht Gegner KIrandomflight = 1; // Beschädigt, weicht Gegnern aus KIhunttarget = 2; // Auf der Jagd nach Flugzeugen var UFO:TUFO; path:String; Startpoint:TFloatpoint; pathcounter:Integer; function critical(UFO:TUFO):boolean; begin result:=false; if (UFO.HitPoints50% Hitpoints hat. // Fluchtkurse zur Reparatur, wenn weniger als 50% Hitpoints // Wird das UFO während einer Flugzeugverfolgung in eine Basisverteidigung gelockt, // dann wird auf die Basis als Ziel gewechselt. // Ansonsten (und auch wenn die Basistreffer das UFO über 50% beschädigen) // flieht der fighter vor den bewaffneten Basen. // // ************************************************ program UFOAI_fighter; uses GEN90path, GEN20geo; const KIrandomsearch = 0; // Normalfall, sucht Gegner KIrandomflight = 1; // Beschädigt, weicht Gegnern aus KIhunttarget = 2; // Auf der Jagd nach Flugzeugen KIhuntbase = 3; // Wenn UFO während der Jagd in eine Basisverteidigung gelockt wurde var UFO:TUFO; path:String; Startpoint:TFloatpoint; pathcounter:Integer; function critical(UFO:TUFO):boolean; begin result:=false; if (UFO.HitPoints