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 —› Frage

Autor Mitteilung
verfasst am: 24.10.2004, 21:08 · Edited by: Admin
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
ich habe heute mal im Forum die Beiträge gelesen über neue Missionen.
Ich habe versucht, einen Wunsch zu erfüllen, der im Forum stand, aber
irgendwas geht da noch net soo ganz.
Die Transporter werden nicht losgeschickt.

Hinweise zur Datei:

Es soll ein Einsatz entstehen. Wenn man den schafft kriegt man 2 mal
(random(7)+3 von einem Lager-Item)
ianzahl:=random(7)+3;
item:=lager_api_getlageritem(ianzahl);
raumschiff_api_dotransporttobase(base,country,item,ianzahl);

Aber irgendwie werden die Transproter nicht losgeschickt.
HIIIIIILFEEEEEEE! (ist recht dringend)

Jim_Raynor: code-Tags eingefügt
verfasst am: 24.10.2004, 21:39
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Mehrere Sachen Dazu. Erstens es gibt auch einen code Tag. Damit sieht der Code besser aus ;)

2. lager_api_getLageritem gibt eine Ausrüstung zurück. Da kannst du nicht einfach einen zufälligen Wert nehmen, da nicht sichergestellt ist, dass überhaupt 10 verschiedene Ausrüstungen gibt. Zum ermitteln einer zufälligen Ausrüstung solltest du folgende Funktion verwenden.

function GetRandomItem(var Item: TLagerItem): Boolean;
var
  Versuche : Integer;
  Index    : Integer;
begin
  result:=false;
  
  Versuche:=50;
  while not result do
  begin
    Versuche:=Versuche-1;
    if Versuche=-1 then
      exit;

    Index:=random(lager_api_count());
    Item:=lager_api_GetItem(Index);

    if not ((Item.TypeID=ptGranate) or (Item.TypeID=ptMine) or (Item.TypeID=ptMunition) 
or (Item.TypeID=ptSensor) or (Item.TypeID=ptWaffe)) then
      continue;
      
    // Alienausrüstung darf nicht gehandelt werden
    if (Item.AlienItem) then
      continue;

    result:=true;
  end
end;
Diese musst du in dein Skript ein fügen. Dann kannst du ein Item folgendermaßen ermitteln
if GetRandomItem(Item) then
  doTransport...


P.S: Poste auch den Code davor, da dort auch Fehler drin sind.
verfasst am: 24.10.2004, 22:23 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Es gibt einen weiteren Fehler. Die Reihenfolge deiner Parameter ist falsch. Bei
raumschiff_api_dotransporttobase(...) 

muss zuerst das Land und dann die Basis angegeben werden.
verfasst am: 25.10.2004, 19:51 · Edited by: nightelf_IX
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
Ich verstehe alles bis auf

    if not ((Item.TypeID=ptGranate) or (Item.TypeID=ptMine) or (Item.TypeID=ptMunition) 
or (Item.TypeID=ptSensor) or (Item.TypeID=ptWaffe)) then
      continue;


was bedeutet das

das mit der reihenfolge hab ich wohl bloß falsch abgeschrieben
verfasst am: 25.10.2004, 19:55 · Edited by: nightelf_IX
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
Du sagtest, dass da Fehler drin seien. Deshalb das ganze Programm zum abschreiben:

program Lager;

const
{$ifdef deutsch}
  {$define constok}
  missiontext      ='Sir, hier spricht %s. Aliens sind in ein altes Lager eingedrungen und haben dieses Besetzt.'#10#13'Sie können die Waren, die sich in diesem Bergwerk befinden bergen, wenn Sie die Aliens vertreiben könnten. Wir vermuten, dass die Aliens die Ausrüstung in drei Tagen zerstört haben.'#10#13#10#13'Viel Glück!';
  wintext          ='Herzlichen Glückwunsch! Sie haben das Lager zurückerobert. Sie erhalten die Waren in den nächsten Minuten.';
  loosetext        ='Sie haben es nicht geschafft. Die Aliens haben den gesamten Inhalt zerstört und es lohnt sich nicht mehr, das Lager anzugreifen und %s ist enttäuscht.';
  roomname         ='Lagerhaus';
  desc             ='Um die Waren aus dem Lagerhaus zurück zu erobern müssen Sie die Aliens vertreiben';
  obj              ='Vernichten Sie alle Aliens, um das Lager zurückzuerobern';
  
{$endif}
{$ifndef constok}
  missiontext      ='Sir, here speaks %s. Aliens conquered an old warehouse.'#10#13'You can salvage the wares from this warehouse when you kill all the aliens. We think, those bastards will destroy the wares in three days.'#10#13#10#13'Good luck!'
  wintext          ='Congratulation! You have killed all the aliens in the warehouse. You get the the wares in the next minutes.'
  loosetext        ='You didnt succeed. The aliens have destroyed the wares and %s is very disappointed.'
  roomname         ='Warehouse'
  desc             ='To get the wares, you must defeat all the aliens which are in the warehouse.'
  obj              ='Kill the aliens to get the Items'
  
{$endif}
var
  country:tcountry;
  inum:integer;
  item:tlageritem;
  base:tbasis;

function GetRandomItem(var Item: TLagerItem): Boolean;
var
  Versuche : Integer;
  Index    : Integer;
begin
  result:=false;

  Versuche:=50;
  while not result do
  begin
    Versuche:=Versuche-1;
    if Versuche=-1 then
      exit;

    Index:=random(lager_api_count());
    Item:=lager_api_GetItem(Index);

    if not ((Item.TypeID=ptGranate) or (Item.TypeID=ptMine) or (Item.TypeID=ptMunition)
or (Item.TypeID=ptSensor) or (Item.TypeID=ptWaffe)) then
      continue;

    result:=true;
  end
end;

procedure missionwin(Einsatz:Teinsatz);
var
  Basis:Tbasis;
begin
  basis:=basis_api_getmainbase;
  game_api_messagebox(format(wintext,[basis]));
  
( da jetzt das neue zeug )
  raumschiff_api_dotransporttobase(country,base,item,inum);

( da auch )
  raumschiff_api_dotransporttobase(country,base,item,inum);
  
  mission_win();

end;

procedure timeup(einsatz:teinsatz);
  begin
  game_api_messagebox(format(loosetext,[country.name]));
  mission_loose();
  country_api_changeconfident(country.index,-125);
end;
procedure StartMission;
var
  i:integer;
  einsatz:Teinsatz;
begin
  base:=basis_api_getmainbase;
  einsatz:=einsatz_api_generateeinsatz();
  if einsatz.country=-1 then
  begin
    einsatz.start;
    mission_abort();
  end;
  for i:=1 to random(15)+5 do
    einsatz.addalien(alien_api_getrandomalien);
  if not einsatz.start then
    mission_abort()

  einsatz.description:=desc;
  einsatz.objectives:=obj;
  einsatz.name:=roomname;
  
  register_einsatz_win(@missionwin,einsatz);
  register_einsatz_timeup(@timeup,einsatz);
  
  einsatz.remaintime:=4320;
  
  country:=country_api_getcountry(einsatz.country);
  game_api_messagebox(format(missiontext,[country.name]))
  
end;

begin
  MissionName := 'Lager';
  MissionType := mzUser;
end.
verfasst am: 25.10.2004, 20:33
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: nightelf_IX
Ich verstehe alles bis auf

if not ((Item.TypeID=ptGranate) or (Item.TypeID=ptMine) or (Item.TypeID=ptMunition)
or (Item.TypeID=ptSensor) or (Item.TypeID=ptWaffe)) then
continue;

Damit wird einfach geprüft, ob es sich bei dem ausgewählten Gegenstand um eine Granate, Mine, Munition, Sensor oder Waffe handelt. Bei allen anderen Gegenständen (z.B. Triebwerke) wird die Schleife von vorne abgearbeitet.
verfasst am: 25.10.2004, 20:38
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Ach ja, wenn du andere Gegenstände zulassen willst, schau einfach mal im Objektbrowser unter
Typen/Aufzählungen/TProjektType
Da wirst du feststellen, dass es auch fürs Lager ungeeignete Typen wie z.B. Einrichtungen gibt.
verfasst am: 25.10.2004, 20:48 · Edited by: nightelf_IX
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
ok, aber triebwerke und sensoren und waffen und schilde und gürtel und noch ein paar andere müssen rein. danke ;)

ich glaube jimraynor hat seine codes oben von 'handel' abgeschrieben. das habe ich auch gemacht, nur ich wusste nicht, dass function so wichtig ist
verfasst am: 26.10.2004, 07:30
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Zitat: nightelf_IX
ich glaube jimraynor hat seine codes oben von 'handel' abgeschrieben
Sind ja immer meine eigenen Skripte.

Okay fangen wir mal an.

1. Die Globale Variable base brauchst du nicht. Definiere einfach bei Startmission eine TBasis variable genauso wie du es auch unter MissionWin getan hast.

2. inum und Item müssen auch nicht global sein. Reicht wenn diese Lokal bei MissionWin definiert sind.

3. game_api_messagebox(format(wintext,[basis])); Hier ist ein Fehler. Und zwar muss es basis.Name heissen (ist das selbe wie bei Country. Zu dem hast du in WinText keinen Platzhalter (%s) definiert, so dass das Format an dieser Stelle keinen Sinn macht. Deshalb kommt es auch nicht zum Fehler an dieser Stelle. Also entweder in wintext an einer Sinnvollen Stelle einen Platzhalter einbauen, oder das Format ganz weglassen und direkt wintext anzeigen.

Entscheidend ist jetzt, was du aus ( da jetzt das neue zeug ) gemacht hast. Ansonsten 1. und 2. sind Schönheitssachen und 3. ist ein richtiger Fehler, der zu Problemen führen kann.
verfasst am: 26.10.2004, 14:11 · Edited by: nightelf_IX
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
Einen Fehler hab ich selber noch gefunden:
die variable index (welche die anzahl des items angibt)
darf gar nicht global sein, da sie nach der ausführung von
function wieder auf 0 gesetzt ist, dann steht zum schluss da
Die Lieferung von 0x WasAuchImmer ist in Hauptbasis angekommen.)
verfasst am: 26.10.2004, 15:06
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Ähh. Index gibt doch garnicht die Anzahl der Items an und wenn ja ist das eine Schlechte Bezeichnung. Und jetzt verwechselst du global und lokal. Am besten du wartest mal ab, wir werden bald das Tutorial von X-Skript veröffentlichen.

GLobale Variablen sind nur notwendig, wenn diese Funktionsübergreifend benötigt werden. In deinem Skript wäre dies nur das Land. Alle anderen Variablen können Lokal in der jeweiligen Prozedur definiert werden.
verfasst am: 26.10.2004, 15:41
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
OK, also der Skript ist jetzt in dem neuen Thema fertig und in einem anderen Skript das ist als beispiel genommen habe (eins von dir) war der name auch index.
so langsam komm ich selber dahinter wie das funktioniert. hab seitdem wieder zwei (nicht nennenswerte) neue.
verfasst am: 26.10.2004, 17:34
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Sicherlich habe ich eine Variable mal Index genannt. Aber dann wurde darin nicht eine Zahl gespeichert. Eine der Obersten Regeln guten Programmieren. Variablen mit sprechenden Namen versehen ;)
verfasst am: 26.10.2004, 17:49 · Edited by: nightelf_IX
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
Ich bin sicher, du machst mich noch zu einem 8D=

wer macht eigentlich das Tutorial, bzw. hat vor es je zu machen bzw. hat es schon gemacht, ist nur zu faul es auszustellen ?
verfasst am: 26.10.2004, 17:52
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Zitat: nightelf_IX
Ich bin sicher, du machst mich noch zu einem |D=
Ordnung muss sein, nicht wahr ;)
Zitat: nightelf_IX
wer macht eigentlich das Tutorial, bzw. hat vor es je zu machen bzw. hat es schon gemacht, ist nur zu faul es auszustellen ?
Also, sowas möchte ich hier nicht hören. Jeder arbeitet hier in seiner Begrenzten Freizeit. Wir sind keine Schulgänger mehr und können nicht 10 Stunden am Tag vorm Computer hocken. Deshalb nur Geduld.
verfasst am: 26.10.2004, 18:30 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: nightelf_IX
wer macht eigentlich das Tutorial, bzw. hat vor es je zu
machen bzw. hat es schon gemacht, ist nur zu faul es
auszustellen ?


Dieser Jemand bin ich. Und nur zur Information, ich bin
kein Programmierer, und ich muss mich genau wie jeder
andere (ohne eine Anleitung) in X-Skript einarbeiten.
Außerdem wird X-Skript ja am laufenden Band
geändert/erweitert, so dass es schwierig ist, überhaupt
irgendetwas zu schreiben. Bis jetzt steht erstmal neben den
Grundlagen nur ein (ca. 10 Seiten umfassendes) Kapitel für
ein UFO-Skript. Außerdem sind wir derzeit am überlegen, wie
wir Anleitungen überhaupt präsentieren wollen. Dabei sollen
nach Mölichkeit mehrere Personen an einem Text arbeiten
können. Bis das umgesetzt ist, wird es wohl noch mal eine
Weile dauern (vermutlich muss das ganze Layout neu erstellt
werden). Eventuell wird zwischenzeitlich ein PDF-File mit
dem aktuellen Stand des Tutorials veröffentlicht, dass steht
aber noch nicht fest. Ach ja, irgendwo im Forum steht was
von September, aber ich kann mich nicht erinnern, eine Jahreszahl angegeben zu haben.
verfasst am: 27.10.2004, 20:24
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
Frage:

Was ist falsch, wenn ein Laufzeitfehler, could not call proc kommt
verfasst am: 27.10.2004, 20:56
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Kann vieles sein. Am besten mal Skript herzeigen.
verfasst am: 28.10.2004, 14:17 · Edited by: nightelf_IX
Registrierdatum: 18.10.2004, 16:31

 Beiträge: 481
var
lohn       : integer;
country    : tcountry;
einsznum   : integer;
ufonum     : integer;
inum       : integer;
enum       : integer;
unum       : integer;

function getrandomitem(var item : tlageritem) : boolean;
var
  tries    : integer;
  tinum    : integer;
begin
  tries := 50
  result := false;
  tinum := random(5)+3;

    while not result do
    begin
      tries := tries-1
      if tries = -1 then
        exit;

      item := lager_api_getitem(tinum);

      if ((item.typeid = ptorganisation) or (item.typeid = pteinrichtung)) then
        continue;

      if (item.typeid = ptraumschiff) then
        tinum := 1;

      result := true;
      
      inum := tinum;
    end;
end;

procedure secufodown(ufo:tufo);
begin
  lohn := lohn + 150
  unum := unum-1
end;

procedure moreufos(ufo:tufo);
var
  index   : integer;
  point   : tfloatpoint;
  model   : tufomodel;
begin

  game_api_messagebox(atext);
  ufonum := random(2)+2;
  unum := unum-1+ufonum
  for index := 1 to ufonum do
  ufo_api_createufo();
  ufo.setposition(point.x,point.y);
  model := ufo.model;
  ufo.name := model.name + ' Angreifer';
  register_ufo_shootdown(@secufodown,ufo);
  lohn := lohn + 200
end;

procedure seceinsatz(einsatz:teinsatz);
begin
  lohn := lohn + 150
  enum := enum-1
end;

procedure moreeinsatz(einsatz:teinsatz);
var
  index        : integer;
begin
  game_api_messagebox(btext);
  lohn         := lohn + 300
  register_einsatz_win(@seceinsatz,einsatz);
  einsznum     := random(2)+1
  enum         := enum-1+einsznum
  for index := 1 to einsznum do
    einsatz_api_generateeinsatz;
  einsatz.addalien(alien_api_getrandomalien);
  if einsatz.country = -1 then
    einsatz.start;
end;

procedure MissionWin;
var
base           : tbasis;
einsatz        : teinsatz;
item           : tlageritem;
inum           : integer;

begin
  base := basis_api_getmainbase;
  country := country_api_getcountry(einsatz.country);
  game_api_messagebox(format(wtext,[lohn,country]));
  savegame_api_freemoney(lohn,kbeg);
  if getrandomitem(item) then
    raumschiff_api_dotransporttobase(country,base,item,inum);
end;

procedure StartMission;
var
einsatz        : teinsatz;
ufo            : tufo;
index          : integer;
point          : tfloatpoint;
model          : tufomodel;
begin
  einsznum     := random(4)+2;
  ufonum       := random(3)+4;
  for index := 1 to ufonum do
    ufo_api_createufo();
  for index := 1 to enum do
  einsatz_api_generateeinsatz();
  einsatz.name         := etext;
  einsatz.objectives   := otext;
  einsatz.description  := dtext;
  einsatz.addalien(alien_api_getrandomalien);
  model                := ufo.model;
  ufo.name             := model.name + ' Angreifer';
  ufo.setposition(point.x,point.y);
  register_ufo_shootdown(@moreufos,ufo);
  lohn         := 500;
  register_einsatz_win(@moreeinsatz,einsatz);
  enum         := einsznum;
  unum         := ufonum;
// Sieht zwar ein bisschen Krückenhaft aus, aber es funktioniert.
  if (( enum = 0) and (unum = 0)) then
    event_register(@missionwin,0);
end;


hab jetzt anfang und ende weggelassen
fehler is nach einsatz.addalien(alien_api_addalien);
verfasst am: 28.10.2004, 14:33
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Tja. UFO ist noch keinen Wert zu gewiesen. Deshalb kann er auch keine Funktion aufrufen. Das gleich passiert wieder bei einsatz. Das sind Variablen die nicht automatisch mit einem Wert belegt werden. Richtig wäre zum Beispiel:

ufo := ufo_api_createufo();
denn ufo_api_createufo gibt ein TUFO zurück. Genauso verhält es sich bei einsatz_api_generateeinsatz().

Dann würde ich dir noch empfehlen die procedure MissionWin nach OnMissionWin umzubennen. Dann wird diese automatisch aufgerufen, wenn die Mission gewonnen wurde (wie auch immer).

Dann kannst du dir das event_register(@missionwin,0) sparen und direkt Mission_Win() aufrufen.

Hehe. Man muss sich erstmal an deinen Sourcecode gewöhnen. Hier gibt es einen Styleguide: http://www.delphi-source.de/grundlagen/styleguide/ zu Delphi (Delphi basiert auf Object Pascal). Der gibt paar Hinweise wie Pascal Code aussehen sollte. Wir halten uns immer dran, da es dadurch wirklich übersichtlicher wird. Vielleicht kannst du ja deine Sourcecodes auch mal danach ausrichten?



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

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