Autor Thema: MMM - Die eigene Episode - Anleitung für AGS  (Gelesen 22921 mal)

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2371
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
MMM - Die eigene Episode - Anleitung für AGS
« am: 20. Oktober 2006, 19:18:53 »
AGS Einsteigertutorials für die Arbeit mit den Maniac Mansion Mania Starterpacks!

Für AGS-Version:
Tutorial AGS 3.xx <- wärmstens empfohlen
Tutorial AGS 2.61 - 2.72 <- für Nostalgiker
AGS-Farbentabelle, MMM-Sound Tabelle zum Nachschauen
« Letzte Änderung: 11. Februar 2011, 19:27:52 von Rocco »

Endres

  • Midlife Crisis Tentakel
  • ******
  • Beiträge: 1264
  • Geschlecht: Männlich
  • En|dres, der
    • ICQ Messenger - 230191486
    • MSN Messenger - enni_puschner@hotmail.de
    • Profil anzeigen
    • e7p.de
    • E-Mail
MMM - Die eigene Episode - Anleitung für AGS 3.x
« Antwort #1 am: 07. Januar 2011, 00:14:17 »
edit Rocco: Da die Bilder hier nicht mehr angezeigt werden, gibts hier noch die Version mit Bilder -> http://web.archive.org/web/20130630150917/http://www.maniac-mansion-mania.de/forum/index.php?topic=15.msg36729#msg36729

Überarbeitete Version für AGS 3.x!

Dieses Tutorial soll in das Erstellen von Episoden für Maniac Mansion Mania mit dem Autorensystem AGS (Adventure Game Studio) einführen. Wenn technische Fragen aufkommen, hilft meistens ein Blick in die sehr gute Hilfe von AGS, die unter anderem alle Scriptbefehle, die nicht nur in diesem Artikel auftauchen, genau erklärt. Sollten trotzdem noch Fragen bleiben, findest du eine hilfreiche Community entweder hier im Forum oder im Adventure-Treff AGS-Forum, wo du deine Fragen stellen kannst.

Als Voraussetzung für dieses Tutorial solltest du dir erst mal ein paar Sachen herunterladen:

  • Eine aktuelle Version AGS. (Ich nehme hier im Tutorial 3.1.2 SP1, jede neuere sollte jedoch im Prinzip die gleichen Schritte benötigen)
  • Ein AGS-Starterpack für MMM (In diesem Tutorial Dave's Starterpack, wichtig ist, dass es möglichst neu ist – also 3.0.2)

Ein paar Englischkenntnisse solltest du übrigens auch mitbringen, da Oberfläche und Hilfe von AGS nicht auf Deutsch verfügbar sind.

Wenn du dir beides heruntergeladen hast, installierst du zuerst AGS und entpackst das AGS-Starterpack in das Templateverzeichnis von AGS. (Bei mir "C:\Programme\Adventure Game Studio 3.1.2 SP1\Templates") Dann startest du AGS (zum Beispiel über das Startmenü) und wählst "Start a new game".



Nach einem klick auf "Next" sollte das Starterpack, welches du dir heruntergeladen hast, erscheinen.



Nun solltest du den Namen des Spiels festlegen. Der erste Name kann im Nachhinein noch geändert werden, dort kannst du zum Beispiel auch die Episodennummer mit eingeben. Der zweite "Ordnername" lässt sich nicht mehr einfach ändern, daher sollte man dort sehr vorsichtig mit sein. Schau dir einfach mal mein Beispiel an.



Such dir einfach einen schönen Namen aus. Als zweiten Namen kannst du auch erstmal sowas wie "meine_erste_episode" nehmen. Danach solltest du aber schon eine Meldung erhalten. Diese erscheint, wenn du 3.0.2 Starterpacks in einer höheren Version von AGS öffnest. Drücke auf Okay und befolge die Nachricht.





Jetzt kannst du mit F5 das Spiel zum ersten Mal testen und mit Dave ein wenig durch sein Haus laufen.




Hotspots

Jetzt geht es daran, die Räume mit Leben zu füllen. Beginnen wir in Dave's Zimmer. Öffne dazu rechts oben den Baum bei "Room" und bei "Daves Zimmer". Dann auf "Edit Room" auf einen Doppelklick. Du bist jetzt im Raumeditor. Wenn du nun in der zweiten Auswahlbox statt "Nothing" "Hotspots" auswählst, siehst du, welche Hotspots in dem Raum eingerichtet sind. Das sind Bereiche im Hintergrund, auf die der Spieler dann später draufklicken kann, zum Beispiel die Tür oder das Bett. Der gerade ausgewählte Hotspot ist farbig markiert.



Wähle die Pinnwand aus (hPinnwand, ID; 7), klicke auf das Blitzsymbol, (siehe Screen) hier auf "Any Click on hotspot" und dort auf "...".



Der Scripteditor öffnet sich dann. Die ersten Zeilen sehen so aus:

[ags]   if (any_click_move(190, 123, eDirUp))
   {
      if (UsedAction(eActWalkTo))
      {[/ags]

Die erste Zeile bestimmt, dass der Spieler erst an die Position (190, 123) auf dem Bildschirm geht, damit das passiert, was in den geschweiften Klammern (Tipp: Am besten den Inhalt von geschweiften Klammern immer einrücken, damit man sieht, wie weit dieser noch geht) auf dieser Ebene passiert. Die zweite Zeile sorgt dafür, welches Verb angeklickt sein muss, bevor das passiert, was innerhalb der geschweiften Klammern danach steht. Die Positionen werden im Room Editior auch angezeigt, wenn man den Mauszeiger über die Raumgrafik bewegt. In diesem Fall steht in der dritten "Funktionsebene" nur:

[ags]      //  Wait(5);[/ags]

Dies ist ein auskommentierter Funktionsaufruf. Das heißt, dass AGS die Zeile nicht beachtet, als ob sie da nicht stehen würde. Das heißt, der Charakter geht nur bis zur Position und guckt nach oben, sonst nix – Er wartet nicht, weil es auskommentiert ist. Mehr tut er nur bei anderen Aktionen. Dass mehr nicht passiert, ist klar, denn der Aufrag an die Spielfigur lautete ja nur eActWalkTo, d.h. "Gehe zu". Möglich sind hier außerdem die folgenden Verben: eActLookAt (Schau), eActUse (Benutze), eActPickUp (Nimm), eActPush (Drücke), eActPull (Ziehe), eActOpen (Öffne) und eActClose (Schließe). Bei Charakteren gibt es auch noch die Aktion eActTalkTo (Rede) und bei Inventargegenständen eActGiveTo (Gebe), dazu später. Im Anhang findest du noch eine praktische Tabelle für den Überblick hierbei.

Da hier nicht mehr passiert, schauen wir uns also die nächste if-Fallunterscheidung an.

[ags]      else if (UsedAction(eActLookAt))
      {
         Wait(5);
         player.Say("Ja, auch ich hab so meine Pläne.");
         player.FaceDirection(eDirDown);
         player.Say("He, he, he.");
      }[/ags]

Dieser Code wird ausgeführt, wenn die Pinnwand angeschaut wird. Natürlich geht Dave auch wieder zur Pinnwand und schaut sie an, denn das war ja die erste Abfrage. Wichtig ist auf dieser zweiten Ebene, dass ab dem zweiten if-Block mit "else" eingeleitet wird, also "wenn das passiert oder sonst wenn das passiert". Dave wartet einen kurzen Moment und gibt dann zwei Kommentare ab, wozwischen er sich dem Charakter zuwendet. Es gibt die vier Richtungen eDirUp (nach hinten, also oben), eDirRight (nach rechts), eDirDown (nach vorne, also unten), eDir Left (nach links).

So geht das dann die Aktionen durch, die definiert sind. Beim letzten else steht dann noch:

[ags]      else Unhandled();[/ags]

Diese Zeile sorgt dafür, dass auch etwas passiert, wenn der Spieler etwas macht, was im Script nicht festgelegt wäre (z.B., wenn kein LookAt definiert wäre, würde Unhandled bei "Schau an Pinnwand" greifen). Unhandled lässt den Spieler nur einen passenden Standardkommentar sagen, wie "Nett".

Auf diese Weise können auch eigene Hotspots definiert werden. Beispiel: Du wählst nun im "Room 5"-Tab über die Auswahlliste rechts in der mitte unter "hPinnwand (Hotspot; ID 7)" hHotspot12 aus (den gibt es noch nicht im Raum) und zeichnest mit den Zeichenwerkzeugen eine der unteren Schubladen nach. Nun wählst du wieder das andere Symbol links neben dem Blitz aus und gibst in das Feld "Name" "hSchubladeUnten" ein, dieser Name wird im Script verwendet. Bei "Description" schreibst du "Schublade>l" rein. Diese Beschreibung wird im Spiel angezeigt. Das ">l" wird natürlich nicht gezeigt, sondern bedeutet, dass die Standardaktion für die rechte Maustaste "Anschauen" ist. Es gibt hierbei >o (Öffnen), >c (Schließen), >l (Schau), >p (Nimm), >u (Benutze), >s (Drücke), >y (Ziehe) und in besonderen Fällen >t (Rede), >g (Gib), >v (Variabel, wie Türen Öffnen und Schließen) und >n (Normal). Wie gesagt, im Anhang eine Übersicht für die Aktionen. Schließlich drückst du bei dem Blitz und "Any click on hotspot" wieder auf "..." und schreibst rein:

[ags]   if (any_click_move(160, 123, eDirUp))
   {
      if (UsedAction(eActLookAt))
      {
         Wait(5);
         player.Say("Das alte Mistding klemmt die meiste Zeit.");
      }
      else Unhandled();
   }[/ags]

Dein erster Hotspot ist fertig. Erinnerst du dich daran, dass du alles mit F5 ausprobieren kannst, wenn du was geändert hast?


Objekte

Wenn du wieder in dem "Room 5"-Tab, dort wo wir "Hotspots" ausgewählt haben auf "Objects" klickst, kann du die Objekte in dem Raum bearbeiten.



Anders als Hotspots sind Objekte nicht Bereiche im Hintergrund, die man anklicken kann, sondern Grafiken, die praktisch auf dem Hintergrund liegen und z.B. verschoben oder mitgenommen werden können. Als Beispiel wollen wir auf Daves Tisch einen Laptop stellen. Erst erstellen wir durch Rechtsklick auf der ungefähren Position des Laptops ein neues Objekt.



Nun weisen wir der erscheinenden Tasse (das ist das Zeichen dafür, dass diesem Objekt noch keine Grafik zugewiesen wurde) eben eine Grafik zu. Also gehst du nun wieder in die Eigenschaftsliste unten rechts, dort bei Image auf die bekannten drei Punkte. Du befindest dich in Dave's Raum, also navigierst du nach Räume und dann nach Daves Zimmer. Hier siehst du die Sprites, die in Dave's Raum schon vorhanden sind. Erst einmal kopierst du diese Grafik aus deinem Browserfenster in die Zwischenablage:



Dann klickst du rechts auf einen freien Bereich im rechten Abschnitt und wählst "Paste new sprite from clipboard...". Öffnet sich folgendes Fenster, musst du nur noch auf "Import Whole Image" klicken. Ansonsten solltest du dir die Bilddatei herunterladen und stattdessen im Kontextmenü "Import new sprite from file..." wählen. Die Farbtiefe der Bilder wird bei diesem Vorgang gleich an das Spiel angepasst, da AGS-Adventures den gewissen "Old-School"-Stil haben.



Jetzt klickst du nur noch doppelt auf den importierten Laptop, und schon sollte er am Schreibtisch stehen. Du kannst nun noch die Position durch ziehen des Objekts anpassen, außerdem solltest du ihm eine Beschreibung (z.B. Laptop) und einen Namen (z.B. oLaptop) geben, dies funktioniert wie bei den Hotspots.

Damit Dave damit auch was machen kann, müssen wir wieder das Skript erweitern. Dazu gehst du auf den Blitz und dann bei "Any click on object" auf die drei Punkte und fügst folgendes Skript ein:

[ags]   if (any_click_move(187, 122, eDirUp))
   {
      if (UsedAction(eActLookAt))
      {
         Wait(5);
         player.Say("Mein neuer Laptop.");
      }
      else if (UsedAction(eActPickUp))
      {
         Wait(5);
         //ins Inventar
      }
      else if (UsedAction(eActUse))
      {
         Wait(5);
         player.Say("Dafür habe ich jetzt keine Zeit.");
      }
      else if (UsedAction(eActOpen))
      {
         Wait(5);
         player.Say("Er ist bereits aufgeklappt.");
      }
      else if (UsedAction(eActClose))
      {
         Wait(5);
         player.Say("Der kann anbleiben.");
      }
      else if (UsedAction(eActPull) || UsedAction(eActPush))
      {
         Wait(5);
         player.Say("Ich verrücke ihn jetzt nicht.");
      }
      else Unhandled();
   }[/ags]

Wenn Dave für verschiedene Aktionen an verschiedene Orte gehen soll, was in einigen Sonderfällen passieren kann, kann man das if mit der Position auch stattdessen in alle UsedAction-ifs einbauen, natürlich entsprechend mit angepassten Positionen. Hier ein gekürztes Beispiel. Beim benutzen geht er statt zum Laptop zur Tür:

[ags]   if (UsedAction(eActLookAt))
   {
      if (any_click_move(187, 122, eDirUp))
      {
         Wait(5);
         player.Say("Mein neuer Laptop.");
      }
   }
   else if (UsedAction(eActUse))
   {
      if (any_click_move(273, 125, eDirRight))
      {
         Wait(5);
         player.Say("Dafür habe ich jetzt keine Zeit.");
      }
   }
   else if (any_click_move(187, 122, eDirUp)) Unhandled();[/ags]


Inventargegenstände

Wie du vielleicht schon im Skript gesehen hast, war da noch keine Funktion zum nehmen des Laptops darin, lediglich ein Kommentar "ins Inventar" - aber so einfach ist das schließlich nicht.



Du kopierst dir also als erstes wieder diese Grafik (wenn du mal selbst eine Zeichnest - sie sollte 31x19 Pixel groß sein, theoretisch möglich wären aber auch 38x22 Pixel) in die Zwischenablage und öffnest dann oben rechts in AGS den Baum "Inventory Items", worin du siehst, dass bereits eine Fernbedienung definiert wurde. Also klickst du rechts auf "Inventory Items" und dann auf "New inventory item".



Auch hier musst du also wieder auf Image gehen und im Spritefenster in den Ordner "Inventar" gehen, dort das Sprite einfügen und auswählen. Die Beschreibung ("Laptop>u", zu diesem ">u" später mehr) und der Name ("iLaptop") sollte natürlich auch gesetzt werden.

Die Aktionen müssen wieder über den Blitz eingefügt werden. Der Unterschied hierbei ist, dass wir mehrere Funktionen aktivieren müssen, da es bei Inventargegenständen kein "Any click" gibt. Also erstellst du als erstes die "Look at inventory" Funktion:

[ags]   Wait(5);
   player.Say("Es läuft eine Kommandozeile.");[/ags]

Dann die "Other click on inventory" Funktion. Hierbei ist wichtig, dass statt "Unhandled" zum schluss "Unhandled_Inventory" verwendet wird, da wir hier ja einen Inventargegenstand vorliegen haben:

[ags]   if (UsedAction(eActOpen))
   {
      Wait(5);
      player.Say("Er ist bereits aufgeklappt.");
   }
   else if (UsedAction(eActClose))
   {
      Wait(5);
      player.Say("Der kann anbleiben.");
   }
   else Unhandled_Inventory();[/ags]

Und zu guter letzt kommen wir nochmal zum ">u" zurück. Inventargegenstände sind ja immer mit dem Benutze-Befehl vorausgewählt. Warum habe ich also trotzdem nochmal dieses Kürzel drangehängt? Ganz einfach: Wir wollen den Laptop vielleicht später nochmal alleine benutzen, ohne zweiten Inventargegenstand. Und deshalb bedeutet das ">u" bei Inventargegenständen, dass das "Benutze mit" wieder zu "Benutze" wird. Dies machst du bei diesem Fall im "Use inventory on this item" Skript (Wenn rulaman es geändert hat, bitte hier Interact on this item verwenden!):

[ags]   if(UsedAction(eActUse)) {
      Wait(5);
      player.Say("Vielleicht woanders.");
   }
   else Unhandled_Inventory();[/ags]

Man kann noch weitere else ifs für andere Inventagegenstände definieren, also wenn zum Beispiel ein USB-Stick mit dem Laptop benutzt werden soll sähe das etwa so aus:

[ags]   if(UsedAction(eActUse)) {
      Wait(5);
      player.Say("Vielleicht woanders.");
   }
   else if(player.ActiveInventory==iUSBStick) {
      Wait(5);
      player.Say("Ich stecke den Stick mal rein...");
   }
   else Unhandled_Inventory();[/ags]

Natürlich haben wir jetzt aber noch das wichtigste vergessen. Denn immernoch ist in der "Any Click" Routine vom Objekt unser langweiliger Kommentar zu sehen, den du jetzt noch mit folgendem ersetzt, damit das Objekt verschwindet und in unser Inventar wandert, damit wir die ganzen definierten Funktionen auch verwenden können:

[ags]         oLaptop.Visible = false;
         PlaySound(4);
         player.AddInventory(iLaptop);[/ags]


Charaktere

Was wäre Maniac Mansion ohne Dave's Freunde? Als nächstes wollen wir ihm Sandy zur Seite stellen. Klicke dazu rechts oben in der Baumstruktur auf "Characters" doppelt und wähle cSandy aus. Hier stellst du ein, dass Sandy in Raum 5 startet ("StartingRoom"), und zwar an Position X = 260 und Y = 130. Wichtig ist auch, dass das Clickable-Attribut auf "True" gesetzt ist.



Jetzt richten wir auch für sie eine "Any click on character" Interaktion ein:

[ags]   if(any_click_move(230, 130, eDirRight)) {
      if(UsedAction(eActLookAt)) {
         player.Say("Meine Freundin.");
      }
      else if(UsedAction(eActTalkTo)) {
         cSandy.FaceDirection(eDirLeft);
         Wait(20);
         player.Say("Ich liebe Dich, Sandy!");
         Wait(30);
         cSandy.Say("Ich Dich auch, Dave.");
         Wait(20);
         cSandy.FaceDirection(eDirDown);
      }
      else if(!UsedAction(eActUseInventory)) Unhandled_Character();
   }[/ags]

Das einzige, was merklich anders ist, als sonst, ist das letzte else if. Wenn es eine "Use inventory on character" Funktion gibt, darf eine Standardnachricht nicht beim geben kommen. Ansonsten könntest du auch für das letzte else if folgendes schreiben:

[ags]else Unhandled_Character();[/ags]

Und das bringt uns schon zum nächsten Punkt. Denn möglicherweise möchten wir ja auch, dass Sandy von uns den Laptop gegeben haben kann. Darum fügst du jetzt noch in die Andere Charakteraktion "Use inventory on charakter" ein:

[ags]   if(player.ActiveInventory==iLaptop) {
      if(any_click_move(230, 130, eDirRight)) {
         cSandy.FaceDirection(eDirLeft);
         player.Say("Willst du meinen Laptop mitnehmen?");
         player.InventoryQuantity[iLaptop.ID] = 0;
         UpdateInventory();
         PlaySound(4);
         cSandy.Say("Ja, du kriegst ihn auch irgendwann wieder.");
      }
   }
   else Unhandled_Character();[/ags]

Da die Aktion "Gib an" im Starterpack nicht richtig implementiert wurde, könnte es nötig sein die ganze Zeile 1753 ("else if ((GSagsusedmode == 4)" usw.) durch folgende zu ersetzen: [ags]else if ((GSagsusedmode == 4) && (GetLocationType (mouse.x, mouse.y) == 2) && isAction (eActGiveTo) && 0)[/ags] Sonst könnte der Gegenstand ohne Abfrage in der Charakteraktion abgegeben werden. (Wenn rulaman das Problem gelöst hat und die Zeile nicht mehr dem in etwa entspricht oder leer ist, diese Anweisung einfach ignorieren!)

Danach kann der Spieler den Laptop an Sandy geben.

Wenn du nicht mit Dave spielen willst, sondern z.B. mit Syd, dann klicke bei Syd einfach den Knopf "Make this the player character" an. Wichtig ist, dass dann bei ihm hinter "Start in Room" eine 1 steht (die Raumnummer des Startraums) und bei Dave eine -1, falls er nicht mehr im Spiel auftauchen soll. Auch "Clickable" sollte deaktiviert werden, damit wir nicht plötzlich mit uns selbst interagieren können. Bitte stelle nur sicher, dass zum Beispiel der Dialog mit Sandy ein bisschen anders ablaufen würde. ;)




Ein neuer Raum

Um einen neuen Raum zu bauen, muss es zunächst mal eine Tür geben, die dorthin führt. Natürlich könnte man auch Räume ohne Türen erstellen - zum Beispiel draußen. Jetzt will ich dir aber zeigen, wie man Türen erstellt. Dafür brauchen wir aber erstmal eine Tür im Raumhintergrund. Eine freie Stelle (wenn auch nicht ganz architekturell korrekt) habe ich im Schlafzimmer gefunden. Lade dir also folgendes Bild herunter und klicke im Raumeditor von dem Schlafzimmer auf "Change...". Dort kannst du es dann auswählen und tauschen.



Wenn die Tür nun im Raumeditor sichtbar ist, solltest du ein Objekt erstellen, was angezeigt wird, wenn die Tür offen (!) ist. Dabei muss man ein bisschen umdenken, im Prinzip ist es aber ganz einfach. Nimm folgendes Bild für ein neues Objekt, welchem du dann Namen "oTuerKammer" und Beschreibung "Tür" gibst und "BaselineOverriden" aktivierst.



Eingebaut sollte das dann etwa so aussehen:



Dann erstellst du nur noch einen Hotspot, der die gesamte Tür umfasst. Wichtig ist hier die Beschreibung "Tür>v".



Jetzt gibt es wieder ein "Any click on hotspot"-Script bei, welches diese eine Zeile enthalten soll:

[ags]   if(!Door[eDoorNumKammer].Click()) Unhandled();[/ags]

Das "eDoorNumKammer" ist ein beliebiger Name, der allerdings diesem Schema entsprechen sollte. Wir dürfen nachher nur nicht vergessen, ihn noch zu definieren.
Nun musst du die Raumladefunktion des Schlafzimmers um eine Zeile erweitern. Wo die Funktionslisten sind, solltest du ja mittlerweile wissen.



[ags]function room_Load()
{
   Door[eDoorNumKammer].Init(oTuerKammer, hTuerKammer); // Das ist die Zeile, die du einfügen musst
   oTuerFlur.init_object(3); // Dies ist ein älteres Türenskript, welches komplizierter war
   oTuerKueche.init_object(4);

   PlayMusic(23);
}[/ags]

Jetzt müssen wir aber noch das eDoorNumKammer definieren, denn wo soll das sonst herkommen?

Wir öffnen also in der Baumstruktur Scripts und dann Doors.ash. Dort sollte man ein "enum eDoorNum ..." stehen sehen. Wenn nicht, ist der enum noch nicht im Starterpack enthalten. Dann solltest du bitte überall, wo du "eDoorNumKammer" verwendet hast, stattdessen eine Zahl (z.B. 6) verwenden. Jedenfalls ist es wahrscheinlich dass in dem Starterpack dieser "enum" schon enthalten ist, und so fügst du vor dem schließenden } eine Zeile mit Inhalt "eDoorNumKammer," ein.

Nun musst du die Tür auch noch im globalen Türenskript einbauen, damit Sachen wie Position und Ziel der Türen geklärt werden. Dazu öffnest du das Script Doors.asc. Die Eigenschaften sind recht einleuchtend. Die normalen Eigenschaften legen das für den aktuellen Raum fest und die New-Eigenschaften für den zweiten Raum. Bei Türen ist das ein wenig problematisch, zu sagen, wo alt und wo neu ist, aber irgendwo fängt man ja schließlich an mit den Türen. Den folgenden Code fügst du am Ende der Funktion DoorSetup ein (zwischen dem letzten "Door[...]" und "}").

[ags]   Door[eDoorNumKammer].i_GlobalInt   = 0;

   Door[eDoorNumKammer].l_Room      = 8;
   Door[eDoorNumKammer].i_XPosition   = 90;
   Door[eDoorNumKammer].i_YPosition   = 116;
   Door[eDoorNumKammer].l_Direction   = eDirUp;
   
   Door[eDoorNumKammer].l_NewRoom   = 19;
   Door[eDoorNumKammer].i_NewXPosition   = 106;
   Door[eDoorNumKammer].i_NewYPosition   = 135;
   Door[eDoorNumKammer].l_NewDirection   = eDirRight;
   
   Door[eDoorNumKammer].s_LookAt   = "Die Tür zur Kammer.";
   Door[eDoorNumKammer].s_NewLookAt   = "Zum Schlafzimmer.";[/ags]

Jetzt musst du natürlich noch diesen neuen Raum 19 anlegen. Klicke dazu in der Baumstruktur auf "Rooms" rechts und wähle "New Room" aus. Dort siehst du auch schon die vorgesehene Raumnummer. Drücke nun auf OK und öffne den neuen Raum auch gleich (speichern nicht vergessen!). Du kannst ihn auch gleich schonmal benennen, nur zur Übersichtlichkeit. Vielleicht hast du es ja schon gemerkt, wir wollen eine Kammer machen.

Mit "Change..." kannst du wieder eine Hintergrundgrafik laden, denn schwarz ist uns ja ein bisschen dunkel. Als Beispiel habe ich wie immer ein Bild beigelegt. Also lade es wieder herunter und wähle die Datei nach Klick auf "Change..." aus.



Fast hätte ich es vergessen. Damit sich der Spieler auch im Raum bewegen kann, musst du noch eine Walkable-Area erstellen. Diese Funktion ist im Raumeditor unter der Auswahlliste, wo auch "Hotspots" und "Objects" zu finden sind. Du weißt schon... Die, wo am Anfang "Nothing" drin steht. Also wählst du "Walkable Areas" aus. Nun zeichnest du mit den Zeichenwerkzeugen ein wenig verkleinert den Boden nach, so in etwa wie in dem Screenshot:



Als nächstes solltest du jetzt als kleine Übung wie eben (also bei der anderen Tür) dafür sorgen, dass die Tür links funktioniert. Als Objektsprite habe ich auch schon was für dich. Den Rest solltest du aber mithilfe des Tutorials schaffen.




Viel Spaß

Wenn du alles so gemacht hast wie beschrieben, dann ist dein erstes MMM-Spiel immerhin schon mal nicht verbuggt oder du hast wenigstens Lust bekommen, dich an das neue 3.x System zu gewöhnen.

Jetzt liegt es an dir, weiter mit AGS rumzuspielen. Wenn Probleme auftauchen, dann solltest du einen Blick in die Hilfedatei werfen (F1 in AGS drücken) und wenn auch das nicht hilft, dann kannst du deine Frage auch gerne im Adventure-Treff AGS-Forum oder hier im Forum stellen.


Original von Jan 'DasJan' Schneider.

Überarbeitet für 3.x und "entbernardisiert" von Endres.


Anhang A

Hier die Tabelle für Aktionen und verschiedene Bezeichnungen dafür in AGS. Mit Endung ist das Anhängsel bei Beschreibungen von Objekten, Hotspots und Inventargegenständen gemeint.

im SpielEndungScript-WertBesonderheit
Schau an>leActLookAt
Benutze>ueActUse
Nimm>peActPickUp
Öffne>oeActOpen
Schließe>ceActClose
Gib an>geActGiveToNur in besonderen Fällen
Ziehe>yeActPull
Drücke>seActPush
Rede mit>teActTalkToNur in besonderen Fällen
Benutze mit-eActUseInventoryKann bei Inventargegenständen wichtig sein
Variable Aktion>v-Zum Beispiel bei Türen
Normal>n-
« Letzte Änderung: 15. November 2015, 22:44:22 von Rocco »


Domi:"irc hab ich mir viren geholt.. icq hab ich nimmer"

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2371
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: MMM - Die eigene Episode - Anleitung für AGS
« Antwort #2 am: 07. Januar 2011, 00:36:38 »
Hinweis: Dieses Tutorial ist nur für veraltete Starterpacks bis AGS Version 2.72 geeignet.
Es wird empfohlen, neuere Starterpacks zu verwenden und das überarbeitete Tutorial von Endres für AGS 3.xx zu verwenden.

Dieses Tutorial soll in das Erstellen von Episoden von Maniac Mansion Mania mit dem Autorensystem AGS einführen. Wenn technische Fragen aufkommen, hilft meistens ein Blick in die sehr gute Hilfe von AGS, die um Beispiel alle Scriptbefehle, die in diesem Artikel auftauchen, genau erklärt. Sollten trotzdem noch Fragen bleiben findet ihr eine hilfreiche Community im entweder hier im Forum, oder im Adventure-Treff AGS-Forum, wo ihr eure Fragen stellen könnt.
Als Voraussetzung für dieses Tutorial solltest du dir erst mal ein paar Sachen runterladen:

Eine aktuelle Version des Adventure Game Studio (AGS)
Ein AGS-Starterpack für MMM (In diesem Tutorial das Bernard Starterpack)
Die Bilder, die in diesem Tutorial benutzt werden.  -> siehe Anhang

Ein paar Englischkenntnisse sollte man übrigens auch mitbringen, da Oberfläche und Hilfe von AGS nicht in deutsch verfügbar sind. Alternativ kann man auch zum deutschen Autorensystem Visionaire greifen, für das in Kürze auch ein Starterpack vorliegen soll, oder zu einer anderen Engine.
Wenn du dir alles runtergeladen hast, installierst du zuerst AGS und entpackst das AGS-Starterpack in ein Verzeichnis deiner Wahl. Dann startest du AGS (mit agsedit.exe) und lädst das Starterpack mit "Load an existing game". Jetzt kannst du mit Strg+T das Spiel zum ersten Mal testen und mit Bernard ein wenig durch das Haus laufen.

Hotspots
Jetzt geht es daran, die Räume mit Leben zu füllen. Beginnen wir in Bernards Zimmer. Klicke dazu links auf "Room Editor" und dann einen Doppelklick auf den ersten Raum ("Bernards Zimmer"). Du bist jetzt im Raumeditor. Wenn du links auf "Areas" klickst, siehst du, welche "Hotspots" in dem Raum eingerichtet sind. Das sind Bereiche im Hintergrund, auf die der Spieler dann später draufklicken kann, zum Beispiel die Tür oder der Computer. Der gerade ausgewählte Hotspot ist farbig markiert.
Wähle den Computer aus (Hotspot 1), klicke auf "Interaction" und hier auf "Run Script" unter "Any Click on Hotspot". Der Scripteditor öffnet sich dann. Die ersten Zeilen sehen so aus:

if (UsedAction (A_WALK_TO)) {
if (MovePlayer (90, 130)) {

Die erste Zeile bestimmt, welches Verb angeklickt sein muss, damit das Folgende passiert. Die zweite Zeile sorgt dafür, dass der Spieler erst an die Position (90, 130) auf dem Bildschirm geht, bevor das passiert, was innerhalb der geschweiften Klammern danach steht. Die Positionen werden im Room Editior auch angezeigt, wenn man den Mauszeiger über die Raumgrafik bewegt. In diesem Fall steht dort nur:

FaceLocation (GetPlayerCharacter (), 90, 129);
Hier empfiehlt sich für die eigene Verwendung in Zukunft allerdings der Befehl

FaceDirection(GetPlayerCharacter (), DIR_UP);
weil es einfacher ist über die Konstanten DIR_DOWN, DIR_UP, DIR_LEFT, DIR_RIGHT die Blickrichtung festzulegen, als über Bildkoordinaten.

Der Charakter guckt also nach oben. Dass mehr nicht passiert ist klar, denn der Aufrag an die Spielfigur lautete ja nur A_WALK_TO, d.h. "Gehe zu". Möglich sind hier außerdem die folgenden Verben: A_LOOK_AT (Schau), A_USE (Benutze), A_PICK_UP (Nimm), A_PUSH (Drücke), A_PULL (Ziehe), A_TALK_TO (Rede), A_OPEN (Öffne), A_CLOSE (Schließe) und A_GIVE_TO (Gib). Bei der nächsten voreingestellten Interaktion mit dem Computer (Benutze) geht der Charakter wieder zur selben Position und es wird das folgende Script ausgeführt.

FaceLocation (GetPlayerCharacter (), 90, 129);
Wait (5);
DisplaySpeech(GetPlayerCharacter(),"Der funktioniert im Moment nicht.");
DisplaySpeech(GetPlayerCharacter(),"Ich habe Doors XP installiert.");


Bernard wendet sich als dem Computer zu, wartet einen kurzen Moment, und gibt dann sein Kommentar ab. Wichtig ist, dass diese Blöcke ab dem zweiten Block mit "else" eingeleitet werden. Am Schluss steht dann noch

else Unhandled ();
Diese Zeile sorgt dafür, dass auch etwas passiert, wenn der Spieler etwas macht, was im Script nicht festgelegt wurde (z.B. "Rede mit Computer"). Auf diese Weise können auch eigene Hotspots definiert werden. Beispiel: Du wählst über die Pfeile oben im Room Editor unter "Areas" Hotspot 12 aus (den gibt es noch nicht im Raum) und zeichnest mit den Zeichenwerkzeugen die untere Schublade nach. In das Eingabefeld "Name" schreibst du "Schublade", dieser Name wird dann im Spiel angezeigt. Schließlich richtest du bei "Interactions" und "Any click on Hotspot" die Interaktion "Run Script" ein und schreibst rein

if (MovePlayer (132, 138))
{
  FaceDirection (GetPlayerCharacter (), DIR_UP);
  
   if (UsedAction (A_LOOK_AT))
  {
      Wait (5);
      DisplaySpeech (GetPlayerCharacter (), "Das alte Mistding klemmt die meiste Zeit.");        
  }
  else Unhandled ();
 }

Dein erster Hotspot ist fertig.

Objekte
Wenn du links auf "Objects" klickst, kann du die Objekte in dem Raum bearbeiten. Anders als Hotspots sind Objekte nicht Bereiche im Hintergrund, die man anklicken kann, sondern Grafiken, die praktisch auf dem Hintergrund liegen und z.B. verschoben oder mitgenommen werden können. Als Beispiel wollen wir auf Bernards Tisch eine Lampe stellen. Dazu muss erst mal die Grafik der Lampe existieren und AGS muss sie auch kennen. Dazu klickst du links auf "Sprite Manager", dann mit der rechten Maustaste auf die weiße Fläche rechts, wählst "Import new sprite" und "Import from File". Hier wählst du die Datei lampe.bmp aus, die mit einem Klick auf "Grab entire image" auch im Sprite Manager erscheint.
Da Bernard die Lampe auch mitnehmen können soll, brauchen wir noch einen passenden Inventargegenstand. Dazu wird ein 38x22 Pixel großes Bitmap benötigt, das du ebenfalls in den Sprite Manager lädst. Danach klickst du links auf "Inventory items", wo du den Gegenstand #8 (der erste "dummy") mit "Change image" durch die Inventar-Lampe ersetzt. Diese bekommt dann noch den Namen "Lampe". Zurück bei "Objects" kannst du jetzt mit "New Object" ein neues Objekt anlegen. Das sieht zwar erst mal aus wie eine blaue Tasse, mit "Change image" kann man im Sprite Manager jetzt aber die Lampe laden. Diese schiebst du noch an die passende Stelle. Als "Any-Click-on-Object-Script" wird genau wie oben Folgendes eingerichtet:

if (MovePlayer (130, 133))
{
  FaceDirection (GetPlayerCharacter (), DIR_UP);
  
 if (UsedAction (A_LOOK_AT)) {
 DisplaySpeech (GetPlayerCharacter (), "Oha, die stand sonst nicht da.");
 }

 else if (UsedAction (A_PICK_UP)) {
 ObjectOff(6);
 AddInventory(8);
 }

 else if (UsedAction (A_USE_INV))  // einen Inventargegenstand an der Lampe verwenden
  {
    if (character [GetPlayerCharacter ()].activeinv == 6)  //wenn es Inventar Gegenstand 6 ist (zB:eine funktionierende Glühbirne), dann
    {
        Wait (5);
        PlaySound (93); // Einschraubgeräusch
        LoseInventory(10); // Glühbirne vom Inventar verschwindet
        DisplaySpeech(GetPlayerCharacter(),"Jetzt funktioniert sie wieder.");
    }
   else Unhandled();
  }

 else Unhandled ();
}

Es kann Spezialfälle geben, wo man haben will, dass der Character vielleicht beim Anschauen A_LOOK_AT woanders hingehen und hinschauen soll, wie beim Aufnehmen eines Gegenstandes, dann kann man den obigen Code auch so schreiben:

if (UsedAction (A_WALK_TO))  
  {
   if (MovePlayer (130, 133))
    {
      FaceDirection (GetPlayerCharacter (), DIR_UP);
    }
  }
  else if (UsedAction (A_LOOK_AT))
  {
    if (MovePlayer (130, 133))
    {
      FaceDirection (GetPlayerCharacter (), DIR_UP);
      Wait (5);
      DisplaySpeech (GetPlayerCharacter (), "Oha, die stand sonst nicht da.");
    }
  }
  else if (UsedAction (A_PICK_UP))
  {
   if (MovePlayer (115, 133)) {
   FaceDirection (GetPlayerCharacter (), DIR_RIGHT);
   ObjectOff(6);
   AddInventory(8);
   }
  }
  else if (UsedAction (A_USE_INV))  // einen Inventargegenstand an der Lampe verwenden
  {
    if (character [GetPlayerCharacter ()].activeinv == 6)  // wenn es Inventargegenstand 6 ist, dann
    {
      if (MovePlayer (130, 133))
      {
        FaceDirection (GetPlayerCharacter (), DIR_UP);
        Wait (5);
        PlaySound (93); // Einschraubgeräusch
        LoseInventory(10); // Glühbirne vom Inventar verschwindet
        DisplaySpeech(GetPlayerCharacter(),"Jetzt funktioniert sie wieder.");
      }
    }
    else Unhandled(); // Wenn es nicht Inventargegenstand 6 war
  }
  else Unhandled ();
}

Was das bedeutet, dürfte klar sein. Jetzt kann man die Lampe mitnehmen, aber noch nichts mit ihr machen. Deswegen gehen wir zurück zu den Inventory Items und richten dort eine Interaktion für die Lampe ein. Zum Beispiel kannst du bei "Look at inventory item" die folgende Zeile eintragen.

DisplaySpeech (GetPlayerCharacter (), "Was eine prächtige Lampe.");
Dann kann man die Lampe auch im Inventar betrachten, was du wie immer mit Strg+T gleich ausprobieren kannst.

Charaktere
Was wäre Maniac Mansion ohne Bernards Freunde? Als nächstes wollen wir ihm Sandy zur Seite stellen. Klicke dazu links auf "Characters" und wähle Sandy aus. Hier stellst du ein, dass Sandy in Raum 1 startet ("Start in Room"), und zwar an Position X = 265 und Y = 135. Jetzt richten wir auch für sie eine "Any click on character" Interaktion ein:

if (MovePlayer (230, 135))
{
  FaceCharacter (GetPlayerCharacter (), SANDY);
  
  if (UsedAction (A_LOOK_AT)) {
  DisplaySpeech(GetPlayerCharacter(),"Mmmmmhh...");
  }
  
  else if (UsedAction (A_TALK_TO)) {
  FaceCharacter (SANDY, GetPlayerCharacter ());
  DisplaySpeech(GetPlayerCharacter (),"Hallo Sandy.");
  DisplaySpeech(SANDY,"Grüß dich.");
  }
}

Hier funktioniert also auch alles völlig normal, nur die letzte Zeile mit der Unhandled-Anweisung fehlt. Jetzt kannst du noch ein "Use inventory on character" Script für Sandy definieren, zum Beispiel das hier:

if (MovePlayer (230, 135)) {
FaceCharacter (GetPlayerCharacter (), SANDY);
FaceCharacter (SANDY, GetPlayerCharacter ());
DisplaySpeech(GetPlayerCharacter (),"Hier, eine Lampe.");
LoseInventory(8);
DisplaySpeech(SANDY,"Danke, ich mag Lampen.");
}

Dann kann der Spieler die Lampe an Sandy geben.
Wenn du nicht mit Bernard spielen willst, sondern z.B. mit Michael, dann klicke bei Michael einfach "This is the Player Character" an. Wichtig ist, dass dann bei ihm hinter "Start in Room" eine 1 steht (oder die Raumnummer wo er starten soll) und bei Bernard eine -1, falls er nicht mehr im Spiel auftauchen soll. Außerdem sollten die X- und Y-Koordinaten auf einen Wert gesetzt werden, der auf einer walkable area liegt. Auch "No Interaction" sollte angeklickt werden.

Ein neuer Raum
Um einen neuen Raum in das Haus zu bauen, muss es zunächst mal eine Tür geben, die dorthin führt. Dazu öffnest du im Room Editor z.B. Raum 6 (Flur im Erdgeschoss) und richtest ein neues Objekt ein. Als Grafik bekommt das Objekt eine offene (!) Tür, die man zum Beispiel im Sprite-Ordner von Raum 2 findet. Die offene Tür wird jetzt genau über die geschlossene Tür geschoben und das Häkchen vor "Object is initially visible" wird entfernt. Noch funktioniert die Tür natürlich nicht. Gehe dazu zunächst auf den Hotspot der mittleren Tür (#3) und ersetze das gesamte "Any click on hotspot"-Script durch die eine Zeile

if (any_click_on_door (18, 2, 95, 130, DIR_UP, 18, 43, 127, DIR_RIGHT) == 0) Unhandled ();
Die erste Zahl ist eine Art Nummer der Tür, die muss für jede Tür unterschiedlich sein. Die zweite Zahl sagt aus, dass die offene Tür von Objekt 2 dargestellt wird. Und die Angaben danach bedeuten: Wenn man die Tür öffnet, geht der Charakter zu Position (95, 130) und schaut nach oben und wenn man durch die Tür durchgeht, dann taucht man in Raum 18 an Position (43, 127) auf und schaut nach rechts. Wichtig ist, dass die Tür auch in "Tür>v" umbenannt wird. Das ">v" sorgt dafür dass mann die Tür später auch mit der rechten Maustaste öffnen und schließen kann. Dann musst du links auf "Settings" klicken und dann auf das "i"-Symbol. Hier änderst du das "Player enters screen (before fadein)" Script, indem du noch diese Zeile anfügst:

SetObjectClickable (2, 0);
Jetzt musst du natürlich noch diesen neuen Raum 18 anlegen. Wähle dazu im Menü "File" "New Room" aus, es erscheint dann ein schwarzer Raum. Mit dem kleinen Bildsymbol ("Import Background") kannst du eine Hintergrundgrafik laden, zum Beispiel das rosa Badezimmer (das muss nicht im Sprite-Manager sein). Jetzt speicherst du den Raum mit dem Diskettensymbol ("Save Room") unter dem Dateinamen room18 ab. Als erstes solltest du jetzt als kleine Übung wie eben dafür sorgen, dass die Tür links funktioniert. Als Scriptzeile dafür nimmst du dann diese:

if (any_click_on_door (18, 0, 43, 127, DIR_LEFT, 6, 95, 130, DIR_DOWN) == 0) Unhandled ();
Das Häkchen bei "Object is initially visible" sollte allerdings hier gesetzt werden, da die Tür ja geöffnet ist, wenn man sie das erste Mal sieht. Zu guter muss noch eine Zeile im globalen Script hinzugefügt werden (im Menü "Script" "Edit global script"). Etwa bei Zeile 331 solltest du dort die Funktion "VariableExtensions" finden, in der einige Zeilen wie die Folgende stehen:

else if ((r == 2) && (h == 1)) OpenCloseExtension (4, location);
Diese Reihe ergänzt du um die folgende Zeilen:

else if ((r == 6) && (h == 3)) OpenCloseExtension (18, location);
else if ((r == 18) && (h == 1)) OpenCloseExtension (18, location);

Diese Zeilen sagen aus, dass in Raum (r = 6) auf Hotspot (h = 3) die Tür Nummer 18 ist und in Raum 18 auf Hotspot 1 ebenfalls (nur von der anderen Seite). Die Nummer der Tür, in diesem Fall 18, findet man dann als erste Zahl in den any_click_on_door-Anweisungen wieder. Jetzt sollte die Tür normal funktionieren.

Viel Spaß
Wenn du alles so gemacht hast wie beschrieben, dann sieht dein erstes MMM-Spiel aus wie hier.
Jetzt liegt es an dir, weiter mit AGS rumzuspielen. Wenn Probleme auftauchen, dann solltest du einen Blick in die Hilfedatei werfen (F1 drücken) und wenn auch das nicht hilft, dann kannst du deine Frage auch gerne im Adventure-Treff AGS-Forum oder hier im Forum stellen.

Jan 'DasJan' Schneider

Hilfreiche weiterführende Links:
Einige grundsätzliche Erklärungen von a-v-o zu den Funktionen im Starterpack
« Letzte Änderung: 07. Januar 2011, 00:43:07 von Rocco »

Rocco

  • Administrator
  • alter Tentakel
  • *****
  • Beiträge: 2371
  • Geschlecht: Männlich
    • Profil anzeigen
    • Maniac Mansion Mania
    • E-Mail
Re: MMM - Die eigene Episode - Anleitung für AGS
« Antwort #3 am: 11. Februar 2011, 19:25:56 »
Weil ich immer wieder von Neuem danach suchen muss, hier die AGS-Farbentabelle und die Soundtabelle von MMM.

Zitat von: AGS Farbwerte
0. Black

1. Dark Blue

2. Dark Green

3. Dark Cyan

4. Dark Red

5. Dark Purple

6. Dark Yellow

7. Gray

8. Dark Gray

9. Blue

10. Green

11. Cyan

12. Red

13. Purple

14. Yellow

15. White


[quote = MMM-Sounds]
[02:12:14] <FireOrange> Sound 1 - Öffnen und Schließen von Schubladen oder Schränken
[02:12:14] <FireOrange> Sound 2 - Öffnen von Türen
[02:12:14] <FireOrange> Sound 3 - Schließen von Türen
[02:12:14] <FireOrange> Sound 4 - Nehmen von Gegenständen
[02:12:14] <FireOrange> Sound 5 - Schließen von Schubläden oder Schränken
[02:12:14] <FireOrange> Sound 8 - Klick auf Knopf (ding)
[02:12:14] <FireOrange> Sound 11 - Staubsauger
[02:12:14] <FireOrange> Sound 12 - Dusche
[02:12:15] <FireOrange> Sound 28 - Blubb
[02:12:16] <FireOrange> Sound 30 - Rülpsen
[02:12:17] <FireOrange> Sound 31 - Metallenes Quietschen (z.B. eines Schraubenziehers)
[02:12:18] <FireOrange> Sound 32 - Dumpfer Aufschlag auf eine Flasche
[02:12:19] <FireOrange> Sound 33 - Blasen
[02:12:19] <FireOrange> Sound 35 - Klosauger setzt auf
[02:12:21] <FireOrange> Sound 36 - Klosauger wird gezogen
[02:12:22] <FireOrange> Sound 37 - Reißverschluss
[02:12:23] <FireOrange> Sound 38 - Klospülung
[02:12:24] <FireOrange> Sound 39 - ?
[02:12:25] <FireOrange> Sound 40 - Elektrischer Strom
[02:12:26] <FireOrange> Sound 41 - Meißel schlägt auf Stein ein
[02:12:27] <FireOrange> Sound 42 - Flasche wird entkorkt
[02:12:28] <FireOrange> Sound 43 - Ablegen eines Gegenstandes
[02:12:29] <FireOrange> Sound 44 - Schnelles Schließen z.B. einer Dachluke
[02:12:29] <FireOrange> Sound 45 - Zerreißen von Stoff
[02:12:31] <FireOrange> Sound 46 - Karte wird ausgespielt
[02:12:32] <FireOrange> Sound 47 - Schließen von ?
[02:12:33] <FireOrange> Sound 48 - Schleifbohrer
[02:12:34] <FireOrange> Sound 50 - Schließen einer Autotür
[02:12:35] <FireOrange> Sound 51 - Klappern
[02:12:36] <FireOrange> Sound 58 - Zerbrechen einer Flasche
[02:12:37] <FireOrange> Sound 59 - Zerbrechen einer Vase
[02:12:38] <FireOrange> Sound 60 - Lichtschalter
[02:12:38] <FireOrange> Sounds 61 bis 63 - Drehen einer Schraubenziehers
[02:12:40] <FireOrange> Sound 64 - Schlag auf einen Nagel
[02:12:41] <FireOrange> Sound 65 - Säge
[02:12:41] <FireOrange> Sound 66 - Lichtschalter
[02:12:43] <FireOrange> Sound 67 - ?
[02:12:44] <FireOrange> Sound 68 - Einzelne Blase
[02:12:45] <FireOrange> Sound 69 - Glas zerbricht
[02:12:46] <FireOrange> Sound 85 - Knarren
[02:12:47] <FireOrange> Sound 86 - Telefon klingelt
[02:12:48] <FireOrange> Sound 87 - Ton vor "Kein Anschluss unter dieser Nummer"
[02:12:49] <FireOrange> Sound 88 - Einzelnes Besetzt-Zeichen
[02:12:50] <FireOrange> Sound 89 - Telefon wird aufgelegt
[02:12:51] <FireOrange> Sound 90 - Mikrowellen-Ding
[02:12:51] <FireOrange> Sound 93 - Lichtschalter
[02:12:51] <FireOrange> Sound 94 - Schnitt mit der Schere
[02:12:54] <FireOrange> Sound 95 - Wasser wird eingegossen
[02:12:54] <FireOrange> Sound 96 - Grillenzirpen
[02:12:55] <FireOrange> Sound 97 - Schritt auf festem Boden
[02:12:56] <FireOrange> Sound 98 - Explosion
[02:12:57] <FireOrange> Sound 99 - Türklingel[/quote]