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] ... [9] [10] [11] [12] [13] [14] 15 [16] [17] [18] >>

Autor Mitteilung
verfasst am: 31.07.2007, 15:08
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
if (Sender = nil) then
  exit;

am Anfang ist bedeutend sicherer und kürzer. Aber ob es das Problem behebt ... macht bitte einen entsprechenden Mantis-Eintrag, dann vergesse ich nicht danach zu schauen ;)
verfasst am: 31.07.2007, 15:22
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: Jim_Raynor
am Anfang ist bedeutend sicherer und kürzer

Stimmt. Ich hatte nur nicht mehr im Kopf, ob es break; oder exit; war - daher der umständliche Weg ;)

Zitat: Jim_Raynor
Aber ob es das Problem behebt

Hmm, anscheinend doch nicht. Bei mir hat es einmal funktioniert - aber ist nicht reproduzierbar *grml*
verfasst am: 31.07.2007, 15:34 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Bei mir auch nicht.
verfasst am: 31.07.2007, 22:18
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
MMh. So richtig kann ich das nicht nachvollziehen alles. Aber nach UFO.Escape darfst du nicht mehr auf das UFO und auch nicht mehr auf die Events zugreifen. Also UFOEvent.Free nach UFO.Escape ist ganz schlecht, wenn sich das UFOEvent auf das UFO bezieht ... Da mit dem Löschen eines Objektes auch alle Events gelöscht werden.
verfasst am: 31.07.2007, 22:46 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Auch andersrum ändert nichts.

Aber ich wieder den Eindruck gehabt, dass sich das UFO nach dem eigentlich letzten Befehl noch einmal bewegt hat. Leider ist das oft sehr schlecht zu sagen, da die UFOs alle von der Antarktis magisch angezogen werden und die Gradnetze da ja sehr eng werden...
Falls Natter das bestätigen kann, hat es vllt. was mit dem Fehler zu tun.
edit: Ich hatte bei 9: UFO.KISTep:= 19-Flugzahl3; noch eine +1 reingesetzt, weil ich (noch heute früh) den Eindruck hatte, das UFO fliegt einmal zu oft. (Da war der Zufall noch drin. Jedenfalls ergibt sich das aus der folgenden Zeile.) Jetzt habe ich die +1 gelöscht, und jetzt ist das UFO 3 Mal nach der letzten Landung geflogen statt einmal, oder zweimal bei +1. Also immer 1 Mal zu viel, wenn ich nicht völlig blind bin.

Zur Sicherheit hier nochmal der aktuelle code.
program UKI000Forschungsschiff;
uses UKI_AAinit, UKI_ABall, UKI_BAgeo;
var
  Landezahl: integer; //Anzahl Landungen
  Flugzahl1: integer; //Wie #
  Flugzahl2: integer; //Wie oft zwischen den Landungen
  Flugzahl3: integer; //Wie oft nach der letzten Landung
  UFOCast : Integer;
  UFOEvent:TEvent;


procedure ZwischenlandungStart(Sender:TObject);
var
  UFO:TUFO;
begin
  UFO:=TUFO(UFOCast);
  UFO.FlyToPoint(UFO.position);
end;

procedure Zwischenlandung(UFO:TUFO);
  var
    Boden: TEinsatz;
    Zeit: longint;

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




procedure UKICommandComplete(Sender:TObject);
var
  UFO:TUFO;
begin
  if (Sender = nil) then
  exit;
  
  UFO:=TUFO(sender);
 { if (not (Sender = Nil)) then            //
  UFO:=TUFO(sender);                      //
  if (not (UFO = Nil)) then  }             //
  case UFO.KIstep of
    0,1,2,3,4,5,6,7,8:
      begin
        UFO.KIStep:=UFO.KIStep+1;
        UFO.FlyToPoint(PositionNear(UFO.position,20));
      end;
    9:
      begin
        if (Landezahl>0) then
          begin
            if (earth_api_PointOverLand(UFO.Position)=true) then
              begin
                Zwischenlandung(UFO);
                UFO.KIStep:= 9-Flugzahl2;
                Landezahl:= Landezahl-1;
              end
            else UFO.FlyToPoint(PositionNear(UFO.position,20));
          end
        else
          begin
            UFO.KISTep:= 19-Flugzahl3;
            UFO.FlyToPoint(PositionNear(UFO.position,20));
          end;
      end;
  10,11,12,13,14,15,16,17,18:
              begin
                UFO.KIStep:=UFO.KIStep+1;
                UFO.FlyToPoint(PositionNear(UFO.position,20));
              end;
          19: begin
                UFOEvent.free;
                UFO.Escape;
              end;
  end;
  
end;


procedure StartMission;
var
  UFO: TUFO;

begin
//  {$IFNDEF Skriptedit}
//  UFO:=UKI_AAgetUFO;
//  Allcreate(UFO);
//  {$ENDIF}
//  {$IFDEF Skriptedit}
//  UFO:=ufo_api_createUFO;
//  {$ENDIF}
  UFO:=UKI_AAgetUFO;
  Allcreate(UFO);
  register_UFO(UFO);
  UFO.UserKI:=true;
  Flugzahl1:= random(0)+1;    //Flüge vor 1. Landung
  Flugzahl2:= random(0)+1;    //Flüge zwischen Landungen
  Flugzahl3:= random(0)+1;    //Flüge nach allen Landungen
  Landezahl:= random(0)+2;    //Landungen
    // die allgemeinen Reaktionsfunktionen auf UFO-Ereignisse werden zugeordnet
  UFOEvent:=register_event(@UKICommandComplete, UFO, EVENT_ONUFOCOMMANDCOMPLETE);
  UFO.FlyToPoint(PositionNear(UFO.position,20));
  UFO.KIStep:= 9-Flugzahl1;


end;

begin
  MissionName := 'UKI000Forschungsschiff';
  MissionType := mzUFO;
end.
verfasst am: 31.07.2007, 22:57
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: Jim_Raynor
Da mit dem Löschen eines Objektes auch alle Events gelöscht werden.

Da ist halt offen ob das wirklich klappt - wenn mit dem Löschen des UFOs auch die Events auf das UFO gelöscht worden wären, dann hätte nach dem UFO.Escape niemals das CommandComplete wirksam werden können, denn das ist ja an ein Event des UFOs gekoppelt.
Da ist auf jeden Fall was im Programmcode unsauber, und solange der Fehler nicht behoben ist bringt es nicht mehr viel, das per Skript abzufangen - wer weiß wie das umgestellt werden muss um den Originalfehler zu beheben...
verfasst am: 31.07.2007, 23:00
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Da ist auf jeden Fall was im Programmcode unsauber, und solange der Fehler nicht behoben ist bringt es nicht mehr viel, das per Skript abzufangen - wer weiß wie das umgestellt werden muss um den Originalfehler zu beheben...

Mein edit zu der FLuganzahl beachet? Jetzt bin ich damit auch fertig (hatte noch nen Fehler drin)
verfasst am: 01.08.2007, 00:35 · Edited by: Jim_Raynor
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Ich verlagere mal die Diskussion wegen dem 1623 in den Bugtracker. Ich blicke nämlich nicht mehr durch.
verfasst am: 01.08.2007, 09:29
Programmierer

Registrierdatum: 23.08.2003, 19:16

 Beiträge: 2261
Mir ist noch was zu dem Skript eingefallen. Die Sache mit UFOCase und Integer ist sehr gefährlich. Man kann ein Objekt nur in einen Integer umwandeln, da intern ein Objekt als Zeiger gespeichert wird. Man hat also im Integer dann einen Zeiger auf den physischen Arbeitsspeicher des Objektes. Dies geht solange gut, bis man den Spielstand speichert und neulädt. Dann führt es zu massiven Problemen. Man kann es nur mit solchen Cast machen, wenn sicher gestellt ist, dass man zwischendurch nicht speichern kann. Zu dem ist dies auch nur notwendig, wenn man die game_api-Globalen Variablen verwendet, da es hier kein Objekt gibt. Wenn man es nur im Austausch mit dem gleichen Skript benötigt, kann man gleiche eine Variable vom Typ TUFO machen und spart sich die gesamte Casterei. Zudem ist dann auch sichergestellt, dass es mit dem speichern und laden funktioniert.
verfasst am: 01.08.2007, 12:20
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: Jim_Raynor
Die Sache mit UFOCase und Integer ist sehr gefährlich.

Ist bekannt, das war auch mehr ein Test von Natter ob das hilft und funktioniert (und im UKI dient das Cast-Konstrukt ja nur zur Übergabe und wird sofort wieder gelöscht, so schnell kann niemand speichern).
Sollte aus diesem Skript tatsächlich besser wieder herausgenommen werden, da es nichts gebracht hat...
verfasst am: 01.08.2007, 16:35 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Wäre nett, wenn ihr - falls ihr das Problem gefixt habt - das mit meinen script testet und mir die fertige Version gebt ;)

---------

Es gibt noch kein Tutorial für die Einführung von Schwierigkeitsgrads-dingsbums, oder hab ich das übersehen? (wie soll man das eigentlich nennen? Einstellmöglichkeiten? Bissl lang.)

Ich will nämlich demnächst einen Modifikator einfügen, der in den scripten die Zahlen etwas ändert. Und er soll auch die Aliens ändern. Was heißt, ich muss wahrscheinlich für jeden Schwierigkeitsgrad eigene Aliens anlegen, und die dann an/ausschalten bzw. die UFOs.
Das Problem damit ist nur: Wie kann ich dann auf Autopsien basierende Forschungen machen, ohne die ganze Forschungskette einmal pro Schwierigkeitsgrad einzugeben?
Das einzige, was mir spontan einfällt, wäre ein eigenes script für jede Autopsie, das als Voraussetzung die Autopsie hat und die Forschung freischaltet.
verfasst am: 01.08.2007, 16:41
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: LennStar
Was heißt, ich muss wahrscheinlich für jeden Schwierigkeitsgrad eigene Aliens anlegen, und die dann an/ausschalten bzw. die UFOs.

Ich habs zwar nicht ausprobiert, aber es sollte möglich sein (da du die UFOs ja selbst erzeugst), die Werte der Aliens je nach Schwierigkeitsgrad anzupassen. Ist vielleicht einfacher (vor allem wegen der Forschungsketten).
verfasst am: 01.08.2007, 16:42
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Und er soll auch die Aliens ändern. Was heißt, ich muss wahrscheinlich für jeden Schwierigkeitsgrad eigene Aliens anlegen, und die dann an/ausschalten bzw. die UFOs.

genau - oder fast.
Wenn es nur um einige Werte geht kannst Du auch einen Faktor im Skript einsetzen, aber dann musst Du praktisch den Bodeneinsatz manuell mit Aliens bestücken (ohne PopulateFromUFO), was auch wieder Arbeit ist.

Zitat: LennStar
Das Problem damit ist nur: Wie kann ich dann auf Autopsien basierende Forschungen machen, ohne die ganze Forschungskette einmal pro Schwierigkeitsgrad einzugeben?
Das einzige, was mir spontan einfällt, wäre ein eigenes script für jede Autopsie, das als Voraussetzung die Autopsie hat und die Forschung freischaltet.

stimmt, so mache ich das auch mit einigen Technologien im GalWar.
verfasst am: 01.08.2007, 16:57 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
aber dann musst Du praktisch den Bodeneinsatz manuell mit Aliens bestücken (ohne PopulateFromUFO), was auch wieder Arbeit ist.

eben. Das will ich möglichst vermeiden. In meine Aliens_Active kann ich einfach eine zweifache if für die drei Schwierigkeitsgrade einbauen und die IDs austauschen. Und dann kann ich Alienwerte, falls es sich beim testen als nötig erweist, ganz einfach im editor ändern - ganz unabhängig von der Schwierigkeitsgrad-Zahl selbst. Was auch für das Auftauchen geht. So kann ich auch nicht-global das Erscheinen ändern - oder einzelne Aliens ganz aus dem einfachsten SKG raushalten.

Aber meine eigentlich Frage, wie man den SKG-Modifikator (doch wieder dieses Wort *g*) festlegt/registiert/ausliest oder was auch immer, ist nicht beantwortet. Im editor kann ich ja einen Eintrag einlegen, und der interne Name wär dann die globale Konstante, die ich im script benutzen muss?

btw: Wann kommt denn eine Erklärung zu
tactic_api_AddButton *)
tactic_api_RemoveButton *)
verfasst am: 01.08.2007, 17:12 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: DirkF
aber dann musst Du praktisch den Bodeneinsatz manuell mit Aliens bestücken (ohne PopulateFromUFO), was auch wieder Arbeit ist.

Zitat: LennStar
eben. Das will ich möglichst vermeiden.

Wieso? Verändere doch einfach die Alienwerte im UFO. Beispiel:
program YourName;

procedure StartMission;
var
  Alien : TAlien;
  UFO : TUFO;
  dummy : Integer;
begin
  UFO := ufo_api_CreateUFO;
  for dummy:=0 to  UFO.Besatzung - 1 do
  begin
    Alien := UFO.GetAlien(0);
    Alien.Ges := 1000;
    UFO.RemoveAlien(0);
    UFO.AddAlien(Alien);
  end;
  UFO.Visible:=true;
  UFO.Position:=earth_api_randomPoint(true);
  register_UFO(UFO);

end;

begin
  // Hier darf kein weiterer Code folgen
  // Missionsname festlegen
  MissionName := 'YourName';

  // Missionstype festlegen 
  //   mzUFOs = alle mit register_ufo registrierten UFOs müssen zerstört werden
  //   mzUser = müssen muss mit Mission_Win oder Mission_loose abgeschlossen werden
  MissionType := mzUFO;
end.


OK, die aktuellen Trefferpunkte eines ALiens zu erhöhen ist natürlich etwas ungünstig, da das dann im Bodeneinsatz zu Anzeigefehlern führt (Grüner Balken wird Breiter als der vorgesehene Rahmen). Wenn man aber als Standardwert den höchsten Wert (also höchste SG) nimmt, kann man dann in den anderen SGs die Aliens eines abgeschossenen UFOs verletzt starten lassen - was ja auch plausiebel ist (im übrigen - war das nicht mal ein Featurewunsch gewesewn?).

Nachteilig ist halt, dass man damit nicht die Eigenschaften aus dem Alienmodel manipulieren kann. Kommt also darauf an, welche Werte du ändern willst.
verfasst am: 01.08.2007, 17:19
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Im editor kann ich ja einen Eintrag einlegen, und der interne Name wär dann die globale Konstante, die ich im script benutzen muss?

genau, die ist dann automatisch angelegt und kann mit game_api_getinteger etc. ausgelesen werden.
verfasst am: 01.08.2007, 17:20
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: LennStar
Aber meine eigentlich Frage, wie man den SKG-Modifikator (doch wieder dieses Wort *g*) festlegt/registiert/ausliest oder was auch immer, ist nicht beantwortet.

Schau mal ins Beispielskript GlobalVars, oder noch besser in den default-Spielsatz. Dort hab ich den SG im Skript Katastrophen verwendet, um die Länge zwischen 2 Katastrophen festzulegen. Ach ja, ich hab dafür beim SG die Variable Dooms angelegt (weil ich das auch im ShowDown verwende - das Skript ist aber etwas länger).
verfasst am: 01.08.2007, 20:03
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: Natter
Nachteilig ist halt, dass man damit nicht die Eigenschaften aus dem Alienmodel manipulieren kann. Kommt also darauf an, welche Werte du ändern willst.

Naja, wo merkt der Spieler was? Trefferpunkte, Zeiteinheiten und ev. noch Sichtweite. Wobei das auch nicht unbedingt so 1:1 übertragbar ist. Ein Alien mit 40 Trefferpunkten 10 abzuziehen ist etwas extrem - einem Alien mit 200 Trefferpunkten 10 abziehen wird wohl kaum bemerkbar sein, wenn nicht die Waffen genau darauf abgestimmt sind ;)

Übrigens sehe ich nicht, wie du in deinem script a) nach SKG auswählst und b)eine vernünftige Verteilung erreichen willst.
Wenn ich das einbauen würde - mit Wahrscheinlichkeitsverteilungen etc. dann wäre das script wahrscheinlich 3 Seiten lang.
Da ist es doch wesentlich einfacher, am Anfang nach Schwierigkeitsgrad UFOS zu aktivieren/deaktivieren und die SKG-Abfrage in die Aliens_Active einzubauen. Und viel einfacher zu ändernde Werte.

Zitat: DirkF
und kann mit game_api_getinteger etc. ausgelesen werden.

Also müsste ich dann in jedem script, das auf den SKG Bezug nimmt, eine Variable anlegen und mit getinteger den Wert abrufen?
Oder kann ich mit game_api_RegisterInteger die Konstante für das ganze Spiel verfügbar machen?

game_api_RegisterInteger('SKG');
SKG:=game_api_GetInteger('SKGausDemEditor');
verfasst am: 01.08.2007, 20:31
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Also müsste ich dann in jedem script, das auf den SKG Bezug nimmt, eine Variable anlegen und mit getinteger den Wert abrufen?
Oder kann ich mit game_api_RegisterInteger die Konstante für das ganze Spiel verfügbar machen?

Weder - noch

In dem Moment, indem Du den Wert im Fenster des Schwierigkeitsgrades eingibst kannst Du ihn überall im Spiel abrufen - eine Registrierung per Skript würde sogar einen Fehler "Ist schon registriert" melden.
Es ist nur der Get-Befehl zum abruf nötig und eventuell der Set-Befehl, wenn Du den Wert (und den Schwierigkeitsgrad) im Spiel verändern willst.
verfasst am: 01.08.2007, 22:00 · Edited by: Natter
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: LennStar
Übrigens sehe ich nicht, wie du in deinem script a) nach SKG auswählst und b)eine vernünftige Verteilung erreichen willst.

Wer sagt, das ich das wollte? Ich hab dir nur das Prinzip aufgezeigt. Den Rest wollte ich dir überlassen (weiß doch eh nicht, wie du das genau umgesetzt haben willst). Was das mit dem SG-abhängig angeht, dazu hatte ich doch auf den default verwiesen, da gibts 2 Beispiele.

Zitat: LennStar
Wenn ich das einbauen würde - mit Wahrscheinlichkeitsverteilungen etc. dann wäre das script wahrscheinlich 3 Seiten lang.

Wozu willst du eine Wahrscheinlichkeitsverteilung? Die legst du doch beim UFO fest. Oder sollen bei einem höheren SG mehr Sniper kommen, und bei einem niedrigeren mehr Wissenschaftler? Das wäre in der Tat im Skript etwas aufwendiger. Wenn aber nur die einzelnen Aliens stärker/schwächer werden sollen, dann wird das Skript ganz sicher nicht 3 Seiten lang. Eigentlich fehlen da blos ein paar Zeilen.

Seite: << [1] ... [9] [10] [11] [12] [13] [14] 15 [16] [17] [18] >>




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

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