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 —› LennStars Fragerunde

Seite: << [1] [2] [3] [4] [5] [6] [7] [8] 9 [10] .. [17] [18] >>

Autor Mitteilung
verfasst am: 30.06.2007, 17:28 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Er ist allerdings ein indirekter Hinweis darauf, das Du irgendwo vorher einen unglücklichen (d.h. nicht der korrekten Syntax entsprechenden aber trotzdem keinen Fehler erzeugenden) Code stehen hast.

Ich hab durch Zufall herausgefunden, woran es lag.
uses UKI_BAgeo;
Das war noch drin, da ich vorhatte, die zu nutzen. Hab mir dann aber gesagt, da die Landung-unit eingebunden werden soll, soll jedes script dann selbst eine Position festlegen. (Möglich wär ja, dass erst noch eine andere Berechnung durchgeführt werden soll)
Nachdem ich das gelöscht habe, kam kein Fehler mehr, als ich diesbezüglich noch mal probieren wollte.

{überholter Gedankengang: Dafür hab ich jetzt woanders, wo vorher die (wahrscheinlich) gleiche Meldung kam, diese mit einer (Adresse 00000) 21 statt einer 20. (siehe weiter oben, da hatte ich das am Anfang mal erwähnt)}
probiert: Ressourcenbeschaffung: mit uses: Aliens_Active 21, ohne: 20
Solariermuellkippe: immer 21 (benutzt keine uses)
...

Schlussfolgerung aus den Beobachtungen:
- Die (aktive) Verwendung von uses (egal welche) legt die Adresse scheinbar von 21 auf 20. Wenn die uses XXX nicht angesprochen wird, ändert sich nichts. - falls das irgeneine Hilfe ist.
- Die Verwendung von uses UKI_BAgeo; hat den Punkt-Fehler zur Folge, sofern sie allein als uses XXX verwendet wird - eine zweite unit oder eine andere allein oder keine und das Problem tritt nicht auf!

Egal was bei mir sein mag, in der UKI_BAgeo scheint auf alle Fälle was nicht zu stimmen. Als "Vorbildscript" solltest du da dringend mal nachsehen.

Edit: Wenn ich im unveränderten UKI000nothing bei uses UKI_AAinit, UKI_ABall; ein Komma setze, kommt genau der gleiche Fehler (Adresse 20) auch!
Aber nur zwischen UKI_ABall und dem ;, sonst nirgends, also [UKI_ABall*Fehlerbreich*;].

Edit2: Tritt auch innerhalb eines {} und //Kommentars auf, dabei bei , und . wenn in einer Zeile außerhalb von Text, und nur , wenn innerhalb von Text. (Adresse 21)
Wobei ich mich nicht erinnern kann, dass das vorher auch war. Ich kanns aber nicht beschwören. Tritt auch ohne uses UKI_BAgeo auf.
verfasst am: 01.07.2007, 11:54 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Was ganz anderes (oder nicht? ;D) als oben.

Ich hab jetzt in mein Startscript den Aufruf der AAinit eingebaut. Das sieht so aus:
program Einleitung;
uses UKI_AAinit;
const

    message_1 = ';

procedure StartMission;
begin
  UKI_AAinit;
  game_api_messageBox('Dark Age Version 2. (UKI_AAinit Initialisierung erfolgt.)');
  game_api_messageBox(message_1);	
mission_win;
end;
Im Spiel kommt aber folgende Meldung:
Run Time Error in Mission EinleitungRadar:
UKI_AAinit - File: UKI_AAinit; Line: 40, Col: 3
STARTMISSION - Line: 34, Col: 3 

Global Var UKI_UFO already registered


Hätte ich den Aufruf von UKI_AAinit weglassen sollen?
verfasst am: 01.07.2007, 12:27
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
UKI_AAinit muss genau einmal pro Spiel aufgerufen werden, und zwar bevor irgendeine der UKI-Funktionen (in welchem Skript auch immer) genutzt wird.

Die Fehlermeldung bedeutet das Du in Deinem Spielsatz den Befehl zweimal in zwei verschiedenen Skripten aufrufst - bitte suchen an welchen beiden Stellen, und dann den zeitlich späteren Aufruf löschen.
verfasst am: 01.07.2007, 14:21 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Die Fehlermeldung bedeutet das Du in Deinem Spielsatz den Befehl zweimal in zwei verschiedenen Skripten aufrufst

Ah, hatte vergessen, dass das ja in dem RandomUFO schon von Haus aus drin ist.
Ich werd da gleich mal noch einen entsprechenden Hinweis an der Stelle der Doku einsetzen, die mich da erwischt hat.
verfasst am: 01.07.2007, 15:32 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Und ein neues... Das ist was ich getippt habe, die Vorgabeprozeduren (UKIShootdown etc.) sind auch noch drin.
procedure Landing;
var
  i: integer;
  Flugzahl2: integer; //Wie oft zwischen den Landungen
  Landezahl: integer; //Anzahl Landungen

begin
  Flugzahl2:= random(2)+2;
  Landezahl:= random(2)+1;
  for i:=1 to Landezahl do
    begin
      if earth_api_PointOverLand(UFO.Position) then
        Zwischenlandung;
      if not earth_api_PointOverLand(UFO.Position) then
        UFO.FlyToPoint(PositionNear(UFO.position,10));
      if earth_api_PointOverLand(UFO.Position) then
        Zwischenlandung;
      for i:=1 to Flugzahl2 do
        begin
          UFO.FlyToPoint(PositionNear(UFO.position,10));
        end;
    end;
end;

procedure StartMission;
var
  UFO:TUFO;
  Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
  Flugzahl3: integer; //Wie oft nach der letzten Landung
  i: integer;
begin
  UFO:=UKI_AAgetUFO;
  Allcreate(UFO);
  register_UFO(UFO);
  UFO.UserKI:=true;
    // die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
  register_event(@UKIShootDown, UFO, EVENT_ONUFOSHOOTDOWN);
  register_event(@UKIDiscover, UFO, EVENT_ONUFODISCOVERED);
  register_event(@UKIEscape, UFO, EVENT_ONUFOESCAPE);
  register_event(@UKIKampfwin, UFO, EVENT_ONUFOKAMPFWIN);
  register_event(@UKIHitbyBase, UFO, EVENT_ONUFOHITBYBASE);
  register_event(@UKINewCommand, UFO, EVENT_ONUFONEWCOMMAND);
  register_event(@UKICommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
  register_event(@UKInearEnemy, UFO, EVENT_ONUFONEARESTENEMYCHANGED);
  
  Flugzahl1:= random(2)+2;
  Flugzahl3:= random(2)+2;
  for i:=1 to Flugzahl1 do
    begin
      UFO.FlyToPoint(PositionNear(UFO.position,20));
    end;
  Landing;
  for i:=1 to Flugzahl3 do
    begin
      UFO.FlyToPoint(PositionNear(UFO.position,20));
    end;
  UFO.Escape;
end;

begin
  MissionName := 'UKI000Forschungsschiff';
  MissionType := mzUFO;
end.

Nach Aufruf durch RandomUFO im editor und im Spiel kommt folgende Meldung:
Run Time Error in Mission UKI000Forschungsschiff
LANDING - Line Col
STARTMISSION Line Col

Could not call Proc


edit: Die Zeilenangabe ändert sich doch, aber nur wenn ich alles schließe und den Spielsatz abspeichere.
Was fett ist, ist also die beanstandete Zeile.
verfasst am: 01.07.2007, 15:45
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Irgendwie vermisse ich die Prozedur Zwischenlandung in dem Codeausschnitt.
Außerdem frage ich mich, wieso Du die Zwischenlandung zweimal durchführen willst...
verfasst am: 01.07.2007, 17:10
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Irgendwie vermisse ich die Prozedur Zwischenlandung in dem Codeausschnitt.

per uses - das, worums in der letzten Woche ging.

Zitat: DirkF
Außerdem frage ich mich, wieso Du die Zwischenlandung zweimal durchführen willst...

Das erste Mal Zwischenlandung ist in der if, wenn das UFO also nicht über Land ist, wird es nicht ausgeführt - kein Bodeneinsatz im Wasser.
Dafür bewegt sich das UFO ein Stück, und versucht noch mal die Zwischenlandung.
Wenn immer noch über Wasser, kommt die Schleife für Bewegungen zwischen mehreren Landungen.
Das UFO soll mehrere Landungen ausführen, bevor es endgültig verschwindet.


unit UKI_Unit_Zwischenlandung;
  var
    UFOSpeicher: TUFO;
    UFO: TUFO;

procedure ZwischenlandungStart(Sender:TObject);
begin
  UFO:=UFOSpeicher;
  ufo_api_CreateUFOFromModel(UFO.model);
end;
    
procedure Zwischenlandung;
  var
    Boden: TEinsatz;
    Zeit: longint;

begin
  savegame_api_Message(#',lmMissionMessage,Nil);
  UFOspeicher:=UFO;
  Zeit:=random(360)+120;              //Wie lange dauert die Landung: Zufall+2h
  Boden:= einsatz_api_generateEinsatz;
  Boden.Position:=UFO.Position;
  Boden.PopulateFromUFO(UFO);
  UFO.Escape;
  Boden.RemainTime:=Zeit;
  Boden.Name:= 'Überfall auf ein gelandetes UFO';
  Boden.Objectives:= #.';
  Boden.Description:= #';
  Boden.start;
  //Wenn die Einsatzzeit abgelaufen ist, wird ein UFO erzeugt, ansonsten nicht (erfolgreicher Bodeneinsatz)
  register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
end.


btw: Wenn ich hier oben UFO:TUFO rausnehme, dann kommt beim Start der RandomUFO wieder die Fehlermeldung mit der Adresse 21.
verfasst am: 01.07.2007, 17:38
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Das erste Mal Zwischenlandung ist in der if, wenn das UFO also nicht über Land ist, wird es nicht ausgeführt - kein Bodeneinsatz im Wasser.
Dafür bewegt sich das UFO ein Stück, und versucht noch mal die Zwischenlandung.

Aber wenn das UFO über Land ist, dann wird die Zwischenlandung zweimal in derselben Sekunde am selben Ort ausgeführt - bist Du sicher, das Du das willst?

Ansonsten liegt der Fehler wahrscheinlich in dem Bereich, wie Du mit den Objektpointern für UFO umgehst. Pointer müssen entweder übergeben oder übergeordnet definiert werden - so wie Du UFO definierst kann das nichts werden...
Du kannst nicht erwarten, das ein Pointer der lokal in einer übergeordneten Funktion definiert wird (UFO:TUFO in Startmission) auf dasselbe Objekt zeigt wie ein Pointer, der global in einer untergeordneten unit (UFO:TUFO in der Unit) definiert wird. Das sind zwei grundverschiedene UFOs die Du da definierst, und deshalb klappt das auch nicht.
Denn das UFO in Zwischenlandung ist nie erzeugt worden.

Entweder definierst Du das UFO global in dem übergeordneten Skript, oder Du musst es per Aufruf übergeben (Zwischenlandung(UFO);).

Zur Erklärung:
Wenn Du eine beliebige Variable innerhalb einer Funktion definierst, dann existiert sie NUR innerhalb dieser Funktion. Dies gilt bei dem Code oben z.B. für UFO, Flugzahl1 und Flugzahl3 bei StartMission. Schon die Funktion Landing; kann absolut gar nichts mit dieser Variablen UFO anfangen, weil sie nicht übergeben wird und außerhalb der StartMission auch nicht existiert...
Die müssten stattdessen genauso global definiert sein wie Du das in der Unit gemacht hast - diese Definition ist global (und deshalb gibt es auch keinen Fehler in Landing, denn dort wird die Globale Definition abgefragt), aber diesem UFO wird nirgendwo ein Objekt definiert.
Denn StartMission sagt ja: Bitte erzeuge das UFO in meiner lokalen Variable, auf die der Rest des Skriptes keinen Zugriff hat.
verfasst am: 01.07.2007, 19:21
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Entweder definierst Du das UFO global in dem übergeordneten Skript, oder Du musst es per Aufruf übergeben (Zwischenlandung(UFO);).

Wo fängt das denn jetzt an?
Ich dachte in der RandomUFO, da steht drin *such*
ZPosition.x:=random(360)-1;
ZPosition.y:=random(170)+4;
UFO:=ufo_api_CreateUFO;
UFO.Position:=ZPosition;

Da haben wir das UFO, dem das KI-script zugewiesen wird.
UFO.KIName:='UKI000Forschungsschiff';
dann
UKI_AAcreate(UFO);
procedure UKI_AAcreate(UFO:TUFO);
begin
game_api_setinteger('UKI_UFO',Integer(UFO));
mission_api_StartSkript(UFO.KIname);
end;

Und ich schätze mal, an dieser Stelle hängt dann irgendwas mit dieser Weitergabe, denn der Teil mit dem setinteger sagt mir gar nichts.
verfasst am: 01.07.2007, 19:36
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Beide Definitionen sind in Deinem Skript, nirgendwo anders.

Das ist die Globale Definition:
unit UKI_Unit_Zwischenlandung;
var
UFOSpeicher: TUFO;
UFO: TUFO;
D.h. dieses UFO wird überall AUSSER dort genutzt, wo Du eine lokale Definition hast.

Das ist die lokale Definition:
procedure StartMission;
var
UFO:TUFO;
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
i: integer;
D.h. dieses UFO ist NUR innerhalb der StartMission-Funktion vorhanden und kann NIRGENDWO sonst zugegriffen werden.

Dein Landing; kann gar nicht auf das in StartMission übergebene UFO zugreifen, weil das UFO von StartMission nur lokal definiert ist und nirgendwo sonst existiert.
Das ist der Fehler.

Die Übergabe aus meinen anderen Skripten mit UFO:=UKI_AAgetUFO; funktioniert einwandfrei, erst in Deinem Skript wird die Weitergabe aus der StartMission; an das Landing; blockiert.
verfasst am: 02.07.2007, 19:01
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Brauche ich denn nun irgendwo in und unterhalb der UKI000 ein var UFO:TUFO?
Denn wenn ich es weglasse oder in der UKI000 anlege,dann gibts unknown identifier in ZwischenlandungStart, und bei Start per Random (wo ja das UFO definiert wird) gibts nur den Adresse21 Fehler.

Wenn ich noch so einen Pointer brauche, dann sag es, denn von den Dingern versteh ich nichts, und die Hilfen sind nicht sonderlich hilfreich.
verfasst am: 02.07.2007, 19:57
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Fangen wir mal von vorne an, das sollte die Verwirrung entweder beheben oder vervollständigen ;-)

Es gibt zwei verschiedene Methoden, ein anderes Skript einzubinden: uses und mission_api_StartSkript(skript);

Im Falle von uses gehören diese eingebundenen Skripte zum Hauptskript mit dem uses-Befehl und werden zusammen mit diesem Beendet. Die eingebundenen units dürfen kein "StartMission" enthalten und teilen sich mit dem aufrufenden Skript alle globalen Variablen.

Im Falle von mission_api_Startskript werden diese Skripte aber unabhängig gestartet und können auch unabhängig beendet werden. Das hiermit aufgerufene Programm MUSS ein eigenes Startmission enthalten und eigene Variablen definieren, denn es hat keinerlei direkten Zugriff auf die Variablen des aufrufenden Skriptes. Lediglich ein indirekter Zugriff über getrennt definierte Variablen in game_api_* kann Werte übergeben.

Da man natürlich nicht laufend den Speicher für die KI jedes einzelnen UFOs belegen will, müssen die UFO-Erzeugungsskripte die KI-Skripte extern aufrufen. Nur so können diese KI-Skripte passend beendet werden wenn das UFO zerstört ist.

Dementsprechend ist Dein UKI000Forschungsschiff (oder wie Du Dein KI-Skript nennst) die oberste Einheit für die Definition aller Variablen innerhalb dieses Skriptes und seiner Units. Du musst darin alles definieren was jemals darin verwendet werden soll - fehlen diese Definitionen, dann gibt es natürlich Fehler.

Dein Problem ist, das Du eine Variable zweimal definiert hast und dadurch zwei verschiedene Variablen mit demselben Namen erzeugt hast. Ich formuliere Deinen fehlerhaften Code mal hier um - schau nach welche Variable Du wo definiert hast und wo verwendest, dann siehst Du das Problem:
unit UKI_Unit_Zwischenlandung;
  var
    UFOSpeicher: TUFO;
    gUFO: TUFO;

procedure ZwischenlandungStart(Sender:TObject);
begin
  gUFO:=UFOSpeicher;
  ufo_api_CreateUFOFromModel(gUFO.model);
end;
    
procedure Zwischenlandung;
  var
    Boden: TEinsatz;
    Zeit: longint;

begin
  savegame_api_Message(#',lmMissionMessage,Nil);
  UFOspeicher:=gUFO;
  Zeit:=random(360)+120;              //Wie lange dauert die Landung: Zufall+2h
  Boden:= einsatz_api_generateEinsatz;
  Boden.Position:=gUFO.Position;
  Boden.PopulateFromUFO(gUFO);
  gUFO.Escape;
  Boden.RemainTime:=Zeit;
  Boden.Name:= 'Überfall auf ein gelandetes UFO';
  Boden.Objectives:= #.';
  Boden.Description:= #';
  Boden.start;
  //Wenn die Einsatzzeit abgelaufen ist, wird ein UFO erzeugt, ansonsten nicht (erfolgreicher Bodeneinsatz)
  register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
end.

procedure Landing;
var
  i: integer;
  Flugzahl2: integer; //Wie oft zwischen den Landungen
  Landezahl: integer; //Anzahl Landungen

begin
  Flugzahl2:= random(2)+2;
  Landezahl:= random(2)+1;
  for i:=1 to Landezahl do
    begin
      if earth_api_PointOverLand(gUFO.Position) then
        Zwischenlandung;
      if not earth_api_PointOverLand(gUFO.Position) then
        gUFO.FlyToPoint(PositionNear(gUFO.position,10));
      if earth_api_PointOverLand(gUFO.Position) then
        Zwischenlandung;
      for i:=1 to Flugzahl2 do
        begin
          gUFO.FlyToPoint(PositionNear(gUFO.position,10));
        end;
    end;
end;

procedure StartMission;
var
  lUFO:TUFO;
  Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
  Flugzahl3: integer; //Wie oft nach der letzten Landung
  i: integer;
begin
  lUFO:=UKI_AAgetUFO;
  Allcreate(lUFO);
  register_UFO(lUFO);
  lUFO.UserKI:=true;
    // die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
  register_event(@UKIShootDown, lUFO, EVENT_ONUFOSHOOTDOWN);
  register_event(@UKIDiscover, lUFO, EVENT_ONUFODISCOVERED);
  register_event(@UKIEscape, lUFO, EVENT_ONUFOESCAPE);
  register_event(@UKIKampfwin, lUFO, EVENT_ONUFOKAMPFWIN);
  register_event(@UKIHitbyBase, lUFO, EVENT_ONUFOHITBYBASE);
  register_event(@UKINewCommand, lUFO, EVENT_ONUFONEWCOMMAND);
  register_event(@UKICommandComplete, lUFO, EVENT_ONUFOCOMMANDCOMPLETE);
  register_event(@UKInearEnemy, lUFO, EVENT_ONUFONEARESTENEMYCHANGED);
  
  Flugzahl1:= random(2)+2;
  Flugzahl3:= random(2)+2;
  for i:=1 to Flugzahl1 do
    begin
      lUFO.FlyToPoint(PositionNear(lUFO.position,20));
    end;
  Landing;
  for i:=1 to Flugzahl3 do
    begin
      lUFO.FlyToPoint(PositionNear(lUFO.position,20));
    end;
  lUFO.Escape;
end;
Dein Problem ist, das Du mit lUFO:=UKI_AAgetUFO; das UFO zwar der (fast nutzlosen) Variable lUFO zuweist, aber nirgendwo definiert wird, woher denn das gUFO kommen soll. Der korrekte Code lautet in UKI000Forschung:
program UKI000Forschungsschiff;
uses UKI_Zwischenlandung;
var
  UFO: TUFO;

procedure StartMission;
var
  Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
  Flugzahl3: integer; //Wie oft nach der letzten Landung
  i: integer;
begin


Und NACHDEM Du das UFO im KI-Script korrekt definiert hast, kannst (und musst) Du auch die nicht ganz korrekte Definition in der unit Zwischenlandung löschen.
Vor der korrekten Definition im KI-Script geht das löschen natürlich nicht, denn sonst sind ja die gUFO Variablen im KI-Script ohne Definition...
verfasst am: 02.07.2007, 21:09 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Hmm...
Also UKI_000 läuft durch bis Zwischenlandung, und da durch die ganzen Boden.xxx und dann zu UFO.Escape.
Mit diesem Befehl wird die var UFO komplett gelöscht (oder deregistriert) so dass ein UFO gar nicht mehr existiert und somit erst wieder per var definiert werden muss.

Ist das soweit korrekt? Dann ist mein Fehler, dass ich das UFO als weiterhin belegbare Variable angenommen hatte - und ich dich dann irgendwo oben etwas falsch verstanden habe.


Wenn das nicht stimmt, muss ich sehen, ob ich morgen wieder denken kann, heute ists schlecht damit. (Und eigentlich die ganze Woche, weil ich tagsüber mächtig beschäftigt bin)

edit: Wenn ich UFO unter UK_I000 in die var schreibe, wird bei Zwischenlandung UFOSpeicher:=UFO; gemeckert unknown identifier UFO. Und das versteh ich nicht, dass ist doch - durch die unit - auch nur eine prozedur von UKI_000.
verfasst am: 02.07.2007, 22:04
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Falsch - der Fehler ist, das Du das UFO zweimal definierst...

Schau doch mal wo ich Deine UFO durch lUFO bzw. gUFO ersetzt habe.

UFOspeicher:=gUFO;
Boden.Position:=gUFO.Position;
Boden.PopulateFromUFO(gUFO);
gUFO.Escape;

funktioniert nicht und wird NIE funktionieren, weil es keine einzige Stelle gibt wo das gUFO definiert wird.
Die Zeilen bewirken soviel wie
"Setze UFOSpeicher auf Null, da es kein gUFO gibt, dann setze einen Bodeneinsatz auf den Ursprung 0,0, Bevölkere ihn mit keinem Alien aus einem leeren gUFO und vernichte dann ein nie existierendes gUFO."

Es gibt in Deinem Code keine einzuge Stelle, wo Du dem
gUFO das ursprüngliche UFO zuweist, denn der Befehl beim ZwischenlandungStart wird erst später aufgerufen.


Am besten ist es wohl, wenn Du die Variablen nicht global speicherst sondern übergibst.
Schreibe den Befehl also um in z.B.
Zwischenlandung(UFO:TUFO); und die anderen Befehle äquivalent. Das dürfte einfacher sein als Dir per Forum die unterschiedlichen Definitionsebenen verschiedener Variablen in verschiedenen Funktionen zu erklären.
Dabei musst Du aber aufpasen, das Du mit den Variablen nicht durcheinander kommst - am besten Du benennst die TUFO-Variable bei jeder Funktion anders...
verfasst am: 02.07.2007, 22:13
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Oder vielleicht mal anders beschrieben:
Zitat: LennStar
procedure StartMission;
var
UFO:TUFO;
Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
Flugzahl3: integer; //Wie oft nach der letzten Landung
i: integer;
begin
UFO:=UKI_AAgetUFO;
Allcreate(UFO);
register_UFO(UFO);

und
Zitat: LennStar
Boden.Position:=UFO.Position;
Boden.PopulateFromUFO(UFO);
UFO.Escape;

sind ZWEI VERSCHIEDENE UFOs!!!
Nur weil Du zufällig in beiden Teilen denselben Variablennamen verwendest, sind die Variablen NICHT IDENTISCH
Das in UFO:=UKI_AAgetUFO; erhaltene UFO erreicht zu keinem Zeitpunkt die Funktion Zwischenlandung; - die Variable wird in der Zwischenlandung NIRGENDWO übertragen.
verfasst am: 03.07.2007, 13:45 · Edited by: DirkF
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Nochmal ein paar Infos:
eigentlich ist in Deinem Skript nur eine einzige Zeile zu löschen und es würde sofort perfekt funktionieren.
Der Grund weshalb ich Dir diese Zeile nicht einfach nenne besteht darin, das Du verstehen musst weshalb sie falsch ist - und weshalb der Compiler sie trotzdem für richtig hält. Andernfalls machst Du diesen Fehler immer wieder in allen Skripten...

Es gibt in der Programmierung syntaktische Fehler und logische Fehler. Bei Syntaktischen Fehlern zeigt ein Compiler in 95% aller Fälle die fehlerhafte Zeile an - es gibt nur wenige Ausnahmen wie falsch gesetzte Semikolons bei denen die falsche Zeilenangebe steht.

Bei einem logischen Fehler (und so einer liegt hier vor) zeigt der Compiler dagegen in 95% aller Fälle die Zeile an, wo der Fehler zum ersten mal bemerkt wurde und NICHT die fehlerhafte Zeile selber.
Die vom Compiler als Fehler gemeldeten Zeilen sind also völlig korrekt, und der echte Fehler liegt stattdessen in einer lange vorher stehenden Zeile, die schon längst als angeblich korrekt durchlaufen wurde, es aber nicht ist.

Hier mal ein primitiver Code:
program test;
var 
  Dummy:String;

procedure ausgabe(text:String);
var 
  Dummy: String;
begin
  Dummy:= 'ich verstehe nichts';
  game_api_messagebox(text);
end;

procedure Zwischentext;
var
  Dummy: String;
begin
  Dummy:= 'Hallo Welt';
  ausgabe(Dummy);
end;

procedure StartMission;
begin
  Dummy:='Programm gestartet';
  ausgabe(Dummy);
  Zwischentext;
  ausgabe(Dummy);
end.


Schau Dir mal an was dieser Code wann ausgiebt und weshalb.
Wenn Du jeden Schritt davon nachvollziehen kannst, kannst Du auch den Fehler in Deinem Skript finden...

P.S. eventuell sind oben Syntaxfehler, ich hab das aus dem Kopf ohne Test geschrieben...
verfasst am: 03.07.2007, 21:39 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
eigentlich ist in Deinem Skript nur eine einzige Zeile zu löschen und es würde sofort perfekt funktionieren.

Und mein Problem ist, dass es dann eben NICHT funktioniert - wie ich schon ein ganzes Stück weiter oben gesagt habe.

In StartMission steht schon seit Sonntag Abend keine var UFO mehr drin. Ich hab das irgendwo auch gesagt..
Zitat: LennStar
edit: Wenn ich UFO unter UK_I000 in die var schreibe, wird bei Zwischenlandung UFOSpeicher:=UFO; gemeckert unknown identifier UFO. Und das versteh ich nicht, dass ist doch - durch die unit - auch nur eine prozedur von UKI_000.



program UKI000Forschungsschiff;
uses UKI_AAinit, UKI_ABall, UKI_BAgeo, UKI_Unit_Zwischenlandung;
var
  UFO: TUFO;


procedure Landing;
var
  c: integer;
  d: integer;
  Flugzahl2: integer; //Wie oft zwischen den Landungen
  Landezahl: integer; //Anzahl Landungen

begin
  Flugzahl2:= random(2)+2;
  Landezahl:= random(2)+1;
  for c:=1 to Landezahl do
    begin
      if earth_api_PointOverLand(UFO.Position) then
        begin
          Zwischenlandung;
        end;
      if not earth_api_PointOverLand(UFO.Position) then
        begin
          UFO.FlyToPoint(PositionNear(UFO.position,10));
          if earth_api_PointOverLand(UFO.Position) then
            begin
              Zwischenlandung;
            end;
          end;
      for d:=1 to Flugzahl2 do
        begin
          UFO.FlyToPoint(PositionNear(UFO.position,10));
        end;
    end;
end;

procedure StartMission;
var
  Flugzahl1: integer; //Wie oft ändert das UFO den Kurs vor der ersten Landung
  Flugzahl3: integer; //Wie oft nach der letzten Landung
  a: integer;
  b: integer;
begin
  UFO:=UKI_AAgetUFO;
  Allcreate(UFO);
  register_UFO(UFO);
  UFO.UserKI:=true;
    *register...
  
  Flugzahl1:= random(2)+2;
  Flugzahl3:= random(2)+2;
  for a:=1 to Flugzahl1 do
    begin
      UFO.FlyToPoint(PositionNear(UFO.position,20));
    end;
  Landing;
  for b:=1 to Flugzahl3 do
    begin
      UFO.FlyToPoint(PositionNear(UFO.position,20));
    end;
  UFO.Escape;
end;

begin
  MissionName := 'UKI000Forschungsschiff';
  MissionType := mzUFO;
end.
unit UKI_Unit_Zwischenlandung;
var
  UFOSpeicher: TUFO;

procedure ZwischenlandungStart(Sender:TObject);
begin
  UFO:=UFOSpeicher;
  ufo_api_CreateUFOFromModel(UFO.model);
end;
    
procedure Zwischenlandung;
  var
    Boden: TEinsatz;
    Zeit: longint;

begin
  savegame_api_Message(+.',lmMissionMessage,Nil);
  UFOSpeicher:=UFO;
  Zeit:=random(360)+120;              //Wie lange dauert die Landung: Zufall+2h
  Boden:= einsatz_api_generateEinsatz;
  Boden.Position:=UFO.Position;
  Boden.PopulateFromUFO(UFO);
  UFO.Escape;
  Boden.RemainTime:=Zeit;
  Boden.Name:= +;
  Boden.Objectives:= +';
  Boden.Description:= +';
  Boden.start;
  register_event(@ZwischenlandungStart,Boden,EVENT_ONEINSATZTIMEUP);
end;
end.

verfasst am: 03.07.2007, 22:02
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Da bin ich an einer anderen Stelle durcheinander gekommen - mit ein Grund weshalb Du besser mit übergebenen lokalen statt globalen Variablen arbeiten sollst.

Das UFO muss natürlich vor jeder anderen Funktion definiert werden - die units werden aber aufgerufen, bevor die Variable UFO definiert wird. Dadurch kennen diese die Variable nicht.

Nur - anders herum wird aus der globalen Variable auch ein Schuh draus. Wenn Du UFO:TUFO nämlich in den Unit-Skripten definierst, dann musst Du höllisch aufpassen aus welchem anderen Skript Du die Unit überhaupt aufrufen darfst und was in den anderen Skripten definiert ist.

Deshalb wäre es an dieser Stelle wirklich besser, wenn Du meiner Empfehlung von gestern 22:04 folgst und alle Funktionen so umschreibst, das die Variablen gezielt übergeben werden.
Und die globalen Definitionen erstmal komplett weglässt...

Außerdem wäre es auch mal Interessant zu wissen, für welche anderen Skripte und Funktionen Du die Zwischenlandung alles herausgetrennt hast - units lohnen sich erst wenn sie von mindestens drei verschiedenen Hauptskripten eingebunden werden, und müssen dann zu allen verschiedenen Hauptskripten kompatibel gehalten werden (deshalb das Problem mit in Skripten definierten globalen Variablen).
verfasst am: 03.07.2007, 22:19
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Deshalb wäre es an dieser Stelle wirklich besser, wenn Du meiner Empfehlung von gestern 22:04 folgst und alle Funktionen so umschreibst, das die Variablen gezielt übergeben werden.

Wovon ich keine AHnung habe. Wollt ich nur noch mal gesagt haben...
müsste ich dann also überall procedure xxx(UFO:TUFO); schreiben?
Zitat: DirkF
Das dürfte einfacher sein als Dir per Forum die unterschiedlichen Definitionsebenen verschiedener Variablen in verschiedenen Funktionen zu erklären.

Das erscheint mir wiederum einfach.
Zitat: DirkF
Außerdem wäre es auch mal Interessant zu wissen, für welche anderen Skripte und Funktionen Du die Zwischenlandung alles herausgetrennt hast

Im Moment nur das eine. Aber Landungen werden nicht nur in einem script benutzt. Das einzige Problem das ich da sehe, ist vllt. die Zeitdauer der Lanung.
Der Rest an der Sache wird ja im Hauptscript erledigt, so dass man die Unit auch für Terrorangriffe, Frachttransporter zu Alienbasen etc. nutzen könnte.
verfasst am: 03.07.2007, 22:46 · Edited by: DirkF
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Wovon ich keine AHnung habe. Wollt ich nur noch mal gesagt haben...
müsste ich dann also überall procedure xxx(UFO:TUFO); schreiben?

Wenn Du das UFO übergeben willst. Ich gebe Dir mal ein Beispiel wie man das lösen könnte, wobei ich ausdrücklich mit den Namen spiele um zu verdeutlichen, das eine Benennung immer nur lokal wirksam ist. Der Code oben ist übrigens immer noch unsauber, ich zeige mal eine bessere Lösung:
procedure Zwischenlandung(Lander:TUFO;Zeit:Integer);
  var
    Boden: TEinsatz;
begin
  savegame_api_Message(+.',lmMissionMessage,Nil);
  UFOSpeicher:=Lander;
  Zeit:=random(360)+Zeit;              //Wie lange dauert die Landung: Zufall+übergebene Basiszeit
  Boden:= einsatz_api_generateEinsatz;
  Boden.Position:=Lander.Position;
  Boden.PopulateFromUFO(Lander);
  Lander.Escape;
  Boden.RemainTime:=Zeit;
  Boden.start;
end;

  (schnipp)
  while (not earth_api_PointOverLand(UFO.Position)) do
       // FEHLER: KLAPPT NICHT MIT FLYTOPOINT
       // Ich lasse es trotzdem drin um den Befehl zu zeigen
       // Siehe folgetext mit erklärung
       // UFO.FlyToPoint(PositionNear(UFO.position,10));
  Zwischenlandung(UFO,120);
  // For-Schleife funktioniert ebenfalls nicht mit 
  // FlyToPoint!!!
  //for d:=1 to Flugzahl2 do
  //  begin
      UFO.FlyToPoint(PositionNear(UFO.position,10));
  //  end;
  (schnipp)


Übrigens: Noch ein Fehler in dem Originalscript sind fehlerhafte Einrückungen bei den end; Befehlen.
Das erzeugt zwar keine direkten Fehler, aber Du kannst dann selber kaum erkennen, welches end; zu welchem begin gehört.
Und wenn Du da durcheinander kommst und eines vergisst, ist das eine Hölle in der Fehlersuche.
In diesem Fall ist das zweite end; nach der Zwischenlandung; zuweit eingerückt (das gehört zwei Buchstaben weiter nach vorne). Abgesehen davon ist die begin/end-Klammer um Zwischenlandung unnötig, da es dort nur den einen Befehl gibt - begin und end benutzt man um mehrere Befehle zu einem Bearbeitungsblock zusammenzuschließen.

Und Dein Problem der Zeitdauer der Landung ist auch schon gleich mit gelöst...

EDIT:
Siehe nächsten Text...

Seite: << [1] [2] [3] [4] [5] [6] [7] [8] 9 [10] .. [17] [18] >>




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

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