[DISKUSSION] Allgemeine MD-Fragen

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

Moderators: Moderatoren für Deutsches X-Forum, Scripting / Modding Moderators

Post Reply
User avatar
Ketraar
EGOSOFT
EGOSOFT
Posts: 11740
Joined: Fri, 21. May 04, 17:15
x4

Post by Ketraar » Thu, 1. Mar 18, 18:21

So hab mal kurz in den Plot files rumgewühlt da ich dachte es g+abe da was und siehe da es gibt.

Code: Select all

<find_station name="L2M019.Jonferco_Silicon" typename="SS_FAC_A_SIL_1" race="argon" silent="1">
  <sector sector="L2M019.Albion3"/>
</find_station>
<do_if value="{object.exists@L2M019.Jonferco_Silicon}" exact="1">
  <do_if value="{object.name.textid@L2M019.Jonferco_Silicon}" exact="20551">
    <set_override_name object="L2M019.Jonferco_Silicon" textid="20521"/>
  </do_if>
</do_if>
Also sollte es auch funktionieren, denke das die textid aus page 17 stammen muss, dann gehts. Ignoriere das do_if ich hab das 1:1 aus der Albion Prelude Plot Datei kopiert, nach dem find sollte das set_override_name funktionieren (sofern das find auch was "gefunden" hat).

MFG

Ketraar

PS.: sollte man eine station via MD erstellt haben, erübrigt sich das find_ da man ja bereits die Ref hat.

User avatar
ubuntufreakdragon
Posts: 5189
Joined: Thu, 23. Jun 11, 14:57
x4

Post by ubuntufreakdragon » Thu, 1. Mar 18, 19:03

hey Ketraar würdest du mir zustimmen, dass der TC Plot kaputt geht sollte man es fertig bringen den Torus zu sprengen, (was möglich ist).
https://forum.egosoft.com/viewtopic.php?t=398324
My X3 Mods

XRebirth, things left to patch:
In General; On Firing NPC's; In De Vries; Out Of Zone; And the Antiwishlist

User avatar
Ketraar
EGOSOFT
EGOSOFT
Posts: 11740
Joined: Fri, 21. May 04, 17:15
x4

Post by Ketraar » Thu, 1. Mar 18, 19:10

Ja das würde was ausmachen. :roll:

Aber man kann das Ding nicht sprengen in Vanilla afaik. Zufällig habe ich erst kürzlich den TC Plot gespielt und alles lief ohne Probleme. Aber wen der Torus fehlt, wird der Plot nicht wissen wohin mit den Leuten und man muss ja da andocken.

MFG

Ketraar

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Thu, 1. Mar 18, 19:26

Ketraar wrote:So hab mal kurz in den Plot files rumgewühlt da ich dachte es g+abe da was und siehe da es gibt.

Code: Select all

<find_station name="L2M019.Jonferco_Silicon" typename="SS_FAC_A_SIL_1" race="argon" silent="1">
  <sector sector="L2M019.Albion3"/>
</find_station>
<do_if value="{object.exists@L2M019.Jonferco_Silicon}" exact="1">
  <do_if value="{object.name.textid@L2M019.Jonferco_Silicon}" exact="20551">
    <set_override_name object="L2M019.Jonferco_Silicon" textid="20521"/>
  </do_if>
</do_if>
Also sollte es auch funktionieren, denke das die textid aus page 17 stammen muss, dann gehts. Ignoriere das do_if ich hab das 1:1 aus der Albion Prelude Plot Datei kopiert, nach dem find sollte das set_override_name funktionieren (sofern das find auch was "gefunden" hat).

MFG

Ketraar

PS.: sollte man eine station via MD erstellt haben, erübrigt sich das find_ da man ja bereits die Ref hat.
Ich danke Dir vielmals für Deine erneute Hilfe! :D
Aus Deinem Beispiel habe ich folgendes gemacht:

Code: Select all

<find_station name="Schiffswerft_KlausTeladi01" race="teladi" typename="SS_FAC_A_SHIP_BIG" silent="1">
	<sector sector="Profitabler Handel"/>
</find_station>
	<set_override_name object="Schiffswerft_KlausTeladi01" pageid="17" textid="5151"/>
Nun ist die Werft der Schrotthandel eines Teladiunternehmens und wird vom Bordcomputer auch so angesagt.
In Deinem Beispiel bezog sich die Text ID auf eine andere Page ID als 17.

Ich habe auf YouTube mal versucht, Deine Tutorials zum MD zu verstehen. Leider ist mein Englisch viel zu schlecht. Schade, dass es so etwas nicht auf Deutsch gibt. :cry:

MFG

Klaus
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
ubuntufreakdragon
Posts: 5189
Joined: Thu, 23. Jun 11, 14:57
x4

Post by ubuntufreakdragon » Thu, 1. Mar 18, 20:05

Ketraar wrote:Aber man kann das Ding nicht sprengen in Vanilla afaik.
Ich habs mal gaschafft: mit M2 in Landebucht verschanzt und die turrets des torus haben selbigen zerlegt.

Hast du noch eine andere idee warum 0.30 was anderes als 1 oder 0 returnt und zwar auch nach reset que?
My X3 Mods

XRebirth, things left to patch:
In General; On Firing NPC's; In De Vries; Out Of Zone; And the Antiwishlist

User avatar
Ketraar
EGOSOFT
EGOSOFT
Posts: 11740
Joined: Fri, 21. May 04, 17:15
x4

Post by Ketraar » Thu, 1. Mar 18, 21:15

Klaus11 wrote:Aus Deinem Beispiel habe ich folgendes gemacht:
Hali hallo hier haben wir ein paar kleinigkeiten in deinem code ich versuchen werde so gut wie es get zu erläutern.

Code: Select all

<find_station name="Schiffswerft_KlausTeladi01" race="teladi" typename="SS_FAC_A_SHIP_BIG" silent="1">
in name= soltest du immer this.eigenername nutzen. Wobei this. für den cue steht wo die ref (also eigenername) gespeichert wird. Nutzt man this. ist der cue name der selbe wo diese action genestet ist. Beispiel:

Code: Select all

<cue name="Cue_1">
  <action>
    <do_all>
      <find_station name="this.station" typename="SS_FAC_A_SIL_1" race="argon">
        <sector x="0" y="0"/>
      </find_station>
    </do_all>
  </action>
</cue>
damit wäre this.station die ref für das gefundene Objekt (in diesem Fall eine Station). Will man also dieses Objekt nun "aufrufen" außerhalb (bzw "unterhalb") von Cue_1, so ist die ref Cue_1.Station.
Damit man hier nicht gross ins grübeln kommt empfiehlt sich aber immer selber den cue anzugeben beim erstellen oder finden von Objekten. Oft nutzt man den "obersten" cue und erspart sich so langes rätseln wie die Objekte referenziert wurden. In dem Plot code ist das L2M019. und so werden alle Objekte (außer in speziellen Fällen) immer in diesem cue gespeichert.

Nutzt man keine this. werden die Objekte global gespeichert, hat den vorteil das man diese auch ausserhalb deren Dateien nutzen kann (was selten nötig ist), doch strapaziert das sehr an der Performance wenn oft genutzt wird. Das gilt für alle "Objekte" (Actors, Sektoren, Schiffe, etc).

In Deinem Beispiel bezog sich die Text ID auf eine andere Page ID als 17.
Bist du sicher? War das vielleicht eine 350017? Wenn ja das ist das weiterhin page 17 ingame, die 35 ist ne art prefix um von den Vorgängern zu unterscheiden (35 ist TC, 38 ist AP, etc)
Ich habe auf YouTube mal versucht, Deine Tutorials zum MD zu verstehen. Leider ist mein Englisch viel zu schlecht. Schade, dass es so etwas nicht auf Deutsch gibt. :cry:
Naja englisch war halt eher übergreifend, auch wenn es in DE einfacher gewesen wäre. Wenn sicher einer findet der evtl. Untertitel machen möchte (was ich nicht glaube) dann könnte man diese auch hinzufügen.

Anyway, hoffe das war einigermaßen verständlich, es ist oft nicht einfach MD zu beschreiben in Textform.
Hast du noch eine andere idee warum 0.30 was anderes als 1 oder 0 returnt und zwar auch nach reset que?
Ich verstehe deine Frage nicht, kannst du das mal bitte genauer erklären?

MFG

Ketraar
Last edited by Ketraar on Thu, 1. Mar 18, 22:01, edited 1 time in total.

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Thu, 1. Mar 18, 21:50

Cool :D ,
ich habe dieses "This." nun davor gesetzt und es funktioniert noch besser. Vorher musste ich auf das Model einer argonischen Werft ausweichen, weil die falsche Werft umbenannt wurde. Nun wird genau die Werft umbenannt, die ich neu hinzugefügt habe. (In dem Sektor gibt es ja schon eine Werft.)

Der Text: <t id="20521">Plutarch Siliziummine</t> ist aus AP, also 380017. Du hattest also recht. Ich bin trotzdem bei meinem Namen geblieben.

Nun möchte ich noch ein Ausrüstungsdock hinzufügen. Hoffentlich kriege ich es hin, dass es auch produziert.

Btw, ich habe in YouTube deutsche Untertitel gewählt. Es ist aber zu anstrengend, ständig hin und her zu schauen.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Fri, 2. Mar 18, 07:25

... kann man nich direkt im <create_station/> kommando die textid angeben ??

zum MD tutorial: hier gibts ja die anleitung auf deutsch
ok, videos sind manchmal besser "verdaulicher" ... aber sofern du schon etwas vom MD verstanden hast: im tutorial wird nur die absoluten basics angeschnitten. wenn du kleine "briefings" im game sehen willlst und mini-plots machen willst, das fehlt leider im tutorial, musste dir selbst aneignen .. oder eben hier fragen ;)

hier hatte ich schonmal n kleine übersicht gemacht, wie man die hyroglyphen lesen kann ... wie der code abläuft etc
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Fri, 2. Mar 18, 14:41

Klaus11 wrote:Der Text: <t id="20521">Plutarch Siliziummine</t> ist aus AP, also 380017. Du hattest also recht. Ich bin trotzdem bei meinem Namen geblieben.
Wird trotzdem Intern unter Page 17 zusammen gefasst..
Klaus11 wrote:Nun möchte ich noch ein Ausrüstungsdock hinzufügen. Hoffentlich kriege ich es hin, dass es auch produziert.
ADs können nix Produzieren, sind schliesslich keine Fabriken :P wenn du damit meinst "mit der Werft verbinden": iirc müssen Sektor und Volk dafür einfach gleich sein, das wars..
(Produktionszyklus musst du glaube ich trotzdem an werfen, damit es gelegentlich waren konsumiert..)
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Fri, 2. Mar 18, 14:44

JSDD wrote:... kann man nich direkt im <create_station/> kommando die textid angeben ??
Kann man. :D Mit diesem Code habe ich die "find" Sache eingespart.

Code: Select all

<create_station name="this.Schiffswerft_KlausTeladi01" race="teladi" typename="SS_FAC_T_SHIP_BIG" invincible="1" pageid="17" textid="5151">
JSDD wrote:zum MD tutorial: hier gibts ja die anleitung auf deutsch
ok, videos sind manchmal besser "verdaulicher" ... aber sofern du schon etwas vom MD verstanden hast: im tutorial wird nur die absoluten basics angeschnitten. wenn du kleine "briefings" im game sehen willlst und mini-plots machen willst, das fehlt leider im tutorial, musste dir selbst aneignen .. oder eben hier fragen ;)

hier hatte ich schonmal n kleine übersicht gemacht, wie man die hyroglyphen lesen kann ... wie der code abläuft etc
Langsam verstehe ich die Syntax, glaube ich. Solche Hilfestellungen, wie diese hier von Dir, sind mir sehr willkommen. Danke Dir dafür.
Ich hatte mal eine Übersicht über alle möglichen Befehle. Kann diese aber schon eine Weile nicht mehr finden. :cry:
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Fri, 2. Mar 18, 14:47

UniTrader wrote:
Klaus11 wrote:Der Text: <t id="20521">Plutarch Siliziummine</t> ist aus AP, also 380017. Du hattest also recht. Ich bin trotzdem bei meinem Namen geblieben.
Wird trotzdem Intern unter Page 17 zusammen gefasst..
Klaus11 wrote:Nun möchte ich noch ein Ausrüstungsdock hinzufügen. Hoffentlich kriege ich es hin, dass es auch produziert.
ADs können nix Produzieren, sind schliesslich keine Fabriken :P wenn du damit meinst "mit der Werft verbinden": iirc müssen Sektor und Volk dafür einfach gleich sein, das wars..
(Produktionszyklus musst du glaube ich trotzdem an werfen, damit es gelegentlich waren konsumiert..)
Für die Erweiterungen (Software), die man dort kaufen kann, muss wohl eine Art Produktion laufen.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
ubuntufreakdragon
Posts: 5189
Joined: Thu, 23. Jun 11, 14:57
x4

Post by ubuntufreakdragon » Fri, 2. Mar 18, 15:38

Ketraar wrote:
Hast du noch eine andere idee warum 0.30 was anderes als 1 oder 0 returnt und zwar auch nach reset que?
Ich verstehe deine Frage nicht, kannst du das mal bitte genauer erklären?
der plot ruft den library cue "L0M30" zu finden in 0.30 Transport Passengers.xml auf, dieser bietet einen Parameter "FeedbackName", der einen Wert von 0-7 annimmt.
bei 0 wartet der Plot, bei 1 ist die mission geschafft und bei allem anderen wird der transportteil des Plots resetet.

Code: Select all

          <return name="{param@FeedbackName}" type="number" description="1 = Successfuly transported all passengers"/>
          <return name="{param@FeedbackName}" type="number" description="2 = Fail but with some passengers"/>
          <return name="{param@FeedbackName}" type="number" description="3 = Timeout with no passengers"/>
          <return name="{param@FeedbackName}" type="number" description="4 = Player destroyed a passenger"/>
          <return name="{param@FeedbackName}" type="number" description="5 = Passenger was destroyed without AllowLoss parameter"/>
          <return name="{param@FeedbackName}" type="number" description="6 = Passenger was destroyed with AllowLoss parameter. No passengers transported"/>
          <return name="{param@FeedbackName}" type="number" description="7 = Destination Station was destroyed"/>
soweit ich das sehe kann nur Fall 7 nach einem reset sofort wieder erscheinen, oder siehst du etwas anderes was WIEDERHOLT passieren könnte(Passagiere werden jedes mal neu erstellt).
My X3 Mods

XRebirth, things left to patch:
In General; On Firing NPC's; In De Vries; Out Of Zone; And the Antiwishlist

User avatar
Ketraar
EGOSOFT
EGOSOFT
Posts: 11740
Joined: Fri, 21. May 04, 17:15
x4

Post by Ketraar » Fri, 2. Mar 18, 16:01

Das ist alles ne weile her und mit generischen Missionen hab ich mich nur sporadisch auseinander gesetzt (generell etwas "convoluted"). Ich denke aber nicht das ein Reset im Fall von is_plot=1 "erlaubt" ist. Werde mal die Plotdatei anschauen, aber in Plot Fall ist das nicht eine "normale" Transport Mission und weiss nicht was XS da eingebaut hat.

Ich guck mal heute Abend wenn ich zu hause bin.

MFG

Ketraar

User avatar
ubuntufreakdragon
Posts: 5189
Joined: Thu, 23. Jun 11, 14:57
x4

Post by ubuntufreakdragon » Fri, 2. Mar 18, 16:10

Der reset kommt vom plot her.
My X3 Mods

XRebirth, things left to patch:
In General; On Firing NPC's; In De Vries; Out Of Zone; And the Antiwishlist

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Fri, 2. Mar 18, 20:40

Klaus11 wrote:Ich hatte mal eine Übersicht über alle möglichen Befehle. Kann diese aber schon eine Weile nicht mehr finden. :cry:
die 7 .. ähh .. 6 sachen zum md-scripten kennste ja !? darunter ist "director.xsd", diese öffnest du via firefox, dann siehste alle befehle & variablen im browser, strg+f dich dann durchs geschehen um dinge zu finden ;)
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Fri, 2. Mar 18, 21:40

JSDD wrote:
Klaus11 wrote:Ich hatte mal eine Übersicht über alle möglichen Befehle. Kann diese aber schon eine Weile nicht mehr finden. :cry:
die 7 .. ähh .. 6 sachen zum md-scripten kennste ja !? darunter ist "director.xsd", diese öffnest du via firefox, dann siehste alle befehle & variablen im browser, strg+f dich dann durchs geschehen um dinge zu finden ;)
Ich danke Dir. :D Ich wußte doch, dass ich es eigentlich habe.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Sun, 4. Mar 18, 19:19

Beispiel 1: Code-Aufbau

Code: Select all

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="director.xsl" type="text/xsl" ?>
<director name="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="director.xsd">

  <cues>
    
    <cue name="beispiel1_cue001">
      
      <!--beim zutreffen dieser bedingungen werden sub-cues aktiviert, timing abgewartet, dann actions ausgefuehrt-->
      <condition>
        <check_all>
          <check_age min="10s"/>
        </check_all>
      </condition>
      
      <!--nach abwarten des timings werden actions ausgefuehrt-->
      <timing>
        <time exact="5s"/>
      </timing>
      
      <!--handlungen im spiel-->
      <action>
        <do_all>
          <incoming_message text="... hallo welt!"/>
        </do_all>
      </action>
      
      <!--sub-cues werden aktiviert, sobald conditions erfolgreich gecheckt wurden-->
      <cues>
        
      </cues>
  
    </cue>
    
  </cues>
  
</director>
Kommentare im code sind immer hilfreich. Damit sie vom Spiel ignoriert werden, werden sie <!----> Block geschrieben:

Code: Select all

<!--HIER EIN KOMMENTAR-->
Ein cue (a.k.a "code-ansammlung") checkt seine Bedingungen ("condition"-Block), sobald diese erfolgreich gecheckt wurden, aktiviert es seine "sub-cues" ("cues"-Block nach dem "action"-Block), wartet sein "time"-Block (wenn vorhanden) ab und führt dann erst seine Handlungen aus ("action"-Block). Sind keine Bedingungen gesetzt, dann triggert es sofort ohne nötige checks. Cancelt/resettet man ein cue, werden auch all seine sub-cues gecancelt/resettet. Vernichtet man ein cue via <destroy_cue/>, so existiert es (und all seine sub-cues) nicht mehr im Spiel. Der Name eine cue muss einzigartig sein, damit es eindeutig identifizierbar bleibt. Sonderzeichen und Punkte im Namen sind nicht erlaubt (außer Unterstrich _).

In diesem Beispiel ist ein cue dargestellt, welches frame-weise die Bedingungen checkt. Frameweise heißt bis zu etwa 60x pro Sekunde. Viele cues, die frameweise checken, können die Performance beeinflussen, drum ist es ratsam, wenn möglich "delays" ("Zeitverzug" zwischen 2 checks) in der cue-zeile zu setzen.

Code: Select all

    <cue name="beispiel1_cue001" delay="2s">
Das hätte zur Folge, dass nur alle 2 Sekunden die Bedingungen gecheckt werden statt frameweise. Es gibt Bedingungen, die nur einmalig für 1 Frame zutreffen, also "Ereignisse" ("events"). Diese müssen frameweise gecheckt werden, d.h. ohne "delay"-Angabe in der cue-zeile. Beispiel hierfür wäre <object_docked/>, welches nur im Moment (Frame) des Andockens zutrifft. Will man allerdings den Zustand "angedockt" checken, nutzt man <object_is_docked>, welches zutrifft, solange Objekt A an Objekt B angedockt ist.

<check_all> im condition-Block und <do_all> im action-Block sind dazu da, dass man mehr als nur 1 Bedingung checken bzw. Handlung ausführen kann.
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Sun, 4. Mar 18, 19:22

Beispiel 2: Code-Ausführung

Code: Select all

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="director.xsl" type="text/xsl" ?>
<director name="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="director.xsd">

  <cues>
    
    <cue name="beispiel2_cue001">
      
      <!--beim zutreffen dieser bedingungen werden sub-cues aktiviert, timing abgewartet, dann actions ausgefuehrt-->
      <condition>
        <check_all>
          <check_age min="10s"/>
        </check_all>
      </condition>
      
      <!--nach abwarten des timings werden actions ausgefuehrt-->
      <timing>
        <time exact="5s"/>
      </timing>
      
      <!--handlungen im spiel-->
      <action>
        <do_all>
          <incoming_message text="... hallo welt 1!"/>
        </do_all>
      </action>
      
      <!--sub-cues werden aktiviert, sobald conditions erfolgreich gecheckt wurden-->
      <cues>

        <cue name="beispiel2_cue002">

          <action>
            <do_all>
              <incoming_message text="... hallo welt 2!"/>
            </do_all>
          </action>
          
        </cue>
        
      </cues>
  
    </cue>
    
  </cues>
  
</director>
Dieses Beispiel zeigt, dass der action-Block eines sub-cues VOR dem action-Block seines parent-cue (wovon es sub-cue ist) ausgeführt werden kann. Das soll drauf aufmerksam machen, dass die cue-Hierarchie nicht eindeutig die Ausführ-Reihenfolge vorgibt. Für Synchronisierung muss man selbst sorgen. Z.B. so:

Code: Select all

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="director.xsl" type="text/xsl" ?>
<director name="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="director.xsd">

  <cues>
    
    <cue name="beispiel2_cue001">
      
      <!--beim zutreffen dieser bedingungen werden sub-cues aktiviert, timing abgewartet, dann actions ausgefuehrt-->
      <condition>
        <check_all>
          <check_age min="10s"/>
        </check_all>
      </condition>
      
      <!--nach abwarten des timings werden actions ausgefuehrt-->
      <timing>
        <time exact="5s"/>
      </timing>
      
      <!--handlungen im spiel-->
      <action>
        <do_all>
          <incoming_message text="... hallo welt 1!"/>
        </do_all>
      </action>
      
      <!--sub-cues werden aktiviert, sobald conditions erfolgreich gecheckt wurden-->
      <cues>

        <cue name="beispiel2_cue002">

          <condition>
            <check_all>
              <cue_is_complete cue="beispiel2_cue001"/>
            </check_all>
          </condition>
          
          <action>
            <do_all>
              <incoming_message text="... hallo welt 2!"/>
            </do_all>
          </action>
          
        </cue>
        
      </cues>
  
    </cue>
    
  </cues>
  
</director>
Jetzt wird der action-Block des ersten cue zuerst ausgeführt. Danach wird es auf Zustand "complete" gesetzt. Diesen Zustand fragt das zweite cue ab, und handelt entsprechend.

Ein cue can 4 Zustände haben:
--> inactive (noch nicht activiert)
--> active (checkt sein condition-Block)
--> complete (war active, hat action-Block erfolgreich ausgeführt)
--> cancelled (wurde gecancelled)

Das Spiel setzt sofort nach dem Laden seine cues auf "active". Ausnahme hierzu ist das "library"-cue, welches von anderen cues aufgerufen werden muss.
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Sun, 4. Mar 18, 19:23

Beispiel 3: Missions-Marker setzen

Code: Select all

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="director.xsl" type="text/xsl" ?>
<director name="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="director.xsd">

  <cues>

    <cue name="beispiel3_cue001">

      <action>
        <do_all>
          <!--finde eine station und setze marker drauf-->
          <find_station name="beispiel3_cue001.gefundene_station" nearest="1"/>
          <!--ne IF ELSE abfrage-->
          <do_choose>
            <!--abfrage, ob die station nicht existiert-->
            <do_when value="{object.exists@beispiel3_cue001.gefundene_station}" exact="0">
              <incoming_message text="... keine station gefunden ..."/>
            </do_when>
            <!--anderenfalls-->
            <do_otherwise>
              <!--setze marker FLIEGE ZUR STATION-->
              <set_objective cue="beispiel3_cue001">
                <flyto object="beispiel3_cue001.gefundene_station"/>
              </set_objective>
            </do_otherwise>
          </do_choose>
        </do_all>
      </action>

    </cue>
    
  </cues>
  
</director>
Dieses Beispiel-cue hat keine Bedingungen / Timer / Sub-cues oder sonstiges, nur ein action-Block. In diesen finden wir zuerst die Station, die am nächsten zum Spieler liegt. Danach kommt eine Fall-Unterscheidung via <do_choose>. Wenn keine Station gefunden wurde, wird eine Nachricht ausgegeben, anderenfalls setzen wir den Missions-Marker auf die Station mit dem Hinweis "Fliege zu ...". Danach passiert allerdings nichts mehr, unabhängig davon ob wir dort sind oder nicht. Diese Möglichkeiten müssen ebenfalls von uns gescriptet werden.

Variablen-Namen können lokal unter einem gewissen cue gespeichert werden, oder global. Wenn lokal gespeichert, ist sie gelöscht, wenn man das cue cancelt. Anderenfalls bleibt sie auch nach dem canceln des cue bestehen. Lokal speichert man eine Variable, indem man sie <cue_name>.<variable_name> benennt. Ansonsten ist sie global. Zu viele globale Variablen sollte man u.A. aus Übersichtsgründen vermeiden.

Werte von Variablen werden über spezielle Funktionen erfragt, z.B. {value@variable_name}. Diese Funktionen sind alle in director.xsd gelistet und können mit z.B. Mozilla Firefox eingesehen werden (ganz unten). Existenz-Abfrage von Objekten z.B. werden via {object.exists@variable_name} gemacht, sie gibt 1 bei Existenz und anderenfall 0 zurück. Die Variable für die gefundene Station wurde unter dem cue beispiel3_cue001 gespeichert und heißt gefundene_station:

Code: Select all

<find_station name="beispiel3_cue001.gefundene_station" nearest="1"/>
Damit die Mission identifizierbar ist, wird sie unter eine cue gespeichert (beispiel3_cue001).
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Sun, 4. Mar 18, 19:24

Beispiel 4: Reaktion auf Annäherung, Missions-Abbruch

Code: Select all

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="director.xsl" type="text/xsl" ?>
<director name="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="director.xsd">

  <cues>

    <cue name="beispiel4_cue001">

      <action>
        <do_all>
          <!--finde ne station und setze marker drauf-->
          <find_station name="beispiel4_cue001.gefundene_station" nearest="1"/>
          <!--ne IF ELSE abfrage-->
          <do_choose>
            <!--abfrage, ob die station nicht existiert-->
            <do_when value="{object.exists@beispiel4_cue001.gefundene_station}" exact="0">
              <incoming_message text="... keine station gefunden ..."/>
              <cancel_cue cue="beispiel4_cue001"/>
            </do_when>
            <!--anderenfalls-->
            <do_otherwise>
              <!--setze marker FLIEGE ZUR STATION-->
              <set_objective cue="beispiel4_cue001">
                <flyto object="beispiel4_cue001.gefundene_station"/>
              </set_objective>
            </do_otherwise>
          </do_choose>
        </do_all>
      </action>

      <cues>
        
        <!--reagiert auf annaeherung-->
        <cue name="beispiel4_cue002" delay="3s">

          <condition>
            <check_all>
              <cue_is_complete cue="beispiel4_cue001"/>
              <object_exists object="beispiel4_cue001.gefundene_station"/>
              <!--distanz zwischen spieler und station unter 2km-->
              <object_position object="{player.ship}" max="2km">
                <position object="beispiel4_cue001.gefundene_station"/>
              </object_position>
            </check_all>
          </condition>

          <action>
            <do_all>
              <incoming_message text="...bist unter 2km an der station ran."/>
            </do_all>
          </action>
          
        </cue>
        
      </cues>

    </cue>
    
  </cues>
  
</director>
Das sub-cue hier muss zuerst mal abwarten, bis das obere fertig ist (1. Bedingung). Danach check es, ob die Station noch existiert. Dann check es die Objekt-Position von dem Objekt {player.ship}, welches die Funktion für das Spielerschiff ist. Und zwar muss diese unter "2km" (2 Kilometer) sein, bezogen auf das objekt "beispiel4_cue001.gefundene_station" (die gefundene Station). Trifft alles zu, wird eine Nachricht ausgegeben. Die Bedingungen werden alle 2 Sekunden gecheckt (delay="3s").

Code: Select all

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="director.xsl" type="text/xsl" ?>
<director name="test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="director.xsd">

  <cues>

    <cue name="beispiel4_cue001">

      <action>
        <do_all>
          <!--finde ne station und setze marker drauf-->
          <find_station name="beispiel4_cue001.gefundene_station" nearest="1"/>
          <!--ne IF ELSE abfrage-->
          <do_choose>
            <!--abfrage, ob die station nicht existiert-->
            <do_when value="{object.exists@beispiel4_cue001.gefundene_station}" exact="0">
              <incoming_message text="... keine station gefunden ..."/>
              <cancel_cue cue="beispiel4_cue001"/>
            </do_when>
            <!--anderenfalls-->
            <do_otherwise>
              <!--setze marker FLIEGE ZUR STATION-->
              <set_objective cue="beispiel4_cue001">
                <flyto object="beispiel4_cue001.gefundene_station"/>
              </set_objective>
            </do_otherwise>
          </do_choose>
        </do_all>
      </action>

      <cues>
        
        <!--reagiert auf annaeherung-->
        <cue name="beispiel4_cue002" delay="3s">

          <condition>
            <check_all>
              <cue_is_complete cue="beispiel4_cue001"/>
              <object_exists object="beispiel4_cue001.gefundene_station"/>
              <!--distanz zwischen spieler und station unter 2km-->
              <object_position object="{player.ship}" max="2km">
                <position object="beispiel4_cue001.gefundene_station"/>
              </object_position>
            </check_all>
          </condition>

          <action>
            <do_all>
              <incoming_message text="...bist unter 2km an der station ran."/>
            </do_all>
          </action>
          
        </cue>

        <!--reagiert auf abbruch-->
        <cue name="beispiel4_cue003">

          <condition>
            <check_all>
              <objective_cancelled cue="beispiel4_cue001"/>
            </check_all>
          </condition>

          <action>
            <do_all>
              <!--zeige an, dass mission abgebrochen wurde-->
              <remove_objective cue="beispiel4_cue001" status="aborted"/>
              <!--stoppe alle cues-->
              <cancel_cue cue="beispiel4_cue001"/>
            </do_all>
          </action>

        </cue>
        
      </cues>

    </cue>
    
  </cues>
  
</director>
Ein weiteres sub-cue für das oberste (beispiel4_cue001) ist nun dazu da, um darauf zu reagieren, wenn der Spiieler die Mission abbricht. Wenn das geschieht, wird eine Nachricht ausgegeben und alle cues werden gecancelt (indem man das oberste cue cancelt).
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

Post Reply

Return to “X³: Terran Conflict / Albion Prelude - Scripts und Modding”