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 —› Transporter Skript

Autor Mitteilung
verfasst am: 30.06.2009, 12:31 · Edited by: BlackBetty
Registrierdatum: 27.06.2007, 12:16

 Beiträge: 658
Habe soeben ein Skript programmiert, das zufällige Transporter zeitverzögert auf dem Geoscape erstellt.

Wird ein Transporter abgeschossen, so sinkt das Vertrauen des Landes, von dem er stammt (Ursprungsland d. Flugzeugs ist im Namen vorhanden). Erreicht ein Transporter sein Ziel, ohne zerstört zu werden, so wächst das Vertrauen des Landes und das Budget wird leicht erhöht.

Das Programm ist so eingestellt, dass es sich bei Erstellung von 3-7 Transporter selbst beendet (Warum? Weil das Script beim Testen xForce anscheinend etwas verlangsamt - kann aber auch an meinem Spielsatz liegen). Wenn man also mehrere Transporter haben möchte, im Skript einfach die Variable k erhöhen.

Außerdem erzeugt es einen Button auf dem Geoscape, der bei Aufruf die derzeit aktiven Transporter in einer ItemBox anzeigt. Habe vergeblich versucht, auch dessen Flugziele darin anzuzeigen, hat aber nicht so geklappt... naja, besser als nix. ;)

Bevor man sich das Skript kopiert sollte es besser von den Profis hier inspiziert werden. ;)

program Transporter;

var
Country:TCountry;
Country2:TCountry;
Conf:LongInt;//Vertrauen
f:LongInt;   //Countryindex
g:LongInt;   //Countryindex2
j:LongInt;   //Zählervariable. Skriptbeendung
k:LongInt;
count:LongInt; //Anzahl der Flugzeuge
Timer:TTimerEvent;
Transporter:TAircraft;
Aircrafts:TStringlist;



procedure QuitProcedure;
begin
  Aircrafts.Clear;
  tactic_api_removeButton('Button');
  Timer.Repeated:=false;
  mission_abort;
end;


procedure ButtonPress(SENDER:TOBJECT);
begin
  game_api_ChooseItemBox('Aktive Flugzeuge',Aircrafts);
end;


procedure ReachDest(Sender: TObject);
begin
 Conf:=country_api_GetConfidenceByIndex(Country.Index)+2;
 country_api_changeConfidenceAbs(f,Conf);
 Aircrafts.Delete(count);
 country_api_ChangeBudget(f,50);
end;


procedure Shootdown(TSENDER:TOBJECT);
begin
 Conf:=country_api_GetConfidenceByIndex(Country.Index)-15;
 country_api_changeConfidenceAbs(f,Conf);
 Aircrafts.Delete(count);
end;


procedure StartTransport(TSENDER:TOBJECT);
var
  Float:TFloatPoint;
  Float2:TFloatPoint;

begin

  //Prozedur soll so lange ausgeführt werden, bis gewisse Anzahl
  //von Transporter erstellt wurde und alle Transporter auf dem
  //Geoscape verschwunden sind (leere Liste)
  //Dabei wird j bei jedem Aufruf via Timer um 1 erhöht, wirkt also
  //wie eine verzögerte Schleife
  j:=j+1;
     if (j>k) then
     begin
       if (getarraylength(Aircrafts)<0) then
       QuitProcedure;
     end;


  count:=0-1;
      //Zwei Punkte berechnen für Start und Ende des Flugs
  Float:=earth_api_RandomPoint(true);
  f:=country_api_CountryIndexOverPos(Float);
  Country:=country_api_getCountryByIndex(f);

  Float2:=earth_api_RandomPoint(true);
  g:=country_api_CountryIndexOverPos(Float);
  Country2:=country_api_getCountryByIndex(g);

   //While verhindert, dass Punkte zu nahe beieinander liegen
   while earth_api_Distance(Float,Float2)<random(4)+3 do
    begin
     Float2:=earth_api_RandomPoint(true);
    end;


  Transporter:=aircraft_api_DoAlphatronTransport(Float,Float2,(random(12 00)+300));
  Transporter.Name:=Transporter.Name+' '+inttostr(random(45)+10)+' ['+Country.Name+']';
  Aircrafts.Add(Transporter.Name);
  count:=count+1;
  register_event(@ShootDown,Transporter,EVENT_ONAIRCRAFTSHOOTDOWN);
   register_event(@ReachDest,Transporter,EVENT_ONAIRCRAFTREACHEDDEST);
end;


procedure StartMission;
begin
  k:=random(3)+4; //zufällige Maximalanzahl d. Transporter
  j:=0;
  count:=0-1;
  Timer:=register_timed_event(@StartTransport,nil,+120);
//120Minuten zwischen jeden Transporter
  Timer.Repeated:=true;
  Aircrafts:=TStringList.Create;
  tactic_api_AddButton('Button','Aktive Flugzeuge' ,@ButtonPress);
end;

begin
  MissionName:='Transporter';
  MissionType:=mzUser;
end.
Wer das Script kopiert, sollte den Abstand bei
...=aircraft_api_DoAlphatronTransport(Float,Float2,(random(1200)+300))   ;

löschen. (wer das Ding im Editor einfügt wird wissen, was ich meine)
verfasst am: 30.06.2009, 13:43
Registrierdatum: 08.12.2008, 13:10

 Beiträge: 73
starten die von Städten, oder werden die IRGENDWO (auch im Wasser) einfach gespottet?

vllt könntest du ja noch etwas einfügen, daß man vorher Bescheid bekommt. Algerien plant einen Transporterstart, oder sowas.

LG
verfasst am: 30.06.2009, 16:26
Registrierdatum: 27.06.2007, 12:16

 Beiträge: 658
ACHTUNG: habe in dem Skript einen Fehler entdeckt. Es funktioniert nicht so, wie es sollte. (ist zwar nur ein logischer Fehler, man kann es immer noch benutzen. Die Whileschleife erfüllt ihren Zweck nicht.)

@ScheF
Ich habe das Skript so programmiert, dass die Transporter immer auf dem Land starten. Im Skript, das ich posten werde habe ich es so gemacht, dass sie zu einer beliebigen Stadt im Geoscape fliegen. Eine entsprechende Meldung habe ich auch nachträglich eingefügt.

Hier das neue verbesserte Skript:

program Transporter;

var
Country:TCountry;
Country2:TCountry;
Conf:LongInt;//Vertrauen
f:LongInt;   //Countryindex
g:LongInt;   //Countryindex2
j:LongInt;   //Zählervariable. Skriptbeendung
k:LongInt;
count:LongInt; //Anzahl der Flugzeuge
Timer:TTimerEvent;
Transporter:TAircraft;
Aircrafts:TStringlist;
Town:TTown;



procedure QuitProcedure;
begin
  Aircrafts.Clear;
  tactic_api_removeButton('Button');
  Timer.Repeated:=false;
  mission_abort;
end;


procedure ButtonPress(SENDER:TOBJECT);
begin
  game_api_ChooseItemBox('Aktive Flugzeuge',Aircrafts);
end;


procedure ReachDest(Sender: TObject);
begin
 Conf:=country_api_GetConfidenceByIndex(Country.Index)+2;
 country_api_changeConfidenceAbs(f,Conf);
 Aircrafts.Delete(count);
 country_api_ChangeBudget(f,50);
end;


procedure Shootdown(TSENDER:TOBJECT);
begin
 Conf:=country_api_GetConfidenceByIndex(Country.Index)-15;
 country_api_changeConfidenceAbs(f,Conf);
 Aircrafts.Delete(count);
end;


procedure StartTransport(TSENDER:TOBJECT);
var
  Float:TFloatPoint;
  Float2:TFloatPoint;

begin

  //Prozedur soll so lange ausgeführt werden, bis gewisse Anzahl
  //von Transporter erstellt wurde und alle Transporter auf dem
  //Geoscape verschwunden sind (leere Liste)
  //Dabei wird j bei jedem Aufruf via Timer um 1 erhöht, wirkt also
  //wie eine verzögerte Schleife
  j:=j+1;
     if (j>k) then
     begin
       if (getarraylength(Aircrafts)<0) then
       QuitProcedure;
     end;


  count:=0-1;
      //Zwei Punkte berechnen für Start und Ende des Flugs
  Float:=earth_api_RandomPoint(true);
  f:=country_api_CountryIndexOverPos(Float);
  Country:=country_api_getCountryByIndex(f);


  Float2:=earth_api_RandomPoint(true);
  g:=random(country_api_GetCountryCount);
  Country2:=country_api_getCountryByIndex(g);
  Town:=country_api_GetRandomTown(g);



  Transporter:=aircraft_api_DoAlphatronTransport(Float,Town.Position,(ra ndom(1200)+300));
  Transporter.Name:=Transporter.Name+' '+inttostr(random(45)+10)+' ['+Country.Name+']';
  Aircrafts.Add(Transporter.Name);
  game_api_messageBox('Objekt "'+Transporter.Name
  +'" wurde von unseren Sensoren auf dem Weg nach '+Town.Name+' ['+Country2.Name+'] '
  +' registriert.');
  count:=count+1;
  register_event(@ShootDown,Transporter,EVENT_ONAIRCRAFTSHOOTDOWN);
  register_event(@ReachDest,Transporter,EVENT_ONAIRCRAFTREACHEDDEST);
   

end;


procedure StartMission;
begin
  k:=random(3)+4; //zufällige Maximalanzahl d. Transporter
  j:=0;
  count:=0-1;
  Timer:=register_timed_event(@StartTransport,nil,+120);
//120Minuten zwischen jeden Transporter
  Timer.Repeated:=true;
  Aircrafts:=TStringList.Create;
  tactic_api_AddButton('Button','Aktive Flugzeuge' ,@ButtonPress);
end;

begin
  MissionName:='Transporter';
  MissionType:=mzUser;
end.
verfasst am: 01.07.2009, 03:06
Grafiker

Registrierdatum: 24.11.2006, 14:22

 Beiträge: 568
Hey Betty,
das is ja ein klasse Script!!!
Das macht das Spiel viel lebendiger!
Vielen Dank und viel Aplaus für Betty :D
verfasst am: 01.07.2009, 09:31
Registrierdatum: 12.06.2005, 11:08

 Beiträge: 465
Ähm... ich traue mich fast nicht zu fragen... aber könnte man auch ein Skript basteln, das Ufos generiert, die dann irgendwo verschwinden und dann das Vertrauen des Landes, wo sie "landen" herabsetzen? Das mit den Transportern klingt interessant... nur wüsste ich z.B. bei meinem Gameset, oder wo es sonst noch Storytechnisch eher unwahrscheinlich ist, das Transporter herumfliegen, wie man das nutzen sollte. Auch wenn mir klar ist, dass es wahrscheinlich als Basis-Skript gedacht ist, um Flugverkehr zu simulieren.
verfasst am: 01.07.2009, 09:41
Registrierdatum: 26.06.2008, 13:42

 Beiträge: 648
Könnte man das Skript nicht auch anders herrum nutzen? Es simuliert den Flugverkehr der angreifenden Macht auf der Erde und der Spieler muss diese abschiessen, ohne BE danach.
Wäre doch was für dich Jens ;)
Erhöht das Vertrauen in die Verteidiger der Erde...
verfasst am: 01.07.2009, 12:01
Registrierdatum: 12.06.2005, 11:08

 Beiträge: 465
Eben jenes meine ich.
verfasst am: 01.07.2009, 13:48 · Edited by: sujin
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Zitat: Jens Evering
aber könnte man auch ein Skript basteln, das Ufos generiert, die dann irgendwo verschwinden und dann das Vertrauen des Landes, wo sie "landen" herabsetzen?

Ja, wenn es ein Transporter bleiben soll dann reicht ne Mini-Änderung - man müsste nur in der procedure ReachDest diese Zeile:
 Conf:=country_api_GetConfidenceByIndex(Country.Index)+2;

abändern. In Bettys Skript wird das Vertrauen um 2 erhöht (dabei fällt mir auf, was passiert wenn das Vertrauen schon auf Maximum ist? Wird das in der country_api_changeConfidenceAbs-Funktion abgefangen?), das lässt sich beliebig ändern .
Man sollte natürlich noch die game_api_messageBox entsprechend anpassen.

Wenn es ein kampftüchtiges UFO sein soll, wird es etwas komplizierter... denke ich zumindest. Dann musst du afaik erst per ufo_api_CreateUFO oder ufo_api_CreateUFOFromModel ein UFO erschaffen und dem dann die Koordinaten via UFO-KI-Skript zuweisen... von welchem ich leider keine Ahnung hab, da warte mal besser auf Hinweise von dene die's können ^^
verfasst am: 01.07.2009, 15:53
Registrierdatum: 12.06.2005, 11:08

 Beiträge: 465
Es reicht, wenn es ein unbewaffneter Transporter ist.
verfasst am: 01.07.2009, 16:00 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Also wenn die UFOs dann nur noch von A nach B fliegen sollen, um dann zu verschwinden, dann sollte obiges Skript leicht anzupassen sein. Falls man den UFOs ein AI-Skript zugewiesen hat, müsste man dieses wohl deaktivieren - was aber nicht schwer ist.

Die Frage ist natürlich, ob das so Sinn macht. Wenn die Spielereinheiten nicht deutlich schneller sind, als die UFOs, dann dürfte es bei einer so einfachen Konstellation schwierig sein, überhaupt ein UFO abzufangen.

Wenn es nur darum geht, bei Flucht des UFOs das Vertrauen zu ändern, dann würde ich einen Ansatz wie bei der Chykar-Sonde im Smirkovich vorschlagen. Also ein AI-Skript, welches sich nur um die Vertrauensänderung kümmert, und für den Rest ein Standard-AI-Skript startet (je nachdem, wie sich das UFO verhalten soll).
verfasst am: 01.07.2009, 17:41
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: Natter
Falls man den UFOs ein AI-Skript zugewiesen hat, müsste man dieses wohl deaktivieren

das ist noch nichtmal nötig:
http://www.xforce-online.de/forum/index.php?action=vthread&forum=13&to pic=2657
Bitte den Zusatz beachten, die originalschreibweise des Befehls ist verändert worden. Ich hab das aber noch nicht im Hauptpost geändert.

Ein Beispiel ist im Xeltaan-Skript des Galwar, denn später sollen die Xeltaan-UFOs wieder zu den Basen zurückkehren. Der gemeldete Skriptfehler an der Stelle bezieht sich aber nur auf die Auswahl der Landebasis, das Skript selber sollte funktionieren
verfasst am: 01.07.2009, 18:50
Registrierdatum: 12.06.2005, 11:08

 Beiträge: 465
Oh Gott ist das Kompliziert... wo ist die gute alte Zeit geblieben, wo UFOs einfach irgendwao erschienen sind und so... eben wie bei UFO:EU
verfasst am: 01.07.2009, 18:59
Spielsatz Alliances

Registrierdatum: 14.07.2004, 14:47

 Beiträge: 1185
Die musste auch irgendwer skripten aka programmieren ;-)
verfasst am: 01.07.2009, 22:16
Registrierdatum: 12.06.2005, 11:08

 Beiträge: 465
Aber man musste sich als einfacher Gameset-Ersteller nicht darum kümmern, ob die Ufos nun Loopings oder Schleifen fliegen. Sie flogen einfach.
verfasst am: 01.07.2009, 22:36
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: Jens Evering
Aber man musste sich als einfacher Gameset-Ersteller nicht darum kümmern, ob die Ufos nun Loopings oder Schleifen fliegen. Sie flogen einfach.

Machen sie doch jetzt auch ^^ Hier kam ja der Wunsch nach einem ganz spezifischen Verhalten auf - und das müsste man dann halt skripten.
verfasst am: 27.01.2022, 13:24
Registrierdatum: 27.01.2022, 13:07

 Beiträge: 318
You could survive a zombie apocalypse. https://housecleaningrochesterny.com
verfasst am: 13.06.2022, 18:05
Registrierdatum: 29.10.2021, 14:57

 Beiträge: 763
Good article, but it would be better if in future you can share more about this subject. Keep posting. Ron



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

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