CodeSnippets

Aus AntamarWiki
Wechseln zu: Navigation, Suche

Hier entsteht eine Sammlung von Versatzstücken für die AOQML-Programmierung, sogenannten CodeSnippets. Es soll die möglichst eleganteste, sicherste und platzsparendste Methode hier stehen.

ZB-Aufbau

Einfacher ZB-Grundaufbau

Einführungstext (Z4), dann erste Talentprobe (Z5) und wenn diese gelingt, eine weitere (Z11), danach EP-Vergabe (Z14,18) und wenn beide Proben positiv verliefen, auch Gewinn eines Gegenstands (Z19); Texte nur zwischen p und /p:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Kommentar zu Auftreten, Autor, Besonderheiten (z.B. ob Humor-ZB) -->
<scene xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://spiel.antamar.org/Antamar/xml/aoqml/aoqml.xsd">
<p></p>
<challenge talent="X">
  <failure>
    <p></p>
  </failure>
  <success>
    <p></p>
    <challenge talent="X">
      <failure>
        <p></p>
        <set attribute="EP" inc="X"/>
      </failure>
      <success>
        <p></p>
        <set attribute="EP" inc="X"/>
        <take item="X"/>
      </success>
    </challenge>
  </success>
</challenge>
</scene>

Einfacher ZB-Grundaufbau mit variierenden Textstücken

Viele Begegnungen haben variierende Textinhalte, die aber das gleiche beschreiben, dadurch wird für Abwechselung innerhalb einer ZB gesorgt und es ist nicht immer der gleiche langweilige Text, den man sofort erkennt. Die ist noch besser einsetzbar für gleichwertige Ereignisse, wo also nicht jeder Text innerhalb der ZB aufeinander aufbauen muss und sich auch von den gleichwertigen cases unterscheiden kann.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Kommentar zu Auftreten, Autor, Besonderheiten (z.B. ob Humor-ZB) -->
<scene xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://spiel.antamar.org/Antamar/xml/aoqml/aoqml.xsd">
<p>
<random>
  <case></case>
  <case></case>
  <case></case>
  <case></case>
</random>
</p>

<challenge talent="" mod="+X">
  <failure>
    <p>
    <random>
      <case></case>
      <case></case>
      <case></case>
      <case></case>
    </random>
    </p>
  </failure>
  <success>
    <p>
    <random>
      <case></case>
      <case></case>
      <case></case>
      <case></case>
    </random>
    </p>
  </success>
</challenge>
</scene>

ZB mit Voraussetzung

In Z2 wird eine Talentvoraussetzung (auch möglich: Gegenstand X muss vorhanden sein - has item="X|Y|Z") abgefragt, der Char muss als eines der angegebenen Talent auf dem angegeben Mod haben, sonst wird der success-Zweig nicht ausgeführt (in dem der Charakter einen Gegenstand erhält) und es bleibt nur ein Trösttext (in diesem Falle mit einer anderen Probe, um noch etwas EP zu erhalten)...

<has talent="X|Y" mod="+X">
  <success>
    <p></p>
    <take item="X"/>   
  </success>
  <failure>
    <challenge talent="" mod="+X">
      <success>
        <p></p>
        <set attribute="EP" inc="X"/>
      </success>
      <failure>
        <p></p>
        <set attribute="EP" inc="X"/>
      </failure>
    </challenge>
  </failure>
</has>

Talente

Einfache Talentprobe

<challenge talent="Talent" mod="+X">
  <success>
    <p></p>
  </success>
  <failure>
    <p></p>
  </failure>
</challenge>

Erleichterte Talentprobe durch Gegenstände

In Z1 wird abgefragt, ob einer der angegebenen Gegenstände vorhanden ist, wenn ja, wir die Probe erleichtert (Z3), ansonsten erschwert durchgeführt (Z13):

<has item="X|Y">
  <success>
    <challenge talent="">
      <failure>
        <p></p>
      </failure>
      <success>
        <p></p>
      </success>
    </challenge>
  </success>
  <failure>
    <challenge talent="" mod="+X">
      <failure>
        <p></p>
      </failure>
      <success>
        <p></p>
      </success>
    </challenge>
  </failure>
</has>

Alternative Talentabfrage

Anmerkung: Dies betrifft vor allem Talente, die eher selten sind und wo der Held auf ein Talent ausweichen kann, das er ziemlich sicher hat. Ansonsten könnte im failure-Zweig des ersten has talent auch ein zweites has talent eingebaut werden.

<has talent="Talent1">
  <success>
    <challenge talent="Talent1">
      <success>
      ...
      </success>
      <failure>
      ...
      </failure>
  </success>
  <failure>
    <challenge talent="Talent2">
      <success>
      ...
      </success>
      <failure>
      ...
      </failure>
  </failure>
</has>

Verbesserte modifizierte Probe

Mit dieser Methode kann man eine Probe recht übersichtlich mit mehreren Faktoren modifizieren. Neben Ausrüstung sind auch andere Sachen wie Variablen oder unterstützende Talente möglich.

<store name="probenvariable_1" scope="quest">5</store><!-- Probe ohne Ausrüstung um 5 erschwert. --> 

<has item="XXX"><!-- Man kann auch anderes mit has oder switch abfragen. --> 
  <success>
  	<set name="probenvariable_1" dec="2" show="none"/><!-- Malus wird um 2 erleichtert. --> 
  </success>
  <failure>
  	<!-- Fehlt der Gegenstand, wird nicht modifiziert. --> 
  </failure>
</has>

<has item="YYY"><!-- Man kann auch anderes mit has oder switch abfragen. --> 
  <success>
  	<set name="probenvariable_1" dec="2" show="none"/><!-- Malus wird um 2 erleichtert. --> 
  </success>
  <failure>
  	<!-- Fehlt der Gegenstand, wird nicht modifiziert. --> 
  </failure>
</has>

<challenge talent="AOQML-Programmierung" mod="${probenvariable_1}"><!-- Als Modi wird der Inhalt der Variable gezogen, also 5 ohne Ausrüstung und weniger (also leichter) wenn geeignete Ausrüstung vorhanden. --> 
  <success>
  	<!-- Hier dann Ergebnis Erfolg. --> 
  </success>
  <failure>
  	<!-- Hier Misserfolg. --> 
  </failure>
</challenge>


Heldenspezifisches

Mann oder Frau?

In Z3 wird der Text für Männer ausgegeben, in Z6 der für Frauen.

<switch attribute="gender">
  <case value="male">
    <p></p>
  </case>
  <else>
    <p></p>
  </else>
</switch>

Oder auch direkt in den Text einbinden:

<if attribute="gender" equals="female" null="Ein geschlechtsloses Wesen" then="Eine junge Frau" else="Ein junger Mann"/> kommt dir entgegen.

Hat der Held soundsoviel Geld?

Wenn es wichtig ist, ob der Held einen Mindestbetrag an Geld dabei hat.

<has attribute="cash" min="X">
  <success>
    <p></p>
  </success>
  <failure>
    <p></p>
  </failure>
</has>

Wurde der Held verletzt?

Wenn es wichtig ist, ob der Held in einem Kampf Schadenspunkte bekommen hatte.

<store name="LEPvorher" scope="quest"><get attribute="LEP"/></store>
#Prügelei ...
<switch Attribute="LEP">
  <case min="${LEPvorher}">
    #Fall: vorher so viele LEP wie nachher oder mehr
  </case>
  <else>
    #Fall: nachher weniger LEP als vorher
  </else>
</switch>

nützliche Gegenstands-Kombinationen

Schreibzeug?

Für Schreibzeug gibt es viele Kombinationen, daher steht dafür ein Makro zur Verfügung

<store name="hatSchreibzeug"/>
<p>Der Held hat
  <include target="/lib/_hatSchreibzeug"/>
  <switch name="hatSchreibzeug">
    <case val="true">
       Schreibzeug dabei und könnte also etwas aufschreiben.
    </case>
    <else>
       leider kein Schreibzeug dabei und könnte daher nichts aufschreiben.
    </else>
  </switch>
</p>

Ggf. stellt der Editor die Include-Datei als nicht vorhanden dar. Das bitte einfach ignorieren. Zum einen liegt das daran, dass der absolute Pfad noch nicht richtig aufgelöst wird, zum anderen daran, dass diese Datei ggf. lokal gar nicht zur Verfügung steht.

Zufälle

Zufallstexte

Eine normale Zufallsauswahl, jeder Case ist gleichberechtigt.

<random>
  <case>
    <p></p>
  </case>
  <case>
    <p></p>
  </case>
  <case>
    <p></p>
  </case>
  <case>
    <p></p>
  </case>
</random>

Prozentuale Zufallsauswahl

Wenn man die Ereignisse einer Zufallsauswahl etwas steuern will, weil manches häufiger als anderes auftreten soll. Zuerst die Variable "zufall" setzen, so:

<set name="zufall" value="1...100"/>

oder so:

<set name="zufall" value="$[W100]"/>

Dann die möglichen Ergebnisse:

    
<switch name="zufall">
  <case min="1" max="49">
  ...für 0-49...
  </case>
  <case min="50" max="69">
  ...für 50-69...
  </case>
  <else>
  ...für den Rest...
  </else>
</switch>

Bewertung unterschiedlicher Ausrüstung bei Proben

Bei Proben sind unterschiedliche Gegenstände oft unterschiedlich nützlich. Folgendes System erlaubt eine einfache aber detaillierte Nutzung verschiedener Gegenstände. Man muss nur noch die entsprechenden Gegenstände einfügen (Getrennt mit | wenn mehrere in Frage kommen) und den Modi auf die Probe festlegen. Bei fehlender Ausrüstung entscheidet der Schreiber, ob und wie es weiter geht (hoher Malus auf die Probe oder einfach nicht möglich):

<has item="Gute Ausrüstung|Andere gute Ausrüstung">
  <failure>
    <has item="Mittlere Ausrüstung|Andere mittlere Ausrüstung">
      <failure>
        <has item="Schlechte Ausrüstung|Andere schlechte Ausrüstung">
          <failure>
            <p>Mangels geeigneter Ausrüstung kannst du das gleich vergessen!</p>
            Weiter im Text/Versagt/Was auch immer... 
          </failure> 
          <success>
            <challenge talent="Benutztes Talent" mod="+Hoher Malus in Zahlen" name="probemitausruestung1" show="none" />
          </success> 
        </has>
      </failure> 
      <success>
        <challenge talent="Benutztes Talent" mod="+Mittlerer oder kein Malus in Zahlen" name="probemitausruestung1" show="none" />
      </success> 
    </has>
  </failure> 
  <success>
    <challenge talent="Benutztes Talent" mod="+Kleiner Malus bis Bonus in Zahlen" name="probemitausruestung1" show="none" />
  </success> 
</has> 
...
<challenge name="probemitausruestung1"> 
  <failure>
    ...
    ...
  </failure> 
  <success>
    ...
    ...
  </success> 
</challenge>

Mehrmaliges Verwenden mit <store> und <switch> verhindern

Mittels <store> und <switch> kann man zB eine mehrmalige Benutzung bzw. mehrmaligen Besuch eines Ortes unterbinden.

<switch name="ValName">
    <null>
       <!--Text beim ersten Durchlauf!-->
       <store name="ValName">ja</store>
    </null>
    <case><!--Text beim erfüllter Bedingung!-->
    </case>
    <else>
       <!--Alternativer Text!-->
    </else>
</switch>

ValNamestellt den Variablennamen dar, dieser kann frei vergeben werden. <null>ist der Zweig, der im ersten Ablauf abgearbeitet wird, dort ist noch kein Variablenname vergeben. Erst am Ende des Zweiges wird mittels <store name="ValName">ja</store> ein Wert zugewiesen, in diesem Fall 'ja'. <case> ist der Zweig der Durchlaufen wird, wenn die Bedingung (ja) erfüllt ist. <else> wird Durchlaufen, wenn ein Wert in der Variable gespeichert ist, der aber nicht direkt einer Vorgabe entspricht.

Alternativ kann man auch das has-Tag verwenden.

In dem Beispiel wird durch das Beispiel das Betreten einer Lokalität verhindert. In diesem Beispiel gibt es nur zwei Möglichkeiten, der <case>-Fall wird somit unnötig.


<switch name="besuchtTaverne">
    <null>
        Hier die einmalige Möglichkeit in der Schmiede fragen zu stellen.
       <store name="besuchtTaverne">ja</store>
    </null>
    <else>
       <p>Der Schmied guck dich nur dumm an, was du schon wieder hier willst.</p>
    </else>
</switch>

Gruppenzeug

Alle Helden durchgehen

<retain name="helden-durchgehen" id="helden-durchgehen-1">
  <set name="aktuelle_nr" inc="1" show="none"/><!-- zum Debuggen show="result" verwenden -->
 
  <!-- Held selektieren -->
  <store name="heroAttr">nr_<fetch name="aktuelle_nr"/></store><!-- z.B. nr_1 -->
  <select hero="${heroAttr}"/>
  <p><q>Hallo, ich heiße <get attribute="name"/> und ich bin <get attribute="race"/></q>.</p>
 
  <!-- gibt es noch weitere Gruppenmitglieder? -->
  <switch attribute="anzahl_gruppenmitglieder">
    <case name="aktuelle_nr">
      <!-- Unsere Variable 'aktuelle_nr' entspricht jetzt dem Attribut 'anzahl_gruppenmitglieder'. 
      Daher wurden alle Gruppenmitglieder einmal aufgerufen.
      Daher nichts weiter machen. -->
    </case>
    <else>
      <p>Der nächste:</p>
      <!-- sich erneut aufrufen -->
      <replay name="helden-durchgehen" />
    </else>
  </switch>
</retain>
 
<p>In diesem kleinen Beispiel stellen sich alle Helden der Gruppe kurz vor:</p>
<store name="aktuelle_nr">0</store>
<replay name="helden-durchgehen"/>

Sonstiges

Helden zeitweilig einsperren

Wer nicht gleich einkerkern möchte, kann für (kurzzeitiges) Einsperren in einer Queste folgende Möglichkeit nutzen. Bitte nicht länger als einige Stunden RL, sonst gibt es Gemecker. Mögliche Anwendungen: Schlaf, Bewusstlosigkeit, Reisen (danach dann site verändern), Arbeit...

Datei 1:

<q>Text informiert SC darüber, dass er einige Zeit in der Queste verbleiben muss.</q>
<store name="held_wird_eingesperrt" scope="quest" expire="2h">...</store>
<countdown variable="held_wird_eingesperrt"/><!-- Anzeige, damit der Spieler weiß, wie lange noch. --> 
<ul>
    <li><choice target="raus">Darf ich gehen?</choice></li>
</ul>

Datei 2 (raus.xml):

<has name="held_wird_eingesperrt">
  <success><!-- Variable existiert noch, Held bleibt eingesperrt. --> 
     <q>NEIN!</q>
     <countdown variable="held_wird_eingesperrt"/>
     <ul>
       <li><choice target="raus">Darf ich gehen?</choice></li>
   </ul>
  </success>
  <failure>
     <q>Text Held darf gehen/wacht auf.</q>
     <quest status="ended"/><!-- Oder weiter in der Queste, je nachdem. -->

Jahreszeiten

Für Jahreszeitabhängige Texte... Wichtig: Die Jahreszeiten gelten so nur auf der Nordhalbkugel!

<switch attribute="monat">

 <case val="Herdfeuermond|Maskenmond|Lichtmond">
 </case>
 <case val="Ehrenmond|Hoffnungsmond|Wassermond">
 </case>
 <case val="Liebesmond|Weisheitsmond|Erdmond">
 </case>
 <else>
 </else>

</switch>

Zufällige Zuweisung einer anderen ZB

Folgende Funktion gilt für ZBs, um es zu ermöglichen, dass bei einer misslungenen Startbedingung, statt der ursprünglichen ZB, eine andere, zufällige ZB ausgeführt wird.

<failure> <quest status="rejected"/> </failure>


vorgefertigte Plünderlisten

<?xml version="1.0" encoding="UTF-8"?>
<scene xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://eisentrutz.antamar.eu/aoqml.xsd">

<!-- Plünderlisten -->
	
	
<!--Essen + Trinken -->
<random count="*">
  <case><take item="Apfel"/></case>
  <case><take item="Birne"/></case>
  <case><take item="Brot und Käse"/></case>
  <case><take item="Brpt und Wurst"/></case>
  <case><take item="Dauerwurst"/></case>
  <case><take item="Dörrfleisch vom Schwein"/></case>
  <case><take item="Sörrfleisch von der Ziege"/></case>
  <case><take item="Ei"/></case>
  <case><take item="Einfacher Reiseproviant"/></case>
  <case><take item="Guter Reiseproviant"/></case>
  <case><take item="Hartkäse"/></case>
</random>

<!-- Ausrüstung -->	
<random count="*">
  <case><take item="Beinflöte"/></case>
  <case><take item="Billiger Holzbecher"/></case>
  <case><take item="Doppelfingerdickes Tau"/></case>
  <case><take item="Drei beinerne Wüfel"/></case>
  <case><take item="Ein Satz Spielkraten auf bedruckter Pappe"/></case>
  <case><take item="Einfacher Holzlöffel"/></case>
  <case><take item="Einfacher Holzteller"/></case>
  <case><take item="Einfacher Tonkrug"/></case>
  <case><take item="Einfaches Trinkhorn"/></case>
  <case><take item="Essbesteck aus Zinn"/></case>
  <case><take item="Feldflasche"/></case>
  <case><take item="Feuerstein und Stahl"/></case>
  <case><take item="Geldbeutelchen"/></case>
  <case><take item="Gewandknopf"/></case>
  <case><take item="Gürteltasche"/></case>
  <case><take item="Hanfseil 1 Schritt"/></case>
  <case><take item="Hölzerne Tabakpfeife"/></case>
  <case><take item="Holzflöte"/></case>
  <case><take item="Holzkamm"/></case>
  <case><take item="Irdener Teller"/></case>
  <case><take item="Korb"/></case>
  <case><take item="Ledernes Fesselseil"/></case>
  <case><take item="Messer"/></case>
  <case><take item="Nadel und Garn"/></case>
  <case><take item="Pechfackel"/></case>
  <case><take item="Sack"/></case>
  <case><take item="Schnupftuch"/></case>
  <case><take item="Seife"/></case>
  <case><take item="Tabak"/></case>
  <case><take item="Tonflasche"/></case>
  <case><take item="Tontigel"/></case>
  <case><take item="Tragnetz"/></case>
  <case><take item="Tuchbeutel"/></case>
  <case><take item="Wanderstab"/></case>
  <case><take item="Wasserschlauch"/></case>
  <case><take item="Wolldecke"/></case>
</random>

<!--Auretanien -->
<random count="*">
  <case><take item="Ciabatta"/></case>
</random>

<!--Abajaden -->
<random count="*">
  <case><take item="Dattel"/></case>
  <case><take item="Dattelwein"/></case>
  <case><take item="Fächer aus Elfenbein und Seide"/></case>
  <case><take item="Feige"/></case>
  <case><take item="Fladenbrot"/></case>
  <case><take item="Straußenei"/></case>
</random>

<!-- Gebirge -->
<random count="*">
  <case><take item="Eispickel"/></case>
  <case><take item="Doppelfingerdickes Tau"/></case>
  <case><take item="Katzengold"/></case>
  <case><take item="Kletterhaken"/></case>
  <case><take item="Kletterseil 10 Schritt"/></case>
</random>

<!-- Tekkaioreiche -->
<random count="*">
  <case><take item="Fächer aus Elfenbein und Seide"/></case>
  <case><take item="Grüne Jade"/></case>
  <case><take item="Grüner Tee"/></case>
  <case><take item="Jadeamulett"/></case>
  <case><take item="Reis"/></case>
  <case><take item="Reisbrot"/></case>
  <case><take item="Reiswein"/></case>
  <case><take item="Seidenseil 1 Schritt"/></case>
</random>

<!-- Xetoka -->
<random count="*">
  <case><take item="Jadeamulett"/></case>
  <case><take item="Jadestatue"/></case>
  <case><take item="Kakao"/></case>
</random>

</scene>