Zu Beginn

Die nachfolgenden Erläuterungen gehen davon aus, dass ihr bereits einen Character habt und einen Raum um ihn dort reinzustopfen. Falls nicht schnappt euch von mir aus MS-Paint und malt ein Viereck mit Augen! Scheißt auf alle Animationen und nehmt durch den "Anpassen" Button im Characterfenster für alle Aktionen das gleiche Bild. Feddisch!
Hauptsache ihr könnt irgendetwas durch die Gegend latschen lassen. Apropro Gegend : Erstellt auch auf die selbe Weise mit 6-7 Strichen einen Raum. Legt den Fussboden in der Walkmap frei zum belaufen und pfanzt euren Character drauf. Supi das!

Jetzt erstellt ihr noch eine Cutscene mit den beiden Befehlen setfocus (euerCharacter) und loadroom (euerRaum), tragt den Namen der Cutscene im Gamesetup als Startskript ein und los gehts!

(Ok, ich hab gelogen : Ihr müsst noch ne Hauptschriftart wählen und einstweilen das Bedienfeld ausschalten um das Spiel erstellen zu können ;)


Ein anklickbares Objekt erzeugen

Bastest irgend ein Objekt und setzt es in euren Raum. Vergesst nicht zu bestimmen wie es in Bezug auf den Character dargestellt werden soll.
Clickt im Raumfenster auf das Objekt und öffnet das Skriptfenster, wenn noch nicht geschehn. Damit nun das Objekt im Spiel beachtet wird müssen wir ein Skript hinzufügen :

on (mouse)
  showinfo (text ; true)

on (click)
  walkto (self ; 12 ; 21 ; 3)

Der erste Teil bewirkt das bei Mausbewegung über dem Objekt ein entsprechender Text angezeigt wird in der Aktionszeile UND sofern der zweite Wert TRUE ist auch über dem Mauszeiger. Der Befehl showinfo ist zwingend erforderlich wenn das Objekt auf Befehle wie use oder open reagieren können soll!

Im "Click" Teil lasst ihr nun einen Character laufen. Durch den Begriff "self" wird der momentan gewählte Character angesprochen. Die nächsten beiden Werte sind die Koordinaten wie ihr sie in der Walkmap im Raumfenster seht. Der vierte Wert ist die gewünschte Richtung in die euer Character nach Erreichen des Objektes schauen soll. 1 = Nach unten, 2 = Nach oben, 3 = rechts, 4 = links.

Hinweis : Um einen anderen Character anzuvisieren wird statt walkto der Befehl follow (self ; character2) verwendet.


Ein Bedienfeld Button erstellen

Erstellt zunächst mal einen weiteren Raum den ihr im Setup als Bedienfeld eintragt. Schaltet auch das Bedienfeld ein und bestimmt wie es erscheinen soll
Kreirt nun ein Objekt das als Button dient. Wenn ihr wollt sollte es einen Zustand besitzen der anzeigt wenn die Maus über ihn hinwegfährt. Ein Beispielskript für einen Button sieht wie folgt aus :

on (mouse)
  instobj (button1 ; 2)
on (click)
  {
    setobj (button1 ; 3) "Optional"
    command (look)
  }

Da unser Button nicht auf Befehle reagieren muss sondern einen erzeugen soll, können wir auf showinfo verzichten. Stattdessen verwendet wir hier instobj.
Dieser Befehl bewirkt das ein Zustand eines Objektes für die Zeit die die Maus über ihm verweilt verändert wird, NICHT dauerhaft. Dadurch haben wir die Möglichkeit den Button aufleuchten zu lassen. Wer möchte kann darauf aber auch verzichten.

Im Clickbereich muss nun der Befehl command (euerBefehl) stehen. In dem Fall hier lautet dieser "look".
Optional läßt sich der Button beim clicken noch animieren durch den Befehl setobj. Setobj setzt den Zustand eines Objektes dauerhaft um.


Ein Objekt anschauen können

Zunächst mal : Jeder Befehl so auch "look" wird vom Character immer erst dann ausgeführt wenn der angegebene Punkt des walkto Befehls im on (click) Teil erreicht wurde, außer natürlich es ist kein Character gewählt.
Der folgende Teil muss euerm Objektskript hinzugefügt werden.

on (look)
  speech (self ; Hier euern Beschreibungstext für das Objekt ; sprachsample)

"self" steht auch hier für den akut gewählten Character, kann aber durch einen Characternamen ersetzt werden. Als zweites gebt ihr den Text den euer Character sprechen soll ein. Der dritte Wert ist der Name des Soundfiles für Sprachausgabe und ist nur optional!

Hinweis : Anschauen eines Gegenstands oder Characters funktioniert genauso.


Etwas aufsammeln können

Wichtig : Ein Objekt im Raum das aufsammelbar ist und den Gegenstand der sich anschließend tatsächlich in der Inventory befindet sind 2 verschiedene Dinge!

Jetzt brauchen wir einen Gegenstand. Ich schlage hier einen Schlüssel vor. Das Skript des Gegenstands könnt ihr vorsorglich schon mal mit der Vorlage für Gegenstände füllen, soll uns aber jetzt egal sein.

Nun brauchen wir ein entsprechendes Objekt das in den Raum gesetzt und anschaubar gemacht wird. Im Skript für dieses Objekt kommt nun :

on (pickup)
  if_obj (key ; 1)
  {
    setobj (key ; 0)
    pickup (self)
    playsound (pickupeffect)
    additem (self ; key)
  }

Hinweis : Das Objekt im Raum und der Inventorygegenstand tragen in diesem Beispiel den selben Namen, was durchaus geht.

Als erstes wird durch if_obj überprüft ob das Objekt nicht bereits aufgesammelt wurde.
Wenn nicht geschieht folgendes :
  • Das Objekt "key" wird auf Zustand "0" (aus) gesetzt, verschwindet dadurch nicht nur vom Bild sondern ist auch kein zweites mal aufsammelbar.
  • Der angegebene Character macht seine Nimmanimation.
  • Ein Soundeffekt für "nehmen" wird abgespielt.
  • Der Gegenstand "key" wird der Inventory des aktuellen Characters hinzugefügt.


    Inventory bedienen

    Um sich in einer Inventory zu bewegen braucht ihr in eurem Bedienfeld (oder in eurem Subroom, je nach dem) zwei Objekte die als Pfeilbuttons dienen. Mit diesen Buttons werden nun die Befehle inv_up (anzahl) und inv_down (anzahl) ausgeführt. Als Anzahl sollte die Breite eurer Inventory verwendet werden.


    Reaktion bei nicht möglich

    Da natürlich nicht alle möglichen Kombinationen von Befehlen und Objekten verwendet werden muss darauf reagiert werden wenn etwas nicht geht.
    Dies geschieht im Characterskript des aktiven Characters. Clickt dazu auf einen gewünschten Character in einem Raum im Editor.
    Reagiert werden kann speziell auf einen bestimmten Befehl und zwar so :

    on (cantpickup)
      speech (self ; Das kann ich nicht mitnehmen. ; speech_cantpickup)

    Wird versucht ein Objekt oder Character mitzunehmen und selbiges/r hat KEIN on (pickup) wird das on (cantpickup) Ereigniss im Characterskript ausgeführt, sofern vorhanden.
    Ist keine Spezielle Reaktion erwünscht oder vorhanden kann auch allgemein reagiert werden durch :

    on (cantall)
      speech (self ; Das funktioniert nicht. ; speech_cant)

    Hinweis : In der Vorlage für ein Gegenstandsskript ist die Stelle vorhanden :

    on (pickup)
      break()

    Dies soll verhindern das der Nimm Befehl auf einen Gegenstand etwas auslöst wie "Das kann ich nicht mitnehmen", was blödsinnig wäre, weil man den Gegenstand je bereits hat.


    Eine Tür erstellen

    Zunächst brauchen wir ein Türobjekt mit zwei Zuständen : "Tür zu" und "Tür offen". Setzt es in euren Raum mit dem Zustand "zu"
    Das Skript für die Tür startet so :

    on (mouse)
      showinfo (Tuer ; false)

    on (click)
      {
        walkto (self; 8; 16; 4)
        if_obj (Tuer ; 2)
          if_command ()
            walkto(self; 5 ; 15)
      }

    Der erste Walkto Befehl setzt den Character an den Punkt nahe bei der Tür von wo es Sinnvoll aussieht wenn der Character sie öffnen oder schließen soll. Der zweite Walkto Befehl setzt ihn an die Stelle wo er durch die Tür geht und wo er auf einen Punkt mit einem Walkmapskript trifft um den Raum wechseln zu können. Dazu später mehr.
    Die Bedingung für den zweiten Punkt ist das zum einen die Tür offen ist (Zustand 2) und der aktuelle Befehl nichts, also "gehe zu", ist. Ist die Tür zu oder ist der aktuelle Befehl etwas wie "use" oder "open" wird der erste Punkt angelaufen.

    Zum Öffnen und Schließen kommt nun folgendes hinzu :

    on (open)
      if_obj (tuer ; 1)
        {
          playsound (tuerauf)
          setobj (Tuer ; 2)
        }

    on (close)
      if_obj (Tuer ; 2)
        {
          setobj (Tuer ; 1)
          playsound (tuerzu)
        }

    Es wird in beiden Teilen der Zustand der Tür überprüft anschließend umbenannt und ein entsprechender Sound abgespielt.


    Etwas kombinieren

    Um ein Objekt/Gegenstand mit einem anderen kombinieren zu können gibt es den Befehl Link (linkname)
    In der Vorlage für Gegenstandskripts steht folgendes :

    on (use)
      link (key)

    Der Begriff "key" wird festgehalten um später abgefragt werden zu können. Durch den Skriptbefehl link wird außerdem der aktuelle Befehl zu "link" geändert.
    Im Objekt oder Gegenstand, das als zweites angeclickt wird, muss nun im Skript stehen :

    on (link)
      {
        if_link (key)
          {
            *Hier rein was passiert wenn die Sachen kombiniert werden*
            break()
          }
        speech (self ; Damit kann man das nicht benutzen. ; speech_cantuse)
      }

    Durch if_link wird der vorher mit link gegebene Begriff überprüft. Ist es der Richtige erfolgt das Ereigniss auf die Kombination gefolgt von break()
    Dieses bewirkt das der restliche Teil des on (link) Teils abgeschnitten wird. Dadurch wird der letzte Skriptbefehl speech nur ausgeführt wenn if_link falsch ergeben hat.


    Eine aufschließbare Tür erstellen

    Erstellt einen Merker z.B mit dem Namen "tuer_verschlossen" und setzt ihn auf TRUE in dem ihr ein Häkchen an den Merker setzt. Damit regelt ihr das eure Tür zu Beginn des Spiels auch abgeschlossen ist.

    Um die Tür aufzuschließen müsst ihr einen Schlüssel mit ihr benutzen. Dafür muss ins Türskript :

    on (link)
      {
        if_link (key)
          {
            if_bool (tuer_verschlossen ; true)
              playsound (benutzekey)
            setbool (tuer_verschlossen ; false)
            break()
          }
        speech (self ; Damit kann man das nicht benutzen. ; speech_cantuse)
      }

    Der Merker "tuer_verschlossen" wird auf false gesetzt und ein Soundeffekt wird abgespielt fürs aufschließen. Jetzt müsst ihr noch dafür sorgen das die Tür auch nur dann geöffnet werden kann wenn sie vorher entriegelt wurde. Deshalb sieht das on (open) nun so aus :

    on (open)
      {
      if_bool (tuer_verschlossen; false)
        {
          if_obj (tuer ; 1)
            {
              playsound (tuerauf)
              setobj (Tuer ; 2)
            }
          break ()
        }
      speech (self ; Die Tuer ist verschlossen. ; speech_doorlocked)
      }

    Ist die Tür aufgeschlossen wird sie geöffnet, ein Sound abgespielt und das Restskript abgeschnitten. Ist sie verschlossen gibts ne entsprechende Meldung.


    Etwas geben

    Um einen Gegenstand einem anderen Character zu geben muss dieser mit givelink () vorbereitet werden. In der Vorlage für Gegenstandskripts ist dies bereits drin :

    on (give)
      givelink ()

    Durch den givelink Befehl wird der jeweilige Gegenstand zwischengespeichert.
    Die Vorlage für Character Skripts enthält bereits die passende Reaktion um einen Gegenstand anzunehmen. Self ist der Character der gibt und Char2 ist der der bekommt :

    on (givelink)
      {
        delitem (self ; givelink)
        additem (char2 ; givelink)
        lookto (char2 ; self)
        playsound (pickup)
        pickup (self)
        pickup (char2)
      }

    Als erstes wird beim gebenden Character der Gegenstand der vergeben werden soll entfernt. Durch den Wert "givelink" im Befehl delitem ist genau der Gegenstand gemeint durch den vorher der givelink () Befehl ausgelöst wurde. Dann wird den zweiten Character der Gegenstand hinzugefügt.
    lookto bewirkt das der Empfänger Character den anderen anschaut.
    Anschließend wird noch ein Sound abgespielt und beide Character machen ihre "Nehmen" Animation.


    Musik und Loopsounds

    Musik wird mit dem Befehl playmusic (euremusik) gestartet und mit stopmusic() beendet. In der Regel könnt ihr das Abspielen von Musik an den Raum binden in dem ihr im Raumskript unter dem Ereigniss on (enter) die Musik startet.
    Dem playmusic Befehl läßt sich noch ein zweiter Wert einfügen welcher nur für Modulmusik gedacht ist. Mit diesem könnt ihr den Pattern im Song bestimmen der gestartet werden soll, so könnt ihr bspw. beim Wechseln von Charactern (wie bei DOTT) erst eine kleine Intromelody abspielen lassen und dann den Hauptsong des Raumes.

    Um einen Soundeffect als Loop benutzen zu können, etwa für Maschinengeräusche, gibt es die Befehle loopsound (euersound) und loopstop (euersound). Diese sollten beim Betreten des Raumes gestartet werden und beim Verlassen mit on (exit) im Raumskript wieder beendet werden.

    Es können maximal 3 Loopsounds gleichzeitig abgespielt werden.


    Videos und Flashfilme abspielen

    Mit den Befehlen playvideo (video ; true/false) und playswf (Flashmovie) können Filme im Spielverlauf abgespielt werden.
    Hierbei ist zu beachten das die Darstellung der Filme IMMER vor allen anderen Spielteilen verläuft. Die Filme sind kein Bestandteil von Objekten oder Räumen sondern laufen seperat, unabhängig von Raumpositionen, Lichteffekten ect.
    AVI,MPG und WMV Filme stoppen automatisch nach dem Ende, Flashfilme MÜSSEN manuell geschlossen werden mit stopswf()

    Obwohl die Filme immer im Vordergrund laufen, kann man Filme begrenzt auch als Spielelement verwenden. Ein Video oder Flashfilm kann mit zusätzlichen Angaben über X,Y, Breite und Höhe versehen werden. (Siehe Skriptreferenz)
    Nehmen wir an in einem Raum steht ein Fernseher. Um einen Film darauf abzuspielen muss die Raumposition per Cutscene festgelegt werden und es dürfen keine Character vor dem Fernseher stehen, so entgeht man dem Problem das Filme immer im Vordergrund laufen.

    Das Abspielen muss innerhalb einer Cutscene geschehen, NICHT im normalen Spielverlauf.

    Wichtig : SWF Dateien welche durch ein auf dem PC befindliches Shockwave Plugin abgespielt werden verweigern auf 64bit Betriebssystemen scheinbar die Arbeit! Daher ist WMV das empfohlene Standard Format.


    Eine Textscene erstellen

    Eine Textscene ist eine typische Spielsituation aus Point&Click Adventures wenn mit jemanden geredet werden soll. Ihr habt im untereren Bildschirmrand eine Auswahl von Sätzen die ihr sagen könnt und je nach Spielverlauf erweitert und verändert sich diese auch.

    Um eine Textscene im Editor zu erstellen werden Skripte verwendet. Erstellt also ein neues Skript und füllt diese mit der Vorlage im Skriptfenster für Textscenes mit 3 Reihen.
    Das sieht dann so aus :

    level ( )
      {
        row (1 ; ; true)
          {

          }
        row (2 ; ; true)
          {

          }
        row (3 ; ; true)
          {

          }
      }

    Eine Textscene hat maximal 9 Level mit jeweils maximal 9 Reihen. Beim Start einer Textscene mit dem Befehl textscene(namederscene) beginnt der Level automatisch bei 1.
    Tragt also oben bei Level eine 1 ein. Als zweiten Wert in der Zeile Row nach der Nummerierung tragt ihr den Text ein der unten im Bildschirm zu sehen ist. Der dritte Wert TRUE bestimmt das diese Zeile beim Start des Spiels aktiv ist. Soll sie noch nicht aktiv sein könnt ihr dort FALSE eintragen. In den Bereich nach Row kommt nun rein was passiert beim anclicken dieser Zeile. Normalerweise sind das dann zwei speech Befehle um einen Dialog darzustellen. Aber es kann natürlich auch alles andere rein.

    Um die Auswahlmöglichkeiten aus- und abzubauen gibt es die Befehle activate und deactivate. Benutzt werden diese z.B so :

    activate (textscene3 ; 2 ; 5)
    deactivate (self ; 1 ; 3)

    Der erste Wert ist die zu verändernde Textscene. Soll eine Zeile der gerade aktiven Textscene geändert werden kann auch self angegeben werden.
    Der zweite Wert ist der Level und der Dritte die Reihe die aktiviert oder deactiviert werden soll.

    Mit gotolevel (zahl) könnt ihr in einer Textscene das Level Wechseln.
    Mit endscene() verlasst ihr eine Textscene wieder.

    Tipp 1 : Eine Textscene muss nicht nur für ein Gespräch genutzt werden, sondern kann auch als generelle "Multiple-Choice" Abfrage genutzt werden, etwa wie das Bedienen einer Schalttafel wo ihr Knopf A, Knopf B oder Knopf C drücken könnt.
    Tipp 2 : Es ist auch möglich statt Textzeilen, Symbole zu verwenden. Stellt dazu die dazugehörige Option im Projekt Setup um. Als Symbole werden Gegenstände verwendet. In der Row Zeile müsst ihr dann als zweiten Wert keinen Text sondern den Namen des jeweiligen Gegenstands eingeben, dass wars schon. Wenn ihr beide Formen einer Textscene verwenden wollt könnt ihr den Modus mit dem Befehl textscenestyle im Spiel umändern.
    Tipp 3 : Ihr könnt die Darstellung der Textszene mehr personalisieren indem ihr statt der normalen Darstellung eine Hintergrundgrafik angebt und die Position und Breite der Dialogbox bestimmt z.B so : textscene (name ; 200 ; 100 ; 250). Das Dialogfeld wird an Pixelposition 200/100 mit einer Breite von 250 Pixeln ausgegeben.


    Einen Raum wechseln

    Befindet ihr euch in einer Cutscene oder ist kein Character fokusiert könnt ihr den Befehl loadroom (euerraum) benutzen. Ist ein Character aktiv passt sich der aktuelle Raum automatisch der Position des Characters an, also müsst ihr nur den Character in einen anderen Raum bekommen

    Dazu braucht ihr einen Punkt auf der Walkmap den euer Character beim anclicken des Ausgangs betritt. Das Skript dieses Walkmappunktes enthält dann den Befehl beamto (self ; NeuerRaum ; 13 ; 23 ; 2)
    Dieser Befehl funktioniert wie walkto nur das ihr zusätzlich einen Raum angebt UND das euer Character nicht dort hinläuft sondern SOFORT an Ort und Stelle steht.
    13 und 23 sind die Koordinaten und 2 die Blickrichtung die der Character einnimmt.