[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, 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

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

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

Beispiel 5: Missionsanweisung

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="beispiel5_cue001">

      <action>
        <do_all>
          <!--finde ne station und setze marker drauf-->
          <find_station name="beispiel5_cue001.gefundene_station" nearest="1"/>
          <!--ne IF ELSE abfrage-->
          <do_choose>
            <!--abfrage, ob die station nicht existiert-->
            <do_when value="{object.exists@beispiel5_cue001.gefundene_station}" exact="0">
              <incoming_message text="... keine station gefunden ..."/>
              <cancel_cue cue="beispiel5_cue001"/>
            </do_when>
            <!--anderenfalls-->
            <do_otherwise>
              <!--erstelle missionsanweisung-->
              <create_briefing cue="beispiel5_cue001">
                <objectives>
                  <objective step="1">
                    <flyto object="beispiel5_cue001.gefundene_station"/>
                  </objective>
                  <objective step="2">
                    <custom action="... tue dies ..."/>
                  </objective>
                  <objective step="3">
                    <custom action="... tue das in bezug auf ..." text="{object.name@beispiel5_cue001.gefundene_station}"/>
                  </objective>
                </objectives>
              </create_briefing>
              <!--setze marker FLIEGE ZUR STATION-->
              <set_objective cue="beispiel5_cue001">
                <!--verbinde missionsanweisung + missionsschritt mit marker-->
                <briefing cue="beispiel5_cue001" step="1"/>
                <flyto object="beispiel5_cue001.gefundene_station"/>
              </set_objective>
            </do_otherwise>
          </do_choose>
        </do_all>
      </action>

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

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

          <action>
            <do_all>
              <incoming_message text="...bist unter 2km an der station ran."/>
              <!--setze marker auf schritt 2 der missionsanweisung-->
              <set_objective cue="beispiel5_cue001">
                <briefing cue="beispiel5_cue001" step="2"/>
                <custom action="... tue dies ..."/>
              </set_objective>
            </do_all>
          </action>
          
        </cue>

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

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

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

        </cue>
        
      </cues>

    </cue>
    
  </cues>
  
</director>
Hier wird dem Missionmarker mit einer Missionsanweisung (Beschreibung), die 3 Schritte beinhaltet, versorgt.
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:25

Beispiel 6: Frage stellen, Antwort prüfen

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="beispiel6_cue001">

      <action>
        <do_all>
          <!--stell dem spieler eine frage-->
          <ask_question name="beispiel6_cue001.gestellte_frage" popup="1" 
                        text="... irgendeine frage ? 
                        \n[select value='antwort1']yepp[/select]
                        \n[select value='antwort2']weiss nicht[/select]
                        \n[select value='antwort3']nope[/select]"/>
        </do_all>
      </action>

      <cues>
        
        <!--antwort reaktion-->
        <cue name="beispiel6_cue002">

          <condition>
            <check_all>
              <cue_is_complete cue="beispiel6_cue001"/>
              <question_answered question="beispiel6_cue001.gestellte_frage"/>
            </check_all>
          </condition>

          <action>
            <do_all>
              <incoming_message text="hast mit {question.answer@beispiel6_cue001.gestellte_frage} geantwortet"/>
            </do_all>
          </action>
          
        </cue>

      </cues>

    </cue>
    
  </cues>
  
</director>
Hier wird eine Frage gestellt, in der es 3 Antwort-Möglichkeiten gibt. Um diese unterscheiden zu können, versieht man sie mit unterschiedlichen (beliebig gewählten) Werten ("antwort1" "antwort2" "antwort3"). Mit <question_answered> checkt man, ob sie beantwortet wurde. Man muss nicht (aber kann) die konkrete Antwort checken. Die gewählte Antwort wird als Nachricht ausgegeben ({question.answer@...} = gewählte Antwort).
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:26

Beispiel 7: Schiff erstellen und Person mit Missionsangebot hinzufügen

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="beispiel7_cue001">

      <action>
        <do_all>
          <!--schiff erstellen-->
          <create_ship name="beispiel7_cue001.das_schiff" race="argon" typename="SS_SH_A_M6M">
            <equipment loadout="default"/>
            <command command="idle"/>
          </create_ship>
          <!--person auf schiff als crew erstellen-->
          <create_actor name="beispiel7_cue001.die_person" character="...JSDD" face="158" voice="102" 
                        object="beispiel7_cue001.das_schiff" location="crew"/>
          <!--ein missionsangebot (plot) fuer die person erstellen-->
          <create_offer actor="beispiel7_cue001.die_person" conversation="L2OfferBuyCustom2" discipline="XXXXP">
            <!--parameter speziell fuer diese conversation: eine verkaufsliste mit 2 optionen, siehe t/conversations.xml-->
            <params>
              <!--der name OfferText stammt aus der text-datei {3800,...}-->
              <param name="OfferText" value="willste was kaufen?"/>
              <!--diese 2 namen (Option1 Option2) stehen in der text-datei {3800,...}-->
              <param name="Option1" value="erste option"/>
              <param name="Option2" value="zweite option"/>
              <!--diese 2 namen (Price1 Price2) stehen in der text-datei {3800,...}-->
              <param name="Price1" value="1234"/>
              <param name="Price2" value="5678"/>
            </params>
          </create_offer>
        </do_all>
      </action>

      <cues>

        <!--kommunikations-reaktion: gekauft-->
        <cue name="beispiel7_cue002">

          <condition>
            <check_all>
              <!--eine diese bedingungen muss zutreffen-->
              <check_any>
                <!--diese 2 rueckgabe-werte der conversation sind incht frei waehlbar, sondern in t/conversations.xml festgelegt-->
                <conversation_completed actor="beispiel7_cue001.die_person" conversation="L2OfferBuyCustom2" answer="accept1"/>
                <conversation_completed actor="beispiel7_cue001.die_person" conversation="L2OfferBuyCustom2" answer="accept2"/>
              </check_any>
            </check_all>
          </condition>

          <action>
            <do_all>
              <incoming_message author="{actor.name@beispiel7_cue001.die_person}" text="... du hast etwas gekauft."/>
            </do_all>
          </action>

        </cue>

        <!--kommunikations-reaktion: gecancelt-->
        <cue name="beispiel7_cue002">

          <condition>
            <check_all>
              <!--eine diese bedingungen muss zutreffen-->
              <check_any>
                <conversation_completed actor="beispiel7_cue001.die_person" conversation="L2OfferBuyCustom2" answer="cancel"/>
              </check_any>
            </check_all>
          </condition>

          <action>
            <do_all>
              <!--zerstoere schiff und die darauf befindliche personen-->
              <destroy_object object="beispiel7_cue001.das_schiff" warp="1"/>
              <cancel_cue cue="beispiel7_cue001"/>
            </do_all>
          </action>

        </cue>
        
      </cues>

    </cue>
    
  </cues>
  
</director>
Hier wird eine Person auf einem Schiff erstellt, die ein Missionsangebot (vom Typ Plot) hat.
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, 20:08

Beispiel 8: Eine Gruppe von Schiffen erstellen

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="beispiel8_cue001">

      <action>
        <do_all>
          <!--schiffe erstellen-->
          <do_all min="3" max="10">
            <create_ship group="beispiel8_cue001.gruppe_von_schiffen" race="argon" typename="SS_SH_A_M4">
              <position object="{player.ship}" min="3km" max="4km"/>
              <equipment loadout="default"/>
              <command command="idle"/>
            </create_ship>
          </do_all>
          <incoming_message text="... {group.object.count@beispiel8_cue001.gruppe_von_schiffen} schiffe sind in der gruppe zusammengefasst"/>
        </do_all>
      </action>

      <cues>
        
        <!--checkt distanz vom spieler zu allen schiffen der gruppe-->
        <cue name="beispiel8_cue002">

          <condition>
            <check_all>
              <!--beim unterschreiten der distanz von 2km zwischen spieler und irgendein objekt der gruppe-->
              <any_object_position group="beispiel8_cue001.gruppe_von_schiffen" max="2km">
                <position object="{player.ship}"/>
              </any_object_position>
            </check_all>
          </condition>

          <action>
            <do_all>
              <!--setze visier auf naechstes objekt in der gruppe-->
              <set_target object="{group.nearest@beispiel8_cue001.gruppe_von_schiffen}"/>
            </do_all>
          </action>
          
        </cue>
        
      </cues>
        
    </cue>
    
  </cues>
  
</director>
Hier wird eine <do_all> Schleife ausgeführt, um mehrere Schiffe zu erstellen und sie der gleichen Gruppe hinzuzufügen. Anschließend wird beim unterschreiten von der Mindest-Distanz von 2km das nächste Objekt der Gruppe automatisch anvisiert. Dafür wird <any_object_position> (für Gruppen) statt <object_position> (für einzelne Objekte) verwendet.
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, 20:46

Beispiel 10: Loop Counter verwenden

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="beispiel10_cue001">

      <action>
        <do_all>
          <do_all exact="10" counter="laufindex">
            <incoming_message text="das ist die {counter@laufindex}. Nachricht"/>
          </do_all>
        </do_all>
      </action>
        
    </cue>
    
  </cues>
  
</director>
Hier werden 10 indexierte Nachrichten versendet.
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”