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: 27.05.2006, 19:22
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Man kann kein procedure in ein anderes schreiben, richtig?
***
Also entweder ich versteh dich nicht, oder du mich nicht ^^ Oder eher: Du weißt nicht, warum ich das mit dem false gefragt habe.
Was genau sagt denn nun das repeat aus?
Ich dachte, das event.active:=true sorgt dafür, dass sich das Ziel nach dem Zeitabstand immer wieder wiederholt, während false es nur 1 einzige Mal auslöst.
Denn ansonsten müssten ja bei hintereinandergeschalteten events das 1. und 2. getrennt losgehen, statt dass das 1. läuft und läuft, und das 2. nur Ausgelöst wird, wenn die Bedingung eingetreten ist. Das ist nämlich, was ich will.

Hier mein Ergebnis, wenn ihr sagt, das klappt so, dann bau ich es ins Spiel und probiers. Ansonsten könnte es eine ganze Spielwoche dauern, bis ich es mal am richtigen Ende habe ^^

program Ressourcensammler;
  var
   onedayrepeat : TTimerEvent;        //scriptwiederholer
   Xhourwait: TTimerEvent;            //#

procedure SammlerEreignis(Sender:TObject);
  var
    Auswahlzahl: integer;  //Zufallszahl für Missionstyp
    ZZahl: integer;        //Anzahl
    ZielBasis: TBasis;
begin
  Auswahlzahl:= random(10);
   if (Auswahlzahl)<3 then
    begin
     ZielBasis:= basis_api_GetMainBase;
     ZZahl:= random(10)+1;
     lager_api_PutItems(ZielBasis.ID,1476478364,ZZahl);   //Elektronikschrott
     ZZahl:= random(10)+7;
     lager_api_PutItems(ZielBasis.ID,72216835,ZZahl);     //Kunststoffreste
     ZZahl:= random(10)+5;
     lager_api_PutItems(ZielBasis.ID,132230505,ZZahl);    //Metallschrott
     ZZahl:= random(10)+3;
     lager_api_PutItems(ZielBasis.ID,3056462527,ZZahl);   //Stahlschrott
     savegame_api_Message(#. ',lmMissionMessage,Nil);  //Win-Nachricht, Belohnung
    end
   else
    begin
      mission_api_StartSkript('Ressourcenbeschaffung');
    end;
end;


procedure SammlerSchicken(Sender:TObject);
 var
    Losschicken: Boolean;  //Sammler loschicken ja/nein
begin
  Losschicken:= game_api_Question(#' ,'Sammler ausschicken?');
  if not (Losschicken) then
    begin
      game_api_MessageBox(#.');
    end
  else
    begin
      Xhourwait:=register_timed_event(@SammlerEreignis,nil,random(250)+150); 
      Xhourwait.repeated:=true;
    end;
end;



procedure StartMission;

begin
  onedayrepeat:=register_timed_event(@SammlerSchicken,nil,1440);
  onedayrepeat.repeated:=true;
end;



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

  // 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 := mzUser;
end.
verfasst am: 27.05.2006, 21:08 · Edited by: DirkF
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Was genau sagt denn nun das repeat aus?
Ich dachte, das event.active:=true sorgt dafür, dass sich das Ziel nach dem Zeitabstand immer wieder wiederholt, während false es nur 1 einzige Mal auslöst.

Du verwechselst die Eigenschaften active und repeated, die haben nichts miteinander zu tun.

repeated:=false bedeutet das das event einmal nach der angegebenen Zeit ausgelöst wird, danach nicht mehr und ist die voreinstellung.
repeated:=true bedeutet das das event direkt nach der Auslösung wieder neu zählt und nach dem Ablauf der Zeit auch erneut ausgelöst wird.

active:=true bedeutet das das event ganz normal stattfindet und ist die Voreinstellung.
active:=false bedeutet das das event abgeschaltet ist und niemals auslöst - egal ob es auf repeated steht oder nicht.

Deshalb kann man die Eigenschaft active benutzen um ein repeated-Event pausieren zu lassen, ohne das man die Eigenschaften wann es wiederholt wird auslesen oder verändern müsste.
*************
Kommen wir dann mal zur Analyse was Dein Script macht - ob das Verhalten korrekt ist oder nicht kannst nur Du entscheiden.

Einmal am Tag, beginnend einen Tag nach Skriptstart (nicht sofort) erscheint eine Abfrage, ob ein Sammler ausgeschickt werden soll.

Wenn diese Anfrage bejaht wird, dann wird für diesen Tag der Zeitabstand festgelegt auf zufällige 150-400 Minuten.
In diesen für den gesamten Tag festgelegten Zeitabständen wird dann dass Sammlerereignis stattfinden.
Wenn also der Zufall eine 150 ergibt dann wird es im Abstand von je 150 Minuten insgesamt 9 Sammler an diesem Tag geben, wenn der Zufall 400 ergibt dann wird es nur 3 Sammler an diesem Tag geben.

Nach einem Tag erfolgt dann eine erneute Abfrage ob die Sammler geschickt werden sollen, und wenn dann wieder auf Ja geklickt wird dann wird der Zeitabstand und das Ereignis vom Vortag gelöscht und neu gezählt bis zur neuen Zufallsgrenze diesen Tages.
Wenn Du dagegen bei der Abfrage auf "nein" klickst und keinen Sammler schicken willst, dann läuft einfach das event vom Vortag weiter und produziert neue Sammler, ohne eine neue Zufallszeit festzulegen...

Irgendwie glaube ich nicht das Du das bewirken wolltest ;-)

Schau Dir mal die Zeitsteuerungen in SPS001 und CON002 aus der Demo des galaktischen Krieges an, die machen wohl eher sowas wie geplant (ignoriere dabei alle Funktionsaufrufe die nicht im gleichen Script stehen - alles was zur Zeitsteuerung gehört steht jeweils in dieser einen Datei drin, wobei SPS001 eine regelmäßige und CON002 eine unregelmäßig wiederholte Timerevents erzeugt...
verfasst am: 27.05.2006, 22:09
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Irgendwie glaube ich nicht das Du das bewirken wolltest ;-)

Nee.
Einmal am Tag die Frage, ob Sammler geschickt werden sollen.
Wenn nein, passiert nichts bis zum nächsten Tag.
Wenn ja, soll nach der Zufallszeit random(250)+150 eines der folgenden Ereignisse auftreten.

Wenn ich das richtig verstanden habe, müsste ich nur
Xhourwait.repeated:=true; false machen, und dann stimmt es.
Die Sammler "gehen los" und nach (250)+150 Minuten passiert dann eines der Ergebnisse (procedure SammlerEreignis). Und zwar nur 1 Mal am Tag.
(Darum hatte ich das auf der vorigen Seite gefragt. Wie ich auf "Ich dachte, das event.active:=true sorgt dafür" gekommen bin, weiß ich nicht. Wahrscheinlich hab ich mir das in der online-Doku angesehen, und da einfach das falsche noch im Kopf gehabt.)
verfasst am: 27.05.2006, 22:18
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Es reicht wenn Du
Xhourwait.repeated:=true;
einfach löschst, false ist die Voreinstellung.
Dann macht das Skript das was Du willst.
verfasst am: 27.05.2006, 22:40
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Noch mal ne ganz andere Sache zu dem Skript - Du solltest Dir für den Spielsatz einen Nachteil dafür überlegen, ob der Sammler ausgeschickt werden soll.
Wenn es nur darum geht entweder kostenlose Resourcen oder einen Bodeneinsatz mit anschließend mehr kostenlosen Resourcen zu erhalten, dann macht eine Frage auf Ja/Nein rein von der Handlungslogik Deines Spielsatzes keinen Sinn.
Wenn der Sammler also weder Kosten noch sonstige Nachteile hat dann wird jeder Spieler immer mit Ja antworten.

Ob Du nun bei jedem Losschicken einfach nur Credits abziehst oder z.B. die Sammler als Pseudo-Lager-Item anlegst und dann bei jedem Flug eine Chance besteht den Sammler zu verlieren (worauf dieser erst nachproduziert werden muss) oder sonstwie ist egal, aber irgendeinen Nachteil solltest Du einsetzen. Sonst kannst Du die Abfrage gleich weglassen und den Sammler automatisch abschicken...
verfasst am: 17.06.2006, 23:27
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Wenn der Sammler also weder Kosten noch sonstige Nachteile hat dann wird jeder Spieler immer mit Ja antworten.

Naja, du hast die Gefahr eines Bodeneinsatzes, und falls deine Soldaten verletzt sind...
Außerdem kann ja auch dein Lager voll sein, und da ein Handeln nicht möglich ist, musst man die Vermehrung irgendwie stoppen können.
Und ansonsten ist es einfahc noch eine alphaversion ;)

Oder anders ausgedrückt: Vorläufig geht es nicht ohne Frage, also bleibt sie drin.
*****

Aber zum Thema dieses threads:

Gibts irgendwo schon ein script mit PopulateFromUFO?
Und was muss ich machen, um die Besatzung von 2 UFOs zu bekommen? Oder muss ich das dann einzeln machen per ID und Anzahl?
verfasst am: 18.06.2006, 01:51
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Gibts irgendwo schon ein script mit PopulateFromUFO

Das geht ganz einfach:

// Wird mit Angabe eines UFOs aufgerufen, um einen 
// Bodeneinsatz mit der Besatzung des UFOs zu erzeugen
procedure Bodeneinsatz(UFO:TUFO);
var
  Einsatz:TEinsatz;
begin
  Einsatz:=einsatz_api_generateeinsatz;
  einsatz.populatefromUFO(UFO);
  einsatz.start;
end;


Zitat: LennStar
Und was muss ich machen, um die Besatzung von 2 UFOs zu bekommen? Oder muss ich das dann einzeln machen per ID und Anzahl?

Kann ich nicht sagen, wahrscheinlich aber einfach den populatefromUFO zweimal mit verschiedenen UFOs aufrufen.

Solange Jim bei einem populate nicht die alten Aliens im Bodeneinsatz löscht sollte das klappen - alternativ musst Du aber wirklich das erste mit populate und danach mit addalien über ID arbeiten, das klappt auf jeden Fall.
verfasst am: 18.06.2006, 14:13
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
So weit war ich schon im Grunde, nur wie sag ich dem UFO, welches UFO es ist?
verfasst am: 18.06.2006, 20:32
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Das UFO muss natürlich eines sein das Du vorher selber erzeugt hast - das funktioniert nicht mit den automatischen Zufallsufos.
Und die UFO-Erzeugung funktioniert dann ganz normal mit ufo_api_createUFO bzw. ufo_api_createUFOFromModel.
(Du kannst das so erzeugte UFO auch sofort mit escape löschen, wenn es nur um die Alienauswahl ging).

D.h. wenn Du die Bodeneinsätze auch bei Zufallsufos steuern willst, dann musst Du wie in den Skripten zum galaktischen Krieg die komplette automatische Zufallserzeugung abschalten und eine eigene Zufallsroutine zur UFO-Erzeugung per Skript schreiben.
verfasst am: 18.06.2006, 20:51
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Das UFO muss natürlich eines sein das Du vorher selber erzeugt hast - das funktioniert nicht mit den automatischen Zufallsufos.

Ich will aber gar kein UFO erzeugen (in diesem Fall), ich will nur den Bodeneinsatz. Das (die) UFO soll sozusagen unbemerkt gelandet sein.
verfasst am: 18.06.2006, 20:58
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Zitat: LennStar
Ich will aber gar kein UFO erzeugen (in diesem Fall), ich will nur den Bodeneinsatz. Das (die) UFO soll sozusagen unbemerkt gelandet sein.

Antwort:
Zitat: DirkF
Du kannst das so erzeugte UFO auch sofort mit escape löschen, wenn es nur um die Alienauswahl ging

Also UFO erzeugen, Bodeneinsatz erzeugen, Aliens zuordnen, UFO mit escape vernichten.
Wenn das alles in einem Skript gemacht wird sollte das UFO theoretisch nie auf dem Geoscape auftauchen.

Alternativ kannst Du auch nur das UFOMOdell auswählen und die Eigenschaft AlieninUFO abgreifen, um die richtigen Aliens einfach per addalien dem Bodeneinsatz zuzuweisen - dann erspart man sich die lange Suche nach den Alien-IDs.
verfasst am: 19.06.2006, 17:00
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: DirkF
Wenn das alles in einem Skript gemacht wird sollte das UFO theoretisch nie auf dem Geoscape auftauchen.

Nein, aber es wird wahrscheinlich die "UFO entkommen" Meldung erscheinen. Ich werd wohl also doch das mit dem UFOMOdell machen müssen, nur hab ich das gestern Abend einfach nicht hingekriegt, als ich mal ausprobiert habe. .

Jetzt hab ich bei dem EVENT_ONEINSATZ_WIN wieder mal ein type mismatch, was stimmt nicht?


program story_bodenmission_ufoforschung;

procedure UfoEinsatzWin;
begin
  savegame_api_Message(#',lmMissionMessage,Nil);
  science_api_ActivateProject(1991247765);
end;

procedure UfoEinsatzLoose;
begin
  savegame_api_Message(#.',lmMissionMessage,Nil);
  //wiederholung 3-5 Tage
end;

procedure StartMission;
    var
    UfoEinsatz: TEinsatz;
    UFO: TUFO;

begin
  UFO:= ufo_api_CreateUFO;
  UfoEinsatz:= einsatz_api_generateEinsatz;
  UfoEinsatz.PopulateFromUFO(UFO);
  UFO.Escape;
  UfoEinsatz.Name:= 'Kaperung des notgelandeten UFOs';
  UfoEinsatz.Objectives:= #;
  UfoEinsatz.Description:= #;
  UfoEinsatz.start;
  register_event(@UfoEinsatzWin,UfoEinsatz,EVENT_ONEINSATZWIN);
  register_event(@UfoEinsatzLoose,UfoEinsatz,EVENT_ONEINSATZLOOSE);

end;

begin
  MissionName:='story_bodenmission_ufoforschung';
  MissionType:=mzUser;
end.
verfasst am: 19.06.2006, 17:02
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Die Nachrichtenfunktionen brauchen ein Objekt-Feld zur Übergabe, auch wenn Du es nie benutzt.

UFOEinsatzWin(Einsatz:TEinsatz);
verfasst am: 19.06.2006, 17:57 · Edited by: LennStar
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Genau das hab ich gehabt, aber da hats das selbe angezeigt. Jetzt auch wieder. Egal ob mit Einsatz, UfoEinsatz oder was auch immer, ich hab da schon ne Menge durchprobiert. (Gerade weil ich gedacht habe, an der Stelle liegt der Fehler.)
verfasst am: 19.06.2006, 18:32
Registrierdatum: 14.06.2006, 19:44

 Beiträge: 16
procedure UfoEinsatzWin(Sender:TOBJECT);
procedure UfoEinsatzLoose(Sender:TOBJECT);

So könnte es vielleicht gehen. :o) Aber nur vielleicht. :o)
verfasst am: 19.06.2006, 19:15
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Das hatte ich als erstes, da gings nicht. Jetzt ja, vielleicht hatte ich ja statt Object Objekt stehen? Ist mir schon mal passiert.

Dafür ist jetzt "EVENT_ONEINSATZLOOSE" ein unbekannter identifier O.o
verfasst am: 19.06.2006, 19:20 · Edited by: azrael666
Registrierdatum: 14.06.2006, 19:44

 Beiträge: 16
Vielleicht
EVENT_ONEINSATZLOSE
Hört sich auf jedenfall an, als würdest du versuchen ein nichtvorhandenes Macro zu benutzen.
(Es könnte auch sein, dass es noch garkein EVENT_ONEINSATZLOSE gibt, zumindest bei der Liste die ich hier im Forum gefunden habe nicht. Wäre auch möglich, dass es ein Standardevent gibt, dass automatisch bei einem verlorenen Einsatz aufgerufen wird. )
verfasst am: 19.06.2006, 19:31
Programmierer, allgemeines

Registrierdatum: 06.06.2004, 17:19

 Beiträge: 3186
Zitat: LennStar
Dafür ist jetzt "EVENT_ONEINSATZLOOSE" ein unbekannter identifier O.o

War er schon immer. Den Befehl hat es nie gegeben.
verfasst am: 19.06.2006, 19:37
Spielsatz Darkage

Registrierdatum: 01.03.2005, 13:47

 Beiträge: 1846
Zitat: Natter
War er schon immer. Den Befehl hat es nie gegeben.

und was nimmt man dann wenn der Bodeneinsatz verloren ist?
verfasst am: 19.06.2006, 19:41
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5596
Für das Programm kann ein Einsatz nicht verloren gehen - Du kannst zwar alle Soldaten verlieren, aber es dann beliebig oft weiter versuchen.

Es ist nur ein Timeout möglich, d.h. Du kannst im Skript das den Einsatz erzeugt eine Timerfunktion setzen was passiert wenn der Einsatz verschwindet ohne gelöst zu werden.

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.009 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003