|
MMM - Die eigene Episode
Dieses Tutorial soll in das Erstellen von Episoden von Maniac Mansion Mania
mit dem Autorensystem AGS einführen. Infos zu dem Fanadventure-Projekt im
Maniac-Mansion-Universum gibt es auf dessen
Homepage und
im offiziellen MMM-Forum. Wenn technische
Fragen aufkommen, hilft meistens ein Blick in die sehr gute Hilfe von AGS, die zum
Beispiel alle Scriptbefehle, die in diesem Artikel auftauchen, genau erklärt. Sollten
trotzdem noch Fragen bleiben findet ihr eine hilfreiche Community in unserem
AGS-Forum, wo ihr eure Fragen stellen
könnt.
Als Voraussetzung für dieses Tutorial solltest du dir erst mal ein paar Sachen
runterladen:
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);
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 (UsedAction (A_WALK_TO)) {
if (MovePlayer (132, 138)) {
FaceLocation (GetPlayerCharacter (), 132, 138);
}
}
else if (UsedAction (A_LOOK_AT)) {
if (MovePlayer (132, 138)) {
FaceLocation (GetPlayerCharacter (), 132, 137);
Wait (5);
DisplaySpeech(GetPlayerCharacter(), "Auch eine schöne Schublade.");
}
}
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 (UsedAction (A_WALK_TO)) {
if (MovePlayer (130, 133)) {
FaceLocation (GetPlayerCharacter (), 130, 132);
}
}
else if (UsedAction (A_LOOK_AT)) {
if (MovePlayer (130, 133)) {
FaceLocation (GetPlayerCharacter (), 130, 132);
DisplaySpeech (GetPlayerCharacter (), "Oha, die stand sonst nicht da.");
}
}
else if (UsedAction (A_PICK_UP)) {
if (MovePlayer (130, 133)) {
FaceLocation (GetPlayerCharacter (), 130, 132);
ObjectOff(6);
AddInventory(8);
}
}
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 (UsedAction (A_WALK_TO)) {
if (MovePlayer (230, 135)) {
FaceCharacter (GetPlayerCharacter (), SANDY);
}
}
else if (UsedAction (A_LOOK_AT)) {
if (MovePlayer (230, 135)) {
FaceCharacter (GetPlayerCharacter (), SANDY);
DisplaySpeech(GetPlayerCharacter(),"Mmmmmhh...");
}
}
else if (UsedAction (A_TALK_TO)) {
if (MovePlayer (230, 135)) {
FaceCharacter (GetPlayerCharacter (), SANDY);
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 Zeile:
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 in unserem
AGS-Forum stellen.
Jan 'DasJan' Schneider
|
|