[Scummvm-git-logs] scummvm master -> fc3ae4c9b955f6b7e702993f38c25f61d49b593c

criezy criezy at scummvm.org
Sun Jul 28 16:10:56 CEST 2019


This automated email contains information about 160 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
0ed3dbf21f SUPERNOVA2: add tool to generate engine data file
98b3ba2d2b SUPERNOVA: Remove detection of Mission Supernova 2
d8c62a0e6f SUPERNOVA2: Create engine skeleton for supernova 2
4c03331d07 SUPERNOVA2: add loading of game strings
7e2ca31be0 SUPERNOVA2: Add gamemanager skeleton
cf2583f142 SUPERNOVA2: Finished copying of engine skeleton.
9b786ded4f SUPERNOVA2: Add roughly translated room, object ID
4b12c8d17b SUPERNOVA2: Begin intro animation
f10135bb76 SUPERNOVA2: Remove code for rendering newspapers
e99dc80446 SUPERNOVA2: Rewrite palette to 1 RGB color per row
a86a397b26 SUPERNOVA2: Programm intro title screen
b6b26bb6bb SUPERNOVA2: Add intro animation
86acda73a7 SUPERNOVA2: Correct overlook in comment and define
df1fbcbf4d SUPERNOVA2: Add string, divide long line in string
977d67b272 SUPERNOVA2: Synchronize with main repository
777040557d SUPERNOVA2: Add inventory from supernova
5c8171eed6 SUPERNOVA2: Add gui commands to game manager
cb9c28a374 SUPERNOVA2: Add room deletion to game manager
f82e55a7f1 SUPERNOVA2: Add gui element from supernova
dd5f1778ff SUPERNOVA2: Render GUI
38904b405f SUPERNOVA2: Add airport objects
3300c358db SUPERNOVA2: Add starting items
3cb1cf1699 SUPERNOVA2: Add drawMapExits from supernova
6bd7e561b4 SUPERNOVA2: Add interaction with room objects
701a957007 SUPERNOVA2: Add taxi stand room
43393fc29f SUPERNOVA2: Add Dialogues from supernova engine
800e41ddd2 SUPERNOVA2: Finish taxistand, add taxi
291cd5c9ff SUPERNOVA2: Fix missing fadeout after intro skip
da8275ac62 SUPERNOVA2: Fix dialog mouse hover color change
f744adec4e SUPERNOVA2: Fix object indexing in taxi stand
88973057fe SUPERNOVA2: Add dialog separator to gametext.h
b437266c66 SUPERNOVA2: Finish taxi destination choosing
19d0a3cce9 SUPERNOVA2: Fix airport message rendering
83b0da1ebd SUPERNOVA2: Fix of overlooked save pattern
c331b69bbd SUPERNOVA2: Add load and save mechanism
1985c5bf57 SUPERNOVA2: Add downtown street
b9c528425a SUPERNOVA2: Add some more generic interactoins
63ca424ac3 SUPERNOVA2: Add sound to all rooms currently coded
beadc80462 SUPERNOVA2: Fix not quiting during intro
f9c30a58bd SUPERNOVA2: Add the games room
247deea4fc SUPERNOVA2: Add skeleton for the rest of the rooms
286f12c830 SUPERNOVA2: Add cabin room
c20f600026 SUPERNOVA2: Add partialy finished kiosk room
0a7ec13c3c SUPERNOVA2: Finish Kiosk room
6b6466b4b3 SUPERNOVA2: Add more generic interactions
856b387641 SUPERNOVA2: Add palace of culture
93561220b7 SUPERNOVA2: Add partialy implemented checkout room
3a5ea64e9c SUPERNOVA2: Finish the Checkout, add TV appearence
be450f0967 SUPERNOVA2: Change saving of room variables
d2e67fca8f SUPERNOVA2: Add City1 and City2 rooms
b4c59bee45 SUPERNOVA2: Add partialy finished Elevator room.
9e9602051c SUPERNOVA2: Add missing interactions in Cabin room
c23411bb73 SUPERNOVA2: Finish the elevator room
e90a82ac79 SUPERNOVA2: Add the apartment room
5fe8f6fae9 SUPERNOVA2: Fix doors in elevator.
925784f01b SUPERNOVA2: Add ship room
8c6515182f SUPERNOVA2: Add part of Pyramid room
29f83a0887 SUPERNOVA2: Finish Pyramid, add PyrEntrance rooms
aa7b4a2c97 SUPERNOVA2: Add Upstairs1 room
9a4d7eca38 SUPERNOVA2: Add Downstairs1 room
aaffee83c0 SUPERNOVA2: Add BottomRightDoor room
f4a2441a7c SUPERNOVA2: Add BotomLeftDoor room
277b4eeac7 SUPERNOVA2: Add Upstairs2 room
c8b900bd4a SUPERNOVA2: Add UpperDoor room
d40d52cb2f SUPERNOVA2: Add pyramid puzzle
3524c4fc1f SUPERNOVA2: Add BehindPuzzle and Formula1F rooms
d7d6ef785d SUPERNOVA2: Add Formula1N room
933233d7bf SUPERNOVA2: Add Formula2F room
2d4b37233d SUPERNOVA2: Add Formula2N room
559f6b4e28 SUPERNOVA2: Add TomatoF room
499f0b47dc SUPERNOVA2: Add TomatoN room
103bd737a5 SUPERNOVA2: Add missing string to translatin tool
f022350257 SUPERNOVA2: Add Monster1N room
d4f2b81b07 SUPERNOVA2: Add Monster2N room
bebaf084a7 SUPERNOVA2: Add Upstairs3 room
be27f9aa3e SUPERNOVA2: Add Downstairs3 room
14aeaf9c92 SUPERNOVA2: Add LCorridor1 room
df792b74d9 SUPERNOVA2: Add LCorridor2 room
48c84280cb SUPERNOVA2: Add HoleRoom room
9c1eba6bd6 SUPERNOVA2: add InHole and Floordoor rooms
6744c0b4b1 SUPERNOVA2: Add FloordoorU room
fe48f0b699 SUPERNOVA2: Add BstDoor room
f5afd19df7 SUPERNOVA2: Add hall room
13c6b96305 SUPERNOVA2: Add CoffinRoom room
801c684218 SUPERNOVA2: Add missing string to translation tool
4500cd0bfb SUPERNOVA2: Add Mask room
002134f3e1 SUPERNOVA2: Fix missing image numbers in few rooms
2810974533 SUPERNOVA2: Fix a few bugs in pyramid
a77d56219f SUPERNOVA2: Update translations
b0eeb8cc22 SUPERNOVA2: Initialize price = 0 to avoid warnings
57ebb3fd1d SUPERNOVA2: Add missing fade ins
231121a120 SUPERNOVA2: Add siren sound
f00c19604e SUPERNOVA2: Add missing string to translatino tool
006880ea7c SUPERNOVA2: Add Museum room.
46fe10db87 SUPERNOVA2: Add MuseumEntrance and Mus1 rooms.
d93656c10a SUPERNOVA2: Add rooms Mus2 to Mus7
e7dbd78995 SUPERNOVA2: Update code formating.
a8ca6b9f52 SUPERNOVA2: Simplify code for generating siren.
01a3f82886 SUPERNOVA2: Add rooms Mus8 to Mus11
d768680534 SUPERNOVA2: Add MusRound room
44c20ab45e SUPERNOVA2: Add rest of rooms (MUS12 to MUS22)
d0c9a676d5 SUPERNOVA2: Add missing strings
1fb6437cdc SUPERNOVA2: Fix bugs in museum
800621cb8e SUPERNOVA2: Fix some noticable bugs
76142e2e7d SUPERNOVA2: Add outro
83e05ea13f SUPERNOVA2: Add english translated image
d09b286054 SUPERNOVA2: Fix more bugs
de4dac5693 SUPERNOVA2: Fix bug, add pyramid door translation
ee5b907f62 SUPERNOVA: Rearange supernova and supernova2 files
5f355734fd SUPERNOVA: Partial merge of the engine
bc8393deaf SUPERNOVA: Divide GameManager into 2 classes
4dd72f4ae0 SUPERNOVA: Divide rooms into 2 files
33d7391f4a SUPERNOVA: Move part 1 files to it's own directory
d1edf0e467 SUPERNOVA: Reorder strings in devtools
cefdf8220a SUPERNOVA2: Delete supernova2, it's getting merged
eb2a017a68 SUPERNOVA: Generate new dat files for supernova.
3cf9cfbf78 SUPERNOVA: Merge in the supernova2 engine.
2f84e6d22a SUPERNOVA: Refactor sound initialization
b1f37566ea SUPERNOVA: Refactor game-manager
ab4af5c614 SUPERNOVA: Add info, doc, help screens for MS2
714a4f909b SUPERNOVA: Refactor graphics
0912b6a48d SUPERNOVA: Implement lazy loading of resources
a637cea700 SUPERNOVA: Remove unused getImage(CursorId)
9cac9a8592 SUPERNOVA: Fix bugs
8125f7b67d SUPERNOVA: Fix street animation.
01d601b237 SUPERNOVA: Reformat StringId enums and gametext.h
1cf7bd073f SUPERNOVA: Fix segfault in axacuss
28f262eaee SUPERNOVA: Fix translation of "Wundersam!"
43131d8e02 SUPERNOVA: Add intermediate room classes
09975e10c2 SUPERNOVA: Remove meaning TODOs from MS2
5ddc251528 SUPERNOVA: Preload exit list on room entry
fbf6a912cb SUPERNOVA: Resolve same MS1 TODOs
8f7b10a5de SUPERNOVA: Add tool to create image datafiles.
80c1cd9e61 SUPERNOVA: Implement MS datafile loading to .dat
12f4211fb2 SUPERNOVA: Load MS2 datafiles from .dat file.
3a08ad99d9 SUPERNOVA: Fix palette in translated ms2_data.015
061d14e799 SUPERNOVA: Add ciphered text image translation.
28a70bb615 SUPERNOVA: Fix german save and load feature.
b0e386b014 SUPERNOVA: Fix MS1 image loading
a4ca2a838f SUPERNOVA: When dead return back to main loop ASAP
24ff7b26ff SUPERNOVA: Fix some room comparison issues.
c1317bb9c7 SUPERNOVA: Finish pyramid door translation
61975aa2e2 SUPERNOVA: Add improved mode
7ea4d03597 SUPERNOVA: Add size computation to create_image.
bcd62c0669 SUPERNOVA: Code refactoring
16bad91f4b SUPERNOVA: Add placeholder info files to .dat
37c53c420f SUPERNOVA: Load info files from .dat file
0e31a6163d SUPERNOVA: Merge create_supernova tools
7164016b34 SUPERNOVA: Refactor .dat file access
0f82716ca3 SUPERNOVA: Replace placeholder files
b883958c05 SUPERNOVA: Fix module.mk to make create_image tool
f9d13b8d2c SUPERNOVA: Add translated Indiana Joe image
e5a5aed28c SUPERNOVA: Update translation
e734872fc8 SUPERNOVA: Fix some code issues pointed by Criezy
0366f3da27 SUPERNOVA: Add help screen translation
ee9d7ee9c7 SUPERNOVA: Implement choosing verbs by keyboard.
df008c1290 SUPERNOVA: Add correct help screen image
448db9f432 SUPERNOVA: Make improved mode an engine option.
c2177f8453 SUPERNOVA: Merge getInput and waitOnInput methods.
fc3ae4c9b9 SUPERNOVA: Fix most of Codacy issues


Commit: 0ed3dbf21f5dc2eb6bb90324d77937e68189a43a
    https://github.com/scummvm/scummvm/commit/0ed3dbf21f5dc2eb6bb90324d77937e68189a43a
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: add tool to generate engine data file

Most of the tool is copied from create supernova
Add correct gametext.h and strings_en.po for supernova2
Doesn't handle images yet

Changed paths:
  A devtools/create_supernova2/create_supernova2.cpp
  A devtools/create_supernova2/create_supernova2.h
  A devtools/create_supernova2/file.cpp
  A devtools/create_supernova2/file.h
  A devtools/create_supernova2/gametext.h
  A devtools/create_supernova2/module.mk
  A devtools/create_supernova2/po_parser.cpp
  A devtools/create_supernova2/po_parser.h
  A devtools/create_supernova2/strings-en.po


diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp
new file mode 100644
index 0000000..ff19728
--- /dev/null
+++ b/devtools/create_supernova2/create_supernova2.cpp
@@ -0,0 +1,197 @@
+#include "create_supernova2.h"
+#include "gametext.h"
+#include "file.h"
+#include "po_parser.h"
+
+// HACK to allow building with the SDL backend on MinGW
+// see bug #1800764 "TOOLS: MinGW tools building broken"
+#ifdef main
+#undef main
+#endif // main
+
+// List of languages to look for. To add new languages you only need to change the array below
+// and add the supporting files:
+//   - 640x480 bitmap picture for the newpaper named 'img1-##.pbm' and 'img2-##.pbm'
+//     in pbm binary format (you can use gimp to generate those)
+//   - strings in a po file named 'strings-##.po' that uses CP850 encoding
+
+const char *lang[] = {
+	"en",
+	NULL
+};
+
+void writeImage(File& outputFile, const char *name, const char* language) {
+	File imgFile;
+	char fileName[16];
+	sprintf(fileName, "%s-%s.pbm", name, language);
+	if (!imgFile.open(fileName, kFileReadMode)) {
+		printf("Cannot find image '%s' for language '%s'. This image will be skipped.\n", name, language);
+		return;
+	}
+
+	char str[256];
+
+	// Read header (and check we have a binary PBM file)
+	imgFile.readString(str, 256);
+	if (strcmp(str, "P4") != 0) {
+		imgFile.close();
+		printf("File '%s' doesn't seem to be a binary pbm file! This image will be skipped.\n", fileName);
+		return;
+	}
+
+	// Skip comments and then read and check size
+	do {
+		imgFile.readString(str, 256);
+	} while (str[0] == '#');
+	int w = 0, h = 0;
+	if (sscanf(str, "%d %d", &w, &h) != 2 || w != 640 || h != 480) {
+		imgFile.close();
+		printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480, read: %dx%d). This image will be skipped.\n", fileName, w, h);
+		return;
+	}
+
+	// Write block header in output file (4 bytes).
+	// We convert the image name to upper case.
+	for (int i = 0 ; i < 4 ; ++i) {
+		if (name[i] >= 97 && name[i] <= 122)
+			outputFile.writeByte(name[i] - 32);
+		else
+			outputFile.writeByte(name[i]);
+	}
+	// And write the language code on 4 bytes as well (padded with 0 if needed).
+	int languageLength = strlen(language);
+	for (int i = 0 ; i < 4 ; ++i) {
+		if (i < languageLength)
+			outputFile.writeByte(language[i]);
+		else
+			outputFile.writeByte(0);
+	}
+
+	// Write block size (640*480 / 8)
+	outputFile.writeLong(38400);
+
+	// Write all the bytes. We should have 38400 bytes (640 * 480 / 8)
+	// However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
+	// but pbm uses 0 for white and 1 for black.
+	for (int i = 0 ; i < 38400 ; ++i) {
+		byte b = imgFile.readByte();
+		outputFile.writeByte(~b);
+	}
+
+	imgFile.close();
+}
+
+void writeGermanStrings(File& outputFile) {
+	// Write header and language
+	outputFile.write("TEXT", 4);
+	outputFile.write("de\0\0", 4);
+
+	// Reserve the size for the block size, but we will write it at the end once we know what it is.
+	uint32 blockSizePos = outputFile.pos();
+	uint32 blockSize = 0;
+	outputFile.writeLong(blockSize);
+
+	// Write all the strings
+	const char **s = &gameText[0];
+	while (*s) {
+		outputFile.writeString(*s);
+		blockSize += strlen(*s) + 1;
+		++s;
+	}
+
+	// Now write the block size and then go back to the end of the file.
+	outputFile.seek(blockSizePos, SEEK_SET);
+	outputFile.writeLong(blockSize);
+	outputFile.seek(0, SEEK_END);
+}
+
+void writeStrings(File& outputFile, const char* language) {
+	char fileName[16];
+	sprintf(fileName, "strings-%s.po", language);
+	PoMessageList* poList = parsePoFile(fileName);
+	if (!poList) {
+		printf("Cannot find strings file for language '%s'.\n", language);
+		return;
+	}
+
+	// Write block header
+	outputFile.write("TEXT", 4);
+
+	// And write the language code on 4 bytes as well (padded with 0 if needed).
+	int languageLength = strlen(language);
+	for (int i = 0 ; i < 4 ; ++i) {
+		if (i < languageLength)
+			outputFile.writeByte(language[i]);
+		else
+			outputFile.writeByte(0);
+	}
+
+	// Reserve the size for the block size, but we will write it at the end once we know what it is.
+	uint32 blockSizePos = outputFile.pos();
+	uint32 blockSize = 0;
+	outputFile.writeLong(blockSize);
+
+	// Write all the strings.
+	// If a string is not translated we use the German one.
+	const char **s = &gameText[0];
+	while (*s) {
+		const char* translation = poList->findTranslation(*s);
+		if (translation) {
+			outputFile.writeString(translation);
+			blockSize += strlen(translation) + 1;
+		} else {
+			outputFile.writeString(*s);
+			blockSize += strlen(*s) + 1;
+		}
+		++s;
+	}
+	delete poList;
+
+	// Now write the block size and then go back to the end of the file.
+	outputFile.seek(blockSizePos, SEEK_SET);
+	outputFile.writeLong(blockSize);
+	outputFile.seek(0, SEEK_END);
+}
+
+
+/**
+ * Main method
+ */
+int main(int argc, char *argv[]) {
+	File outputFile;
+	if (!outputFile.open("supernova2.dat", kFileWriteMode)) {
+		printf("Cannot create file 'supernova2.dat' in current directory.\n");
+		exit(0);
+	}
+
+	// The generated file is of the form:
+	// 3 bytes: 'MSN'
+	// 1 byte:  version
+	// -- data blocks
+	// 4 bytes: header  'IMG1' and 'IMG2' for newspaper images (for file 1 and file 2 respectively),
+	//                  'TEXT' for strings
+	// 4 bytes: language code ('en\0', 'de\0'- see common/language.cpp)
+	// 4 bytes: block size n (uint32)
+	// n bytes: data
+	// ---
+
+	// Header
+	outputFile.write("MS2", 3);
+	outputFile.writeByte(VERSION);
+
+	// German strings
+	writeGermanStrings(outputFile);
+
+	// TODO make the needed images and reenable writing them to the .dat file
+	// Other languages
+	const char **l = &lang[0];
+	while(*l) {
+	//	writeImage(outputFile, "img1", *l);
+	//	writeImage(outputFile, "img2", *l);
+		writeStrings(outputFile, *l);
+		++l;
+	}
+
+	outputFile.close();
+	return 0;
+}
diff --git a/devtools/create_supernova2/create_supernova2.h b/devtools/create_supernova2/create_supernova2.h
new file mode 100644
index 0000000..7447a7e
--- /dev/null
+++ b/devtools/create_supernova2/create_supernova2.h
@@ -0,0 +1,33 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef CREATE_SUPERNOVA_H
+#define CREATE_SUPERNOVA_H
+
+#define VERSION 1
+
+
+
+#endif // CREATE_SUPERNOVA_H
diff --git a/devtools/create_supernova2/file.cpp b/devtools/create_supernova2/file.cpp
new file mode 100644
index 0000000..5fb842a
--- /dev/null
+++ b/devtools/create_supernova2/file.cpp
@@ -0,0 +1,72 @@
+#include "file.h"
+
+bool File::open(const char *filename, AccessMode mode) {
+	f = fopen(filename, (mode == kFileReadMode) ? "rb" : "wb");
+	return (f != NULL);
+}
+
+void File::close() {
+	fclose(f);
+	f = NULL;
+}
+
+int File::seek(int32 offset, int whence) {
+	return fseek(f, offset, whence);
+}
+
+long File::read(void *buffer, int len) {
+	return fread(buffer, 1, len, f);
+}
+void File::write(const void *buffer, int len) {
+	fwrite(buffer, 1, len, f);
+}
+
+byte File::readByte() {
+	byte v;
+	read(&v, sizeof(byte));
+	return v;
+}
+
+uint16 File::readWord() {
+	uint16 v;
+	read(&v, sizeof(uint16));
+	return FROM_LE_16(v);
+}
+
+uint32 File::readLong() {
+	uint32 v;
+	read(&v, sizeof(uint32));
+	return FROM_LE_32(v);
+}
+
+void File::readString(char* string, int bufferLength) {
+	int i = 0;
+	while (i < bufferLength - 1 && fread(string + i, 1, 1, f) == 1) {
+		if (string[i] == '\n' || string[i] == 0)
+			break;
+		++ i;
+	}
+	string[i] = 0;
+}
+
+void File::writeByte(byte v) {
+	write(&v, sizeof(byte));
+}
+
+void File::writeWord(uint16 v) {
+	uint16 vTemp = TO_LE_16(v);
+	write(&vTemp, sizeof(uint16));
+}
+
+void File::writeLong(uint32 v) {
+	uint32 vTemp = TO_LE_32(v);
+	write(&vTemp, sizeof(uint32));
+}
+
+void File::writeString(const char *s) {
+	write(s, strlen(s) + 1);
+}
+
+uint32 File::pos() {
+	return ftell(f);
+}
diff --git a/devtools/create_supernova2/file.h b/devtools/create_supernova2/file.h
new file mode 100644
index 0000000..dd33e41
--- /dev/null
+++ b/devtools/create_supernova2/file.h
@@ -0,0 +1,59 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef FILE_H
+#define FILE_H
+
+// Disable symbol overrides so that we can use system headers.
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+#include "common/endian.h"
+
+enum AccessMode {
+	kFileReadMode = 1,
+	kFileWriteMode = 2
+};
+
+class File {
+private:
+	FILE *f;
+public:
+	bool open(const char *filename, AccessMode mode = kFileReadMode);
+	void close();
+	int seek(int32 offset, int whence = SEEK_SET);
+	uint32 pos();
+	long read(void *buffer, int len);
+	void write(const void *buffer, int len);
+
+	byte readByte();
+	uint16 readWord();
+	uint32 readLong();
+	void readString(char*, int bufferLength);
+	void writeByte(byte v);
+	void writeWord(uint16 v);
+	void writeLong(uint32 v);
+	void writeString(const char *s);
+};
+
+#endif // FILE_H
diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
new file mode 100644
index 0000000..6b4cf1e
--- /dev/null
+++ b/devtools/create_supernova2/gametext.h
@@ -0,0 +1,778 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef GAMETEXT_H
+#define GAMETEXT_H
+
+#include <stddef.h>
+
+// This file contains the strings in German and is encoded using CP850 encoding.
+// Other language should be provided as po files also using the CP850 encoding.
+
+// TODO: add the strings from the engine here, add an Id string in comment.
+// And in the engine add a StringId enum with all the Ids = index in this array.
+
+const char *gameText[] = {
+// 0
+"Gehe",    //Go
+"Schau",    //Look
+"Nimm",    //Take
+"\231ffne",    //Open
+"Schlie\341e",    //Close
+// 5
+"Dr\201cke",    //Push
+"Ziehe",    //Pull
+"Benutze",    //Use
+"Rede",    //Talk
+"Gib",    //Give
+// 10
+"Gespr\204ch beenden",    //End of conversation
+"Gehe zu ",    //Go to 
+"Schau ",    //Look at 
+"Nimm ",    //Take 
+"\231ffne ",    //Open 
+// 15
+"Schlie\341e ",    //Close 
+"Dr\201cke ",    //Push 
+"Ziehe ",    //Pull 
+"Benutze ",    //Use 
+"Rede mit ",    //Talk to 
+// 20
+"Gib ",    //Give 
+" an ",    // to 
+" mit ",    // with 
+"Laden",    //Load
+"Speichern",    //Save
+// 25
+"Zur\201ck",    //Back
+"Neustart",    //Restart
+"Schreibfehler",    //write error
+"Textgeschwindigkeit:",    //Text speed:
+"Spiel abbrechen?",    //Leave game?
+// 30
+"Ja",    //Yes
+"Nein",    //No
+"Das tr\204gst du doch bei dir.",    //You already carry this.
+"Du bist doch schon da.",    //You are already there.
+"Das ist geschlossen.",    //This is closed.
+// 35
+"Das hast du doch schon.",    //You already have that.
+"Das brauchst du nicht.",    //You don't need that.
+"Das kannst du nicht nehmen.",    //You can't take that.
+"Das l\204\341t sich nicht \224ffnen.",    //This cannot be opened.
+"Das ist schon offen.",    //This is already opened.
+// 40
+"Das ist verschlossen.",    //This is locked.
+"Das l\204\341t sich nicht schlie\341en.",    //This cannot be closed.
+"Das ist schon geschlossen.",    //This is already closed.
+"Behalt es lieber!",    //Better keep it!
+"Das geht nicht.",    //You can't do that.
+// 45
+"^(C) 1994 Thomas und Steffen Dingel#",    //^(C) 1994 Thomas and Steffen Dingel#
+"Story und Grafik:^ Thomas Dingel#",    //Story and Graphics:^ Thomas Dingel#
+"Programmierung:^ Steffen Dingel#",    //Programming:^ Steffen Dingel#
+"Musik:^ Bernd Hoffmann#",    //Music:^ Bernd Hoffmann#
+"Getestet von ...#",    //Tested by ...#
+// 50
+"^Das war's.#",    //^That's it.#
+"^Schlu\341!#",    //^Over!#
+"^Ende!#",    //^End!#
+"^Aus!#",    //^Done!#
+"^Tsch\201\341!#",    //^Bye!#
+// 55
+"Oh!",    //Oh!
+"Nicht schlecht!",    //Not bad!
+"Supersound!",    //Supersound!
+"Klasse!",    //Great!
+"Nicht zu fassen!",    //I can't believe it!
+// 60
+"Super, ey!",    //Dope, yo!
+"Fantastisch!",    //Fantastic!
+"Umwerfend!",    //Stunning!
+"Genial!",    //Brilliant!
+"Spitze!",    //Awesome!
+// 65
+"Jawoll!",    //Alright!
+"Hervorragend!",    //Outstanding!
+"Ultragut!",    //Ultra-good!
+"Megacool!",    //Mega cool!
+"Yeah!",    //Yeah!
+// 70
+"Ein W\204chter betritt den Raum.|Du wirst verhaftet.",    //A guard enters the room.|You are getting arrested.
+"Die n\204chsten paar Jahre|verbringst du im Knast.",    //You will spend the next|few years in jail.
+"Es wird Alarm ausgel\224st.",    //The alarm is about to be set off.
+"Du h\224rst Schritte.",    //You are hearing footsteps.
+"Um das Schloss zu \224ffnen,|brauchst du einige Zeit.",    //You will take some time,|to pick that lock.
+// 75
+"Du ger\204tst in Panik|und ziehst die Keycard|aus der T\201r.",    //You are panicking|and remove the keycard|from the door.
+"Du hast deinen Auftrag|noch nicht ausgef\201hrt.",    //You have not completed|your task yet.
+"Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du dich, zu fliehen.",    //Although you haven't|disabled the alarm yet,|you decide to escape.
+"Du entledigst dich der Einbruchswerkzeuge|und nimmst ein Taxi zum Kulturpalast.",    //You get rid of your burglar tools|and take a cab to the Palace of Culture.
+"Diese T\201r brauchst|du nicht zu \224ffnen.",    //You don't need|to open this door.
+// 80
+"Uff, es hat geklappt!",    //Phew, it worked!
+"Zur\201ck im Quartier der Gangster ...",    //Back in the gangsters' hideout ...
+"Das lief ja wie am Schn\201rchen!",    //Everything went like clockwork!
+"Hier, dein Anteil von 30000 Xa.",    //Here, your share of 30000 Xa.
+"Wo ist denn der Saurierkopf?",    //Where's the dinosaur skull?
+// 85
+"Dazu hatte ich keine Zeit mehr.",    //I didn't have enough time for that.
+"Was? Du spinnst wohl!|Dann kriegst du auch deinen|Anteil nicht. Raus!",    //What? You're nuts!|Then you won't get your|share. Beat it!
+"Der Sauger ist schon dort.",    //The suction cup is already there.
+"Du heftest den Sauger an die Wand|und h\204lst dich daran fest.",    //You attach the suction cup to the wall|and hold on to it.
+"Du stellst dich auf den|Boden nimmst den Sauger|wieder von der Wand",    //You stand on the floor|then remove the suction cup from the wall
+// 90
+"Die Alarmanlage ist|schon ausgeschaltet.",    //The alarm system is|already switched off.
+"Um die Anlage abzuschalten,|brauchst du einige Zeit.",    //To turn off the system,|you need some time.
+"Die Alarmanlage ist jetzt ausgeschaltet.",    //The alarm system is now switched off.
+"Saurier",    //Dinosaur
+"Du hast jetzt besseres zu tun,|als das Ding anzuschauen.",    //You have better things to do now|than look at that thing.
+// 95
+"Eingang",    //Entrance
+"T\201r",    //Door
+"Strasse zum Stadtzentrum",    //Road to the city center
+"Kamera",    //Security camera
+"Hoffentlich bemerkt dich niemand.",    //Hopefully nobody will notice you.
+// 100
+"Haupteingang",    //Main entrance
+"Gang",    //Corridor
+"Ziemlich gro\341.",    //Quite large.
+"Saurierkopf",    //Dinosaur head
+"Dies ist der Kopf,|den du suchst.",    //This is the head|you're looking for.
+// 105
+"Alarmanlage",    //Alarm system
+"Sauger",    //Suction cup
+"Wand",    //Wall
+"Loch",    //Opening
+"Buchstabe",    //Letter
+// 110
+"Sie ist sehr massiv.",    //It is very massive.
+"Hmm, X und Y, irgendwo|habe ich die Buchstaben|schon gesehen.",    //Hmm, X and Y|I have seen these letters|somewhere before.
+"Deine Zeit ist um, Fremder!",    //Your Time is up, Stranger!
+"Du hast das Seil|doch schon festgebunden.",    //You already tied the rope.
+"Das w\201rde wenig bringen.",    //That would have little effect.
+// 115
+"Sonnenstich, oder was?",    //Sunstroke, or what?
+"Du merkst, da\341 der Boden|unter dir nachgibt, und|springst zur Seite.",    //You notice that the ground|is giving way under you,|and you leap aside.
+"Puzzleteil",    //Puzzle piece
+"Neben diesem Stein|ist kein freies Feld.",    //There's no free square|next to this stone.
+"Du spielst gerade ein|Adventure, kein Rollenspiel!",    //You are currently playing an|Adventure, not a Role-Playing Game!
+// 120
+"Du kannst das Seil|nirgends befestigen.",    //There's nowhere|to attach the rope.
+"Es pa\341t nicht|zwischen die Steine.",    //It does not fit|between the stones.
+"Das ist doch|oben festgebunden!",    //That is already|tied up above!
+"Hey, das ist|mindestens 10 Meter tief!",    //Hey, that is|at least 10 meters deep!
+"In dem Schlitz|ist nichts mehr.",    //There is nothing|left in the slot.
+// 125
+"Das ist mindestens 5 Meter tief!",    //That is at least 5 meters deep!
+"Du versuchst, den Sarg zu|\224ffnen, aber der Deckel bewegt|sich keinen Millimeter.",    //You try to open the coffin,|but the lid does not|move a millimeter.
+"Du hast die Kugel schon gedr\201ckt.",    //You have already|pushed the ball.
+"Die Kugel bewegt sich ein St\201ck.",    //The ball moves a bit.
+"Herzlichen Gl\201ckwunsch!",    //Congratulations!
+// 130
+"Sie haben das Spiel gel\224st|und gewinnen 400 Xa!",    //You solved the game|and won 400 Xa!
+"Vielen Dank f\201r die Benutzung eines|VIRTUAL-REALITY-SYSTEMS-Produkts!",    //Thank you for using a|VIRTUAL-REALITY-SYSTEMS product!
+"N",    //N
+"O",    //E
+"S",    //S
+// 135
+"W",    //W
+"Seil",    //Rope
+"Schild",    //Sign
+"Darauf steht:|\"Willst du finden das|richtige Loch, so wage|dich in die Pyramide!\".",    //It reads:|"Want to find|the right hole? Then dare|to enter the pyramid!".
+"Es ist eine kleine \231ffnung.",    //It is a small opening.
+// 140
+"Pyramide",    //Pyramid
+"Komisch! Was soll eine Pyramide|bei den Axacussanern? Deine|eigenen Gedanken scheinen|den Spielverlauf zu beeinflussen.",    //Weird! What is a pyramid doing|at the Axacussians? Your own thoughts seem to influence|the course of the game.
+"Sonne",    //Sun
+"Sch\224n!",    //Nice!
+"\"Hallo Fremder, wenn du diesen|Raum betreten hast, bleibt|dir nur noch eine Stunde Zeit,|um deine Aufgabe zu erf\201llen!\"",    //"Hello, Stranger, when you enter|this room, you have only an hour|to accomplish your task!"
+// 145
+"rechte Seite",    //right side
+"linke Seite",    //left side
+"Knopf",    //Button
+"Schrift",    //Inscription
+"Tomate",    //Tomato
+// 150
+"Komisch!",    //Funny!
+"Messer",    //Knife
+"Es ist ein relativ stabiles Messer.",    //It is a relatively sturdy knife.
+"Monster",    //Monster
+"Es ist dick und|ungef\204hr 15 Meter lang.",    //It is thick and|about 15 meters long.
+// 155
+"Augen",    //Eyes
+"Mund",    //Mouth
+"Es ist nur eine Statue.",    //It's just a statue.
+"Zettel",    //Note
+"Darauf steht:|\"Wenn du fast am Ziel|bist, tu folgendes:|Sauf!\"",    //It reads:|"When you're almost there,|do the following:|Drink!"
+// 160
+"Es ist ca. 10 Meter tief.",    //It is about 10 meters deep.
+"Oben siehst du helles Licht.",    //Above you is a bright light.
+"Darauf steht:|\"Ruhe eine Minute im Raum|zwischen den Monstern,|und du wirst belohnt!\"",    //It reads:|"Rest a minute in the room|between the monsters,|and you'll be rewarded!"
+"Schlitz",    //Slot
+"Du kommst mit den|H\204nden nicht rein.",    //You cannot get in|with your hands.
+// 165
+"Es ist ca. 5 Meter tief.",    //It is about 5 meters deep.
+"Steine",    //Stones
+"Platte",    //Plate
+"Sarg",    //Coffin
+"Ausgang",    //Exit
+// 170
+"Unheimlich!",    //Creepy!
+"Zahnb\201rste",    //Toothbrush
+"Die Sache mit der|Artus GmbH scheint dir zu|Kopf gestiegen zu sein.",    //The thing with the|Artus GmbH seems to have|gotten to your head.
+"Zahnpastatube",    //Toothpaste
+"Kugel",    //Ball
+// 175
+"Hmm, die Kugel sieht lose aus.",    //Hmm, the ball looks loose.
+"Auge",    //Eye
+"Irgendwas stimmt damit nicht.",    //Something is wrong with that.
+"Es ist nichts Besonderes daran.",    //There's nothing special about it.
+"Sieht nach Metall aus.",    //It looks like metal.
+// 180
+"Ein Taxi kommt angerauscht,|du steigst ein.",    //A taxi arrives, and you get in.
+"Du dr\201ckst auf den Knopf, aber nichts passiert",    //You press the button, but nothing happens
+"Es ist leer.",    //It is empty.
+"Du findest ein kleines Ger\204t,|einen Ausweis und einen Xa.",    //You find a small device,|an ID card and a Xa.
+"Du heftest den|Magnet an die Stange.",    //You attach the|magnet to the pole.
+// 185
+"Stange mit Magnet",    //Pole with magnet
+"Raffiniert!",    //Cunning!
+"Du mu\341t das|Ger\204t erst kaufen.",    //You must buy|this device first.
+"Du legst den Chip|in das Ger\204t ein.",    //You insert the chip|into the device.
+"Du \201berspielst die CD|auf den Musikchip.",    //You transfer the CD|to the Music chip.
+// 190
+"Ohne einen eingelegten|Musikchip kannst du auf dem|Ger\204t nichts aufnehmen.",    //Without an inserted|music chip, you can not|record on the device.
+"Du nimmst den Chip|aus dem Ger\204t.",    //You remove the chip|from the device.
+"Es ist kein Chip eingelegt.",    //There is no chip inserted.
+"Wozu? Du hast sowieso nur die eine CD.",    //What for? You only have one CD anyway.
+"Die \"Mad Monkeys\"-CD. Du hast|sie schon tausendmal geh\224rt.",    //The "Mad Monkeys" CD.|You've heard them a thousand times.
+// 195
+"Du h\224rst nichts.|Der Chip ist unbespielt.",    //All you hear is silence.|The chip is empty.
+"Du h\224rst dir den Anfang|der \201berspielten CD an.",    //You are listening to the beginning|of the copied CD.
+"Es ist kein Chip einglegt.",    //There is no chip inserted.
+"Du trinkst etwas von den Zeug, danach|f\201hlst du dich leicht beschwipst.",    //You drink some of the stuff,|then begin to feel slightly tipsy.
+"%d Xa",    //%d Xa
+// 200
+"Als du ebenfalls aussteigst haben|die anderen Passagiere das|Fluggel\204nde bereits verlassen.",    //When you get off the plane|the other passengers|have already left the airport.
+"Flughafen",    //Airport
+"Stadtzentrum",    //Downtown
+"Kulturpalast",    //Palace of Culture
+"Erde",    //Earth
+// 205
+"Privatwohnung",    //Private apartment
+"(Taxi verlassen)",    //(Leave the taxi)
+"(Bezahlen)",    //(Pay)
+"Adresse:|                              ",    //Address:|                              
+"Fuddeln gilt nicht!|Zu diesem Zeitpunkt kannst du diese|Adresse noch gar nicht kennen!",    //Fiddling with the system doesn't work!|At this time you can not|even know this address!
+// 210
+"Du hast nicht|mehr genug Geld.",    //You do not|have enough money left.
+"Du merkst, da\341 das Taxi stark beschleunigt.",    //You notice the taxi is accelerating rapidly.
+"F\201nf Minuten sp\204ter ...",    //Five minutes later ...
+"Du hast doch schon eine Stange",    //You already have a pole
+"Du s\204gst eine der Stangen ab.",    //You saw off one of the poles.
+// 215
+"Du betrittst das einzige|offene Gesch\204ft, das|du finden kannst.",    //You enter the only|open shop that|you can find.
+"Die Kabine ist besetzt.",    //The cabin is occupied.
+"He, nimm erstmal das Geld|aus dem R\201ckgabeschlitz!",    //Hey, take the money|from the return slot!
+"Du hast doch schon bezahlt.",    //You have already paid.
+"Du hast nicht mehr genug Geld.",    //You do not have enough money left.
+// 220
+"Du wirfst 10 Xa in den Schlitz.",    //You put 10 Xa in the slot.
+"Dir wird schwarz vor Augen.",    //You are about to pass out.
+"Du ruhst dich eine Weile aus.",    //You rest for a while.
+"An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ...\"",    //On the Wall is:|"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
+"Ok, ich nehme es.",    //OK, I'll take it.
+// 225
+"Nein danke, das ist mir zu teuer.",    //No thanks, that's too expensive for me.
+"Ich w\201rde gern etwas kaufen.",    //I would like to buy something.
+"Ich bin's, Horst Hummel.",    //It's me, Horst Hummel.
+"Haben Sie auch einen Musikchip f\201r das Ger\204t?",    //Do you have a music chip for the device?
+"Eine tolle Maske, nicht wahr?",    //It's a great mask, right?
+// 230
+"Komisch, da\341 sie schon drei Jahre da steht.",    //Strange that it has been there for three years.
+"Ein starker Trunk. Zieht ganz sch\224n rein.",    //A strong drink. It hits you pretty hard.
+"Ein Abspiel- und Aufnahmeger\204t f\201r die neuen Musikchips.",    //A playback and recording device for the new music chips.
+"Eine ARTUS-Zahnb\201rste. Der letzte Schrei.",    //An ARTUS toothbrush. The latest craze.
+"Verkaufe ich massenhaft, die Dinger.",    //I sell these things in bulk.
+// 235
+"Das sind echte Rarit\204ten. B\201cher in gebundener Form.",    //These are real rarities. Books in bound form.
+"Die Encyclopedia Axacussana.",    //The Encyclopedia Axacussana.
+"Das gr\224\341te erh\204ltliche Lexikon auf 30 Speicherchips.",    //The largest available dictionary on 30 memory chips.
+"\232ber 400 Trilliarden Stichw\224rter.",    //Over 400 sextillion keywords.
+"Die ist nicht zu verkaufen.",    //It is not for sale.
+// 240
+"So eine habe ich meinem Enkel zum Geburtstag geschenkt.",    //I gave one to my grandson for his birthday.
+"Er war begeistert von dem Ding.",    //He was excited about this thing.
+"Der stammt aus einem bekannten Computerspiel.",    //It comes from a well-known computer game.
+"Robust, handlich und stromsparend.",    //Sturdy, handy and energy-saving.
+"Irgendein lasches Ges\224ff.",    //Some cheap swill.
+// 245
+"Das sind Protestaufkleber gegen die hohen Taxigeb\201hren.",    //These are stickers protesting the high taxi fees.
+"Das ist Geschirr aus der neuen Umbina-Kollektion.",    //These are dishes from the new Umbina-Collection.
+"H\204\341lich, nicht wahr?",    //Ugly, right?
+"Aber verkaufen tut sich das Zeug gut.",    //But this stuff sells well.
+"Das kostet %d Xa.",    //That costs %d Xa.
+// 250
+"Schauen Sie sich ruhig um!",    //Take a look around!
+"Unsinn!",    //Nonsense!
+"Tut mir leid, die sind|schon alle ausverkauft.",    //I'm very sorry,|they are already sold out.
+"Guten Abend.",    //Good evening.
+"Hallo.",    //Hello.
+// 255
+"Huch, Sie haben mich aber erschreckt!",    //Yikes, you scared me!
+"Wieso?",    //How so?
+"Ihre Verkleidung ist wirklich t\204uschend echt.",    //Your disguise is deceptively real-looking.
+"Welche Verkleidung?",    //What disguise?
+"Na, tun Sie nicht so!",    //Stop pretending you don't know!
+// 260
+"Sie haben sich verkleidet wie der Au\341erirdische,|dieser Horst Hummel, oder wie er hei\341t.",    //You disguised yourself as that extraterrestrial guy,|Horst Hummel, or whatever his name is.
+"Ich BIN Horst Hummel!",    //I AM Horst Hummel!
+"Geben Sie's auf!",    //Give it up!
+"An Ihrer Gestik merkt man, da\341 Sie|ein verkleideter Axacussaner sind.",    //You can tell from your gestures that you are|a disguised Axacussan.
+"Der echte Hummel bewegt sich|anders, irgendwie ruckartig.",    //The real Hummel moves|differently, kind of jerky.
+// 265
+"Weil er ein Roboter ist! ICH bin der Echte!",    //Because he is a robot! I am the real one!
+"Ach, Sie spinnen ja!",    //Oh, you are crazy!
+"Sie Trottel!!!",    //You Idiot!!!
+"Seien Sie still, oder ich werfe Sie raus!",    //Shut up or I'll kick you out!
+"Taschenmesser",    //Pocket knife
+// 270
+"Hey, da ist sogar eine S\204ge dran.",    //Hey, there's even a saw on it.
+"20 Xa",    //20 Xa
+"Discman",    //Discman
+"Da ist noch die \"Mad Monkeys\"-CD drin.",    //The "Mad Monkeys" CD is still in there.
+"Mit dem Ding sollst du dich|an der Wand festhalten.",    //You should hold onto the wall|using that thing.
+// 275
+"Spezialkeycard",    //Special keycard
+"Damit sollst du die|T\201ren knacken k\224nnen.",    //With that you should be able to crack the doors.
+"Alarmknacker",    //Alarm cracker
+"Ein kleines Ger\204t, um|die Alarmanlage auszuschalten.",    //A small device|to turn off the alarm.
+"Karte",    //Keycard
+// 280
+"Raumschiff",    //Spaceship
+"Damit bist du hierhergekommen.",    //You came here with it.
+"Fahrzeuge",    //Vehicles
+"Du kannst von hier aus nicht erkennen,|was das f\201r Fahrzeuge sind.",    //You cannot tell from here|what those vehicles are.
+"Fahrzeug",    //Vehicle
+// 285
+"Es scheint ein Taxi zu sein.",    //It seems to be a taxi.
+"Komisch, er ist verschlossen.",    //Funny, it is closed.
+"Portemonnaie",    //Wallet
+"Das mu\341 ein Axacussaner|hier verloren haben.",    //This must have been|lost by an Axacussan.
+"Ger\204t",    //Device
+// 290
+"Auf dem Ger\204t steht: \"Taxi-Call\".|Es ist ein kleiner Knopf daran.",    //The device says "Taxi Call."|There is a small button on it.
+"Ausweis",    //ID card
+"Auf dem Ausweis steht:|  Berta Tschell|  Axacuss City|  115AY2,96A,32",    //On the card it reads: | Berta Tschell | Axacuss City | 115AY2,96A,32
+"Treppe",    //Staircase
+"Sie f\201hrt zu den Gesch\204ften.",    //It leads to the shops.
+// 295
+"Gesch\204ftsstra\341e im Hintergrund",    //Business street in the background
+"Die Stra\341e scheint kein Ende zu haben.",    //The road seems to have no end.
+"Stange",    //Rod
+"Pfosten",    //Post
+"Gel\204nder",    //Railing
+// 300
+"Plakat",    //Poster
+"Musik Pur - Der Musikwettbewerb!|Heute im Kulturpalast|Hauptpreis:|Fernsehauftritt mit Horst Hummel|Sponsored by Artus GmbH",    //Pure Music - The Music Competition!|Today at the Palace of Culture|Main Prize:|Television appearance with Horst Hummel|Sponsored by Artus GmbH
+"Kabine",    //Cabin
+"Sie ist frei!",    //It is free!
+"Sie ist besetzt.",    //It is occupied.
+// 305
+"F\201\341e",    //Feet
+"Komisch, die|F\201\341e scheinen|erstarrt zu sein.",    //Strange, the|feet seem to be frozen.
+"Haube",    //Hood
+"Sieht aus wie beim Fris\224r.",    //Looks like the hairdresser.
+"400 Xa",    //400 Xa
+// 310
+"10 Xa",    //10 Xa
+"Dar\201ber steht:|\"Geldeinwurf: 10 Xa\".",    //It says:|"Coins: 10 Xa".
+"Dar\201ber steht:|\"Gewinnausgabe / Geldr\201ckgabe\".",    //It says:|"Prize / Money Return".
+"Stuhl",    //Chair
+"Etwas Entspannung k\224nntest du jetzt gebrauchen.",    //You could use some relaxation right about now.
+// 315
+"Gekritzel",    //Scribble
+"Gesicht",    //Face
+"Nicht zu fassen! Die|W\204nde sind genauso beschmutzt|wie auf der Erde.",    //Unbelievable! The walls|are just as dirty|as those on Earth.
+"B\201cher",    //Books
+"Lexikon",    //Dictionary
+// 320
+"Pflanze",    //Plant
+"Maske",    //Mask
+"Schlange",    //Snake
+"Becher",    //Cup
+"Joystick",    //Joystick
+// 325
+"Eine normale Zahnb\201rste,|es steht nur \"Artus\" darauf.",    //An ordinary toothbrush.|It says "Artus" on it.
+"Musikger\204t",    //Music device
+"Ein Ger\204t zum Abspielen und|Aufnehmen von Musikchips.|Es ist ein Mikrofon daran.",    //A device for playing and recording music chips.|There is a microphone on it.
+"Flasche",    //Bottle
+"Auf dem Etikett steht:|\"Enth\204lt 10% Hyperalkohol\".",    //The label says: "Contains 10% hyperalcohol".
+// 330
+"Kiste",    //Box
+"Verk\204ufer",    //Seller
+"Was? Daf\201r wollen Sie die Karte haben?",    //What? Do you want the card for that?
+"Sie sind wohl nicht ganz \201ber|die aktuellen Preise informiert!",    //You are probably not completely|informed about the current prices!
+"Ich bin's, Horst Hummel!",    //It's me, Horst Hummel!
+// 335
+"Sch\224nes Wetter heute!",    //Nice weather today!
+"K\224nnen Sie mir sagen, von wem ich eine Eintrittskarte f\201r den Musikwettbewerb kriegen kann?",    //Can you tell me who can get me a ticket for the music contest?
+"Ok, hier haben Sie den Xa.",    //OK, here is the Xa.
+"Ich biete Ihnen 500 Xa.",    //I offer you 500 Xa.
+"Ich biete Ihnen 1000 Xa.",    //I offer you 1000 Xa.
+// 340
+"Ich biete Ihnen 5000 Xa.",    //I offer you 5000 Xa.
+"Ich biete Ihnen 10000 Xa.",    //I offer you 10000 Xa.
+"Vielen Dank f\201r Ihren Kauf!",    //Thank you for your purchase!
+"Was bieten Sie mir|denn nun f\201r die Karte?",    //What will you offer me|for the card?
+"Hallo, Sie!",    //Hello to you!
+// 345
+"Was wollen Sie?",    //What do you want?
+"Wer sind Sie?",    //Who are you?
+"Horst Hummel!",    //Horst Hummel!
+"Kenne ich nicht.",    //Never heard of him.
+"Was, Sie kennen den ber\201hmten Horst Hummel nicht?",    //What, you don't know the famous Horst Hummel?
+// 350
+"Ich bin doch der, der immer im Fernsehen zu sehen ist.",    //I'm the guy who is always on TV.
+"Ich kenne Sie wirklich nicht.",    //I really do not know you.
+"Komisch.",    //Funny.
+"Aha.",    //Aha.
+"Ja, kann ich.",    //Yes, I can.
+// 355
+"Von wem denn?",    //From whom?
+"Diese Information kostet einen Xa.",    //This information costs a Xa.
+"Wie Sie meinen.",    //As you say.
+"Sie k\224nnen die Karte von MIR bekommen!",    //You can get the card from ME!
+"Aber nur eine Teilnahmekarte,|keine Eintrittskarte.",    //But only a participation ticket,|not an entrance ticket.
+// 360
+"Was wollen Sie daf\201r haben?",    //What do you want for it?
+"Machen Sie ein Angebot!",    //Make an offer!
+"Das ist ein gutes Angebot!",    //That's a good offer!
+"Daf\201r gebe ich Ihnen meine|letzte Teilnahmekarte!",    //For that I give you my|last participation card!
+"(Dieser Trottel!)",    //(That Idiot!)
+// 365
+"Ich w\201rde gern beim Musikwettbewerb zuschauen.",    //I would like to watch the music competition.
+"Ich w\201rde gern am Musikwettbewerb teilnehmen.",    //I would like to participate in the music competition.
+"Wieviel Uhr haben wir?",    //What time is it?
+"Ja.",    //Yes.
+"Nein.",    //No.
+// 370
+"Hallo, Leute!",    //Hi guys!
+"Hi, Fans!",    //Hi, fans!
+"Gute Nacht!",    //Good night!
+"\216h, wie geht es euch?",    //Uh, how are you?
+"Sch\224nes Wetter heute.",    //Nice weather today.
+// 375
+"Hmm ...",    //Hmm ...
+"Tja ...",    //Well ...
+"Also ...",    //So ...
+"Ok, los gehts!",    //OK let's go!
+"Ich klimper mal was auf dem Keyboard hier.",    //I'll fix something on the keyboard here.
+// 380
+"Halt, sie sind doch schon drangewesen!",    //Stop, you have already been on it!
+"He, Sie! Haben Sie|eine Eintrittskarte?",    //Hey, you! Do you have|a ticket?
+"Ja nat\201rlich, hier ist meine Teilnahmekarte.",    //Yes of course, here is my participation ticket.
+"Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten k\224nnen.",    //You are a participant!|Please ask at the checkout|when you can go on stage.
+"\216h, nein.",    //Uh, no.
+// 385
+"He, wo ist Ihr Musikchip?",    //Hey, where's your music chip?
+"Laber nicht!",    //Stop talking!
+"Fang an!",    //Get started!
+"Einen Moment, ich mu\341 erstmal \201berlegen, was ich|euch spiele.",    //One moment, I have to think about what I'm playing for you.
+"Anfangen!!!",    //Begin!!!
+// 390
+"Nun denn ...",    //Well then ...
+"Raus!",    //Out!
+"Buh!",    //Boo!
+"Aufh\224ren!",    //Stop!
+"Hilfe!",    //Help!
+// 395
+"Ich verziehe mich lieber.",    //I'd prefer to get lost.
+"Mist, auf dem Chip war|gar keine Musik drauf.",    //Damn, there was no music on the chip at all.
+"Das ging ja voll daneben!",    //That went completely wrong!
+"Du n\204herst dich der B\201hne,|aber dir wird mulmig zumute.",    //You approach the stage,|but you feel queasy.
+"Du traust dich nicht, vor|so vielen Menschen aufzutreten|und kehrst wieder um.",    //You do not dare to appear|in front of so many people|and turn around.
+// 400
+"Oh, Sie sind Teilnehmer!|Dann sind Sie aber sp\204t dran.",    //Oh, you are a participant!|But you are late.
+"Spielen Sie die Musik live?",    //Do you play the music live?
+"Dann geben Sie bitte Ihren Musikchip ab!|Er wird bei Ihrem Auftritt abgespielt.",    //Then please submit your music chip!|It will be played during your performance.
+"Oh, Sie sind sofort an der Reihe!|Beeilen Sie sich! Der B\201hneneingang|ist hinter dem Haupteingang rechts.",    //Oh, it's your turn!|Hurry! The stage entrance|is to the right behind the main entrance.
+"Habe ich noch einen zweiten Versuch?",    //Can I have another try?
+// 405
+"Nein!",    //No!
+"Haben Sie schon eine Eintrittskarte?",    //Do you already have a ticket?
+"Tut mir leid, die Karten|sind schon alle ausverkauft.",    //I'm sorry, the tickets|are already sold out.
+"Mist!",    //Crap!
+"Haben Sie schon eine Teilnahmekarte?",    //Do you already have a participation ticket?
+// 410
+"Ja, hier ist sie.",    //Yes, here it is.
+"Tut mir leid, die Teilnahmekarten|sind schon alle ausverkauft.",    //I'm sorry, the participation tickets|are already sold out.
+"Schei\341e!",    //Crap!
+"Das kann ich Ihnen|leider nicht sagen.",    //I can not tell you that.
+"Wo ist denn nun Ihr Musikchip?",    //Where is your music chip?
+// 415
+"Jetzt beeilen Sie sich doch!",    //Now hurry up!
+"Huch, Sie sind hier bei einem Musik-,|nicht bei einem Imitationswettbewerb",    //Huh, you're here at a music contest,|not at an imitation contest
+"Imitationswettbewerb?|Ich will niemanden imitieren.",    //Imitation contest?|I do not want to imitate anyone.
+"Guter Witz, wieso sehen Sie|dann aus wie Horst Hummel?",    //Good joke. Then why do you look like Horst Hummel?
+"Na, nun h\224ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht.",    //Oh come on! Your disguise isn't that perfect.
+// 420
+"Ich werde Ihnen beweisen, da\341 ich Horst Hummel bin,|indem ich diesen Wettbewerb hier gewinne.",    //I will prove to you that I am Horst Hummel|by winning this competition.
+"Dann kann ich in dieser verdammten Fernsehshow|auftreten.",    //Then I can perform in this|damn TV show.
+"Du hampelst ein bi\341chen zu|der Musik vom Chip herum.|Die Leute sind begeistert!",    //You're rocking a little bit|to the music from the chip.|The audience is excited!
+"Guten Abend. Diesmal haben wir|einen besonderen Gast bei uns.",    //Good evening. This time we have|a special guest with us.
+"Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort vor allem durch seine|Verkleidung aufgefallen war.",    //He is the winner of yesterday's music competition in the Palace of Culture.|He was particularly noteworthy|because of his disguise.
+// 425
+"Sie haben das Wort!",    //You have the floor!
+"Nun ja, meine erste Frage lautet: ...",    //Well, my first question is ...
+"Warum haben Sie sich sofort nach|Ihrer Landung entschlossen, f\201r|die Artus-GmbH zu arbeiten?",    //Why did you decide immediately|after your arrival to work for|Artus GmbH?
+"Es war meine freie Entscheidung.|Die Artus-GmbH hat mir einfach gefallen.",    //It was a decision I made on my own.|I just decided I liked Artus-GmbH.
+"Wieso betonen Sie, da\341 es|Ihre freie Entscheidung war?|Haben Sie Angst, da\341 man Ihnen|nicht glaubt?",    //Why do you stress that|it was your own decision?|Are you afraid that nobody will believe you otherwise?
+// 430
+"Also, ich mu\341 doch sehr bitten!|Was soll diese unsinnige Frage?",    //How dare you!|What is with this nonsensical question?
+"Ich finde die Frage wichtig.|Nun, Herr Hummel, was haben|Sie dazu zu sagen?",    //I think the question is important.|Well, Mr. Hummel, what do you have to say?
+"Auf solch eine Frage brauche|ich nicht zu antworten!",    //I don't feel that I have|to answer such a question!
+"Gut, dann etwas anderes ...",    //Alright, something else then ...
+"Sie sind von Beruf Koch.|Wie hie\341 das Restaurant,|in dem Sie auf der Erde|gearbeitet haben?",    //You are a chef by profession.|What was the name of the restaurant|where you worked|on Earth?
+// 435
+"Hmm, da\341 wei\341 ich nicht mehr.",    //Hmm, I do not remember that.
+"Sie wollen mir doch nicht weismachen,|da\341 Sie den Namen vergessen haben!",    //Do you really expect me to believe you cannot remember the name?
+"Schlie\341lich haben Sie|zehn Jahre dort gearbeitet!",    //After all, you worked there for ten years!
+"Woher wollen Sie das wissen?",    //How do you know that?
+"Nun, ich komme von der Erde,|im Gegensatz zu Ihnen!",    //Well, I come from Earth,|unlike you!
+// 440
+"Langsam gehen Sie zu weit!",    //Now you've gone too far!
+"Sie sind ein Roboter!|Das merkt man schon an|Ihrer dummen Antwort!|Sie sind nicht optimal|programmiert!",    //You are a robot!|It is obvious from|your stupid answer!|You are not even programmed|correctly!
+"Wenn Sie jetzt nicht mit Ihren|Beleidigungen aufh\224ren, mu\341 ich|Ihnen das Mikrofon abschalten!",    //If you do not stop right now|with your insults, I will have|to turn off the microphone!
+"Ich bin der echte Horst Hummel,|und hier ist der Beweis!",    //I am the real Horst Hummel,|and here is the proof!
+"Am n\204chsten Morgen sind alle|Zeitungen voll mit deiner spektakul\204ren|Enth\201llung des Schwindels.",    //The next morning, all the papers|are full of your spectacular|revelation of fraud.
+// 445
+"Die Manager der Artus-GmbH und Commander|Sumoti wurden sofort verhaftet.",    //The managers of Artus-GmbH and Commander|Sumoti were arrested immediately.
+"Nach dem Stre\341 der letzten Tage,|entscheidest du dich, auf die|Erde zur\201ckzukehren.",    //After these stressful last few days|you decide to return to Earth.
+"W\204hrend du dich vor Interviews|kaum noch retten kannst, ...",    //While you can barely save|yourself from interviews, ...
+"... arbeiten die Axacussanischen|Techniker an einem Raumschiff,|das dich zur Erde zur\201ckbringen soll.",    //... the Axacussan|technicians are working on a spaceship|to bring you back to Earth.
+"Eine Woche sp\204ter ist der|Tag des Starts gekommen.",    //One week later, the day of the launch has arrived.
+// 450
+"Zum dritten Mal in deinem|Leben verbringst du eine lange|Zeit im Tiefschlaf.",    //For the third time in your life,|you spend a long time|in deep sleep.
+"Zehn Jahre sp\204ter ...",    //Ten years later ...
+"Du wachst auf und beginnst,|dich schwach an deine|Erlebnisse zu erinnern.",    //You wake up and begin|to faintly remember|your experiences.
+"Um dich herum ist alles dunkel.",    //Everything is dark around you.
+"Sie zeigt %d an.",    //It displays %d.
+// 455
+"Ich interessiere mich f\201r den Job, bei dem man \201ber Nacht",    //I'm interested in the job where you can get
+"reich werden kann.",    //rich overnight.
+"Ich verkaufe frische Tomaten.",    //I sell fresh tomatoes.
+"Ich bin der Klempner. Ich soll hier ein Rohr reparieren.",    //I am the plumber. I'm supposed to fix a pipe here.
+"Ja, h\224rt sich gut an.",    //Yes, it sounds good.
+// 460
+"Krumme Gesch\204fte? F\201r wen halten Sie mich? Auf Wiedersehen!",    //Crooked business? Who do you think I am? Goodbye!
+"\216h - k\224nnten Sie mir das Ganze nochmal erkl\204ren?",    //Uh - could you explain that to me again?
+"Wie gro\341 ist mein Anteil?",    //How big is my share?
+"Machen Sie es immer so, da\341 Sie Ihre Komplizen \201ber ein Graffitti anwerben?",    //Do you always use graffiti to recruit your accomplices?
+"Hmm, Moment mal, ich frage den Boss.",    //Hmm wait, I will ask the boss.
+// 465
+"Kurze Zeit sp\204ter ...",    //A short while later ...
+"Ok, der Boss will dich sprechen.",    //OK, the boss wants to talk to you.
+"Du betrittst die Wohnung und|wirst zu einem Tisch gef\201hrt.",    //You enter the apartment and are led to a table.
+"Hmm, du willst dir also|etwas Geld verdienen?",    //Hmm, so you want to earn some money?
+"Nun ja, wir planen|einen n\204chtlichen Besuch|eines bekannten Museums.",    //Well, we're planning|a nightly visit|to a well-known museum.
+// 470
+"Wie sieht's aus, bist du interessiert?",    //So, are you interested?
+"Halt, warte!",    //Stop, wait!
+"\232berleg's dir, es springen|30000 Xa f\201r dich raus!",    //Think about it, your share would be|30000 Xa!
+"30000?! Ok, ich mache mit.",    //30000?! Alright, count me in.
+"Gut, dann zu den Einzelheiten.",    //Good, now then to the details.
+// 475
+"Bei dem Museum handelt es|sich um das Orzeng-Museum.",    //The museum in question is|the Orzeng Museum.
+"Es enth\204lt die wertvollsten|Dinosaurierfunde von ganz Axacuss.",    //It contains the most valuable|dinosaur discoveries of Axacuss.
+"Wir haben es auf das Sodo-Skelett|abgesehen. Es ist weltber\201hmt.",    //We're aiming to get the Sodo skeleton.|It is world-famous.
+"Alle bekannten Pal\204ontologen haben|sich schon damit besch\204ftigt.",    //All known paleontologists|have already dealt with it.
+"Der Grund daf\201r ist, da\341 es allen|bis jetzt bekannten Erkenntnissen|\232ber die Evolution widerspricht.",    //The reason for this is that it contradicts all known|knowledge about evolution.
+// 480
+"Irgendein verr\201ckter Forscher|bietet uns 200.000 Xa,|wenn wir ihm das Ding beschaffen.",    //Some crazy researcher|will give us 200,000 Xa|if we retrieve that thing for him.
+"So, jetzt zu deiner Aufgabe:",    //So, now to your task:
+"Du dringst durch den Nebeneingang|in das Geb\204ude ein.",    //You enter the building through|the side entrance.
+"Dort schaltest du die Alarmanlage aus,|durch die das Sodo-Skelett gesichert wird.",    //There you switch off the alarm system,|which secures the Sodo skeleton.
+"Wir betreten einen anderen Geb\204udeteil|und holen uns das Gerippe.",    //We'll enter another part of the building|and fetch the skeleton.
+// 485
+"Deine Aufgabe ist nicht leicht.|Schau dir diesen Plan an.",    //Your task is not easy.|Look at this plan.
+"Unten siehst du die kleine Abstellkammer,|durch die du in die Austellungsr\204ume kommst.",    //Below you can see the small storage room,|through which you come to the showrooms.
+"Bei der mit Y gekennzeichneten|Stelle ist die Alarmanlage.",    //The alarm system is at the location marked Y.
+"Bei dem X steht ein gro\341er Dinosaurier|mit einem wertvollen Sch\204del.|Den Sch\204del nimmst du mit.",    //The X marks the spot with a big dinosaur|with a valuable skull.|You will take the skull with you.
+"Nun zu den Problemen:",    //Now for the problems:
+// 490
+"Die wei\341 gekennzeichneten|T\201ren sind verschlossen.",    //The marked white doors|are locked.
+"Sie m\201ssen mit einer Spezialkeycard ge\224ffnet|werden, was jedoch einige Zeit dauert.",    //They have to be opened with a special keycard,|which can take a while.
+"Au\341erdem gibt es in den auf der Karte|farbigen R\204umen einen Druck-Alarm.",    //In addition, there are pressure alarms|in the rooms which are colored on the map.
+"Du darfst dich dort nicht l\204nger|als 16 bzw. 8 Sekunden aufhalten,|sonst wird Alarm ausgel\224st.",    //You can not stay there longer than|16 or 8 seconds,|or the alarm will go off.
+"Im Raum oben rechts ist|eine Kamera installiert.",    //In the room at the top right|there is a camera installed.
+// 495
+"Diese wird jedoch nur von|der 21. bis zur 40. Sekunde|einer Minute \201berwacht.",    //However, it is only monitored|between the 21st and the 40th second|of every minute.
+"Das gr\224\341te Problem ist der W\204chter.",    //The biggest problem is the guard.
+"Er braucht f\201r seine Runde genau|eine Minute, ist also ungef\204hr|zehn Sekunden in einem Raum.",    //He needs exactly one minute for his round,|so he is in each room|for about ten seconds.
+"Du m\201\341test seine Schritte h\224ren k\224nnen,|wenn du in der Abstellkammer bist|und der W\204chter dort vorbeikommt.",    //You should be able to hear his footsteps|if you are in the closet|and the guard passes by.
+"Wenn du es bis zur Alarmanlage|geschafft hast, h\204ngst du dich|mit dem Sauger an die Wand,|damit du keinen Druck-Alarm ausl\224st.",    //If you make it to the alarm system,|you'll use the sucker to hang on the wall|to avoid triggering the pressure alarm.
+// 500
+"Die Alarmanlage schaltest du|mit einem speziellen Ger\204t aus.",    //You switch off the alarm system|with a special device.
+"Wenn du das geschafft hast, nichts|wie raus! Aber keine Panik,|du darfst keinen Alarm ausl\224sen.",    //Once you're done, get out of there!|But do not panic!|You must not set off the alarm.
+"So, noch irgendwelche Fragen?",    //So, any more questions?
+"Also gut.",    //All right then.
+"Du bekommst 30000 Xa.",    //You get 30,000 Xa.
+// 505
+"Ja, die Methode hat sich bew\204hrt.",    //Yes, that method has proven itself worthy.
+"Hast du sonst noch Fragen?",    //Do you have any questions?
+"Nachdem wir alles gekl\204rt|haben, kann es ja losgehen!",    //Now that we are on the same page we can get started!
+"Zur vereinbarten Zeit ...",    //At the agreed upon time ...
+"Du stehst vor dem Orzeng Museum,|w\204hrend die Gangster schon in einen|anderen Geb\204uderteil eingedrungen sind.",    //You stand in front of the Orzeng Museum,|while the gangsters have already penetrated|into another part of the building.
+// 510
+"Wichtiger Hinweis:|Hier ist die letzte M\224glichkeit,|vor dem Einbruch abzuspeichern.",    //Important note:|Here is the last possibility to save|before the break-in.
+"Wenn Sie das Museum betreten haben,|k\224nnen Sie nicht mehr speichern!",    //Once you enter the museum|you will not be able to save!
+"Stecken Sie sich Ihre|Tomaten an den Hut!",    //You can keep your tomatoes!
+"Das kann ja jeder sagen!",    //Anyone can say that!
+"Niemand \224ffnet.",    //Nobody answers.
+// 515
+"Welche Zahl willst du eingeben:      ",    //What number do you want to enter:      
+"Falsche Eingabe",    //Invalid input
+"Der Aufzug bewegt sich.",    //The elevator is moving.
+"Die Karte wird|nicht angenommen.",    //The card|is not accepted.
+"Da ist nichts mehr.",    //There is nothing left.
+// 520
+"Da ist ein Schl\201ssel unter dem Bett!",    //There's a key under the bed!
+"Hey, da ist etwas unter dem|Bett. Nach dem Ger\204usch zu|urteilen, ist es aus Metall.",    //Hey, there is something under the|bed. Judging by the noise,|it is made of metal.
+"Mist, es gelingt dir nicht,|den Gegenstand hervorzuholen.",    //Damn, you do not succeed in getting the object out.
+"Die Klappe ist schon offen.",    //The flap is already open.
+"Der Schl\201sssel pa\341t nicht.",    //The key does not fit.
+// 525
+"Du steckst den Chip in die|Anlage, aber es passiert nichts.|Die Anlage scheint kaputt zu sein.",    //You put the chip in the stereo,|but nothing happens.|The stereo seems to be broken.
+"Es passiert nichts. Das Ding|scheint kaputt zu sein.",    //Nothing happens. The thing|seems to be broken.
+"Hochspannung ist ungesund, wie du aus|Teil 1 eigentlich wissen m\201\341test!",    //High voltage is unhealthy, as you|should already know|from Part 1!
+"Es h\204ngt ein Kabel heraus.",    //A cable hangs out.
+"Irgendetwas hat hier|nicht ganz funktioniert.",    //Something did not|quite work out here.
+// 530
+"Du ziehst den Raumanzug an.",    //You put on your space suit.
+"Du ziehst den Raumanzug aus.",    //You take off your space suit.
+"Das ist schon verbunden.",    //That is already connected.
+"Die Leitung ist hier|schon ganz richtig.",    //The cable is already|at the right place.
+"Roger W.! Wie kommen Sie denn hierher?",    //Roger W.! How did you get here?
+// 535
+"Ach, sieh mal einer an! Sie schon wieder!",    //Oh, look at that! It's you again!
+"Wo haben Sie denn|Ihr Schiff gelassen?",    //Where did you|leave your ship?
+"Schauen Sie mal hinter mich auf|den Turm! Da oben h\204ngt es.",    //Take a look behind me, up on|the tower! It's up there.
+"Ich hatte es scheinbar etwas zu|eilig, aber ich mu\341te unbedingt|zu den Dreharbeiten nach Xenon!",    //Apparently I was too much in a hurry,|but I had to be at the film shooting in Xenon!
+"Mich wundert, da\341 es die Leute|hier so gelassen nehmen.",    //I am surprised that people|here take things so calmly.
+// 540
+"Die tun gerade so, als ob der Turm|schon immer so schr\204g gestanden h\204tte!",    //They are pretending that the tower|has always been that slanted!
+"Hat er auch, schon seit|mehreren Jahrhunderten!",    //It has, for|several centuries, actually!
+"\216h ... ach so. Und von wo|kommen Sie? Sie hatten's ja|wohl auch ziemlich eilig.",    //Uh ... I see. And where are you coming from? It seems you were in quite a hurry as well.
+"Ich komme von Axacuss.",    //I come from Axacuss.
+"Hmm, was mach ich jetzt blo\341?",    //Hmm, what am I going to do now?
+// 545
+"Ich kenne ein gutes Cafe nicht|weit von hier, da k\224nnen|wir uns erstmal erholen.",    //I know a good cafe not far from here,|where we can get some rest.
+"Ok, einverstanden.",    //OK, I agree.
+"Faszinierend!",    //Fascinating!
+"Taxis",    //Taxis
+"Hier ist ja richtig was los!",    //There seems to be something really going on here!
+// 550
+"Axacussaner",    //Axacussan
+"Teilnahmekarte",    //Participation card
+"Axacussanerin",    //Axacussian
+"Darauf steht:|\"115AY2,96A\"",    //It reads:|"115AY2,96A"
+"Darauf steht:|\"115AY2,96B\"",    //It reads:|"115AY2,96B"
+// 555
+"Darauf steht:|\"341,105A\"",    //It reads:|"341,105A"
+"Darauf steht:|\"341,105B\"",    //It reads:|"341,105B"
+"Klingel",    //Bell
+"Anzeige",    //Display
+"Tastenblock",    //Keypad
+// 560
+"Es sind Tasten von 0 bis 9 darauf.",    //There are keys from 0 to 9 on it.
+"Chip",    //Chip
+"Es ist ein Musikchip!",    //It's a music chip!
+"Klappe",    //Hatch
+"Sie ist mit einem altmodischen|Schlo\341 verschlossen.",    //It is secured with an old-fashioned lock.
+// 565
+"Musikanlage",    //Music system
+"Toll, eine in die Wand|integrierte Stereoanlage.",    //Great, a built-in stereo|in the wall.
+"Boxen",    //Speakers
+"Ganz normale Boxen.",    //Ordinary speakers.
+"Stifte",    //Pencils
+// 570
+"Ganz normale Stifte.",    //Ordinary pencils.
+"Metallkl\224tzchen",    //Metal blocks
+"Es ist magnetisch.",    //It is magnetic.
+"Bild",    //Image
+"Ein ungew\224hnliches Bild.",    //An unusual picture.
+// 575
+"Schrank",    //Cabinet
+"Er ist verschlossen",    //It is closed
+"Aufzug",    //Elevator
+"unter Bett",    //under bed
+"Unter dem Bett sind bestimmt wichtige|Dinge zu finden, nur kommst du nicht darunter.|Du br\204uchtest einen Stock oder so etwas.",    //Under the bed are certainly important|things to find, only you cannot reach underneath.|You need a stick or something.
+// 580
+"Schl\201ssel",    //Key
+"Ein kleiner Metallschl\201ssel.",    //A small metal key.
+"Schalter",    //Switch
+"Griff",    //Handle
+"Luke",    //Hatch
+// 585
+"Raumanzug",    //Space suit
+"Ein zusammenfaltbarer Raumanzug.",    //A collapsible spacesuit.
+"Leitung",    //Cable
+"Irgendetwas scheint hier|kaputtgegangen zu sein.",    //Something seems to|have broken here.
+"Sie h\204ngt lose von der Decke runter.",    //It hangs loose from the ceiling.
+// 590
+"Zur Erinnerung:|Dir ist es gelungen, aus den|Artus-Geheimb\201ros zu fliehen.",    //Reminder:|You managed to escape from the|Artus-GmbH secret offices.
+"Nun befindest du dich in|einem Passagierraumschiff,|das nach Axacuss City fliegt.",    //Now you are in a passenger|spaceship that|flies to Axacuss City.
+"W\204hrend des Fluges schaust du dir|das axacussanische Fernsehprogramm an.|Du st\224\341t auf etwas Interessantes ...",    //During the flight, you watch the|Axacussan TV program.|You come across something interesting ...
+"Herzlich willkommen!",    //Welcome!
+"Heute zu Gast ist Alga Lorch.|Sie wird Fragen an den Erdling|Horst Hummel stellen.",    //Alga Lorch will be present today.|She will ask questions to the Earthling|Horst Hummel.
+// 595
+"Horst wird alle Fragen|beantworten, soweit es|ihm m\224glich ist.",    //Horst will answer all|questions as fully|as possible.
+"Sie haben das Wort, Frau Lorch!",    //You have the floor, Mrs Lorch!
+"Herr Hummel, hier ist meine erste Frage: ...",    //Mr. Hummel, here is my first question: ...
+"Sie sind nun ein ber\201hmter Mann auf Axacuss.|Aber sicher vermissen Sie auch Ihren Heimatplaneten.",    //You are now a famous man on Axacuss.|But surely you miss your home planet.
+"Wenn Sie w\204hlen k\224nnten, w\201rden Sie lieber|ein normales Leben auf der Erde f\201hren,|oder finden Sie das Leben hier gut?",    //If you could choose, would you prefer|to lead a normal life on Earth,|or do you find life here good?
+// 600
+"Ehrlich gesagt finde ich es sch\224n,|ber\201hmt zu sein. Das Leben ist|aufregender als auf der Erde.",    //Honestly, I think it's nice to be|famous. Life is more exciting here|than on Earth.
+"Au\341erdem sind die Leute von der|Artus GmbH hervorragende Freunde.",    //In addition, the people of|Artus GmbH are excellent friends.
+"Nun ja, planen Sie denn trotzdem,|irgendwann auf die Erde zur\201ckzukehren?",    //Well, are you still planning|to return to Earth someday?
+"Das kann ich Ihnen zum jetzigen|Zeitpunkt noch nicht genau sagen.",    //At this point in time,|I haven't made up my mind, yet.
+"Aber ich versichere Ihnen, ich|werde noch eine Weile hierbleiben.",    //But I assure you,|I will stay here for a while.
+// 605
+"Aha, mich interessiert au\341erdem,|ob es hier auf Axacuss etwas gibt,|das Sie besonders m\224gen.",    //I see. I'm also interested in|whether there's anything here on Axacuss that you particularly like.
+"Oh mir gef\204llt der ganze Planet,|aber das Beste hier sind die|hervorragenden Artus-Zahnb\201rsten!",    //Oh I like the whole planet,|but the best thing here are the|extraordinary Artus toothbrushes!
+"Zahnb\201rsten von solcher Qualit\204t|gab es auf der Erde nicht.",    //Toothbrushes of such quality|do not exist on Earth.
+"\216h, ach so.",    //Um, I see.
+"Pl\224tzlich lenkt dich eine|Lautsprecherstimme vom Fernseher ab.",    //Suddenly, a speaker's voice|distracts you from the television.
+// 610
+"\"Sehr geehrte Damen und Herren,|wir sind soeben auf dem Flughafen|von Axacuss City gelandet.\"",    //"Ladies and Gentlemen,|We just landed at the airport|at Axacuss City."
+"\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das Raumschiff! Auf Wiedersehen!\"",    //"I hope you had a nice flight.|Please leave the spaceship! Goodbye!"
+"W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.",    //While the other passengers|are disembarking, you are trying|to handle the shock.
+"\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
+NULL
+};
+
+#endif // GAMETEXT_H
diff --git a/devtools/create_supernova2/module.mk b/devtools/create_supernova2/module.mk
new file mode 100644
index 0000000..f157fde
--- /dev/null
+++ b/devtools/create_supernova2/module.mk
@@ -0,0 +1,12 @@
+MODULE := devtools/create_supernova2
+
+MODULE_OBJS := \
+        file.o \
+        po_parser.o \
+        create_supernova2.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_supernova2
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/devtools/create_supernova2/po_parser.cpp b/devtools/create_supernova2/po_parser.cpp
new file mode 100644
index 0000000..05a8ac1
--- /dev/null
+++ b/devtools/create_supernova2/po_parser.cpp
@@ -0,0 +1,221 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "po_parser.h"
+
+PoMessageList::PoMessageList() : _list(NULL), _size(0), _allocated(0) {
+}
+
+PoMessageList::~PoMessageList() {
+	for (int i = 0; i < _size; ++i)
+		delete _list[i];
+	delete[] _list;
+}
+
+int PoMessageList::compareString(const char* left, const char* right) {
+	if (left == NULL && right == NULL)
+		return 0;
+	if (left == NULL)
+		return -1;
+	if (right == NULL)
+		return 1;
+	return strcmp(left, right);
+}
+
+int PoMessageList::compareMessage(const char *msgLeft, const char *contextLeft, const char *msgRight, const char *contextRight) {
+	int compare = compareString(msgLeft, msgRight);
+	if (compare != 0)
+		return compare;
+	return compareString(contextLeft, contextRight);
+}
+
+void PoMessageList::insert(const char *translation, const char *msg, const char *context) {
+	if (msg == NULL || *msg == '\0' || translation == NULL || *translation == '\0')
+		return;
+
+	// binary-search for the insertion index
+	int leftIndex = 0;
+	int rightIndex = _size - 1;
+	while (rightIndex >= leftIndex) {
+		int midIndex = (leftIndex + rightIndex) / 2;
+		int compareResult = compareMessage(msg, context, _list[midIndex]->msgid, _list[midIndex]->msgctxt);
+		if (compareResult == 0)
+			return; // The message is already in this list
+		else if (compareResult < 0)
+			rightIndex = midIndex - 1;
+		else
+			leftIndex = midIndex + 1;
+	}
+	// We now have rightIndex = leftIndex - 1 and we need to insert the new message
+	// between the two (i.a. at leftIndex).
+	if (_size + 1 > _allocated) {
+		_allocated += 100;
+		PoMessage **newList = new PoMessage*[_allocated];
+		for (int i = 0; i < leftIndex; ++i)
+			newList[i] = _list[i];
+		for (int i = leftIndex; i < _size; ++i)
+			newList[i + 1] = _list[i];
+		delete[] _list;
+		_list = newList;
+	} else {
+		for (int i = _size - 1; i >= leftIndex; --i)
+			_list[i + 1] = _list[i];
+	}
+	_list[leftIndex] = new PoMessage(translation, msg, context);
+	++_size;
+}
+
+const char *PoMessageList::findTranslation(const char *msg, const char *context) {
+	if (msg == NULL || *msg == '\0')
+		return NULL;
+
+	// binary-search for the message
+	int leftIndex = 0;
+	int rightIndex = _size - 1;
+	while (rightIndex >= leftIndex) {
+		int midIndex = (leftIndex + rightIndex) / 2;
+		int compareResult = compareMessage(msg, context, _list[midIndex]->msgid, _list[midIndex]->msgctxt);
+		if (compareResult == 0)
+			return _list[midIndex]->msgstr;
+		else if (compareResult < 0)
+			rightIndex = midIndex - 1;
+		else
+			leftIndex = midIndex + 1;
+	}
+	return NULL;
+}
+
+PoMessageList *parsePoFile(const char *file) {
+	FILE *inFile = fopen(file, "r");
+	if (!inFile)
+		return NULL;
+
+	char msgidBuf[1024], msgctxtBuf[1024], msgstrBuf[1024];
+	char line[1024], *currentBuf = msgstrBuf;
+
+	PoMessageList *list = new PoMessageList();
+
+	// Initialize the message attributes.
+	bool fuzzy = false;
+	bool fuzzy_next = false;
+
+	// Parse the file line by line.
+	// The msgstr is always the last line of an entry (i.e. msgid and msgctxt always
+	// precede the corresponding msgstr).
+	msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+	while (!feof(inFile) && fgets(line, 1024, inFile)) {
+		if (line[0] == '#' && line[1] == ',') {
+			// Handle message attributes.
+			if (strstr(line, "fuzzy")) {
+				fuzzy_next = true;
+				continue;
+			}
+		}
+		// Skip empty and comment line
+		if (*line == '\n' || *line == '#')
+			continue;
+		if (strncmp(line, "msgid", 5) == 0) {
+			if (currentBuf == msgstrBuf) {
+				// add previous entry
+				if (*msgstrBuf != '\0' && !fuzzy)
+					list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
+				msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+
+				// Reset the attribute flags.
+				fuzzy = fuzzy_next;
+				fuzzy_next = false;
+			}
+			strcpy(msgidBuf, stripLine(line));
+			currentBuf = msgidBuf;
+		} else if (strncmp(line, "msgctxt", 7) == 0) {
+			if (currentBuf == msgstrBuf) {
+				// add previous entry
+				if (*msgstrBuf != '\0' && !fuzzy)
+					list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
+				msgidBuf[0] = msgstrBuf[0] = msgctxtBuf[0] = '\0';
+
+				// Reset the attribute flags
+				fuzzy = fuzzy_next;
+				fuzzy_next = false;
+			}
+			strcpy(msgctxtBuf, stripLine(line));
+			currentBuf = msgctxtBuf;
+		} else if (strncmp(line, "msgstr", 6) == 0) {
+			strcpy(msgstrBuf, stripLine(line));
+			currentBuf = msgstrBuf;
+		} else {
+			// concatenate the string at the end of the current buffer
+			if (currentBuf)
+				strcat(currentBuf, stripLine(line));
+		}
+	}
+	if (currentBuf == msgstrBuf) {
+		// add last entry
+		if (*msgstrBuf != '\0' && !fuzzy)
+			list->insert(msgstrBuf, msgidBuf, msgctxtBuf);
+	}
+
+	fclose(inFile);
+	return list;
+}
+
+char *stripLine(char *const line) {
+	// This function modifies line in place and return it.
+	// Keep only the text between the first two unprotected quotes.
+	// It also look for literal special characters (e.g. preceded by '\n', '\\', '\"', '\'', '\t')
+	// and replace them by the special character so that strcmp() can match them at run time.
+	// Look for the first quote
+	char const *src = line;
+	while (*src != '\0' && *src++ != '"') {}
+	// shift characters until we reach the end of the string or an unprotected quote
+	char *dst = line;
+	while (*src != '\0' && *src != '"') {
+		char c = *src++;
+		if (c == '\\') {
+			switch (c = *src++) {
+				case  'n': c = '\n'; break;
+				case  't': c = '\t'; break;
+				case '\"': c = '\"'; break;
+				case '\'': c = '\''; break;
+				case '\\': c = '\\'; break;
+				default:
+					// Just skip
+					fprintf(stderr, "Unsupported special character \"\\%c\" in string. Please contact ScummVM developers.\n", c);
+					continue;
+			}
+		}
+		*dst++ = c;
+	}
+	*dst = '\0';
+	return line;
+}
+
+char *parseLine(const char *line, const char *field) {
+	// This function allocate and return a new char*.
+	// It will return a NULL pointer if the field is not found.
+	// It is used to parse the header of the po files to find the language name
+	// and the charset.
+	const char *str = strstr(line, field);
+	if (str == NULL)
+		return NULL;
+	str += strlen(field);
+	// Skip spaces
+	while (*str != '\0' && isspace(*str)) {
+		++str;
+	}
+	// Find string length (stop at the first '\n')
+	int len = 0;
+	while (str[len] != '\0' && str[len] != '\n') {
+		++len;
+	}
+	if (len == 0)
+		return NULL;
+	// Create result string
+	char *result = new char[len + 1];
+	strncpy(result, str, len);
+	result[len] = '\0';
+	return result;
+}
+
diff --git a/devtools/create_supernova2/po_parser.h b/devtools/create_supernova2/po_parser.h
new file mode 100644
index 0000000..7c358e3
--- /dev/null
+++ b/devtools/create_supernova2/po_parser.h
@@ -0,0 +1,78 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * This is a utility for generating a data file for the supernova engine.
+ * It contains strings extracted from the original executable as well
+ * as translations and is required for the engine to work properly.
+ */
+
+#ifndef PO_PARSER_H
+#define PO_PARSER_H
+
+struct PoMessage {
+	char *msgstr;
+	char *msgid;
+	char *msgctxt;
+
+	PoMessage(const char *translation, const char *message, const char *context = NULL) :
+	msgstr(NULL), msgid(NULL), msgctxt(NULL)
+	{
+		if (translation != NULL && *translation != '\0') {
+			msgstr = new char[1 + strlen(translation)];
+			strcpy(msgstr, translation);
+		}
+		if (message != NULL && *message != '\0') {
+			msgid = new char[1 + strlen(message)];
+			strcpy(msgid, message);
+		}
+		if (context != NULL && *context != '\0') {
+			msgctxt = new char[1 + strlen(context)];
+			strcpy(msgctxt, context);
+		}
+	}
+	~PoMessage() {
+		delete[] msgstr;
+		delete[] msgid;
+		delete[] msgctxt;
+	}
+};
+
+class PoMessageList {
+public:
+	PoMessageList();
+	~PoMessageList();
+
+	void insert(const char *translation, const char *msg, const char *context = NULL);
+	const char *findTranslation(const char *msg, const char *context = NULL);
+
+private:
+	int compareString(const char *left, const char *right);
+	int compareMessage(const char *msgLeft, const char *contextLeft, const char *msgRight, const char *contextRight);
+
+	PoMessage **_list;
+	int _size;
+	int _allocated;
+};
+
+PoMessageList *parsePoFile(const char *file);
+char *stripLine(char *);
+char *parseLine(const char *line, const char *field);
+
+#endif /* PO_PARSER_H */
diff --git a/devtools/create_supernova2/strings-en.po b/devtools/create_supernova2/strings-en.po
new file mode 100644
index 0000000..624f975
--- /dev/null
+++ b/devtools/create_supernova2/strings-en.po
@@ -0,0 +1,2780 @@
+# Mission Supernova Translation.
+# Copyright (C) YEAR ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mission Supernova Part 2 1.0\n"
+"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
+"POT-Creation-Date: 2017-07-22 19:37+0100\n"
+"PO-Revision-Date: 2018-04-15 05:41+0000\n"
+"Last-Translator: Adrian Frhwirth <bonki at scummvm.org>\n"
+"Language-Team: none\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9\n"
+
+#: ../../ms2/ms2.c:1641
+msgid "Gehe"
+msgstr "Go"
+
+#: ../../ms2/ms2.c:1641
+msgid "Schau"
+msgstr "Look"
+
+#: ../../ms2/ms2.c:1641
+msgid "Nimm"
+msgstr "Take"
+
+#: ../../ms2/ms2.c:1641
+msgid "™ffne"
+msgstr "Open"
+
+#: ../../ms2/ms2.c:1641
+msgid "Schlieáe"
+msgstr "Close"
+
+#: ../../ms2/ms2.c:1642
+msgid "Drcke"
+msgstr "Push"
+
+#: ../../ms2/ms2.c:1642
+msgid "Ziehe"
+msgstr "Pull"
+
+#: ../../ms2/ms2.c:1642
+msgid "Benutze"
+msgstr "Use"
+
+#: ../../ms2/ms2.c:1642
+msgid "Rede"
+msgstr "Talk"
+
+#: ../../ms2/ms2.c:1642
+msgid "Gib"
+msgstr "Give"
+
+#: ../../ms2/ms2.c:2199
+msgid "Gespr„ch beenden"
+msgstr "End of conversation"
+
+#: ../../ms2/ms2.c:2333
+msgid "Gehe zu "
+msgstr "Go to "
+
+#: ../../ms2/ms2.c:2333
+msgid "Schau "
+msgstr "Look at "
+
+#: ../../ms2/ms2.c:2333
+msgid "Nimm "
+msgstr "Take "
+
+#: ../../ms2/ms2.c:2333
+msgid "™ffne "
+msgstr "Open "
+
+#: ../../ms2/ms2.c:2333
+msgid "Schlieáe "
+msgstr "Close "
+
+#: ../../ms2/ms2.c:2334
+msgid "Drcke "
+msgstr "Push "
+
+#: ../../ms2/ms2.c:2334
+msgid "Ziehe "
+msgstr "Pull "
+
+#: ../../ms2/ms2.c:2334
+msgid "Benutze "
+msgstr "Use "
+
+#: ../../ms2/ms2.c:2334
+msgid "Rede mit "
+msgstr "Talk to "
+
+#: ../../ms2/ms2.c:2334
+msgid "Gib "
+msgstr "Give "
+
+#: ../../ms2/ms2.c:2344
+msgid " an "
+msgstr " to "
+
+#: ../../ms2/ms2.c:2345
+msgid " mit "
+msgstr " with "
+
+#: ../../ms2/ms2.c:2903
+msgid "Laden"
+msgstr "Load"
+
+#: ../../ms2/ms2.c:2905
+msgid "Speichern"
+msgstr "Save"
+
+#: ../../ms2/ms2.c:2907
+msgid "Zurck"
+msgstr "Back"
+
+#: ../../ms2/ms2.c:2909
+msgid "Neustart"
+msgstr "Restart"
+
+#: ../../ms2/ms2.c:3002
+msgid "Schreibfehler"
+msgstr "write error"
+
+#: ../../ms2/ms2.c:3243
+msgid "Textgeschwindigkeit:"
+msgstr "Text speed:"
+
+#: ../../ms2/ms2.c:3292
+msgid "Spiel abbrechen?"
+msgstr "Leave game?"
+
+#: ../../ms2/ms2.c:3295
+msgid "Ja"
+msgstr "Yes"
+
+#: ../../ms2/ms2.c:3296
+msgid "Nein"
+msgstr "No"
+
+#: ../../ms2/ms2.c:3368
+msgid "Das tr„gst du doch bei dir."
+msgstr "You already carry this."
+
+#: ../../ms2/ms2.c:3370
+msgid "Du bist doch schon da."
+msgstr "You are already there."
+
+#: ../../ms2/ms2.c:3373
+msgid "Das ist geschlossen."
+msgstr "This is closed."
+
+#: ../../ms2/ms2.c:3383
+msgid "Das hast du doch schon."
+msgstr "You already have that."
+
+#: ../../ms2/ms2.c:3385
+msgid "Das brauchst du nicht."
+msgstr "You don't need that."
+
+#: ../../ms2/ms2.c:3387
+msgid "Das kannst du nicht nehmen."
+msgstr "You can't take that."
+
+#: ../../ms2/ms2.c:3393
+msgid "Das l„át sich nicht ”ffnen."
+msgstr "This cannot be opened."
+
+#: ../../ms2/ms2.c:3395 ../../ms2/ms2_pyra.c:646
+msgid "Das ist schon offen."
+msgstr "This is already opened."
+
+#: ../../ms2/ms2.c:3397
+msgid "Das ist verschlossen."
+msgstr "This is locked."
+
+#: ../../ms2/ms2.c:3413
+msgid "Das l„át sich nicht schlieáen."
+msgstr "This cannot be closed."
+
+#: ../../ms2/ms2.c:3415 ../../ms2/ms2_pyra.c:671
+msgid "Das ist schon geschlossen."
+msgstr "This is already closed."
+
+#: ../../ms2/ms2.c:3430
+msgid "Behalt es lieber!"
+msgstr "Better keep it!"
+
+#: ../../ms2/ms2.c:3434
+msgid "Das geht nicht."
+msgstr "You can't do that."
+
+#: ../../ms2/ms2_mod.c:533
+msgid "^(C) 1994 Thomas und Steffen Dingel#"
+msgstr "^(C) 1994 Thomas and Steffen Dingel#"
+
+#: ../../ms2/ms2_mod.c:534
+msgid "Story und Grafik:^ Thomas Dingel#"
+msgstr "Story and Graphics:^ Thomas Dingel#"
+
+#: ../../ms2/ms2_mod.c:535
+msgid "Programmierung:^ Steffen Dingel#"
+msgstr "Programming:^ Steffen Dingel#"
+
+#: ../../ms2/ms2_mod.c:536
+msgid "Musik:^ Bernd Hoffmann#"
+msgstr "Music:^ Bernd Hoffmann#"
+
+#: ../../ms2/ms2_mod.c:537
+msgid "Getestet von ...#"
+msgstr "Tested by ...#"
+
+#: ../../ms2/ms2_mod.c:548
+msgid "^Das war's.#"
+msgstr "^That's it.#"
+
+#: ../../ms2/ms2_mod.c:549
+msgid "^Schluá!#"
+msgstr "^Over!#"
+
+#: ../../ms2/ms2_mod.c:550
+msgid "^Ende!#"
+msgstr "^End!#"
+
+#: ../../ms2/ms2_mod.c:551
+msgid "^Aus!#"
+msgstr "^Done!#"
+
+#: ../../ms2/ms2_mod.c:552
+msgid "^Tschá!#"
+msgstr "^Bye!#"
+
+#: ../../ms2/ms2_mod.c:603
+msgid "Oh!"
+msgstr "Oh!"
+
+#: ../../ms2/ms2_mod.c:605
+msgid "Nicht schlecht!"
+msgstr "Not bad!"
+
+#: ../../ms2/ms2_mod.c:607
+msgid "Supersound!"
+msgstr "Supersound!"
+
+#: ../../ms2/ms2_mod.c:609
+msgid "Klasse!"
+msgstr "Great!"
+
+#: ../../ms2/ms2_mod.c:611
+msgid "Nicht zu fassen!"
+msgstr "I can't believe it!"
+
+#: ../../ms2/ms2_mod.c:613
+msgid "Super, ey!"
+msgstr "Dope, yo!"
+
+#: ../../ms2/ms2_mod.c:615
+msgid "Fantastisch!"
+msgstr "Fantastic!"
+
+#: ../../ms2/ms2_mod.c:617
+msgid "Umwerfend!"
+msgstr "Stunning!"
+
+#: ../../ms2/ms2_mod.c:619
+msgid "Genial!"
+msgstr "Brilliant!"
+
+#: ../../ms2/ms2_mod.c:621
+msgid "Spitze!"
+msgstr "Awesome!"
+
+#: ../../ms2/ms2_mod.c:623
+msgid "Jawoll!"
+msgstr "Alright!"
+
+#: ../../ms2/ms2_mod.c:625
+msgid "Hervorragend!"
+msgstr "Outstanding!"
+
+#: ../../ms2/ms2_mod.c:627
+msgid "Ultragut!"
+msgstr "Ultra-good!"
+
+#: ../../ms2/ms2_mod.c:629
+msgid "Megacool!"
+msgstr "Mega cool!"
+
+#: ../../ms2/ms2_mod.c:631
+msgid "Yeah!"
+msgstr "Yeah!"
+
+#: ../../ms2/ms2_mus.c:60
+msgid "Ein W„chter betritt den Raum.|Du wirst verhaftet."
+msgstr "A guard enters the room.|You are getting arrested."
+
+#: ../../ms2/ms2_mus.c:73
+msgid "Die n„chsten paar Jahre|verbringst du im Knast."
+msgstr "You will spend the next|few years in jail."
+
+#: ../../ms2/ms2_mus.c:145
+msgid "Es wird Alarm ausgel”st."
+msgstr "The alarm is about to be set off."
+
+#: ../../ms2/ms2_mus.c:200
+msgid "Du h”rst Schritte."
+msgstr "You are hearing footsteps."
+
+#: ../../ms2/ms2_mus.c:232
+msgid "Um das Schloss zu ”ffnen,|brauchst du einige Zeit."
+msgstr "You will take some time,|to pick that lock."
+
+#: ../../ms2/ms2_mus.c:238
+msgid "Du ger„tst in Panik|und ziehst die Keycard|aus der Tr."
+msgstr "You are panicking|and remove the keycard|from the door."
+
+#: ../../ms2/ms2_mus.c:316
+msgid "Du hast deinen Auftrag|noch nicht ausgefhrt."
+msgstr "You have not completed|your task yet."
+
+#: ../../ms2/ms2_mus.c:330
+msgid ""
+"Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du "
+"dich, zu fliehen."
+msgstr "Although you haven't|disabled the alarm yet,|you decide to escape."
+
+#: ../../ms2/ms2_mus.c:337
+msgid ""
+"Du entledigst dich der Einbruchswerkzeuge|und nimmst ein Taxi zum "
+"Kulturpalast."
+msgstr ""
+"You get rid of your burglar tools|and take a cab to the Palace of Culture."
+
+#: ../../ms2/ms2_mus.c:376 ../../ms2/ms2_mus.c:532 ../../ms2/ms2_mus.c:631
+msgid "Diese Tr brauchst|du nicht zu ”ffnen."
+msgstr "You don't need|to open this door."
+
+#: ../../ms2/ms2_mus.c:394
+msgid "Uff, es hat geklappt!"
+msgstr "Phew, it worked!"
+
+#: ../../ms2/ms2_mus.c:407
+msgid "Zurck im Quartier der Gangster ..."
+msgstr "Back in the gangsters' hideout ..."
+
+#: ../../ms2/ms2_mus.c:417
+msgid "Das lief ja wie am Schnrchen!"
+msgstr "Everything went like clockwork!"
+
+#: ../../ms2/ms2_mus.c:418
+msgid "Hier, dein Anteil von 30000 Xa."
+msgstr "Here, your share of 30000 Xa."
+
+#: ../../ms2/ms2_mus.c:425
+msgid "Wo ist denn der Saurierkopf?"
+msgstr "Where's the dinosaur skull?"
+
+#: ../../ms2/ms2_mus.c:426
+msgid "Dazu hatte ich keine Zeit mehr."
+msgstr "I didn't have enough time for that."
+
+#: ../../ms2/ms2_mus.c:427
+msgid "Was? Du spinnst wohl!|Dann kriegst du auch deinen|Anteil nicht. Raus!"
+msgstr "What? You're nuts!|Then you won't get your|share. Beat it!"
+
+#: ../../ms2/ms2_mus.c:703
+msgid "Der Sauger ist schon dort."
+msgstr "The suction cup is already there."
+
+#: ../../ms2/ms2_mus.c:707
+msgid "Du heftest den Sauger an die Wand|und h„lst dich daran fest."
+msgstr "You attach the suction cup to the wall|and hold on to it."
+
+#: ../../ms2/ms2_mus.c:718
+msgid "Du stellst dich auf den|Boden nimmst den Sauger|wieder von der Wand"
+msgstr "You stand on the floor|then remove the suction cup from the wall"
+
+#: ../../ms2/ms2_mus.c:722
+msgid "Die Alarmanlage ist|schon ausgeschaltet."
+msgstr "The alarm system is|already switched off."
+
+#: ../../ms2/ms2_mus.c:725
+msgid "Um die Anlage abzuschalten,|brauchst du einige Zeit."
+msgstr "To turn off the system,|you need some time."
+
+#: ../../ms2/ms2_mus.c:729
+msgid "Die Alarmanlage ist jetzt ausgeschaltet."
+msgstr "The alarm system is now switched off."
+
+#: ../../ms2/ms2_mus.c:746 ../../ms2/ms2_mus.c:875
+msgid "Saurier"
+msgstr "Dinosaur"
+
+#: ../../ms2/ms2_mus.c:746
+msgid "Du hast jetzt besseres zu tun,|als das Ding anzuschauen."
+msgstr "You have better things to do now|than look at that thing."
+
+#: ../../ms2/ms2_mus.c:747 ../../ms2/ms2_pyra.c:1010 ../../ms2/ms2_r1.c:805
+#: ../../ms2/ms2_r1.c:816 ../../ms2/ms2_r2.c:1203 ../../ms2/ms2_r2.c:1214
+msgid "Eingang"
+msgstr "Entrance"
+
+#: ../../ms2/ms2_mus.c:748 ../../ms2/ms2_mus.c:756 ../../ms2/ms2_mus.c:757
+#: ../../ms2/ms2_mus.c:765 ../../ms2/ms2_mus.c:766 ../../ms2/ms2_mus.c:774
+#: ../../ms2/ms2_mus.c:775 ../../ms2/ms2_mus.c:783 ../../ms2/ms2_mus.c:784
+#: ../../ms2/ms2_mus.c:792 ../../ms2/ms2_mus.c:801 ../../ms2/ms2_mus.c:802
+#: ../../ms2/ms2_mus.c:804 ../../ms2/ms2_mus.c:812 ../../ms2/ms2_mus.c:814
+#: ../../ms2/ms2_mus.c:815 ../../ms2/ms2_mus.c:823 ../../ms2/ms2_mus.c:824
+#: ../../ms2/ms2_mus.c:832 ../../ms2/ms2_mus.c:833 ../../ms2/ms2_mus.c:842
+#: ../../ms2/ms2_mus.c:844 ../../ms2/ms2_mus.c:845 ../../ms2/ms2_mus.c:854
+#: ../../ms2/ms2_mus.c:855 ../../ms2/ms2_mus.c:864 ../../ms2/ms2_mus.c:865
+#: ../../ms2/ms2_mus.c:866 ../../ms2/ms2_mus.c:872 ../../ms2/ms2_mus.c:894
+#: ../../ms2/ms2_mus.c:895 ../../ms2/ms2_mus.c:903 ../../ms2/ms2_mus.c:911
+#: ../../ms2/ms2_mus.c:912 ../../ms2/ms2_mus.c:920 ../../ms2/ms2_mus.c:921
+#: ../../ms2/ms2_mus.c:929 ../../ms2/ms2_mus.c:930 ../../ms2/ms2_mus.c:931
+#: ../../ms2/ms2_mus.c:932 ../../ms2/ms2_mus.c:940 ../../ms2/ms2_mus.c:941
+#: ../../ms2/ms2_mus.c:949 ../../ms2/ms2_mus.c:957 ../../ms2/ms2_mus.c:965
+#: ../../ms2/ms2_mus.c:966 ../../ms2/ms2_mus.c:974 ../../ms2/ms2_pyra.c:1070
+#: ../../ms2/ms2_pyra.c:1079 ../../ms2/ms2_pyra.c:1103
+#: ../../ms2/ms2_pyra.c:1111 ../../ms2/ms2_pyra.c:1135
+#: ../../ms2/ms2_pyra.c:1309 ../../ms2/ms2_r2.c:1225 ../../ms2/ms2_r2.c:1226
+#: ../../ms2/ms2_r2.c:1235 ../../ms2/ms2_r2.c:1236 ../../ms2/ms2_r2.c:1247
+msgid "Tr"
+msgstr "Door"
+
+#: ../../ms2/ms2_mus.c:749
+msgid "Strasse zum Stadtzentrum"
+msgstr "Road to the city center"
+
+#: ../../ms2/ms2_mus.c:793
+msgid "Kamera"
+msgstr "Security camera"
+
+#: ../../ms2/ms2_mus.c:793
+msgid "Hoffentlich bemerkt dich niemand."
+msgstr "Hopefully nobody will notice you."
+
+#: ../../ms2/ms2_mus.c:856
+msgid "Haupteingang"
+msgstr "Main entrance"
+
+#: ../../ms2/ms2_mus.c:873 ../../ms2/ms2_mus.c:874 ../../ms2/ms2_mus.c:885
+#: ../../ms2/ms2_mus.c:893 ../../ms2/ms2_pyra.c:1046 ../../ms2/ms2_pyra.c:1054
+#: ../../ms2/ms2_pyra.c:1062 ../../ms2/ms2_pyra.c:1087
+#: ../../ms2/ms2_pyra.c:1095 ../../ms2/ms2_pyra.c:1222
+#: ../../ms2/ms2_pyra.c:1230 ../../ms2/ms2_pyra.c:1238
+#: ../../ms2/ms2_pyra.c:1246
+msgid "Gang"
+msgstr "Corridor"
+
+#: ../../ms2/ms2_mus.c:875
+msgid "Ziemlich groá."
+msgstr "Quite large."
+
+#: ../../ms2/ms2_mus.c:876 ../../ms2/ms2_r1.c:787
+msgid "Saurierkopf"
+msgstr "Dinosaur head"
+
+#: ../../ms2/ms2_mus.c:876
+msgid "Dies ist der Kopf,|den du suchst."
+msgstr "This is the head|you're looking for."
+
+#: ../../ms2/ms2_mus.c:975
+msgid "Alarmanlage"
+msgstr "Alarm system"
+
+#: ../../ms2/ms2_mus.c:976 ../../ms2/ms2_r1.c:783
+msgid "Sauger"
+msgstr "Suction cup"
+
+#: ../../ms2/ms2_mus.c:977
+msgid "Wand"
+msgstr "Wall"
+
+#: ../../ms2/ms2_pyra.c:26 ../../ms2/ms2_pyra.c:1255 ../../ms2/ms2_pyra.c:1256
+#: ../../ms2/ms2_pyra.c:1274 ../../ms2/ms2_pyra.c:1284
+msgid "Loch"
+msgstr "Opening"
+
+#: ../../ms2/ms2_pyra.c:27
+msgid "Buchstabe"
+msgstr "Letter"
+
+#: ../../ms2/ms2_pyra.c:28
+msgid "Sie ist sehr massiv."
+msgstr "It is very massive."
+
+#: ../../ms2/ms2_pyra.c:29
+msgid "Hmm, X und Y, irgendwo|habe ich die Buchstaben|schon gesehen."
+msgstr "Hmm, X and Y|I have seen these letters|somewhere before."
+
+#: ../../ms2/ms2_pyra.c:34
+msgid "Deine Zeit ist um, Fremder!"
+msgstr "Your Time is up, Stranger!"
+
+#: ../../ms2/ms2_pyra.c:76
+msgid "Du hast das Seil|doch schon festgebunden."
+msgstr "You already tied the rope."
+
+#: ../../ms2/ms2_pyra.c:80
+msgid "Das wrde wenig bringen."
+msgstr "That would have little effect."
+
+#: ../../ms2/ms2_pyra.c:126
+msgid "Sonnenstich, oder was?"
+msgstr "Sunstroke, or what?"
+
+#: ../../ms2/ms2_pyra.c:385
+msgid "Du merkst, daá der Boden|unter dir nachgibt, und|springst zur Seite."
+msgstr "You notice that the ground|is giving way under you,|and you leap aside."
+
+#: ../../ms2/ms2_pyra.c:537
+msgid "Puzzleteil"
+msgstr "Puzzle piece"
+
+#: ../../ms2/ms2_pyra.c:570
+msgid "Neben diesem Stein|ist kein freies Feld."
+msgstr "There's no free square|next to this stone."
+
+#: ../../ms2/ms2_pyra.c:683
+msgid "Du spielst gerade ein|Adventure, kein Rollenspiel!"
+msgstr "You are currently playing an|Adventure, not a Role-Playing Game!"
+
+#: ../../ms2/ms2_pyra.c:699 ../../ms2/ms2_pyra.c:800
+msgid "Du kannst das Seil|nirgends befestigen."
+msgstr "There's nowhere|to attach the rope."
+
+#: ../../ms2/ms2_pyra.c:705 ../../ms2/ms2_pyra.c:784
+msgid "Es paát nicht|zwischen die Steine."
+msgstr "It does not fit|between the stones."
+
+#: ../../ms2/ms2_pyra.c:710 ../../ms2/ms2_pyra.c:741 ../../ms2/ms2_pyra.c:840
+msgid "Das ist doch|oben festgebunden!"
+msgstr "That is already|tied up above!"
+
+#: ../../ms2/ms2_pyra.c:715
+msgid "Hey, das ist|mindestens 10 Meter tief!"
+msgstr "Hey, that is|at least 10 meters deep!"
+
+#: ../../ms2/ms2_pyra.c:731
+msgid "In dem Schlitz|ist nichts mehr."
+msgstr "There is nothing|left in the slot."
+
+#: ../../ms2/ms2_pyra.c:765
+msgid "Das ist mindestens 5 Meter tief!"
+msgstr "That is at least 5 meters deep!"
+
+#: ../../ms2/ms2_pyra.c:900
+msgid ""
+"Du versuchst, den Sarg zu|”ffnen, aber der Deckel bewegt|sich keinen "
+"Millimeter."
+msgstr "You try to open the coffin,|but the lid does not|move a millimeter."
+
+#: ../../ms2/ms2_pyra.c:913 ../../ms2/ms2_pyra.c:923
+msgid "Du hast die Kugel schon gedrckt."
+msgstr "You have already|pushed the ball."
+
+#: ../../ms2/ms2_pyra.c:944
+msgid "Die Kugel bewegt sich ein Stck."
+msgstr "The ball moves a bit."
+
+#: ../../ms2/ms2_pyra.c:965
+msgid "Herzlichen Glckwunsch!"
+msgstr "Congratulations!"
+
+#: ../../ms2/ms2_pyra.c:966
+msgid "Sie haben das Spiel gel”st|und gewinnen 400 Xa!"
+msgstr "You solved the game|and won 400 Xa!"
+
+#: ../../ms2/ms2_pyra.c:967
+msgid "Vielen Dank fr die Benutzung eines|VIRTUAL-REALITY-SYSTEMS-Produkts!"
+msgstr "Thank you for using a|VIRTUAL-REALITY-SYSTEMS product!"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "N"
+msgstr "N"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "O"
+msgstr "E"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "S"
+msgstr "S"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "W"
+msgstr "W"
+
+#: ../../ms2/ms2_pyra.c:1008 ../../ms2/ms2_pyra.c:1200
+#: ../../ms2/ms2_pyra.c:1254 ../../ms2/ms2_pyra.c:1262
+#: ../../ms2/ms2_pyra.c:1273 ../../ms2/ms2_pyra.c:1283
+msgid "Seil"
+msgstr "Rope"
+
+#: ../../ms2/ms2_pyra.c:1009 ../../ms2/ms2_pyra.c:1043 ../../ms2/ms2_r1.c:850
+#: ../../ms2/ms2_r2.c:1223 ../../ms2/ms2_r2.c:1224 ../../ms2/ms2_r2.c:1233
+#: ../../ms2/ms2_r2.c:1234
+msgid "Schild"
+msgstr "Sign"
+
+#: ../../ms2/ms2_pyra.c:1009
+msgid ""
+"Darauf steht:|\"Willst du finden das|richtige Loch, so wage|dich in die "
+"Pyramide!\"."
+msgstr ""
+"It reads:|\"Want to find|the right hole? Then dare|to enter the pyramid!\"."
+
+#: ../../ms2/ms2_pyra.c:1010
+msgid "Es ist eine kleine ™ffnung."
+msgstr "It is a small opening."
+
+#: ../../ms2/ms2_pyra.c:1011
+msgid "Pyramide"
+msgstr "Pyramid"
+
+#: ../../ms2/ms2_pyra.c:1011
+msgid ""
+"Komisch! Was soll eine Pyramide|bei den Axacussanern? Deine|eigenen Gedanken "
+"scheinen|den Spielverlauf zu beeinflussen."
+msgstr ""
+"Weird! What is a pyramid doing|at the Axacussians? Your own thoughts seem to "
+"influence|the course of the game."
+
+#: ../../ms2/ms2_pyra.c:1012
+msgid "Sonne"
+msgstr "Sun"
+
+#: ../../ms2/ms2_pyra.c:1012
+msgid "Sch”n!"
+msgstr "Nice!"
+
+#: ../../ms2/ms2_pyra.c:1043
+msgid ""
+"\"Hallo Fremder, wenn du diesen|Raum betreten hast, bleibt|dir nur noch eine "
+"Stunde Zeit,|um deine Aufgabe zu erfllen!\""
+msgstr ""
+"\"Hello, Stranger, when you enter|this room, you have only an hour|to "
+"accomplish your task!\""
+
+#: ../../ms2/ms2_pyra.c:1044 ../../ms2/ms2_pyra.c:1052
+#: ../../ms2/ms2_pyra.c:1060 ../../ms2/ms2_pyra.c:1068
+#: ../../ms2/ms2_pyra.c:1077 ../../ms2/ms2_pyra.c:1085
+#: ../../ms2/ms2_pyra.c:1093 ../../ms2/ms2_pyra.c:1101
+#: ../../ms2/ms2_pyra.c:1109 ../../ms2/ms2_pyra.c:1133
+#: ../../ms2/ms2_pyra.c:1141 ../../ms2/ms2_pyra.c:1149
+#: ../../ms2/ms2_pyra.c:1157 ../../ms2/ms2_pyra.c:1165
+#: ../../ms2/ms2_pyra.c:1173 ../../ms2/ms2_pyra.c:1181
+#: ../../ms2/ms2_pyra.c:1190 ../../ms2/ms2_pyra.c:1198
+#: ../../ms2/ms2_pyra.c:1209 ../../ms2/ms2_pyra.c:1220
+#: ../../ms2/ms2_pyra.c:1228 ../../ms2/ms2_pyra.c:1236
+#: ../../ms2/ms2_pyra.c:1244 ../../ms2/ms2_pyra.c:1252
+#: ../../ms2/ms2_pyra.c:1270 ../../ms2/ms2_pyra.c:1281
+#: ../../ms2/ms2_pyra.c:1291
+msgid "rechte Seite"
+msgstr "right side"
+
+#: ../../ms2/ms2_pyra.c:1045 ../../ms2/ms2_pyra.c:1053
+#: ../../ms2/ms2_pyra.c:1061 ../../ms2/ms2_pyra.c:1069
+#: ../../ms2/ms2_pyra.c:1078 ../../ms2/ms2_pyra.c:1086
+#: ../../ms2/ms2_pyra.c:1094 ../../ms2/ms2_pyra.c:1102
+#: ../../ms2/ms2_pyra.c:1110 ../../ms2/ms2_pyra.c:1134
+#: ../../ms2/ms2_pyra.c:1142 ../../ms2/ms2_pyra.c:1150
+#: ../../ms2/ms2_pyra.c:1158 ../../ms2/ms2_pyra.c:1166
+#: ../../ms2/ms2_pyra.c:1174 ../../ms2/ms2_pyra.c:1182
+#: ../../ms2/ms2_pyra.c:1191 ../../ms2/ms2_pyra.c:1199
+#: ../../ms2/ms2_pyra.c:1210 ../../ms2/ms2_pyra.c:1221
+#: ../../ms2/ms2_pyra.c:1229 ../../ms2/ms2_pyra.c:1237
+#: ../../ms2/ms2_pyra.c:1245 ../../ms2/ms2_pyra.c:1253
+#: ../../ms2/ms2_pyra.c:1271 ../../ms2/ms2_pyra.c:1282
+#: ../../ms2/ms2_pyra.c:1292
+msgid "linke Seite"
+msgstr "left side"
+
+#: ../../ms2/ms2_pyra.c:1071
+msgid "Knopf"
+msgstr "Button"
+
+#: ../../ms2/ms2_pyra.c:1143 ../../ms2/ms2_pyra.c:1151
+#: ../../ms2/ms2_pyra.c:1159 ../../ms2/ms2_pyra.c:1167
+msgid "Schrift"
+msgstr "Inscription"
+
+#: ../../ms2/ms2_pyra.c:1175 ../../ms2/ms2_pyra.c:1184
+msgid "Tomate"
+msgstr "Tomato"
+
+#: ../../ms2/ms2_pyra.c:1175 ../../ms2/ms2_pyra.c:1184
+msgid "Komisch!"
+msgstr "Funny!"
+
+#: ../../ms2/ms2_pyra.c:1183 ../../ms2/ms2_pyra.c:1272
+msgid "Messer"
+msgstr "Knife"
+
+#: ../../ms2/ms2_pyra.c:1183
+msgid "Es ist ein relativ stabiles Messer."
+msgstr "It is a relatively sturdy knife."
+
+#: ../../ms2/ms2_pyra.c:1192 ../../ms2/ms2_pyra.c:1203
+#: ../../ms2/ms2_pyra.c:1214
+msgid "Monster"
+msgstr "Monster"
+
+#: ../../ms2/ms2_pyra.c:1200
+msgid "Es ist dick und|ungef„hr 15 Meter lang."
+msgstr "It is thick and|about 15 meters long."
+
+#: ../../ms2/ms2_pyra.c:1201 ../../ms2/ms2_pyra.c:1212
+msgid "Augen"
+msgstr "Eyes"
+
+#: ../../ms2/ms2_pyra.c:1202 ../../ms2/ms2_pyra.c:1213
+#: ../../ms2/ms2_pyra.c:1336
+msgid "Mund"
+msgstr "Mouth"
+
+#: ../../ms2/ms2_pyra.c:1203 ../../ms2/ms2_pyra.c:1214
+msgid "Es ist nur eine Statue."
+msgstr "It's just a statue."
+
+#: ../../ms2/ms2_pyra.c:1211 ../../ms2/ms2_pyra.c:1263
+msgid "Zettel"
+msgstr "Note"
+
+#: ../../ms2/ms2_pyra.c:1211
+msgid "Darauf steht:|\"Wenn du fast am Ziel|bist, tu folgendes:|Sauf!\""
+msgstr "It reads:|\"When you're almost there,|do the following:|Drink!\""
+
+#: ../../ms2/ms2_pyra.c:1255
+msgid "Es ist ca. 10 Meter tief."
+msgstr "It is about 10 meters deep."
+
+#: ../../ms2/ms2_pyra.c:1256
+msgid "Oben siehst du helles Licht."
+msgstr "Above you is a bright light."
+
+#: ../../ms2/ms2_pyra.c:1263
+msgid ""
+"Darauf steht:|\"Ruhe eine Minute im Raum|zwischen den Monstern,|und du wirst "
+"belohnt!\""
+msgstr ""
+"It reads:|\"Rest a minute in the room|between the monsters,|and you'll be "
+"rewarded!\""
+
+#: ../../ms2/ms2_pyra.c:1264 ../../ms2/ms2_r1.c:844 ../../ms2/ms2_r1.c:845
+#: ../../ms2/ms2_r2.c:1243
+msgid "Schlitz"
+msgstr "Slot"
+
+#: ../../ms2/ms2_pyra.c:1264
+msgid "Du kommst mit den|H„nden nicht rein."
+msgstr "You cannot get in|with your hands."
+
+#: ../../ms2/ms2_pyra.c:1274
+msgid "Es ist ca. 5 Meter tief."
+msgstr "It is about 5 meters deep."
+
+#: ../../ms2/ms2_pyra.c:1275
+msgid "Steine"
+msgstr "Stones"
+
+#: ../../ms2/ms2_pyra.c:1285
+msgid "Platte"
+msgstr "Plate"
+
+#: ../../ms2/ms2_pyra.c:1315 ../../ms2/ms2_pyra.c:1323
+msgid "Sarg"
+msgstr "Coffin"
+
+#: ../../ms2/ms2_pyra.c:1316 ../../ms2/ms2_pyra.c:1322
+#: ../../ms2/ms2_pyra.c:1333 ../../ms2/ms2_r1.c:833 ../../ms2/ms2_r1.c:840
+#: ../../ms2/ms2_r1.c:857 ../../ms2/ms2_r2.c:1215 ../../ms2/ms2_r2.c:1248
+msgid "Ausgang"
+msgstr "Exit"
+
+#: ../../ms2/ms2_pyra.c:1323
+msgid "Unheimlich!"
+msgstr "Creepy!"
+
+#: ../../ms2/ms2_pyra.c:1324 ../../ms2/ms2_r1.c:865
+msgid "Zahnbrste"
+msgstr "Toothbrush"
+
+#: ../../ms2/ms2_pyra.c:1324 ../../ms2/ms2_pyra.c:1325
+msgid "Die Sache mit der|Artus GmbH scheint dir zu|Kopf gestiegen zu sein."
+msgstr "The thing with the|Artus GmbH seems to have|gotten to your head."
+
+#: ../../ms2/ms2_pyra.c:1325
+msgid "Zahnpastatube"
+msgstr "Toothpaste"
+
+#: ../../ms2/ms2_pyra.c:1326 ../../ms2/ms2_pyra.c:1327
+msgid "Kugel"
+msgstr "Ball"
+
+#: ../../ms2/ms2_pyra.c:1326 ../../ms2/ms2_pyra.c:1327
+msgid "Hmm, die Kugel sieht lose aus."
+msgstr "Hmm, the ball looks loose."
+
+#: ../../ms2/ms2_pyra.c:1334 ../../ms2/ms2_pyra.c:1335
+msgid "Auge"
+msgstr "Eye"
+
+#: ../../ms2/ms2_pyra.c:1334 ../../ms2/ms2_pyra.c:1335
+msgid "Irgendwas stimmt damit nicht."
+msgstr "Something is wrong with that."
+
+#: ../../ms2/ms2_r1.c:11
+msgid "Es ist nichts Besonderes daran."
+msgstr "There's nothing special about it."
+
+#: ../../ms2/ms2_r1.c:12
+msgid "Sieht nach Metall aus."
+msgstr "It looks like metal."
+
+#: ../../ms2/ms2_r1.c:83
+msgid "Ein Taxi kommt angerauscht,|du steigst ein."
+msgstr "A taxi arrives, and you get in."
+
+#: ../../ms2/ms2_r1.c:90
+msgid "Du drckst auf den Knopf, aber nichts passiert"
+msgstr "You press the button, but nothing happens"
+
+#: ../../ms2/ms2_r1.c:94
+msgid "Es ist leer."
+msgstr "It is empty."
+
+#: ../../ms2/ms2_r1.c:97
+msgid "Du findest ein kleines Ger„t,|einen Ausweis und einen Xa."
+msgstr "You find a small device,|an ID card and a Xa."
+
+#: ../../ms2/ms2_r1.c:109
+msgid "Du heftest den|Magnet an die Stange."
+msgstr "You attach the|magnet to the pole."
+
+#: ../../ms2/ms2_r1.c:110
+msgid "Stange mit Magnet"
+msgstr "Pole with magnet"
+
+#: ../../ms2/ms2_r1.c:111
+msgid "Raffiniert!"
+msgstr "Cunning!"
+
+#: ../../ms2/ms2_r1.c:118
+msgid "Du muát das|Ger„t erst kaufen."
+msgstr "You must buy|this device first."
+
+#: ../../ms2/ms2_r1.c:127
+msgid "Du legst den Chip|in das Ger„t ein."
+msgstr "You insert the chip|into the device."
+
+#: ../../ms2/ms2_r1.c:137
+msgid "Du berspielst die CD|auf den Musikchip."
+msgstr "You transfer the CD|to the Music chip."
+
+#: ../../ms2/ms2_r1.c:141
+msgid ""
+"Ohne einen eingelegten|Musikchip kannst du auf dem|Ger„t nichts aufnehmen."
+msgstr "Without an inserted|music chip, you can not|record on the device."
+
+#: ../../ms2/ms2_r1.c:152
+msgid "Du nimmst den Chip|aus dem Ger„t."
+msgstr "You remove the chip|from the device."
+
+#: ../../ms2/ms2_r1.c:157
+msgid "Es ist kein Chip eingelegt."
+msgstr "There is no chip inserted."
+
+#: ../../ms2/ms2_r1.c:162
+msgid "Wozu? Du hast sowieso nur die eine CD."
+msgstr "What for? You only have one CD anyway."
+
+#: ../../ms2/ms2_r1.c:166
+msgid "Die \"Mad Monkeys\"-CD. Du hast|sie schon tausendmal geh”rt."
+msgstr "The \"Mad Monkeys\" CD.|You've heard them a thousand times."
+
+#: ../../ms2/ms2_r1.c:183
+msgid "Du h”rst nichts.|Der Chip ist unbespielt."
+msgstr "All you hear is silence.|The chip is empty."
+
+#: ../../ms2/ms2_r1.c:185
+msgid "Du h”rst dir den Anfang|der berspielten CD an."
+msgstr "You are listening to the beginning|of the copied CD."
+
+#: ../../ms2/ms2_r1.c:187
+msgid "Es ist kein Chip einglegt."
+msgstr "There is no chip inserted."
+
+#: ../../ms2/ms2_r1.c:193
+msgid "Du trinkst etwas von den Zeug, danach|fhlst du dich leicht beschwipst."
+msgstr "You drink some of the stuff,|then begin to feel slightly tipsy."
+
+#: ../../ms2/ms2_r1.c:224
+#, c-format
+msgid "%d Xa"
+msgstr "%d Xa"
+
+#: ../../ms2/ms2_r1.c:242
+msgid ""
+"Als du ebenfalls aussteigst haben|die anderen Passagiere das|Fluggel„nde "
+"bereits verlassen."
+msgstr ""
+"When you get off the plane|the other passengers|have already left the "
+"airport."
+
+#: ../../ms2/ms2_r1.c:285 ../../ms2/ms2_r1.c:809
+msgid "Flughafen"
+msgstr "Airport"
+
+#: ../../ms2/ms2_r1.c:286
+msgid "Stadtzentrum"
+msgstr "Downtown"
+
+#: ../../ms2/ms2_r1.c:287 ../../ms2/ms2_r2.c:1204
+msgid "Kulturpalast"
+msgstr "Palace of Culture"
+
+#: ../../ms2/ms2_r1.c:288
+msgid "Erde"
+msgstr "Earth"
+
+#: ../../ms2/ms2_r1.c:289
+msgid "Privatwohnung"
+msgstr "Private apartment"
+
+#: ../../ms2/ms2_r1.c:290 ../../ms2/ms2_r1.c:295
+msgid "(Taxi verlassen)"
+msgstr "(Leave the taxi)"
+
+#: ../../ms2/ms2_r1.c:294
+msgid "(Bezahlen)"
+msgstr "(Pay)"
+
+#: ../../ms2/ms2_r1.c:337
+msgid "Adresse:|                              "
+msgstr "Address:|                              "
+
+#: ../../ms2/ms2_r1.c:356
+msgid ""
+"Fuddeln gilt nicht!|Zu diesem Zeitpunkt kannst du diese|Adresse noch gar "
+"nicht kennen!"
+msgstr ""
+"Fiddling with the system doesn't work!|At this time you can not|even know "
+"this address!"
+
+#: ../../ms2/ms2_r1.c:378
+msgid "Du hast nicht|mehr genug Geld."
+msgstr "You do not|have enough money left."
+
+#: ../../ms2/ms2_r1.c:389
+msgid "Du merkst, daá das Taxi stark beschleunigt."
+msgstr "You notice the taxi is accelerating rapidly."
+
+#: ../../ms2/ms2_r1.c:398
+msgid "Fnf Minuten sp„ter ..."
+msgstr "Five minutes later ..."
+
+#: ../../ms2/ms2_r1.c:433
+msgid "Du hast doch schon eine Stange"
+msgstr "You already have a pole"
+
+#: ../../ms2/ms2_r1.c:436
+msgid "Du s„gst eine der Stangen ab."
+msgstr "You saw off one of the poles."
+
+#: ../../ms2/ms2_r1.c:444
+msgid "Du betrittst das einzige|offene Gesch„ft, das|du finden kannst."
+msgstr "You enter the only|open shop that|you can find."
+
+#: ../../ms2/ms2_r1.c:507
+msgid "Die Kabine ist besetzt."
+msgstr "The cabin is occupied."
+
+#: ../../ms2/ms2_r1.c:524
+msgid "He, nimm erstmal das Geld|aus dem Rckgabeschlitz!"
+msgstr "Hey, take the money|from the return slot!"
+
+#: ../../ms2/ms2_r1.c:526
+msgid "Du hast doch schon bezahlt."
+msgstr "You have already paid."
+
+#: ../../ms2/ms2_r1.c:528
+msgid "Du hast nicht mehr genug Geld."
+msgstr "You do not have enough money left."
+
+#: ../../ms2/ms2_r1.c:531
+msgid "Du wirfst 10 Xa in den Schlitz."
+msgstr "You put 10 Xa in the slot."
+
+#: ../../ms2/ms2_r1.c:566
+msgid "Dir wird schwarz vor Augen."
+msgstr "You are about to pass out."
+
+#: ../../ms2/ms2_r1.c:582
+msgid "Du ruhst dich eine Weile aus."
+msgstr "You rest for a while."
+
+#: ../../ms2/ms2_r1.c:598
+msgid ""
+"An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|"
+"0=0, 1=9, 2=8 ...\""
+msgstr ""
+"On the Wall is:|\"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
+"\""
+
+#: ../../ms2/ms2_r1.c:657
+msgid "Ok, ich nehme es."
+msgstr "OK, I'll take it."
+
+#: ../../ms2/ms2_r1.c:658
+msgid "Nein danke, das ist mir zu teuer."
+msgstr "No thanks, that's too expensive for me."
+
+#: ../../ms2/ms2_r1.c:662
+msgid "Ich wrde gern etwas kaufen."
+msgstr "I would like to buy something."
+
+#: ../../ms2/ms2_r1.c:663
+msgid "Ich bin's, Horst Hummel."
+msgstr "It's me, Horst Hummel."
+
+#: ../../ms2/ms2_r1.c:664
+msgid "Haben Sie auch einen Musikchip fr das Ger„t?"
+msgstr "Do you have a music chip for the device?"
+
+#: ../../ms2/ms2_r1.c:668
+msgid "Eine tolle Maske, nicht wahr?"
+msgstr "It's a great mask, right?"
+
+#: ../../ms2/ms2_r1.c:668
+msgid "Komisch, daá sie schon drei Jahre da steht."
+msgstr "Strange that it has been there for three years."
+
+#: ../../ms2/ms2_r1.c:669
+msgid "Ein starker Trunk. Zieht ganz sch”n rein."
+msgstr "A strong drink. It hits you pretty hard."
+
+#: ../../ms2/ms2_r1.c:670
+msgid "Ein Abspiel- und Aufnahmeger„t fr die neuen Musikchips."
+msgstr "A playback and recording device for the new music chips."
+
+#: ../../ms2/ms2_r1.c:671
+msgid "Eine ARTUS-Zahnbrste. Der letzte Schrei."
+msgstr "An ARTUS toothbrush. The latest craze."
+
+#: ../../ms2/ms2_r1.c:671
+msgid "Verkaufe ich massenhaft, die Dinger."
+msgstr "I sell these things in bulk."
+
+#: ../../ms2/ms2_r1.c:672
+msgid "Das sind echte Rarit„ten. Bcher in gebundener Form."
+msgstr "These are real rarities. Books in bound form."
+
+#: ../../ms2/ms2_r1.c:673
+msgid "Die Encyclopedia Axacussana."
+msgstr "The Encyclopedia Axacussana."
+
+#: ../../ms2/ms2_r1.c:673
+msgid "Das gr”áte erh„ltliche Lexikon auf 30 Speicherchips."
+msgstr "The largest available dictionary on 30 memory chips."
+
+#: ../../ms2/ms2_r1.c:673
+msgid "šber 400 Trilliarden Stichw”rter."
+msgstr "Over 400 sextillion keywords."
+
+#: ../../ms2/ms2_r1.c:674
+msgid "Die ist nicht zu verkaufen."
+msgstr "It is not for sale."
+
+#: ../../ms2/ms2_r1.c:675
+msgid "So eine habe ich meinem Enkel zum Geburtstag geschenkt."
+msgstr "I gave one to my grandson for his birthday."
+
+#: ../../ms2/ms2_r1.c:675
+msgid "Er war begeistert von dem Ding."
+msgstr "He was excited about this thing."
+
+#: ../../ms2/ms2_r1.c:676
+msgid "Der stammt aus einem bekannten Computerspiel."
+msgstr "It comes from a well-known computer game."
+
+#: ../../ms2/ms2_r1.c:677
+msgid "Robust, handlich und stromsparend."
+msgstr "Sturdy, handy and energy-saving."
+
+#: ../../ms2/ms2_r1.c:678 ../../ms2/ms2_r1.c:679 ../../ms2/ms2_r1.c:680
+#: ../../ms2/ms2_r1.c:681
+msgid "Irgendein lasches Ges”ff."
+msgstr "Some cheap swill."
+
+#: ../../ms2/ms2_r1.c:682
+msgid "Das sind Protestaufkleber gegen die hohen Taxigebhren."
+msgstr "These are stickers protesting the high taxi fees."
+
+#: ../../ms2/ms2_r1.c:683
+msgid "Das ist Geschirr aus der neuen Umbina-Kollektion."
+msgstr "These are dishes from the new Umbina-Collection."
+
+#: ../../ms2/ms2_r1.c:683
+msgid "H„álich, nicht wahr?"
+msgstr "Ugly, right?"
+
+#: ../../ms2/ms2_r1.c:683
+msgid "Aber verkaufen tut sich das Zeug gut."
+msgstr "But this stuff sells well."
+
+#: ../../ms2/ms2_r1.c:699
+#, c-format
+msgid "Das kostet %d Xa."
+msgstr "That costs %d Xa."
+
+#: ../../ms2/ms2_r1.c:726
+msgid "Schauen Sie sich ruhig um!"
+msgstr "Take a look around!"
+
+#: ../../ms2/ms2_r1.c:728
+msgid "Unsinn!"
+msgstr "Nonsense!"
+
+#: ../../ms2/ms2_r1.c:730
+msgid "Tut mir leid, die sind|schon alle ausverkauft."
+msgstr "I'm very sorry,|they are already sold out."
+
+#: ../../ms2/ms2_r1.c:743
+msgid "Guten Abend."
+msgstr "Good evening."
+
+#: ../../ms2/ms2_r1.c:744
+msgid "Hallo."
+msgstr "Hello."
+
+#: ../../ms2/ms2_r1.c:754
+msgid "Huch, Sie haben mich aber erschreckt!"
+msgstr "Yikes, you scared me!"
+
+#: ../../ms2/ms2_r1.c:755
+msgid "Wieso?"
+msgstr "How so?"
+
+#: ../../ms2/ms2_r1.c:756
+msgid "Ihre Verkleidung ist wirklich t„uschend echt."
+msgstr "Your disguise is deceptively real-looking."
+
+#: ../../ms2/ms2_r1.c:757
+msgid "Welche Verkleidung?"
+msgstr "What disguise?"
+
+#: ../../ms2/ms2_r1.c:758
+msgid "Na, tun Sie nicht so!"
+msgstr "Stop pretending you don't know!"
+
+#: ../../ms2/ms2_r1.c:759
+msgid ""
+"Sie haben sich verkleidet wie der Auáerirdische,|dieser Horst Hummel, oder "
+"wie er heiát."
+msgstr ""
+"You disguised yourself as that extraterrestrial guy,|Horst Hummel, or "
+"whatever his name is."
+
+#: ../../ms2/ms2_r1.c:760 ../../ms2/ms2_r2.c:419
+msgid "Ich BIN Horst Hummel!"
+msgstr "I AM Horst Hummel!"
+
+#: ../../ms2/ms2_r1.c:761
+msgid "Geben Sie's auf!"
+msgstr "Give it up!"
+
+#: ../../ms2/ms2_r1.c:762
+msgid "An Ihrer Gestik merkt man, daá Sie|ein verkleideter Axacussaner sind."
+msgstr "You can tell from your gestures that you are|a disguised Axacussan."
+
+#: ../../ms2/ms2_r1.c:763
+msgid "Der echte Hummel bewegt sich|anders, irgendwie ruckartig."
+msgstr "The real Hummel moves|differently, kind of jerky."
+
+#: ../../ms2/ms2_r1.c:764
+msgid "Weil er ein Roboter ist! ICH bin der Echte!"
+msgstr "Because he is a robot! I am the real one!"
+
+#: ../../ms2/ms2_r1.c:765 ../../ms2/ms2_r2.c:56
+msgid "Ach, Sie spinnen ja!"
+msgstr "Oh, you are crazy!"
+
+#: ../../ms2/ms2_r1.c:766
+msgid "Sie Trottel!!!"
+msgstr "You Idiot!!!"
+
+#: ../../ms2/ms2_r1.c:767
+msgid "Seien Sie still, oder ich werfe Sie raus!"
+msgstr "Shut up or I'll kick you out!"
+
+#: ../../ms2/ms2_r1.c:780
+msgid "Taschenmesser"
+msgstr "Pocket knife"
+
+#: ../../ms2/ms2_r1.c:780
+msgid "Hey, da ist sogar eine S„ge dran."
+msgstr "Hey, there's even a saw on it."
+
+#: ../../ms2/ms2_r1.c:781
+msgid "20 Xa"
+msgstr "20 Xa"
+
+#: ../../ms2/ms2_r1.c:782
+msgid "Discman"
+msgstr "Discman"
+
+#: ../../ms2/ms2_r1.c:782
+msgid "Da ist noch die \"Mad Monkeys\"-CD drin."
+msgstr "The \"Mad Monkeys\" CD is still in there."
+
+#: ../../ms2/ms2_r1.c:783
+msgid "Mit dem Ding sollst du dich|an der Wand festhalten."
+msgstr "You should hold onto the wall|using that thing."
+
+#: ../../ms2/ms2_r1.c:785
+msgid "Spezialkeycard"
+msgstr "Special keycard"
+
+#: ../../ms2/ms2_r1.c:785
+msgid "Damit sollst du die|Tren knacken k”nnen."
+msgstr "With that you should be able to crack the doors."
+
+#: ../../ms2/ms2_r1.c:786
+msgid "Alarmknacker"
+msgstr "Alarm cracker"
+
+#: ../../ms2/ms2_r1.c:786
+msgid "Ein kleines Ger„t, um|die Alarmanlage auszuschalten."
+msgstr "A small device|to turn off the alarm."
+
+#: ../../ms2/ms2_r1.c:788
+msgid "Karte"
+msgstr "Keycard"
+
+#: ../../ms2/ms2_r1.c:795
+msgid "Raumschiff"
+msgstr "Spaceship"
+
+#: ../../ms2/ms2_r1.c:795
+msgid "Damit bist du hierhergekommen."
+msgstr "You came here with it."
+
+#: ../../ms2/ms2_r1.c:796
+msgid "Fahrzeuge"
+msgstr "Vehicles"
+
+#: ../../ms2/ms2_r1.c:796
+msgid "Du kannst von hier aus nicht erkennen,|was das fr Fahrzeuge sind."
+msgstr "You cannot tell from here|what those vehicles are."
+
+#: ../../ms2/ms2_r1.c:803 ../../ms2/ms2_r1.c:804
+msgid "Fahrzeug"
+msgstr "Vehicle"
+
+#: ../../ms2/ms2_r1.c:803 ../../ms2/ms2_r1.c:804
+msgid "Es scheint ein Taxi zu sein."
+msgstr "It seems to be a taxi."
+
+#: ../../ms2/ms2_r1.c:805
+msgid "Komisch, er ist verschlossen."
+msgstr "Funny, it is closed."
+
+#: ../../ms2/ms2_r1.c:806
+msgid "Portemonnaie"
+msgstr "Wallet"
+
+#: ../../ms2/ms2_r1.c:806
+msgid "Das muá ein Axacussaner|hier verloren haben."
+msgstr "This must have been|lost by an Axacussan."
+
+#: ../../ms2/ms2_r1.c:807
+msgid "Ger„t"
+msgstr "Device"
+
+#: ../../ms2/ms2_r1.c:807
+msgid "Auf dem Ger„t steht: \"Taxi-Call\".|Es ist ein kleiner Knopf daran."
+msgstr "The device says \"Taxi Call.\"|There is a small button on it."
+
+#: ../../ms2/ms2_r1.c:808
+msgid "Ausweis"
+msgstr "ID card"
+
+#: ../../ms2/ms2_r1.c:808
+msgid "Auf dem Ausweis steht:|  Berta Tschell|  Axacuss City|  115AY2,96A,32"
+msgstr "On the card it reads: | Berta Tschell | Axacuss City | 115AY2,96A,32"
+
+#: ../../ms2/ms2_r1.c:817
+msgid "Treppe"
+msgstr "Staircase"
+
+#: ../../ms2/ms2_r1.c:817
+msgid "Sie fhrt zu den Gesch„ften."
+msgstr "It leads to the shops."
+
+#: ../../ms2/ms2_r1.c:818
+msgid "Gesch„ftsstraáe im Hintergrund"
+msgstr "Business street in the background"
+
+#: ../../ms2/ms2_r1.c:818
+msgid "Die Straáe scheint kein Ende zu haben."
+msgstr "The road seems to have no end."
+
+#: ../../ms2/ms2_r1.c:819 ../../ms2/ms2_r1.c:820
+msgid "Stange"
+msgstr "Rod"
+
+#: ../../ms2/ms2_r1.c:821
+msgid "Pfosten"
+msgstr "Post"
+
+#: ../../ms2/ms2_r1.c:822
+msgid "Gel„nder"
+msgstr "Railing"
+
+#: ../../ms2/ms2_r1.c:829
+msgid "Plakat"
+msgstr "Poster"
+
+#: ../../ms2/ms2_r1.c:829
+msgid ""
+"Musik Pur - Der Musikwettbewerb!|Heute im Kulturpalast|Hauptpreis:|"
+"Fernsehauftritt mit Horst Hummel|Sponsored by Artus GmbH"
+msgstr ""
+"Pure Music - The Music Competition!|Today at the Palace of Culture|Main "
+"Prize:|Television appearance with Horst Hummel|Sponsored by Artus GmbH"
+
+#: ../../ms2/ms2_r1.c:830 ../../ms2/ms2_r1.c:831
+msgid "Kabine"
+msgstr "Cabin"
+
+#: ../../ms2/ms2_r1.c:830
+msgid "Sie ist frei!"
+msgstr "It is free!"
+
+#: ../../ms2/ms2_r1.c:831
+msgid "Sie ist besetzt."
+msgstr "It is occupied."
+
+#: ../../ms2/ms2_r1.c:832
+msgid "Fáe"
+msgstr "Feet"
+
+#: ../../ms2/ms2_r1.c:832
+msgid "Komisch, die|Fáe scheinen|erstarrt zu sein."
+msgstr "Strange, the|feet seem to be frozen."
+
+#: ../../ms2/ms2_r1.c:841
+msgid "Haube"
+msgstr "Hood"
+
+#: ../../ms2/ms2_r1.c:841
+msgid "Sieht aus wie beim Fris”r."
+msgstr "Looks like the hairdresser."
+
+#: ../../ms2/ms2_r1.c:842
+msgid "400 Xa"
+msgstr "400 Xa"
+
+#: ../../ms2/ms2_r1.c:843
+msgid "10 Xa"
+msgstr "10 Xa"
+
+#: ../../ms2/ms2_r1.c:844
+msgid "Darber steht:|\"Geldeinwurf: 10 Xa\"."
+msgstr "It says:|\"Coins: 10 Xa\"."
+
+#: ../../ms2/ms2_r1.c:845
+msgid "Darber steht:|\"Gewinnausgabe / Geldrckgabe\"."
+msgstr "It says:|\"Prize / Money Return\"."
+
+#: ../../ms2/ms2_r1.c:846 ../../ms2/ms2_r2.c:1264
+msgid "Stuhl"
+msgstr "Chair"
+
+#: ../../ms2/ms2_r1.c:846
+msgid "Etwas Entspannung k”nntest du jetzt gebrauchen."
+msgstr "You could use some relaxation right about now."
+
+#: ../../ms2/ms2_r1.c:847 ../../ms2/ms2_r1.c:848
+msgid "Gekritzel"
+msgstr "Scribble"
+
+#: ../../ms2/ms2_r1.c:849 ../../ms2/ms2_r1.c:873
+msgid "Gesicht"
+msgstr "Face"
+
+#: ../../ms2/ms2_r1.c:849
+msgid "Nicht zu fassen! Die|W„nde sind genauso beschmutzt|wie auf der Erde."
+msgstr "Unbelievable! The walls|are just as dirty|as those on Earth."
+
+#: ../../ms2/ms2_r1.c:858
+msgid "Bcher"
+msgstr "Books"
+
+#: ../../ms2/ms2_r1.c:859
+msgid "Lexikon"
+msgstr "Dictionary"
+
+#: ../../ms2/ms2_r1.c:860
+msgid "Pflanze"
+msgstr "Plant"
+
+#: ../../ms2/ms2_r1.c:861
+msgid "Maske"
+msgstr "Mask"
+
+#: ../../ms2/ms2_r1.c:862
+msgid "Schlange"
+msgstr "Snake"
+
+#: ../../ms2/ms2_r1.c:863
+msgid "Becher"
+msgstr "Cup"
+
+#: ../../ms2/ms2_r1.c:864
+msgid "Joystick"
+msgstr "Joystick"
+
+#: ../../ms2/ms2_r1.c:865
+msgid "Eine normale Zahnbrste,|es steht nur \"Artus\" darauf."
+msgstr "An ordinary toothbrush.|It says \"Artus\" on it."
+
+#: ../../ms2/ms2_r1.c:866
+msgid "Musikger„t"
+msgstr "Music device"
+
+#: ../../ms2/ms2_r1.c:866
+msgid ""
+"Ein Ger„t zum Abspielen und|Aufnehmen von Musikchips.|Es ist ein Mikrofon "
+"daran."
+msgstr ""
+"A device for playing and recording music chips.|There is a microphone on it."
+
+#: ../../ms2/ms2_r1.c:867 ../../ms2/ms2_r1.c:868 ../../ms2/ms2_r1.c:869
+#: ../../ms2/ms2_r1.c:870 ../../ms2/ms2_r1.c:871
+msgid "Flasche"
+msgstr "Bottle"
+
+#: ../../ms2/ms2_r1.c:867
+msgid "Auf dem Etikett steht:|\"Enth„lt 10% Hyperalkohol\"."
+msgstr "The label says: \"Contains 10% hyperalcohol\"."
+
+#: ../../ms2/ms2_r1.c:872
+msgid "Kiste"
+msgstr "Box"
+
+#: ../../ms2/ms2_r1.c:874
+msgid "Verk„ufer"
+msgstr "Seller"
+
+#: ../../ms2/ms2_r2.c:36
+msgid "Was? Dafr wollen Sie die Karte haben?"
+msgstr "What? Do you want the card for that?"
+
+#: ../../ms2/ms2_r2.c:37
+msgid "Sie sind wohl nicht ganz ber|die aktuellen Preise informiert!"
+msgstr "You are probably not completely|informed about the current prices!"
+
+#: ../../ms2/ms2_r2.c:47
+msgid "Ich bin's, Horst Hummel!"
+msgstr "It's me, Horst Hummel!"
+
+#: ../../ms2/ms2_r2.c:48
+msgid "Sch”nes Wetter heute!"
+msgstr "Nice weather today!"
+
+#: ../../ms2/ms2_r2.c:49
+msgid ""
+"K”nnen Sie mir sagen, von wem ich eine Eintrittskarte fr den "
+"Musikwettbewerb kriegen kann?"
+msgstr "Can you tell me who can get me a ticket for the music contest?"
+
+#: ../../ms2/ms2_r2.c:55
+msgid "Ok, hier haben Sie den Xa."
+msgstr "OK, here is the Xa."
+
+#: ../../ms2/ms2_r2.c:60
+msgid "Ich biete Ihnen 500 Xa."
+msgstr "I offer you 500 Xa."
+
+#: ../../ms2/ms2_r2.c:61
+msgid "Ich biete Ihnen 1000 Xa."
+msgstr "I offer you 1000 Xa."
+
+#: ../../ms2/ms2_r2.c:62
+msgid "Ich biete Ihnen 5000 Xa."
+msgstr "I offer you 5000 Xa."
+
+#: ../../ms2/ms2_r2.c:63
+msgid "Ich biete Ihnen 10000 Xa."
+msgstr "I offer you 10000 Xa."
+
+#: ../../ms2/ms2_r2.c:72
+msgid "Vielen Dank fr Ihren Kauf!"
+msgstr "Thank you for your purchase!"
+
+#: ../../ms2/ms2_r2.c:77
+msgid "Was bieten Sie mir|denn nun fr die Karte?"
+msgstr "What will you offer me|for the card?"
+
+#: ../../ms2/ms2_r2.c:81
+msgid "Hallo, Sie!"
+msgstr "Hello to you!"
+
+#: ../../ms2/ms2_r2.c:83 ../../ms2/ms2_r2.c:719
+msgid "Was wollen Sie?"
+msgstr "What do you want?"
+
+#: ../../ms2/ms2_r2.c:87
+msgid "Wer sind Sie?"
+msgstr "Who are you?"
+
+#: ../../ms2/ms2_r2.c:88
+msgid "Horst Hummel!"
+msgstr "Horst Hummel!"
+
+#: ../../ms2/ms2_r2.c:89
+msgid "Kenne ich nicht."
+msgstr "Never heard of him."
+
+#: ../../ms2/ms2_r2.c:90
+msgid "Was, Sie kennen den berhmten Horst Hummel nicht?"
+msgstr "What, you don't know the famous Horst Hummel?"
+
+#: ../../ms2/ms2_r2.c:91
+msgid "Ich bin doch der, der immer im Fernsehen zu sehen ist."
+msgstr "I'm the guy who is always on TV."
+
+#: ../../ms2/ms2_r2.c:92
+msgid "Ich kenne Sie wirklich nicht."
+msgstr "I really do not know you."
+
+#: ../../ms2/ms2_r2.c:93
+msgid "Komisch."
+msgstr "Funny."
+
+#: ../../ms2/ms2_r2.c:95 ../../ms2/ms2_r2.c:1155
+msgid "Aha."
+msgstr "Aha."
+
+#: ../../ms2/ms2_r2.c:97
+msgid "Ja, kann ich."
+msgstr "Yes, I can."
+
+#: ../../ms2/ms2_r2.c:98
+msgid "Von wem denn?"
+msgstr "From whom?"
+
+#: ../../ms2/ms2_r2.c:99
+msgid "Diese Information kostet einen Xa."
+msgstr "This information costs a Xa."
+
+#: ../../ms2/ms2_r2.c:104
+msgid "Wie Sie meinen."
+msgstr "As you say."
+
+#: ../../ms2/ms2_r2.c:110
+msgid "Sie k”nnen die Karte von MIR bekommen!"
+msgstr "You can get the card from ME!"
+
+#: ../../ms2/ms2_r2.c:111
+msgid "Aber nur eine Teilnahmekarte,|keine Eintrittskarte."
+msgstr "But only a participation ticket,|not an entrance ticket."
+
+#: ../../ms2/ms2_r2.c:112
+msgid "Was wollen Sie dafr haben?"
+msgstr "What do you want for it?"
+
+#: ../../ms2/ms2_r2.c:113
+msgid "Machen Sie ein Angebot!"
+msgstr "Make an offer!"
+
+#: ../../ms2/ms2_r2.c:133
+msgid "Das ist ein gutes Angebot!"
+msgstr "That's a good offer!"
+
+#: ../../ms2/ms2_r2.c:135
+msgid "Dafr gebe ich Ihnen meine|letzte Teilnahmekarte!"
+msgstr "For that I give you my|last participation card!"
+
+#: ../../ms2/ms2_r2.c:140
+msgid "(Dieser Trottel!)"
+msgstr "(That Idiot!)"
+
+#: ../../ms2/ms2_r2.c:190
+msgid "Ich wrde gern beim Musikwettbewerb zuschauen."
+msgstr "I would like to watch the music competition."
+
+#: ../../ms2/ms2_r2.c:191
+msgid "Ich wrde gern am Musikwettbewerb teilnehmen."
+msgstr "I would like to participate in the music competition."
+
+#: ../../ms2/ms2_r2.c:192
+msgid "Wieviel Uhr haben wir?"
+msgstr "What time is it?"
+
+#: ../../ms2/ms2_r2.c:196 ../../ms2/ms2_r2.c:749
+msgid "Ja."
+msgstr "Yes."
+
+#: ../../ms2/ms2_r2.c:197 ../../ms2/ms2_r2.c:379 ../../ms2/ms2_r2.c:391
+#: ../../ms2/ms2_r2.c:697
+msgid "Nein."
+msgstr "No."
+
+#: ../../ms2/ms2_r2.c:201
+msgid "Hallo, Leute!"
+msgstr "Hi guys!"
+
+#: ../../ms2/ms2_r2.c:202
+msgid "Hi, Fans!"
+msgstr "Hi, fans!"
+
+#: ../../ms2/ms2_r2.c:203
+msgid "Gute Nacht!"
+msgstr "Good night!"
+
+#: ../../ms2/ms2_r2.c:207
+msgid "Žh, wie geht es euch?"
+msgstr "Uh, how are you?"
+
+#: ../../ms2/ms2_r2.c:208
+msgid "Sch”nes Wetter heute."
+msgstr "Nice weather today."
+
+#: ../../ms2/ms2_r2.c:212
+msgid "Hmm ..."
+msgstr "Hmm ..."
+
+#: ../../ms2/ms2_r2.c:213
+msgid "Tja ..."
+msgstr "Well ..."
+
+#: ../../ms2/ms2_r2.c:214
+msgid "Also ..."
+msgstr "So ..."
+
+#: ../../ms2/ms2_r2.c:218
+msgid "Ok, los gehts!"
+msgstr "OK let's go!"
+
+#: ../../ms2/ms2_r2.c:219
+msgid "Ich klimper mal was auf dem Keyboard hier."
+msgstr "I'll fix something on the keyboard here."
+
+#: ../../ms2/ms2_r2.c:234
+msgid "Halt, sie sind doch schon drangewesen!"
+msgstr "Stop, you have already been on it!"
+
+#: ../../ms2/ms2_r2.c:240
+msgid "He, Sie! Haben Sie|eine Eintrittskarte?"
+msgstr "Hey, you! Do you have|a ticket?"
+
+#: ../../ms2/ms2_r2.c:244
+msgid "Ja natrlich, hier ist meine Teilnahmekarte."
+msgstr "Yes of course, here is my participation ticket."
+
+#: ../../ms2/ms2_r2.c:245
+msgid ""
+"Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten "
+"k”nnen."
+msgstr ""
+"You are a participant!|Please ask at the checkout|when you can go on stage."
+
+#: ../../ms2/ms2_r2.c:247
+msgid "Žh, nein."
+msgstr "Uh, no."
+
+#: ../../ms2/ms2_r2.c:252
+msgid "He, wo ist Ihr Musikchip?"
+msgstr "Hey, where's your music chip?"
+
+#: ../../ms2/ms2_r2.c:267
+msgid "Laber nicht!"
+msgstr "Stop talking!"
+
+#: ../../ms2/ms2_r2.c:270
+msgid "Fang an!"
+msgstr "Get started!"
+
+#: ../../ms2/ms2_r2.c:273
+msgid "Einen Moment, ich muá erstmal berlegen, was ich|euch spiele."
+msgstr "One moment, I have to think about what I'm playing for you."
+
+#: ../../ms2/ms2_r2.c:275
+msgid "Anfangen!!!"
+msgstr "Begin!!!"
+
+#: ../../ms2/ms2_r2.c:278
+msgid "Nun denn ..."
+msgstr "Well then ..."
+
+#: ../../ms2/ms2_r2.c:279
+msgid "Raus!"
+msgstr "Out!"
+
+#: ../../ms2/ms2_r2.c:291 ../../ms2/ms2_r2.c:306
+msgid "Buh!"
+msgstr "Boo!"
+
+#: ../../ms2/ms2_r2.c:298
+msgid "Aufh”ren!"
+msgstr "Stop!"
+
+#: ../../ms2/ms2_r2.c:309
+msgid "Hilfe!"
+msgstr "Help!"
+
+#: ../../ms2/ms2_r2.c:312
+msgid "Ich verziehe mich lieber."
+msgstr "I'd prefer to get lost."
+
+#: ../../ms2/ms2_r2.c:317
+msgid "Mist, auf dem Chip war|gar keine Musik drauf."
+msgstr "Damn, there was no music on the chip at all."
+
+#: ../../ms2/ms2_r2.c:319
+msgid "Das ging ja voll daneben!"
+msgstr "That went completely wrong!"
+
+#: ../../ms2/ms2_r2.c:327
+msgid "Du n„herst dich der Bhne,|aber dir wird mulmig zumute."
+msgstr "You approach the stage,|but you feel queasy."
+
+#: ../../ms2/ms2_r2.c:330
+msgid ""
+"Du traust dich nicht, vor|so vielen Menschen aufzutreten|und kehrst wieder "
+"um."
+msgstr "You do not dare to appear|in front of so many people|and turn around."
+
+#: ../../ms2/ms2_r2.c:347
+msgid "Oh, Sie sind Teilnehmer!|Dann sind Sie aber sp„t dran."
+msgstr "Oh, you are a participant!|But you are late."
+
+#: ../../ms2/ms2_r2.c:348
+msgid "Spielen Sie die Musik live?"
+msgstr "Do you play the music live?"
+
+#: ../../ms2/ms2_r2.c:351
+msgid ""
+"Dann geben Sie bitte Ihren Musikchip ab!|Er wird bei Ihrem Auftritt "
+"abgespielt."
+msgstr ""
+"Then please submit your music chip!|It will be played during your "
+"performance."
+
+#: ../../ms2/ms2_r2.c:357
+msgid ""
+"Oh, Sie sind sofort an der Reihe!|Beeilen Sie sich! Der Bhneneingang|ist "
+"hinter dem Haupteingang rechts."
+msgstr ""
+"Oh, it's your turn!|Hurry! The stage entrance|is to the right behind the "
+"main entrance."
+
+#: ../../ms2/ms2_r2.c:367
+msgid "Habe ich noch einen zweiten Versuch?"
+msgstr "Can I have another try?"
+
+#: ../../ms2/ms2_r2.c:368
+msgid "Nein!"
+msgstr "No!"
+
+#: ../../ms2/ms2_r2.c:378
+msgid "Haben Sie schon eine Eintrittskarte?"
+msgstr "Do you already have a ticket?"
+
+#: ../../ms2/ms2_r2.c:380
+msgid "Tut mir leid, die Karten|sind schon alle ausverkauft."
+msgstr "I'm sorry, the tickets|are already sold out."
+
+#: ../../ms2/ms2_r2.c:381
+msgid "Mist!"
+msgstr "Crap!"
+
+#: ../../ms2/ms2_r2.c:383
+msgid "Haben Sie schon eine Teilnahmekarte?"
+msgstr "Do you already have a participation ticket?"
+
+#: ../../ms2/ms2_r2.c:386
+msgid "Ja, hier ist sie."
+msgstr "Yes, here it is."
+
+#: ../../ms2/ms2_r2.c:392
+msgid "Tut mir leid, die Teilnahmekarten|sind schon alle ausverkauft."
+msgstr "I'm sorry, the participation tickets|are already sold out."
+
+#: ../../ms2/ms2_r2.c:393
+msgid "Scheiáe!"
+msgstr "Crap!"
+
+#: ../../ms2/ms2_r2.c:396
+msgid "Das kann ich Ihnen|leider nicht sagen."
+msgstr "I can not tell you that."
+
+#: ../../ms2/ms2_r2.c:401
+msgid "Wo ist denn nun Ihr Musikchip?"
+msgstr "Where is your music chip?"
+
+#: ../../ms2/ms2_r2.c:403
+msgid "Jetzt beeilen Sie sich doch!"
+msgstr "Now hurry up!"
+
+#: ../../ms2/ms2_r2.c:416
+msgid ""
+"Huch, Sie sind hier bei einem Musik-,|nicht bei einem Imitationswettbewerb"
+msgstr "Huh, you're here at a music contest,|not at an imitation contest"
+
+#: ../../ms2/ms2_r2.c:417
+msgid "Imitationswettbewerb?|Ich will niemanden imitieren."
+msgstr "Imitation contest?|I do not want to imitate anyone."
+
+#: ../../ms2/ms2_r2.c:418
+msgid "Guter Witz, wieso sehen Sie|dann aus wie Horst Hummel?"
+msgstr "Good joke. Then why do you look like Horst Hummel?"
+
+#: ../../ms2/ms2_r2.c:420
+msgid ""
+"Na, nun h”ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht."
+msgstr "Oh come on! Your disguise isn't that perfect."
+
+#: ../../ms2/ms2_r2.c:421
+msgid ""
+"Ich werde Ihnen beweisen, daá ich Horst Hummel bin,|indem ich diesen "
+"Wettbewerb hier gewinne."
+msgstr "I will prove to you that I am Horst Hummel|by winning this competition."
+
+#: ../../ms2/ms2_r2.c:422
+msgid "Dann kann ich in dieser verdammten Fernsehshow|auftreten."
+msgstr "Then I can perform in this|damn TV show."
+
+#: ../../ms2/ms2_r2.c:447
+msgid ""
+"Du hampelst ein biáchen zu|der Musik vom Chip herum.|Die Leute sind "
+"begeistert!"
+msgstr ""
+"You're rocking a little bit|to the music from the chip.|The audience is "
+"excited!"
+
+#: ../../ms2/ms2_r2.c:484
+msgid "Guten Abend. Diesmal haben wir|einen besonderen Gast bei uns."
+msgstr "Good evening. This time we have|a special guest with us."
+
+#: ../../ms2/ms2_r2.c:485
+msgid ""
+"Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort "
+"vor allem durch seine|Verkleidung aufgefallen war."
+msgstr ""
+"He is the winner of yesterday's music competition in the Palace of Culture.|"
+"He was particularly noteworthy|because of his disguise."
+
+#: ../../ms2/ms2_r2.c:489
+msgid "Sie haben das Wort!"
+msgstr "You have the floor!"
+
+#: ../../ms2/ms2_r2.c:490
+msgid "Nun ja, meine erste Frage lautet: ..."
+msgstr "Well, my first question is ..."
+
+#: ../../ms2/ms2_r2.c:491
+msgid ""
+"Warum haben Sie sich sofort nach|Ihrer Landung entschlossen, fr|die Artus-"
+"GmbH zu arbeiten?"
+msgstr ""
+"Why did you decide immediately|after your arrival to work for|Artus GmbH?"
+
+#: ../../ms2/ms2_r2.c:492
+msgid ""
+"Es war meine freie Entscheidung.|Die Artus-GmbH hat mir einfach gefallen."
+msgstr "It was a decision I made on my own.|I just decided I liked Artus-GmbH."
+
+#: ../../ms2/ms2_r2.c:493
+msgid ""
+"Wieso betonen Sie, daá es|Ihre freie Entscheidung war?|Haben Sie Angst, daá "
+"man Ihnen|nicht glaubt?"
+msgstr ""
+"Why do you stress that|it was your own decision?|Are you afraid that nobody "
+"will believe you otherwise?"
+
+#: ../../ms2/ms2_r2.c:494
+msgid "Also, ich muá doch sehr bitten!|Was soll diese unsinnige Frage?"
+msgstr "How dare you!|What is with this nonsensical question?"
+
+#: ../../ms2/ms2_r2.c:495
+msgid ""
+"Ich finde die Frage wichtig.|Nun, Herr Hummel, was haben|Sie dazu zu sagen?"
+msgstr ""
+"I think the question is important.|Well, Mr. Hummel, what do you have to say?"
+
+#: ../../ms2/ms2_r2.c:505
+msgid "Auf solch eine Frage brauche|ich nicht zu antworten!"
+msgstr "I don't feel that I have|to answer such a question!"
+
+#: ../../ms2/ms2_r2.c:506
+msgid "Gut, dann etwas anderes ..."
+msgstr "Alright, something else then ..."
+
+#: ../../ms2/ms2_r2.c:507
+msgid ""
+"Sie sind von Beruf Koch.|Wie hieá das Restaurant,|in dem Sie auf der Erde|"
+"gearbeitet haben?"
+msgstr ""
+"You are a chef by profession.|What was the name of the restaurant|where you "
+"worked|on Earth?"
+
+#: ../../ms2/ms2_r2.c:508
+msgid "Hmm, daá weiá ich nicht mehr."
+msgstr "Hmm, I do not remember that."
+
+#: ../../ms2/ms2_r2.c:509
+msgid ""
+"Sie wollen mir doch nicht weismachen,|daá Sie den Namen vergessen haben!"
+msgstr "Do you really expect me to believe you cannot remember the name?"
+
+#: ../../ms2/ms2_r2.c:510
+msgid "Schlieálich haben Sie|zehn Jahre dort gearbeitet!"
+msgstr "After all, you worked there for ten years!"
+
+#: ../../ms2/ms2_r2.c:511
+msgid "Woher wollen Sie das wissen?"
+msgstr "How do you know that?"
+
+#: ../../ms2/ms2_r2.c:512
+msgid "Nun, ich komme von der Erde,|im Gegensatz zu Ihnen!"
+msgstr "Well, I come from Earth,|unlike you!"
+
+#: ../../ms2/ms2_r2.c:522
+msgid "Langsam gehen Sie zu weit!"
+msgstr "Now you've gone too far!"
+
+#: ../../ms2/ms2_r2.c:523
+msgid ""
+"Sie sind ein Roboter!|Das merkt man schon an|Ihrer dummen Antwort!|Sie sind "
+"nicht optimal|programmiert!"
+msgstr ""
+"You are a robot!|It is obvious from|your stupid answer!|You are not even "
+"programmed|correctly!"
+
+#: ../../ms2/ms2_r2.c:533
+msgid ""
+"Wenn Sie jetzt nicht mit Ihren|Beleidigungen aufh”ren, muá ich|Ihnen das "
+"Mikrofon abschalten!"
+msgstr ""
+"If you do not stop right now|with your insults, I will have|to turn off the "
+"microphone!"
+
+#: ../../ms2/ms2_r2.c:534
+msgid "Ich bin der echte Horst Hummel,|und hier ist der Beweis!"
+msgstr "I am the real Horst Hummel,|and here is the proof!"
+
+#: ../../ms2/ms2_r2.c:558
+msgid ""
+"Am n„chsten Morgen sind alle|Zeitungen voll mit deiner spektakul„ren|"
+"Enthllung des Schwindels."
+msgstr ""
+"The next morning, all the papers|are full of your spectacular|revelation of "
+"fraud."
+
+#: ../../ms2/ms2_r2.c:561
+msgid ""
+"Die Manager der Artus-GmbH und Commander|Sumoti wurden sofort verhaftet."
+msgstr ""
+"The managers of Artus-GmbH and Commander|Sumoti were arrested immediately."
+
+#: ../../ms2/ms2_r2.c:564
+msgid ""
+"Nach dem Streá der letzten Tage,|entscheidest du dich, auf die|Erde "
+"zurckzukehren."
+msgstr "After these stressful last few days|you decide to return to Earth."
+
+#: ../../ms2/ms2_r2.c:567
+msgid "W„hrend du dich vor Interviews|kaum noch retten kannst, ..."
+msgstr "While you can barely save|yourself from interviews, ..."
+
+#: ../../ms2/ms2_r2.c:570
+msgid ""
+"... arbeiten die Axacussanischen|Techniker an einem Raumschiff,|das dich zur "
+"Erde zurckbringen soll."
+msgstr ""
+"... the Axacussan|technicians are working on a spaceship|to bring you back "
+"to Earth."
+
+#: ../../ms2/ms2_r2.c:573
+msgid "Eine Woche sp„ter ist der|Tag des Starts gekommen."
+msgstr "One week later, the day of the launch has arrived."
+
+#: ../../ms2/ms2_r2.c:603
+msgid ""
+"Zum dritten Mal in deinem|Leben verbringst du eine lange|Zeit im Tiefschlaf."
+msgstr "For the third time in your life,|you spend a long time|in deep sleep."
+
+#: ../../ms2/ms2_r2.c:606
+msgid "Zehn Jahre sp„ter ..."
+msgstr "Ten years later ..."
+
+#: ../../ms2/ms2_r2.c:609
+msgid ""
+"Du wachst auf und beginnst,|dich schwach an deine|Erlebnisse zu erinnern."
+msgstr "You wake up and begin|to faintly remember|your experiences."
+
+#: ../../ms2/ms2_r2.c:612
+msgid "Um dich herum ist alles dunkel."
+msgstr "Everything is dark around you."
+
+#: ../../ms2/ms2_r2.c:670 ../../ms2/ms2_r2.c:900
+#, c-format
+msgid "Sie zeigt %d an."
+msgstr "It displays %d."
+
+#: ../../ms2/ms2_r2.c:680
+msgid "Ich interessiere mich fr den Job, bei dem man ber Nacht"
+msgstr "I'm interested in the job where you can get"
+
+#: ../../ms2/ms2_r2.c:681
+msgid "reich werden kann."
+msgstr "rich overnight."
+
+#: ../../ms2/ms2_r2.c:682
+msgid "Ich verkaufe frische Tomaten."
+msgstr "I sell fresh tomatoes."
+
+#: ../../ms2/ms2_r2.c:683
+msgid "Ich bin der Klempner. Ich soll hier ein Rohr reparieren."
+msgstr "I am the plumber. I'm supposed to fix a pipe here."
+
+#: ../../ms2/ms2_r2.c:688
+msgid "Ja, h”rt sich gut an."
+msgstr "Yes, it sounds good."
+
+#: ../../ms2/ms2_r2.c:689
+msgid "Krumme Gesch„fte? Fr wen halten Sie mich? Auf Wiedersehen!"
+msgstr "Crooked business? Who do you think I am? Goodbye!"
+
+#: ../../ms2/ms2_r2.c:693
+msgid "Žh - k”nnten Sie mir das Ganze nochmal erkl„ren?"
+msgstr "Uh - could you explain that to me again?"
+
+#: ../../ms2/ms2_r2.c:694
+msgid "Wie groá ist mein Anteil?"
+msgstr "How big is my share?"
+
+#: ../../ms2/ms2_r2.c:695
+msgid ""
+"Machen Sie es immer so, daá Sie Ihre Komplizen ber ein Graffitti anwerben?"
+msgstr "Do you always use graffiti to recruit your accomplices?"
+
+#: ../../ms2/ms2_r2.c:722
+msgid "Hmm, Moment mal, ich frage den Boss."
+msgstr "Hmm wait, I will ask the boss."
+
+#: ../../ms2/ms2_r2.c:728
+msgid "Kurze Zeit sp„ter ..."
+msgstr "A short while later ..."
+
+#: ../../ms2/ms2_r2.c:736
+msgid "Ok, der Boss will dich sprechen."
+msgstr "OK, the boss wants to talk to you."
+
+#: ../../ms2/ms2_r2.c:742
+msgid "Du betrittst die Wohnung und|wirst zu einem Tisch gefhrt."
+msgstr "You enter the apartment and are led to a table."
+
+#: ../../ms2/ms2_r2.c:748
+msgid "Hmm, du willst dir also|etwas Geld verdienen?"
+msgstr "Hmm, so you want to earn some money?"
+
+#: ../../ms2/ms2_r2.c:750
+msgid "Nun ja, wir planen|einen n„chtlichen Besuch|eines bekannten Museums."
+msgstr "Well, we're planning|a nightly visit|to a well-known museum."
+
+#: ../../ms2/ms2_r2.c:751
+msgid "Wie sieht's aus, bist du interessiert?"
+msgstr "So, are you interested?"
+
+#: ../../ms2/ms2_r2.c:754
+msgid "Halt, warte!"
+msgstr "Stop, wait!"
+
+#: ../../ms2/ms2_r2.c:755
+msgid "šberleg's dir, es springen|30000 Xa fr dich raus!"
+msgstr "Think about it, your share would be|30000 Xa!"
+
+#: ../../ms2/ms2_r2.c:756
+msgid "30000?! Ok, ich mache mit."
+msgstr "30000?! Alright, count me in."
+
+#: ../../ms2/ms2_r2.c:758
+msgid "Gut, dann zu den Einzelheiten."
+msgstr "Good, now then to the details."
+
+#: ../../ms2/ms2_r2.c:759
+msgid "Bei dem Museum handelt es|sich um das Orzeng-Museum."
+msgstr "The museum in question is|the Orzeng Museum."
+
+#: ../../ms2/ms2_r2.c:760
+msgid "Es enth„lt die wertvollsten|Dinosaurierfunde von ganz Axacuss."
+msgstr "It contains the most valuable|dinosaur discoveries of Axacuss."
+
+#: ../../ms2/ms2_r2.c:761
+msgid "Wir haben es auf das Sodo-Skelett|abgesehen. Es ist weltberhmt."
+msgstr "We're aiming to get the Sodo skeleton.|It is world-famous."
+
+#: ../../ms2/ms2_r2.c:762
+msgid "Alle bekannten Pal„ontologen haben|sich schon damit besch„ftigt."
+msgstr "All known paleontologists|have already dealt with it."
+
+#: ../../ms2/ms2_r2.c:763
+msgid ""
+"Der Grund dafr ist, daá es allen|bis jetzt bekannten Erkenntnissen|šber die "
+"Evolution widerspricht."
+msgstr ""
+"The reason for this is that it contradicts all known|knowledge about "
+"evolution."
+
+#: ../../ms2/ms2_r2.c:764
+msgid ""
+"Irgendein verrckter Forscher|bietet uns 200.000 Xa,|wenn wir ihm das Ding "
+"beschaffen."
+msgstr ""
+"Some crazy researcher|will give us 200,000 Xa|if we retrieve that thing for "
+"him."
+
+#: ../../ms2/ms2_r2.c:765
+msgid "So, jetzt zu deiner Aufgabe:"
+msgstr "So, now to your task:"
+
+#: ../../ms2/ms2_r2.c:767
+msgid "Du dringst durch den Nebeneingang|in das Geb„ude ein."
+msgstr "You enter the building through|the side entrance."
+
+#: ../../ms2/ms2_r2.c:768
+msgid ""
+"Dort schaltest du die Alarmanlage aus,|durch die das Sodo-Skelett gesichert "
+"wird."
+msgstr "There you switch off the alarm system,|which secures the Sodo skeleton."
+
+#: ../../ms2/ms2_r2.c:769
+msgid "Wir betreten einen anderen Geb„udeteil|und holen uns das Gerippe."
+msgstr "We'll enter another part of the building|and fetch the skeleton."
+
+#: ../../ms2/ms2_r2.c:770
+msgid "Deine Aufgabe ist nicht leicht.|Schau dir diesen Plan an."
+msgstr "Your task is not easy.|Look at this plan."
+
+#: ../../ms2/ms2_r2.c:775
+msgid ""
+"Unten siehst du die kleine Abstellkammer,|durch die du in die "
+"Austellungsr„ume kommst."
+msgstr ""
+"Below you can see the small storage room,|through which you come to the "
+"showrooms."
+
+#: ../../ms2/ms2_r2.c:776
+msgid "Bei der mit Y gekennzeichneten|Stelle ist die Alarmanlage."
+msgstr "The alarm system is at the location marked Y."
+
+#: ../../ms2/ms2_r2.c:777
+msgid ""
+"Bei dem X steht ein groáer Dinosaurier|mit einem wertvollen Sch„del.|Den "
+"Sch„del nimmst du mit."
+msgstr ""
+"The X marks the spot with a big dinosaur|with a valuable skull.|You will "
+"take the skull with you."
+
+#: ../../ms2/ms2_r2.c:778
+msgid "Nun zu den Problemen:"
+msgstr "Now for the problems:"
+
+#: ../../ms2/ms2_r2.c:779
+msgid "Die weiá gekennzeichneten|Tren sind verschlossen."
+msgstr "The marked white doors|are locked."
+
+#: ../../ms2/ms2_r2.c:780
+msgid ""
+"Sie mssen mit einer Spezialkeycard ge”ffnet|werden, was jedoch einige Zeit "
+"dauert."
+msgstr "They have to be opened with a special keycard,|which can take a while."
+
+#: ../../ms2/ms2_r2.c:781
+msgid ""
+"Auáerdem gibt es in den auf der Karte|farbigen R„umen einen Druck-Alarm."
+msgstr ""
+"In addition, there are pressure alarms|in the rooms which are colored on the "
+"map."
+
+#: ../../ms2/ms2_r2.c:782
+msgid ""
+"Du darfst dich dort nicht l„nger|als 16 bzw. 8 Sekunden aufhalten,|sonst "
+"wird Alarm ausgel”st."
+msgstr ""
+"You can not stay there longer than|16 or 8 seconds,|or the alarm will go off."
+
+#: ../../ms2/ms2_r2.c:783
+msgid "Im Raum oben rechts ist|eine Kamera installiert."
+msgstr "In the room at the top right|there is a camera installed."
+
+#: ../../ms2/ms2_r2.c:784
+msgid ""
+"Diese wird jedoch nur von|der 21. bis zur 40. Sekunde|einer Minute berwacht."
+msgstr ""
+"However, it is only monitored|between the 21st and the 40th second|of every "
+"minute."
+
+#: ../../ms2/ms2_r2.c:785
+msgid "Das gr”áte Problem ist der W„chter."
+msgstr "The biggest problem is the guard."
+
+#: ../../ms2/ms2_r2.c:786
+msgid ""
+"Er braucht fr seine Runde genau|eine Minute, ist also ungef„hr|zehn "
+"Sekunden in einem Raum."
+msgstr ""
+"He needs exactly one minute for his round,|so he is in each room|for about "
+"ten seconds."
+
+#: ../../ms2/ms2_r2.c:787
+msgid ""
+"Du mátest seine Schritte h”ren k”nnen,|wenn du in der Abstellkammer bist|"
+"und der W„chter dort vorbeikommt."
+msgstr ""
+"You should be able to hear his footsteps|if you are in the closet|and the "
+"guard passes by."
+
+#: ../../ms2/ms2_r2.c:788
+msgid ""
+"Wenn du es bis zur Alarmanlage|geschafft hast, h„ngst du dich|mit dem Sauger "
+"an die Wand,|damit du keinen Druck-Alarm ausl”st."
+msgstr ""
+"If you make it to the alarm system,|you'll use the sucker to hang on the "
+"wall|to avoid triggering the pressure alarm."
+
+#: ../../ms2/ms2_r2.c:789
+msgid "Die Alarmanlage schaltest du|mit einem speziellen Ger„t aus."
+msgstr "You switch off the alarm system|with a special device."
+
+#: ../../ms2/ms2_r2.c:790
+msgid ""
+"Wenn du das geschafft hast, nichts|wie raus! Aber keine Panik,|du darfst "
+"keinen Alarm ausl”sen."
+msgstr ""
+"Once you're done, get out of there!|But do not panic!|You must not set off "
+"the alarm."
+
+#: ../../ms2/ms2_r2.c:795
+msgid "So, noch irgendwelche Fragen?"
+msgstr "So, any more questions?"
+
+#: ../../ms2/ms2_r2.c:801
+msgid "Also gut."
+msgstr "All right then."
+
+#: ../../ms2/ms2_r2.c:803
+msgid "Du bekommst 30000 Xa."
+msgstr "You get 30,000 Xa."
+
+#: ../../ms2/ms2_r2.c:805
+msgid "Ja, die Methode hat sich bew„hrt."
+msgstr "Yes, that method has proven itself worthy."
+
+#: ../../ms2/ms2_r2.c:808
+msgid "Hast du sonst noch Fragen?"
+msgstr "Do you have any questions?"
+
+#: ../../ms2/ms2_r2.c:811
+msgid "Nachdem wir alles gekl„rt|haben, kann es ja losgehen!"
+msgstr "Now that we are on the same page we can get started!"
+
+#: ../../ms2/ms2_r2.c:816
+msgid "Zur vereinbarten Zeit ..."
+msgstr "At the agreed upon time ..."
+
+#: ../../ms2/ms2_r2.c:834
+msgid ""
+"Du stehst vor dem Orzeng Museum,|w„hrend die Gangster schon in einen|anderen "
+"Geb„uderteil eingedrungen sind."
+msgstr ""
+"You stand in front of the Orzeng Museum,|while the gangsters have already "
+"penetrated|into another part of the building."
+
+#: ../../ms2/ms2_r2.c:837
+msgid ""
+"Wichtiger Hinweis:|Hier ist die letzte M”glichkeit,|vor dem Einbruch "
+"abzuspeichern."
+msgstr ""
+"Important note:|Here is the last possibility to save|before the break-in."
+
+#: ../../ms2/ms2_r2.c:840
+msgid "Wenn Sie das Museum betreten haben,|k”nnen Sie nicht mehr speichern!"
+msgstr "Once you enter the museum|you will not be able to save!"
+
+#: ../../ms2/ms2_r2.c:848
+msgid "Stecken Sie sich Ihre|Tomaten an den Hut!"
+msgstr "You can keep your tomatoes!"
+
+#: ../../ms2/ms2_r2.c:855
+msgid "Das kann ja jeder sagen!"
+msgstr "Anyone can say that!"
+
+#: ../../ms2/ms2_r2.c:865
+msgid "Niemand ”ffnet."
+msgstr "Nobody answers."
+
+#: ../../ms2/ms2_r2.c:870
+msgid "Welche Zahl willst du eingeben:      "
+msgstr "What number do you want to enter:      "
+
+#: ../../ms2/ms2_r2.c:882 ../../ms2/ms2_r2.c:886
+msgid "Falsche Eingabe"
+msgstr "Invalid input"
+
+#: ../../ms2/ms2_r2.c:896
+msgid "Der Aufzug bewegt sich."
+msgstr "The elevator is moving."
+
+#: ../../ms2/ms2_r2.c:914
+msgid "Die Karte wird|nicht angenommen."
+msgstr "The card|is not accepted."
+
+#: ../../ms2/ms2_r2.c:927
+msgid "Da ist nichts mehr."
+msgstr "There is nothing left."
+
+#: ../../ms2/ms2_r2.c:930
+msgid "Da ist ein Schlssel unter dem Bett!"
+msgstr "There's a key under the bed!"
+
+#: ../../ms2/ms2_r2.c:936
+msgid ""
+"Hey, da ist etwas unter dem|Bett. Nach dem Ger„usch zu|urteilen, ist es aus "
+"Metall."
+msgstr ""
+"Hey, there is something under the|bed. Judging by the noise,|it is made of "
+"metal."
+
+#: ../../ms2/ms2_r2.c:939
+msgid "Mist, es gelingt dir nicht,|den Gegenstand hervorzuholen."
+msgstr "Damn, you do not succeed in getting the object out."
+
+#: ../../ms2/ms2_r2.c:945
+msgid "Die Klappe ist schon offen."
+msgstr "The flap is already open."
+
+#: ../../ms2/ms2_r2.c:979
+msgid "Der Schlsssel paát nicht."
+msgstr "The key does not fit."
+
+#: ../../ms2/ms2_r2.c:983
+msgid ""
+"Du steckst den Chip in die|Anlage, aber es passiert nichts.|Die Anlage "
+"scheint kaputt zu sein."
+msgstr ""
+"You put the chip in the stereo,|but nothing happens.|The stereo seems to be "
+"broken."
+
+#: ../../ms2/ms2_r2.c:987
+msgid "Es passiert nichts. Das Ding|scheint kaputt zu sein."
+msgstr "Nothing happens. The thing|seems to be broken."
+
+#: ../../ms2/ms2_r2.c:998
+msgid "Hochspannung ist ungesund, wie du aus|Teil 1 eigentlich wissen mátest!"
+msgstr "High voltage is unhealthy, as you|should already know|from Part 1!"
+
+#: ../../ms2/ms2_r2.c:1034
+msgid "Es h„ngt ein Kabel heraus."
+msgstr "A cable hangs out."
+
+#: ../../ms2/ms2_r2.c:1035
+msgid "Irgendetwas hat hier|nicht ganz funktioniert."
+msgstr "Something did not|quite work out here."
+
+#: ../../ms2/ms2_r2.c:1059
+msgid "Du ziehst den Raumanzug an."
+msgstr "You put on your space suit."
+
+#: ../../ms2/ms2_r2.c:1061
+msgid "Du ziehst den Raumanzug aus."
+msgstr "You take off your space suit."
+
+#: ../../ms2/ms2_r2.c:1069 ../../ms2/ms2_r2.c:1099
+msgid "Das ist schon verbunden."
+msgstr "That is already connected."
+
+#: ../../ms2/ms2_r2.c:1129
+msgid "Die Leitung ist hier|schon ganz richtig."
+msgstr "The cable is already|at the right place."
+
+#: ../../ms2/ms2_r2.c:1137
+msgid "Roger W.! Wie kommen Sie denn hierher?"
+msgstr "Roger W.! How did you get here?"
+
+#: ../../ms2/ms2_r2.c:1140
+msgid "Ach, sieh mal einer an! Sie schon wieder!"
+msgstr "Oh, look at that! It's you again!"
+
+#: ../../ms2/ms2_r2.c:1141
+msgid "Wo haben Sie denn|Ihr Schiff gelassen?"
+msgstr "Where did you|leave your ship?"
+
+#: ../../ms2/ms2_r2.c:1144
+msgid "Schauen Sie mal hinter mich auf|den Turm! Da oben h„ngt es."
+msgstr "Take a look behind me, up on|the tower! It's up there."
+
+#: ../../ms2/ms2_r2.c:1145
+msgid ""
+"Ich hatte es scheinbar etwas zu|eilig, aber ich muáte unbedingt|zu den "
+"Dreharbeiten nach Xenon!"
+msgstr ""
+"Apparently I was too much in a hurry,|but I had to be at the film shooting "
+"in Xenon!"
+
+#: ../../ms2/ms2_r2.c:1146
+msgid "Mich wundert, daá es die Leute|hier so gelassen nehmen."
+msgstr "I am surprised that people|here take things so calmly."
+
+#: ../../ms2/ms2_r2.c:1147
+msgid ""
+"Die tun gerade so, als ob der Turm|schon immer so schr„g gestanden h„tte!"
+msgstr "They are pretending that the tower|has always been that slanted!"
+
+#: ../../ms2/ms2_r2.c:1148
+msgid "Hat er auch, schon seit|mehreren Jahrhunderten!"
+msgstr "It has, for|several centuries, actually!"
+
+#: ../../ms2/ms2_r2.c:1151
+msgid ""
+"Žh ... ach so. Und von wo|kommen Sie? Sie hatten's ja|wohl auch ziemlich "
+"eilig."
+msgstr ""
+"Uh ... I see. And where are you coming from? It seems you were in quite a "
+"hurry as well."
+
+#: ../../ms2/ms2_r2.c:1152
+msgid "Ich komme von Axacuss."
+msgstr "I come from Axacuss."
+
+#: ../../ms2/ms2_r2.c:1156
+msgid "Hmm, was mach ich jetzt bloá?"
+msgstr "Hmm, what am I going to do now?"
+
+#: ../../ms2/ms2_r2.c:1157
+msgid ""
+"Ich kenne ein gutes Cafe nicht|weit von hier, da k”nnen|wir uns erstmal "
+"erholen."
+msgstr "I know a good cafe not far from here,|where we can get some rest."
+
+#: ../../ms2/ms2_r2.c:1160
+msgid "Ok, einverstanden."
+msgstr "OK, I agree."
+
+#: ../../ms2/ms2_r2.c:1204
+msgid "Faszinierend!"
+msgstr "Fascinating!"
+
+#: ../../ms2/ms2_r2.c:1205
+msgid "Taxis"
+msgstr "Taxis"
+
+#: ../../ms2/ms2_r2.c:1205
+msgid "Hier ist ja richtig was los!"
+msgstr "There seems to be something really going on here!"
+
+#: ../../ms2/ms2_r2.c:1206
+msgid "Axacussaner"
+msgstr "Axacussan"
+
+#: ../../ms2/ms2_r2.c:1207
+msgid "Teilnahmekarte"
+msgstr "Participation card"
+
+#: ../../ms2/ms2_r2.c:1216
+msgid "Axacussanerin"
+msgstr "Axacussian"
+
+#: ../../ms2/ms2_r2.c:1223
+msgid "Darauf steht:|\"115AY2,96A\""
+msgstr "It reads:|\"115AY2,96A\""
+
+#: ../../ms2/ms2_r2.c:1224
+msgid "Darauf steht:|\"115AY2,96B\""
+msgstr "It reads:|\"115AY2,96B\""
+
+#: ../../ms2/ms2_r2.c:1233
+msgid "Darauf steht:|\"341,105A\""
+msgstr "It reads:|\"341,105A\""
+
+#: ../../ms2/ms2_r2.c:1234
+msgid "Darauf steht:|\"341,105B\""
+msgstr "It reads:|\"341,105B\""
+
+#: ../../ms2/ms2_r2.c:1244
+msgid "Klingel"
+msgstr "Bell"
+
+#: ../../ms2/ms2_r2.c:1245
+msgid "Anzeige"
+msgstr "Display"
+
+#: ../../ms2/ms2_r2.c:1246
+msgid "Tastenblock"
+msgstr "Keypad"
+
+#: ../../ms2/ms2_r2.c:1246
+msgid "Es sind Tasten von 0 bis 9 darauf."
+msgstr "There are keys from 0 to 9 on it."
+
+#: ../../ms2/ms2_r2.c:1255
+msgid "Chip"
+msgstr "Chip"
+
+#: ../../ms2/ms2_r2.c:1255
+msgid "Es ist ein Musikchip!"
+msgstr "It's a music chip!"
+
+#: ../../ms2/ms2_r2.c:1256
+msgid "Klappe"
+msgstr "Hatch"
+
+#: ../../ms2/ms2_r2.c:1256
+msgid "Sie ist mit einem altmodischen|Schloá verschlossen."
+msgstr "It is secured with an old-fashioned lock."
+
+#: ../../ms2/ms2_r2.c:1258
+msgid "Musikanlage"
+msgstr "Music system"
+
+#: ../../ms2/ms2_r2.c:1258
+msgid "Toll, eine in die Wand|integrierte Stereoanlage."
+msgstr "Great, a built-in stereo|in the wall."
+
+#: ../../ms2/ms2_r2.c:1259
+msgid "Boxen"
+msgstr "Speakers"
+
+#: ../../ms2/ms2_r2.c:1259
+msgid "Ganz normale Boxen."
+msgstr "Ordinary speakers."
+
+#: ../../ms2/ms2_r2.c:1260
+msgid "Stifte"
+msgstr "Pencils"
+
+#: ../../ms2/ms2_r2.c:1260
+msgid "Ganz normale Stifte."
+msgstr "Ordinary pencils."
+
+#: ../../ms2/ms2_r2.c:1261
+msgid "Metallkl”tzchen"
+msgstr "Metal blocks"
+
+#: ../../ms2/ms2_r2.c:1261
+msgid "Es ist magnetisch."
+msgstr "It is magnetic."
+
+#: ../../ms2/ms2_r2.c:1262
+msgid "Bild"
+msgstr "Image"
+
+#: ../../ms2/ms2_r2.c:1262
+msgid "Ein ungew”hnliches Bild."
+msgstr "An unusual picture."
+
+#: ../../ms2/ms2_r2.c:1263
+msgid "Schrank"
+msgstr "Cabinet"
+
+#: ../../ms2/ms2_r2.c:1263
+msgid "Er ist verschlossen"
+msgstr "It is closed"
+
+#: ../../ms2/ms2_r2.c:1265
+msgid "Aufzug"
+msgstr "Elevator"
+
+#: ../../ms2/ms2_r2.c:1266
+msgid "unter Bett"
+msgstr "under bed"
+
+#: ../../ms2/ms2_r2.c:1266
+msgid ""
+"Unter dem Bett sind bestimmt wichtige|Dinge zu finden, nur kommst du nicht "
+"darunter.|Du br„uchtest einen Stock oder so etwas."
+msgstr ""
+"Under the bed are certainly important|things to find, only you cannot reach "
+"underneath.|You need a stick or something."
+
+#: ../../ms2/ms2_r2.c:1267
+msgid "Schlssel"
+msgstr "Key"
+
+#: ../../ms2/ms2_r2.c:1267
+msgid "Ein kleiner Metallschlssel."
+msgstr "A small metal key."
+
+#: ../../ms2/ms2_r2.c:1274 ../../ms2/ms2_r2.c:1277
+msgid "Schalter"
+msgstr "Switch"
+
+#: ../../ms2/ms2_r2.c:1275
+msgid "Griff"
+msgstr "Handle"
+
+#: ../../ms2/ms2_r2.c:1276
+msgid "Luke"
+msgstr "Hatch"
+
+#: ../../ms2/ms2_r2.c:1278
+msgid "Raumanzug"
+msgstr "Space suit"
+
+#: ../../ms2/ms2_r2.c:1278
+msgid "Ein zusammenfaltbarer Raumanzug."
+msgstr "A collapsible spacesuit."
+
+#: ../../ms2/ms2_r2.c:1279 ../../ms2/ms2_r2.c:1280
+msgid "Leitung"
+msgstr "Cable"
+
+#: ../../ms2/ms2_r2.c:1279
+msgid "Irgendetwas scheint hier|kaputtgegangen zu sein."
+msgstr "Something seems to|have broken here."
+
+#: ../../ms2/ms2_r2.c:1280
+msgid "Sie h„ngt lose von der Decke runter."
+msgstr "It hangs loose from the ceiling."
+
+#: ../../ms2/ms2_s.c:85
+msgid ""
+"Zur Erinnerung:|Dir ist es gelungen, aus den|Artus-Geheimbros zu fliehen."
+msgstr "Reminder:|You managed to escape from the|Artus-GmbH secret offices."
+
+#: ../../ms2/ms2_s.c:88
+msgid ""
+"Nun befindest du dich in|einem Passagierraumschiff,|das nach Axacuss City "
+"fliegt."
+msgstr "Now you are in a passenger|spaceship that|flies to Axacuss City."
+
+#: ../../ms2/ms2_s.c:91
+msgid ""
+"W„hrend des Fluges schaust du dir|das axacussanische Fernsehprogramm an.|Du "
+"stӇt auf etwas Interessantes ..."
+msgstr ""
+"During the flight, you watch the|Axacussan TV program.|You come across "
+"something interesting ..."
+
+#: ../../ms2/ms2_s.c:119
+msgid "Herzlich willkommen!"
+msgstr "Welcome!"
+
+#: ../../ms2/ms2_s.c:123
+msgid ""
+"Heute zu Gast ist Alga Lorch.|Sie wird Fragen an den Erdling|Horst Hummel "
+"stellen."
+msgstr ""
+"Alga Lorch will be present today.|She will ask questions to the Earthling|"
+"Horst Hummel."
+
+#: ../../ms2/ms2_s.c:127
+msgid "Horst wird alle Fragen|beantworten, soweit es|ihm m”glich ist."
+msgstr "Horst will answer all|questions as fully|as possible."
+
+#: ../../ms2/ms2_s.c:128
+msgid "Sie haben das Wort, Frau Lorch!"
+msgstr "You have the floor, Mrs Lorch!"
+
+#: ../../ms2/ms2_s.c:134
+msgid "Herr Hummel, hier ist meine erste Frage: ..."
+msgstr "Mr. Hummel, here is my first question: ..."
+
+#: ../../ms2/ms2_s.c:135
+msgid ""
+"Sie sind nun ein berhmter Mann auf Axacuss.|Aber sicher vermissen Sie auch "
+"Ihren Heimatplaneten."
+msgstr ""
+"You are now a famous man on Axacuss.|But surely you miss your home planet."
+
+#: ../../ms2/ms2_s.c:136
+msgid ""
+"Wenn Sie w„hlen k”nnten, wrden Sie lieber|ein normales Leben auf der Erde "
+"fhren,|oder finden Sie das Leben hier gut?"
+msgstr ""
+"If you could choose, would you prefer|to lead a normal life on Earth,|or do "
+"you find life here good?"
+
+#: ../../ms2/ms2_s.c:137
+msgid ""
+"Ehrlich gesagt finde ich es sch”n,|berhmt zu sein. Das Leben ist|"
+"aufregender als auf der Erde."
+msgstr ""
+"Honestly, I think it's nice to be|famous. Life is more exciting here|than on "
+"Earth."
+
+#: ../../ms2/ms2_s.c:138
+msgid "Auáerdem sind die Leute von der|Artus GmbH hervorragende Freunde."
+msgstr "In addition, the people of|Artus GmbH are excellent friends."
+
+#: ../../ms2/ms2_s.c:139
+msgid ""
+"Nun ja, planen Sie denn trotzdem,|irgendwann auf die Erde zurckzukehren?"
+msgstr "Well, are you still planning|to return to Earth someday?"
+
+#: ../../ms2/ms2_s.c:140
+msgid "Das kann ich Ihnen zum jetzigen|Zeitpunkt noch nicht genau sagen."
+msgstr "At this point in time,|I haven't made up my mind, yet."
+
+#: ../../ms2/ms2_s.c:141
+msgid "Aber ich versichere Ihnen, ich|werde noch eine Weile hierbleiben."
+msgstr "But I assure you,|I will stay here for a while."
+
+#: ../../ms2/ms2_s.c:142
+msgid ""
+"Aha, mich interessiert auáerdem,|ob es hier auf Axacuss etwas gibt,|das Sie "
+"besonders m”gen."
+msgstr ""
+"I see. I'm also interested in|whether there's anything here on Axacuss that "
+"you particularly like."
+
+#: ../../ms2/ms2_s.c:152
+msgid ""
+"Oh mir gef„llt der ganze Planet,|aber das Beste hier sind die|hervorragenden "
+"Artus-Zahnbrsten!"
+msgstr ""
+"Oh I like the whole planet,|but the best thing here are the|extraordinary "
+"Artus toothbrushes!"
+
+#: ../../ms2/ms2_s.c:153
+msgid "Zahnbrsten von solcher Qualit„t|gab es auf der Erde nicht."
+msgstr "Toothbrushes of such quality|do not exist on Earth."
+
+#: ../../ms2/ms2_s.c:154
+msgid "Žh, ach so."
+msgstr "Um, I see."
+
+#: ../../ms2/ms2_s.c:160
+msgid "Pl”tzlich lenkt dich eine|Lautsprecherstimme vom Fernseher ab."
+msgstr "Suddenly, a speaker's voice|distracts you from the television."
+
+#: ../../ms2/ms2_s.c:163
+msgid ""
+"\"Sehr geehrte Damen und Herren,|wir sind soeben auf dem Flughafen|von "
+"Axacuss City gelandet.\""
+msgstr ""
+"\"Ladies and Gentlemen,|We just landed at the airport|at Axacuss City.\""
+
+#: ../../ms2/ms2_s.c:166
+msgid ""
+"\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das "
+"Raumschiff! Auf Wiedersehen!\""
+msgstr "\"I hope you had a nice flight.|Please leave the spaceship! Goodbye!\""
+
+#: ../../ms2/ms2_s.c:186
+msgid ""
+"W„hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu "
+"verarbeiten."
+msgstr ""
+"While the other passengers|are disembarking, you are trying|to handle the "
+"shock."
+
+#: ../../ms2/ms2_s.c:189
+msgid ""
+"\"Ich muá beweisen, daá dieser|Roboter der falsche Horst|Hummel ist!\", "
+"denkst du."
+msgstr ""
+"\"I have to prove that this robot|is the wrong Horst|Hummel!\", you think to "
+"yourself."
+
+#: ../../ms2/ms2_s.c:192
+msgid ""
+"\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti mssen entlarvt "
+"werden!\""
+msgstr ""
+"\"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!\""


Commit: 98b3ba2d2b9426420c02acbf3c7f9c040a6ef499
    https://github.com/scummvm/scummvm/commit/98b3ba2d2b9426420c02acbf3c7f9c040a6ef499
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Remove detection of Mission Supernova 2

Changed paths:
    engines/supernova/detection.cpp


diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 974dfa6..0dc210e 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -31,7 +31,6 @@
 
 static const PlainGameDescriptor supernovaGames[] = {
 	{"msn1", "Mission Supernova 1"},
-	{"msn2", "Mission Supernova 2"},
 	{nullptr, nullptr}
 };
 
@@ -56,27 +55,6 @@ static const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE,
 		GUIO1(GUIO_NONE)
 	},
-
-	// Mission Supernova 2
-	{
-		"msn2",
-		nullptr,
-		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
-		Common::DE_DEU,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-	{
-		"msn2",
-		nullptr,
-		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
-		Common::EN_ANY,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-
 	AD_TABLE_END_MARKER
 };
 }


Commit: d8c62a0e6f5e249d231a75af9e91171000001e07
    https://github.com/scummvm/scummvm/commit/d8c62a0e6f5e249d231a75af9e91171000001e07
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Create engine skeleton for supernova 2

Changed paths:
  A engines/supernova2/configure.engine
  A engines/supernova2/detection.cpp
  A engines/supernova2/module.mk
  A engines/supernova2/supernova2.cpp
  A engines/supernova2/supernova2.h


diff --git a/engines/supernova2/configure.engine b/engines/supernova2/configure.engine
new file mode 100644
index 0000000..c935a04
--- /dev/null
+++ b/engines/supernova2/configure.engine
@@ -0,0 +1,3 @@
+# This file is included from the main "configure" script
+# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
+add_engine supernova2 "Mission Supernova 2" no
diff --git a/engines/supernova2/detection.cpp b/engines/supernova2/detection.cpp
new file mode 100644
index 0000000..396ac68
--- /dev/null
+++ b/engines/supernova2/detection.cpp
@@ -0,0 +1,212 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "base/plugins.h"
+#include "common/file.h"
+#include "common/savefile.h"
+#include "common/system.h"
+#include "graphics/thumbnail.h"
+#include "engines/advancedDetector.h"
+
+#include "supernova2/supernova2.h"
+
+static const PlainGameDescriptor supernova2Game[] = {
+	{"msn2", "Mission Supernova 2"},
+	{nullptr, nullptr}
+};
+
+namespace Supernova2 {
+static const ADGameDescription gameDescriptions[] = {
+	// Mission Supernova 2
+	{
+		"msn2",
+		nullptr,
+		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
+		Common::DE_DEU,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GUIO_NONE)
+	},
+	{
+		"msn2",
+		nullptr,
+		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GUIO_NONE)
+	},
+
+	AD_TABLE_END_MARKER
+};
+}
+
+class Supernova2MetaEngine: public AdvancedMetaEngine {
+public:
+	Supernova2MetaEngine() : AdvancedMetaEngine(Supernova2::gameDescriptions, sizeof(ADGameDescription), supernova2Game) {
+//		_singleId = "supernova";
+	}
+
+	virtual const char *getName() const {
+		return "Mission Supernova 2";
+	}
+
+	virtual const char *getOriginalCopyright() const {
+		return "Mission Supernova 2(c) 1994 Thomas and Steffen Dingel";
+	}
+
+	virtual bool hasFeature(MetaEngineFeature f) const;
+	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
+	virtual SaveStateList listSaves(const char *target) const;
+	virtual void removeSaveState(const char *target, int slot) const;
+	virtual int getMaximumSaveSlot() const {
+		return 99;
+	}
+	virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
+};
+
+bool Supernova2MetaEngine::hasFeature(MetaEngineFeature f) const {
+	switch (f) {
+	case kSupportsLoadingDuringStartup:
+		// fallthrough
+	case kSupportsListSaves:
+		// fallthrough
+	case kSupportsDeleteSave:
+		// fallthrough
+	case kSavesSupportMetaInfo:
+		// fallthrough
+	case kSavesSupportThumbnail:
+		// fallthrough
+	case kSavesSupportCreationDate:
+		// fallthrough
+	case kSavesSupportPlayTime:
+		return true;
+	default:
+		return false;
+	}
+}
+
+bool Supernova2MetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
+	if (desc) {
+		*engine = new Supernova2::Supernova2Engine(syst);
+	}
+
+	return desc != nullptr;
+}
+
+SaveStateList Supernova2MetaEngine::listSaves(const char *target) const {
+	Common::StringArray filenames;
+	Common::String pattern("msn_save.###");
+
+	filenames = g_system->getSavefileManager()->listSavefiles(pattern);
+
+	SaveStateList saveFileList;
+	for (Common::StringArray::const_iterator file = filenames.begin();
+		 file != filenames.end(); ++file) {
+		int saveSlot = atoi(file->c_str() + file->size() - 3);
+		if (saveSlot >= 0 && saveSlot <= getMaximumSaveSlot()) {
+			Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(*file);
+			if (savefile) {
+				uint saveHeader = savefile->readUint32LE();
+				if (saveHeader == SAVEGAME_HEADER) {
+					byte saveVersion = savefile->readByte();
+					if (saveVersion <= SAVEGAME_VERSION) {
+						int saveFileDescSize = savefile->readSint16LE();
+						char* saveFileDesc = new char[saveFileDescSize];
+						savefile->read(saveFileDesc, saveFileDescSize);
+						saveFileList.push_back(SaveStateDescriptor(saveSlot, saveFileDesc));
+						delete [] saveFileDesc;
+					}
+				}
+				delete savefile;
+			}
+		}
+	}
+
+	Common::sort(saveFileList.begin(), saveFileList.end(), SaveStateDescriptorSlotComparator());
+	return saveFileList;
+}
+
+void Supernova2MetaEngine::removeSaveState(const char *target, int slot) const {
+	Common::String filename = Common::String::format("ms2_save.%03d", slot);
+	g_system->getSavefileManager()->removeSavefile(filename);
+}
+
+SaveStateDescriptor Supernova2MetaEngine::querySaveMetaInfos(const char *target, int slot) const {
+	Common::String fileName = Common::String::format("ms2_save.%03d", slot);
+	Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(fileName);
+
+	if (savefile) {
+		uint saveHeader = savefile->readUint32LE();
+		if (saveHeader != SAVEGAME_HEADER) {
+			delete savefile;
+			return SaveStateDescriptor();
+		}
+		byte saveVersion = savefile->readByte();
+		if (saveVersion > SAVEGAME_VERSION){
+			delete savefile;
+			return SaveStateDescriptor();
+		}
+
+		int descriptionSize = savefile->readSint16LE();
+		char* description = new char[descriptionSize];
+		savefile->read(description, descriptionSize);
+		SaveStateDescriptor desc(slot, description);
+		delete [] description;
+
+		uint32 saveDate = savefile->readUint32LE();
+		int day = (saveDate >> 24) & 0xFF;
+		int month = (saveDate >> 16) & 0xFF;
+		int year = saveDate & 0xFFFF;
+		desc.setSaveDate(year, month, day);
+
+		uint16 saveTime = savefile->readUint16LE();
+		int hour = (saveTime >> 8) & 0xFF;
+		int minutes = saveTime & 0xFF;
+		desc.setSaveTime(hour, minutes);
+
+		uint32 playTime =savefile->readUint32LE();
+		desc.setPlayTime(playTime * 1000);
+
+		if (Graphics::checkThumbnailHeader(*savefile)) {
+			Graphics::Surface *thumbnail;
+			if (!Graphics::loadThumbnail(*savefile, thumbnail)) {
+				delete savefile;
+				return SaveStateDescriptor();
+			}
+			desc.setThumbnail(thumbnail);
+		}
+
+		delete savefile;
+
+		return desc;
+	}
+
+	return SaveStateDescriptor();
+}
+
+
+#if PLUGIN_ENABLED_DYNAMIC(SUPERNOVA2)
+REGISTER_PLUGIN_DYNAMIC(SUPERNOVA2, PLUGIN_TYPE_ENGINE, Supernova2MetaEngine);
+#else
+REGISTER_PLUGIN_STATIC(SUPERNOVA2, PLUGIN_TYPE_ENGINE, Supernova2MetaEngine);
+#endif
diff --git a/engines/supernova2/module.mk b/engines/supernova2/module.mk
new file mode 100644
index 0000000..c6ebe15
--- /dev/null
+++ b/engines/supernova2/module.mk
@@ -0,0 +1,16 @@
+MODULE := engines/supernova2
+
+MODULE_OBJS := \
+	detection.o \
+	supernova2.o
+
+MODULE_DIRS += \
+	engines/supernova2
+
+# This module can be built as a plugin
+ifeq ($(ENABLE_SUPERNOVA2), DYNAMIC_PLUGIN)
+PLUGIN := 1
+endif
+
+# Include common rules
+include $(srcdir)/rules.mk
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
new file mode 100644
index 0000000..da14dc4
--- /dev/null
+++ b/engines/supernova2/supernova2.cpp
@@ -0,0 +1,85 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/config-manager.h"
+#include "common/debug.h"
+#include "common/debug-channels.h"
+#include "common/endian.h"
+#include "common/error.h"
+#include "common/events.h"
+#include "common/file.h"
+#include "common/fs.h"
+#include "common/memstream.h"
+#include "common/savefile.h"
+#include "common/str.h"
+#include "common/system.h"
+#include "common/translation.h"
+#include "engines/util.h"
+#include "graphics/cursorman.h"
+#include "graphics/surface.h"
+#include "graphics/screen.h"
+#include "graphics/palette.h"
+#include "graphics/thumbnail.h"
+#include "gui/saveload.h"
+
+#include "supernova2/supernova2.h"
+
+
+namespace Supernova2 {
+
+Supernova2Engine::Supernova2Engine(OSystem *syst)
+	: Engine(syst)
+	, _allowLoadGame(true)
+	, _allowSaveGame(true)
+	, _sleepAutoSave(nullptr)
+	, _sleepAuoSaveVersion(-1)
+	, _delay(33)
+	, _textSpeed(1) {
+	if (ConfMan.hasKey("textspeed"))
+		_textSpeed = ConfMan.getInt("textspeed");
+
+	DebugMan.addDebugChannel(1 , "general", "Supernova 2 general debug channel");
+}
+
+Supernova2Engine::~Supernova2Engine() {
+	DebugMan.clearAllDebugChannels();
+
+	delete _sleepAutoSave;
+}
+
+Common::Error Supernova2Engine::run() {
+	init();
+
+	while (!shouldQuit()) {
+		uint32 start = _system->getMillis();
+		int end = _delay - (_system->getMillis() - start);
+		if (end > 0)
+			_system->delayMillis(end);
+	}
+
+	return Common::kNoError;
+}
+
+void Supernova2Engine::init() {
+}
+
+}
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
new file mode 100644
index 0000000..2301f63
--- /dev/null
+++ b/engines/supernova2/supernova2.h
@@ -0,0 +1,81 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA_SUPERNOVA2_H
+#define SUPERNOVA_SUPERNOVA2_H
+
+#include "common/array.h"
+#include "common/events.h"
+#include "common/random.h"
+#include "common/scummsys.h"
+#include "engines/engine.h"
+#include "common/file.h"
+
+namespace Common {
+	class MemoryReadWriteStream;
+}
+
+namespace Supernova2 {
+
+#define SAVEGAME_HEADER MKTAG('M','S','N','2')
+#define SAVEGAME_VERSION 9
+
+#define SUPERNOVA2_DAT "supernova2.dat"
+#define SUPERNOVA2_DAT_VERSION 1
+
+class GuiElement;
+
+class Supernova2Engine : public Engine {
+public:
+	explicit Supernova2Engine(OSystem *syst);
+	~Supernova2Engine();
+
+	virtual Common::Error run();
+
+	bool _allowLoadGame;
+	bool _allowSaveGame;
+	Common::StringArray _gameStrings;
+	Common::String _nullString;
+	int _sleepAuoSaveVersion;
+	Common::MemoryReadWriteStream* _sleepAutoSave;
+
+	uint _delay;
+	int  _textSpeed;
+
+	Common::Error loadGameStrings();
+	void init();
+	bool loadGame(int slot);
+	bool saveGame(int slot, const Common::String &description);
+	bool serialize(Common::WriteStream *out);
+	bool deserialize(Common::ReadStream *in, int version);
+	bool quitGameDialog();
+	void errorTempSave(bool saving);
+	void setTextSpeed();
+	const Common::String &getGameString(int idx) const;
+	void setGameString(int idx, const Common::String &string);
+
+	// forwarding calls
+};
+
+}
+
+#endif


Commit: 4c03331d07f1a638933775da1eb0e4b1824353b8
    https://github.com/scummvm/scummvm/commit/4c03331d07f1a638933775da1eb0e4b1824353b8
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: add loading of game strings

Changed paths:
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index da14dc4..3d57eeb 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -40,6 +40,7 @@
 #include "graphics/palette.h"
 #include "graphics/thumbnail.h"
 #include "gui/saveload.h"
+#include <stdio.h>
 
 #include "supernova2/supernova2.h"
 
@@ -68,18 +69,116 @@ Supernova2Engine::~Supernova2Engine() {
 
 Common::Error Supernova2Engine::run() {
 	init();
+	int i = 0;
 
 	while (!shouldQuit()) {
 		uint32 start = _system->getMillis();
+		Common::String str = getGameString(i);
+		if (str == _nullString)
+			break;
 		int end = _delay - (_system->getMillis() - start);
 		if (end > 0)
 			_system->delayMillis(end);
+		i++;
 	}
 
 	return Common::kNoError;
 }
 
 void Supernova2Engine::init() {
+	Graphics::ModeList modes;
+	modes.push_back(Graphics::Mode(320, 200));
+	modes.push_back(Graphics::Mode(640, 480));
+	initGraphicsModes(modes);
+	initGraphics(320, 200);
+
+	Common::Error status = loadGameStrings();
+	if (status.getCode() != Common::kNoError)
+		error("Failed reading game strings");
+
+	setTotalPlayTime(0);
+}
+
+Common::Error Supernova2Engine::loadGameStrings() {
+	Common::String cur_lang = ConfMan.get("language");
+	Common::String string_id("TEXT");
+
+	// Note: we don't print any warning or errors here if we cannot find the file
+	// or the format is not as expected. We will get those warning when reading the
+	// strings anyway (actually the engine will even refuse to start).
+	Common::File f;
+	if (!f.open(SUPERNOVA2_DAT)) {
+		GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA2_DAT);
+		return Common::kReadingFailed;
+	}
+
+	// Validate the data file header
+	char id[5], lang[5];
+	id[4] = lang[4] = '\0';
+	f.read(id, 3);
+	if (strncmp(id, "MS2", 3) != 0) {
+		GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA2_DAT);
+		return Common::kReadingFailed;
+	}
+
+	int version = f.readByte();
+	if (version != SUPERNOVA2_DAT_VERSION) {
+		GUIErrorMessageFormat(
+			_("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+			SUPERNOVA2_DAT, SUPERNOVA2_DAT_VERSION, version);
+		return Common::kReadingFailed;
+	}
+
+	while (!f.eos()) {
+		f.read(id, 4);
+		f.read(lang, 4);
+		uint32 size = f.readUint32LE();
+		if (f.eos())
+			break;
+		if (string_id == id && cur_lang == lang) {
+			while (size > 0) {
+				Common::String s;
+				char ch;
+				while ((ch = (char)f.readByte()) != '\0')
+					s += ch;
+				_gameStrings.push_back(s);
+				size -= s.size() + 1;
+			}
+			return Common::kNoError;
+		} else
+			f.skip(size);
+	}
+
+	Common::Language l = Common::parseLanguage(cur_lang);
+	GUIErrorMessageFormat(_("Unable to locate the text for %s language in '%s' engine data file."), Common::getLanguageDescription(l), SUPERNOVA2_DAT);
+	return Common::kReadingFailed;
+}
+
+const Common::String &Supernova2Engine::getGameString(int idx) const {
+	if (idx < 0 || idx >= (int)_gameStrings.size())
+		return _nullString;
+	return _gameStrings[idx];
+}
+
+void Supernova2Engine::setGameString(int idx, const Common::String &string) {
+	if (idx < 0)
+		return;
+	while ((int)_gameStrings.size() <= idx)
+		_gameStrings.push_back(Common::String());
+	_gameStrings[idx] = string;
+}
+
+bool Supernova2Engine::hasFeature(EngineFeature f) const {
+	switch (f) {
+	case kSupportsRTL:
+		return true;
+	case kSupportsLoadingDuringRuntime:
+		return true;
+	case kSupportsSavingDuringRuntime:
+		return true;
+	default:
+		return false;
+	}
 }
 
 }
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index 2301f63..ee721f5 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -50,6 +50,7 @@ public:
 	~Supernova2Engine();
 
 	virtual Common::Error run();
+	virtual bool hasFeature(EngineFeature f) const;
 
 	bool _allowLoadGame;
 	bool _allowSaveGame;


Commit: 7e2ca31be085ab3336e5eff38e46cca60fea6a2a
    https://github.com/scummvm/scummvm/commit/7e2ca31be085ab3336e5eff38e46cca60fea6a2a
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add gamemanager skeleton

Changed paths:
  A engines/supernova2/console.cpp
  A engines/supernova2/console.h
  A engines/supernova2/state.cpp
  A engines/supernova2/state.h
    engines/supernova2/module.mk
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/console.cpp b/engines/supernova2/console.cpp
new file mode 100644
index 0000000..d6e805f
--- /dev/null
+++ b/engines/supernova2/console.cpp
@@ -0,0 +1,37 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "gui/debugger.h"
+
+#include "supernova2/supernova2.h"
+#include "supernova2/state.h"
+#include "supernova2/console.h"
+
+namespace Supernova2 {
+
+Console::Console(Supernova2Engine *vm, GameManager *gm)
+{
+	_vm = vm;
+	_gm = gm;
+}
+
+}
diff --git a/engines/supernova2/console.h b/engines/supernova2/console.h
new file mode 100644
index 0000000..fd7cfe0
--- /dev/null
+++ b/engines/supernova2/console.h
@@ -0,0 +1,49 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_CONSOLE_H
+#define SUPERNOVA2_CONSOLE_H
+
+#include "gui/debugger.h"
+
+namespace Supernova2 {
+
+class Supernova2Engine;
+class GameManager;
+
+enum {
+	kDebugGeneral = 1 << 0
+};
+
+class Console : public GUI::Debugger {
+public:
+	Console(Supernova2::Supernova2Engine *vm, Supernova2::GameManager *gm);
+	virtual ~Console() {}
+
+private:
+	Supernova2Engine *_vm;
+	GameManager *_gm;
+};
+
+}
+
+#endif
diff --git a/engines/supernova2/module.mk b/engines/supernova2/module.mk
index c6ebe15..541008e 100644
--- a/engines/supernova2/module.mk
+++ b/engines/supernova2/module.mk
@@ -2,6 +2,8 @@ MODULE := engines/supernova2
 
 MODULE_OBJS := \
 	detection.o \
+	state.o \
+	console.o \
 	supernova2.o
 
 MODULE_DIRS += \
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
new file mode 100644
index 0000000..357a166
--- /dev/null
+++ b/engines/supernova2/state.cpp
@@ -0,0 +1,78 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "graphics/cursorman.h"
+#include "graphics/palette.h"
+#include "gui/message.h"
+
+//#include "supernova2/screen.h"
+#include "supernova2/supernova2.h"
+#include "supernova2/state.h"
+
+namespace Supernova2 {
+
+
+//StringId GameManager::guiCommands[] = {
+//	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+//	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
+//};
+
+//StringId GameManager::guiStatusCommands[] = {
+//	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
+//	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
+//};
+
+GameManager::GameManager(Supernova2Engine *vm)
+	: _vm(vm)
+    , _mouseClickType(Common::EVENT_INVALID) {
+		initState();
+}
+
+GameManager::~GameManager() {
+}
+
+void GameManager::initState() {
+	_guiEnabled = true;
+	_animationEnabled = true;
+	_mouseClicked = false;
+	_keyPressed = false;
+	_mouseX = -1;
+	_mouseY = -1;
+	_inventoryScroll = 0;
+	_timerPaused = 0;
+	_timePaused = false;
+	_messageDuration = 0;
+	_animationTimer = 0;
+
+	_currentSentence = -1;
+	for (int i = 0 ; i < 6 ; ++i) {
+		_sentenceNumber[i] = -1;
+//		_texts[i] = kNoString;
+		_rows[i] = 0;
+		_rowsStart[i] = 0;
+	}
+
+	_prevImgId = 0;
+}
+}
+
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
new file mode 100644
index 0000000..5c8cec4
--- /dev/null
+++ b/engines/supernova2/state.h
@@ -0,0 +1,74 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_STATE_H
+#define SUPERNOVA2_STATE_H
+
+#include "common/events.h"
+#include "common/rect.h"
+#include "common/keyboard.h"
+//#include "supernova/rooms.h"
+//#include "supernova/sound.h"
+
+namespace Supernova2 {
+
+const int32 kMaxTimerValue = 0x7FFFFFFF;
+
+struct GameState {
+};
+
+class GameManager {
+public:
+	GameManager(Supernova2Engine *vm);
+	~GameManager();
+
+	Supernova2Engine *_vm;
+	Common::KeyState _key;
+	Common::EventType _mouseClickType;
+	bool _mouseClicked;
+	bool _keyPressed;
+	int _mouseX;
+	int _mouseY;
+	GameState _state;
+	bool _guiEnabled;
+	bool _animationEnabled;
+	uint _timePaused;
+	bool _timerPaused;
+	int32 _messageDuration;
+	int32 _animationTimer;
+	int _inventoryScroll;
+	int _exitList[25];
+	// Dialog
+	int _currentSentence;
+	int _sentenceNumber[6];
+	byte _rows[6];
+	byte _rowsStart[6];
+
+	void initState();
+
+private:
+	int _prevImgId;
+};
+
+}
+
+#endif // SUPERNOVA_STATE_H
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 3d57eeb..5a2acfb 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -40,15 +40,17 @@
 #include "graphics/palette.h"
 #include "graphics/thumbnail.h"
 #include "gui/saveload.h"
-#include <stdio.h>
 
 #include "supernova2/supernova2.h"
+#include "supernova2/state.h"
 
 
 namespace Supernova2 {
 
 Supernova2Engine::Supernova2Engine(OSystem *syst)
 	: Engine(syst)
+	, _console(nullptr)
+	, _gm(nullptr)
 	, _allowLoadGame(true)
 	, _allowSaveGame(true)
 	, _sleepAutoSave(nullptr)
@@ -64,22 +66,21 @@ Supernova2Engine::Supernova2Engine(OSystem *syst)
 Supernova2Engine::~Supernova2Engine() {
 	DebugMan.clearAllDebugChannels();
 
+	delete _console;
+	delete _gm;
 	delete _sleepAutoSave;
 }
 
 Common::Error Supernova2Engine::run() {
 	init();
-	int i = 0;
 
 	while (!shouldQuit()) {
 		uint32 start = _system->getMillis();
-		Common::String str = getGameString(i);
-		if (str == _nullString)
-			break;
+		_console->onFrame();
+		_system->updateScreen();
 		int end = _delay - (_system->getMillis() - start);
 		if (end > 0)
 			_system->delayMillis(end);
-		i++;
 	}
 
 	return Common::kNoError;
@@ -96,6 +97,8 @@ void Supernova2Engine::init() {
 	if (status.getCode() != Common::kNoError)
 		error("Failed reading game strings");
 
+	_gm = new GameManager(this);
+	_console = new Console(this, _gm);
 	setTotalPlayTime(0);
 }
 
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index ee721f5..043c5cd 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -30,6 +30,8 @@
 #include "engines/engine.h"
 #include "common/file.h"
 
+#include "supernova2/console.h"
+
 namespace Common {
 	class MemoryReadWriteStream;
 }
@@ -43,6 +45,8 @@ namespace Supernova2 {
 #define SUPERNOVA2_DAT_VERSION 1
 
 class GuiElement;
+class console;
+class GameManager;
 
 class Supernova2Engine : public Engine {
 public:
@@ -52,6 +56,8 @@ public:
 	virtual Common::Error run();
 	virtual bool hasFeature(EngineFeature f) const;
 
+	GameManager *_gm;
+	Console *_console;
 	bool _allowLoadGame;
 	bool _allowSaveGame;
 	Common::StringArray _gameStrings;


Commit: cf2583f14277962d4bb7e46a158677440f0e8f83
    https://github.com/scummvm/scummvm/commit/cf2583f14277962d4bb7e46a158677440f0e8f83
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Finished copying of engine skeleton.

Changed paths:
  A engines/supernova2/graphics.cpp
  A engines/supernova2/graphics.h
  A engines/supernova2/imageid.h
  A engines/supernova2/ms2_def.h
  A engines/supernova2/resman.cpp
  A engines/supernova2/resman.h
  A engines/supernova2/rooms.cpp
  A engines/supernova2/rooms.h
  A engines/supernova2/screen.cpp
  A engines/supernova2/screen.h
  A engines/supernova2/screenstatic.cpp
    engines/supernova2/module.mk
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp
new file mode 100644
index 0000000..3ea310a
--- /dev/null
+++ b/engines/supernova2/graphics.cpp
@@ -0,0 +1,276 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/algorithm.h"
+#include "common/file.h"
+#include "common/stream.h"
+#include "common/system.h"
+#include "common/config-manager.h"
+#include "graphics/palette.h"
+#include "graphics/surface.h"
+
+#include "supernova2/graphics.h"
+#include "supernova2/ms2_def.h"
+#include "supernova2/screen.h"
+#include "supernova2/supernova2.h"
+
+namespace Supernova2 {
+
+MS2Image::MS2Image() {
+	_palette = nullptr;
+	_encodedImage = nullptr;
+	_filenumber = -1;
+	_pitch = 0;
+	_numSections = 0;
+	_numClickFields = 0;
+
+	for (int i = 0; i < kMaxSections; ++i) {
+		_section[i].x1 = 0;
+		_section[i].x2 = 0;
+		_section[i].y1 = 0;
+		_section[i].y2 = 0;
+		_section[i].next = 0;
+		_section[i].addressLow = 0xFFFF;
+		_section[i].addressHigh = 0xFF;
+	}
+
+	for (int i = 0; i < kMaxClickFields; ++i) {
+		_clickField[i].x1 = 0;
+		_clickField[i].x2 = 0;
+		_clickField[i].y1 = 0;
+		_clickField[i].y2 = 0;
+		_clickField[i].next = 0;
+	}
+}
+
+MS2Image::~MS2Image() {
+	destroy();
+}
+
+bool MS2Image::init(int filenumber) {
+	Common::File file;
+	if (!file.open(Common::String::format("ms2_data.%03d", filenumber))) {
+		warning("Image data file ms2_data.%03d could not be read!", filenumber);
+		return false;
+	}
+
+	_filenumber = filenumber;
+	loadStream(file);
+
+	return true;
+}
+
+bool MS2Image::loadFromEngineDataFile() {
+	//TODO
+	/*Common::String name;
+	if (_filenumber == 1)
+		name = "IMG1";
+	else if (_filenumber == 2)
+		name = "IMG2";
+	else
+		return false;
+
+	Common::String cur_lang = ConfMan.get("language");
+
+	// Note: we don't print any warning or errors here if we cannot find the file
+	// or the format is not as expected. We will get those warning when reading the
+	// strings anyway (actually the engine will even refuse to start).
+	Common::File f;
+	if (!f.open(SUPERNOVA_DAT))
+		return false;
+
+	char id[5], lang[5];
+	id[4] = lang[4] = '\0';
+	f.read(id, 3);
+	if (strncmp(id, "MSN", 3) != 0)
+		return false;
+	int version = f.readByte();
+	if (version != SUPERNOVA_DAT_VERSION)
+		return false;
+
+	while (!f.eos()) {
+		f.read(id, 4);
+		f.read(lang, 4);
+		uint32 size = f.readUint32LE();
+		if (f.eos())
+			break;
+		if (name == id && cur_lang == lang) {
+			return f.read(_encodedImage, size) == size;
+		} else
+			f.skip(size);
+	}*/
+
+	return false;
+}
+
+bool MS2Image::loadStream(Common::SeekableReadStream &stream) {
+	destroy();
+
+	uint size = 0;
+	size  = (stream.readUint16LE() + 0xF) >> 4;
+	size |= (stream.readUint16LE() & 0xF) << 12;
+	size += 0x70;    // zus_paragraph
+	size *= 16;      // a paragraph is 16 bytes
+	_encodedImage = new byte[size];
+
+	_palette = new byte[717];
+	g_system->getPaletteManager()->grabPalette(_palette, 16, 239);
+
+	byte pal_diff;
+	byte flag = stream.readByte();
+	if (flag == 0) {
+		pal_diff = 0;
+		_palette[141] = 0xE0;
+		_palette[142] = 0xE0;
+		_palette[143] = 0xE0;
+	} else {
+		pal_diff = 1;
+		for (int i = flag * 3; i != 0; --i) {
+			_palette[717 - i] = stream.readByte() << 2;
+		}
+	}
+
+	_numSections = stream.readByte();
+	for (uint i = 0; i < kMaxSections; ++i) {
+		_section[i].addressHigh = 0xff;
+		_section[i].addressLow = 0xffff;
+		_section[i].x2 = 0;
+		_section[i].next = 0;
+	}
+	for (int i = 0; i < _numSections; ++i) {
+		_section[i].x1 = stream.readUint16LE();
+		_section[i].x2 = stream.readUint16LE();
+		_section[i].y1 = stream.readByte();
+		_section[i].y2 = stream.readByte();
+		_section[i].next = stream.readByte();
+		_section[i].addressLow = stream.readUint16LE();
+		_section[i].addressHigh = stream.readByte();
+	}
+
+	_numClickFields = stream.readByte();
+	for (int i = 0; i < _numClickFields; ++i) {
+		_clickField[i].x1 = stream.readUint16LE();
+		_clickField[i].x2 = stream.readUint16LE();
+		_clickField[i].y1 = stream.readByte();
+		_clickField[i].y2 = stream.readByte();
+		_clickField[i].next = stream.readByte();
+	}
+	for (int i = _numClickFields; i < kMaxClickFields; ++i) {
+		_clickField[i].x1 = 0;
+		_clickField[i].x2 = 0;
+		_clickField[i].y1 = 0;
+		_clickField[i].y2 = 0;
+		_clickField[i].next = 0;
+	}
+
+	// Images may be in the engine data file. So first try to read
+	// it from there.
+	if (!loadFromEngineDataFile()) {
+		// Load the image from the stream
+		byte zwCodes[256] = {0};
+		byte numRepeat = stream.readByte();
+		byte numZw = stream.readByte();
+		stream.read(zwCodes, numZw);
+		numZw += numRepeat;
+
+		byte input = 0;
+		uint i = 0;
+
+		while (stream.read(&input, 1)) {
+			if (input < numRepeat) {
+				++input;
+				byte value = stream.readByte();
+				for (--value; input > 0; --input) {
+					_encodedImage[i++] = value;
+				}
+			} else if (input < numZw) {
+				input = zwCodes[input - numRepeat];
+				--input;
+				_encodedImage[i++] = input;
+				_encodedImage[i++] = input;
+			} else {
+				input -= pal_diff;
+				_encodedImage[i++] = input;
+			}
+		}
+	}
+
+	loadSections();
+
+	return true;
+}
+
+bool MS2Image::loadSections() {
+	bool isNewspaper = false;
+	int imageWidth = isNewspaper ? 640 : 320;
+	int imageHeight = isNewspaper ? 480 : 200;
+	_pitch = imageWidth;
+
+	for (int section = 0; section < _numSections; ++section) {
+		Graphics::Surface *surface = new Graphics::Surface;
+		_sectionSurfaces.push_back(surface);
+
+		if (isNewspaper) {
+			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
+			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
+				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
+			}
+		} else {
+			uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
+			if (offset == kInvalidAddress || _section[section].x2 == 0) {
+				return false;
+			}
+			int width = _section[section].x2 - _section[section].x1 + 1;
+			int height = _section[section].y2 - _section[section].y1 + 1;
+			surface->create(width, height, g_system->getScreenFormat());
+			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+			Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels);
+		}
+	}
+
+	return true;
+}
+
+void MS2Image::destroy() {
+	if (_palette) {
+		delete[] _palette;
+		_palette = nullptr;
+	}
+	if (_encodedImage) {
+		delete[] _encodedImage;
+		_encodedImage = nullptr;
+	}
+	for (Common::Array<Graphics::Surface *>::iterator it = _sectionSurfaces.begin();
+		 it != _sectionSurfaces.end(); ++it) {
+		(*it)->free();
+	}
+}
+
+}
diff --git a/engines/supernova2/graphics.h b/engines/supernova2/graphics.h
new file mode 100644
index 0000000..4559900
--- /dev/null
+++ b/engines/supernova2/graphics.h
@@ -0,0 +1,87 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_GRAPHICS_H
+#define SUPERNOVA2_GRAPHICS_H
+
+#include "common/scummsys.h"
+#include "image/image_decoder.h"
+
+namespace Common {
+class SeekableReadStream;
+}
+
+namespace Graphics {
+struct Surface;
+}
+
+namespace Supernova2 {
+
+class MS2Image : public Image::ImageDecoder {
+public:
+	MS2Image();
+	virtual ~MS2Image();
+
+	virtual void destroy();
+	virtual bool loadStream(Common::SeekableReadStream &stream);
+	virtual const Graphics::Surface *getSurface() const { return _sectionSurfaces[0]; }
+	virtual const byte *getPalette() const { return _palette; }
+
+	bool init(int filenumber);
+
+	static const int kMaxSections = 50;
+	static const int kMaxClickFields = 80;
+	static const uint32 kInvalidAddress = 0x00FFFFFF;
+
+	int _filenumber;
+	int _pitch;
+	int _numSections;
+	int _numClickFields;
+	Common::Array<Graphics::Surface *> _sectionSurfaces;
+	byte *_palette;
+	byte *_encodedImage;
+
+	struct Section {
+		int16  x1;
+		int16  x2;
+		byte   y1;
+		byte   y2;
+		byte   next;
+		uint16 addressLow;
+		byte   addressHigh;
+	} _section[kMaxSections];
+
+	struct ClickField {
+		int16  x1;
+		int16  x2;
+		byte   y1;
+		byte   y2;
+		byte   next;
+	} _clickField[kMaxClickFields];
+
+private:
+	bool loadFromEngineDataFile();
+	bool loadSections();
+};
+
+}
+#endif
diff --git a/engines/supernova2/imageid.h b/engines/supernova2/imageid.h
new file mode 100644
index 0000000..6a284e0
--- /dev/null
+++ b/engines/supernova2/imageid.h
@@ -0,0 +1,33 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef SUPERNOVA2_IMAGEID_H
+#define SUPERNOVA2_IMAGEID_H
+
+namespace Supernova2 {
+
+enum ImageId {
+};
+
+}
+
+#endif
diff --git a/engines/supernova2/module.mk b/engines/supernova2/module.mk
index 541008e..f62af5f 100644
--- a/engines/supernova2/module.mk
+++ b/engines/supernova2/module.mk
@@ -3,6 +3,10 @@ MODULE := engines/supernova2
 MODULE_OBJS := \
 	detection.o \
 	state.o \
+	graphics.o \
+	resman.o \
+	rooms.o \
+	screen.o \
 	console.o \
 	supernova2.o
 
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
new file mode 100644
index 0000000..4912850
--- /dev/null
+++ b/engines/supernova2/ms2_def.h
@@ -0,0 +1,170 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_MS2_DEF_H
+#define SUPERNOVA2_MS2_DEF_H
+
+#include "common/scummsys.h"
+
+namespace Supernova2 {
+
+const int kTextSpeed[] = {19, 14, 10, 7, 4};
+const int kMsecPerTick = 55;
+
+const int kMaxSection = 40;
+const int kMaxDialog = 2;
+const int kMaxObject = 25;
+const int kMaxCarry = 30;
+
+const int kSleepAutosaveSlot = 999;
+
+const byte kShownFalse = 0;
+const byte kShownTrue = 1;
+
+enum MessagePosition {
+	kMessageNormal,
+	kMessageLeft,
+	kMessageRight,
+	kMessageCenter,
+	kMessageTop
+};
+
+enum ObjectType {
+	NULLTYPE    =      0,
+	TAKE        =      1,
+	OPENABLE    =      2,
+	OPENED      =      4,
+	CLOSED      =      8,
+	EXIT        =     16,
+	PRESS       =     32,
+	COMBINABLE  =     64,
+	CARRIED     =    128,
+	UNNECESSARY =    256,
+	WORN        =    512,
+	TALK        =   1024,
+	OCCUPIED    =   2048,
+	CAUGHT      =   4096
+};
+typedef uint16 ObjectTypes;
+
+enum Action {
+	ACTION_WALK,
+	ACTION_LOOK,
+	ACTION_TAKE,
+	ACTION_OPEN,
+	ACTION_CLOSE,
+	ACTION_PRESS,
+	ACTION_PULL,
+	ACTION_USE,
+	ACTION_TALK,
+	ACTION_GIVE
+};
+
+enum RoomId {
+	INTRO, OUTRO,
+	NULLROOM
+};
+
+enum ObjectId {
+	INVALIDOBJECT = -1,
+	NULLOBJECT = 0
+};
+
+enum StringId {
+	kNoString = -1, kStringDefaultDescription
+};
+
+ObjectType operator|(ObjectType a, ObjectType b);
+ObjectType operator&(ObjectType a, ObjectType b);
+ObjectType operator^(ObjectType a, ObjectType b);
+ObjectType &operator|=(ObjectType &a, ObjectType b);
+ObjectType &operator&=(ObjectType &a, ObjectType b);
+ObjectType &operator^=(ObjectType &a, ObjectType b);
+
+struct Object {
+	Object()
+		: _name(kNoString)
+		, _description(kStringDefaultDescription)
+		, _id(INVALIDOBJECT)
+		, _roomId(NULLROOM)
+		, _type(NULLTYPE)
+		, _click(0)
+		, _click2(0)
+		, _section(0)
+		, _exitRoom(NULLROOM)
+		, _direction(0)
+	{}
+	Object(byte roomId, StringId name, StringId description, ObjectId id, ObjectType type,
+		   byte click, byte click2, byte section = 0, RoomId exitRoom = NULLROOM, byte direction = 0)
+		: _name(name)
+		, _description(description)
+		, _id(id)
+		, _roomId(roomId)
+		, _type(type)
+		, _click(click)
+		, _click2(click2)
+		, _section(section)
+		, _exitRoom(exitRoom)
+		, _direction(direction)
+	{}
+
+	void resetProperty(ObjectType type = NULLTYPE) {
+		_type = type;
+	}
+
+	void setProperty(ObjectType type) {
+		_type |= type;
+	}
+
+	void disableProperty(ObjectType type) {
+		_type &= ~type;
+	}
+
+	bool hasProperty(ObjectType type) const {
+		return _type & type;
+	}
+
+	static bool combine(Object &obj1, Object &obj2, ObjectId id1, ObjectId id2) {
+		if (obj1.hasProperty(COMBINABLE))
+			return (((obj1._id == id1) && (obj2._id == id2)) ||
+					((obj1._id == id2) && (obj2._id == id1)));
+		else
+			return false;
+	}
+
+	byte _roomId;
+	StringId _name;
+	StringId _description;
+	ObjectId _id;
+	ObjectTypes _type;
+	byte _click;
+	byte _click2;
+	byte _section;
+	RoomId _exitRoom;
+	byte _direction;
+};
+
+#define ticksToMsec(x) (x * kMsecPerTick)
+
+}
+
+#endif // SUPERNOVA2_MS2_DEF_H
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
new file mode 100644
index 0000000..259d279
--- /dev/null
+++ b/engines/supernova2/resman.cpp
@@ -0,0 +1,405 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "audio/audiostream.h"
+#include "audio/decoders/raw.h"
+#include "audio/mixer.h"
+#include "audio/mods/protracker.h"
+#include "common/memstream.h"
+#include "common/system.h"
+#include "graphics/cursorman.h"
+#include "graphics/palette.h"
+
+#include "supernova2/graphics.h"
+#include "supernova2/resman.h"
+#include "supernova2/screen.h"
+#include "supernova2/supernova2.h"
+
+namespace Supernova2 {
+
+struct AudioInfo {
+	int _filenumber;
+	int _offsetStart;
+	int _offsetEnd;
+};
+
+//static Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
+
+/*static const AudioInfo audioInfo[kAudioNumSamples] = {
+	{44,     0,    -1},
+	{45,     0,    -1},
+	{46,     0,  2510},
+	{46,  2510,  4020},
+	{46,  4020,    -1},
+	{47,     0, 24010},
+	{47, 24010,    -1},
+	{48,     0,  2510},
+	{48,  2510, 10520},
+	{48, 10520, 13530},
+	{48, 13530,    -1},
+	{50,     0, 12786},
+	{50, 12786,    -1},
+	{51,     0,    -1},
+	{53,     0,    -1},
+	{54,     0,  8010},
+	{54,  8010, 24020},
+	{54, 24020, 30030},
+	{54, 30030, 31040},
+	{54, 31040,    -1}
+};*/
+
+static const byte mouseNormal[64] = {
+	0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
+	0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
+	0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
+	0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
+
+	0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
+	0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
+	0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
+	0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
+};
+
+static const byte mouseWait[64] = {
+	0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
+	0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
+	0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
+	0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+
+	0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
+	0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
+	0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
+	0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
+};
+
+
+ResourceManager::ResourceManager()
+	: _audioRate(11931) {
+	//initSoundFiles();
+	initGraphics();
+}
+
+//TODO
+/*void ResourceManager::initSoundFiles() {
+	// Sound
+	// Note:
+	//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
+	//     where SS SS (LE uint16) is the size of the sound sample + 2
+	//   - samples end with a footer of 4 bytes: 00 00
+	// Skip those in the buffer
+	Common::File file;
+
+	for (int i = 0; i < kAudioNumSamples; ++i) {
+		if (!file.open(Common::String::format("msn_data.%03d", audioInfo[i]._filenumber))) {
+			error("File %s could not be read!", file.getName());
+		}
+
+		int length = 0;
+		byte *buffer = nullptr;
+
+		if (audioInfo[i]._offsetEnd == -1) {
+			file.seek(0, SEEK_END);
+			length = file.pos() - audioInfo[i]._offsetStart - 10;
+		} else {
+			length = audioInfo[i]._offsetEnd - audioInfo[i]._offsetStart - 10;
+		}
+		buffer = new byte[length];
+		file.seek(audioInfo[i]._offsetStart + 6);
+		file.read(buffer, length);
+		file.close();
+
+		byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
+		_soundSamples[i].reset(Audio::makeRawStream(buffer, length, _audioRate,
+													streamFlag, DisposeAfterUse::YES));
+	}
+
+	_musicIntroBuffer.reset(convertToMod("msn_data.052"));
+	_musicOutroBuffer.reset(convertToMod("msn_data.049"));
+}*/
+
+void ResourceManager::initGraphics() {
+	Screen::initPalette();
+	initCursorGraphics();
+	initImages();
+}
+
+void ResourceManager::initCursorGraphics() {
+	const uint16 *bufferNormal = reinterpret_cast<const uint16 *>(mouseNormal);
+	const uint16 *bufferWait = reinterpret_cast<const uint16 *>(mouseWait);
+	for (uint i = 0; i < sizeof(mouseNormal) / 4; ++i) {
+		for (uint bit = 0; bit < 16; ++bit) {
+			uint mask = 0x8000 >> bit;
+			uint bitIndex = i * 16 + bit;
+
+			_cursorNormal[bitIndex] = (READ_LE_UINT16(bufferNormal + i) & mask) ?
+										 kColorCursorTransparent : kColorBlack;
+			if (READ_LE_UINT16(bufferNormal + i + 16) & mask)
+				_cursorNormal[bitIndex] = kColorLightRed;
+
+			_cursorWait[bitIndex] = (READ_LE_UINT16(bufferWait + i) & mask) ?
+									   kColorCursorTransparent : kColorBlack;
+			if (READ_LE_UINT16(bufferWait + i + 16) & mask)
+				_cursorWait[bitIndex] = kColorLightRed;
+		}
+	}
+}
+
+void ResourceManager::initImages() {
+	for (int i = 0; i < 44; ++i) {
+		if (!_images[i].init(i))
+			error("Failed reading image file ms2_data.%03d", i);
+	}
+	if (!_images[44].init(55))
+			error("Failed reading image file ms2_data.055");
+}
+
+//TODO
+/*Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
+	Audio::SeekableAudioStream *stream = _soundSamples[index].get();
+	stream->rewind();
+
+	return stream;
+}
+
+Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
+	switch (index) {
+	case kMusicIntro:
+		_musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get()));
+		return _musicIntro.get();
+	case kMusicOutro:
+		_musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get()));
+		return _musicOutro.get();
+	default:
+		error("Invalid music constant in playAudio()");
+	}
+}*/
+
+const MS2Image *ResourceManager::getImage(int filenumber) const {
+	if (filenumber < 44)
+		return &_images[filenumber];
+	else if (filenumber == 55)
+		return &_images[44];
+	else
+		return nullptr;
+}
+
+const byte *ResourceManager::getImage(CursorId id) const {
+	switch (id) {
+	case kCursorNormal:
+		return _cursorNormal;
+	case kCursorWait:
+		return _cursorWait;
+	default:
+		return nullptr;
+	}
+}
+
+//TODO
+/*
+static Common::MemoryReadStream *convertToMod(const char *filename, int version) {
+	// MSN format
+	struct {
+		uint16 seg;
+		uint16 start;
+		uint16 end;
+		uint16 loopStart;
+		uint16 loopEnd;
+		char volume;
+		char dummy[5];
+	} instr2[22];
+	int nbInstr2; // 22 for version1, 15 for version 2
+	int16 songLength;
+	char arrangement[128];
+	int16 patternNumber;
+	int32 note2[28][64][4];
+
+	nbInstr2 = ((version == 1) ? 22 : 15);
+
+	Common::File msnFile;
+	msnFile.open(filename);
+	if (!msnFile.isOpen()) {
+		warning("Data file '%s' not found", msnFile.getName());
+		return nullptr;
+	}
+
+	for (int i = 0 ; i < nbInstr2 ; ++i) {
+		instr2[i].seg = msnFile.readUint16LE();
+		instr2[i].start = msnFile.readUint16LE();
+		instr2[i].end = msnFile.readUint16LE();
+		instr2[i].loopStart = msnFile.readUint16LE();
+		instr2[i].loopEnd = msnFile.readUint16LE();
+		instr2[i].volume = msnFile.readByte();
+		msnFile.read(instr2[i].dummy, 5);
+	}
+	songLength = msnFile.readSint16LE();
+	msnFile.read(arrangement, 128);
+	patternNumber = msnFile.readSint16LE();
+	for (int p = 0 ; p < patternNumber ; ++p) {
+		for (int n = 0 ; n < 64 ; ++n) {
+			for (int k = 0 ; k < 4 ; ++k) {
+				note2[p][n][k] = msnFile.readSint32LE();
+			}
+		}
+	}
+
+	// MOD format 
+	struct {
+		char iname[22];
+		uint16 length;
+		char finetune;
+		char volume;
+		uint16 loopStart;
+		uint16 loopLength;
+	} instr[31];
+	int32 note[28][64][4];
+
+	// We can't recover some MOD effects since several of them are mapped to 0.
+	// Assume the MSN effect of value 0 is Arpeggio (MOD effect of value 0).
+	const char invConvEff[8] = {0, 1, 2, 3, 10, 12, 13 ,15};
+
+	// Reminder from convertToMsn
+	// 31 30 29 28 27 26 25 24 - 23 22 21 20 19 18 17 16 - 15 14 13 12 11 10 09 08 - 07 06 05 04 03 02 01 00
+	//  h  h  h  h  g  g  g  g    f  f  f  f  e  e  e  e    d  d  d  d  c  c  c  c    b  b  b  b  a  a  a  a
+	//
+	// MSN:
+	//  hhhh             (4 bits) Cleared to 0
+	//  dddd c           (5 bits) Sample index   | after mapping through convInstr
+	//        ccc        (3 bits) Effect type    | after mapping through convEff
+	//  bbbb aaaa        (8 bits) Effect value   | unmodified
+	//  gggg ffff eeee  (12 bits) Sample period  | unmodified
+	//
+	// MS2:
+	//  hhhh             (4 bits) Cleared to 0
+	//  dddd             (4 bits) Sample index   | after mapping through convInstr
+	//  cccc             (4 bits) Effect type    | unmodified
+	//  bbbb aaaa        (8 bits) Effect value   | unmodified
+	//  gggg ffff eeee  (12 bits) Sample period  | transformed (0xE000 / p) - 256
+	//
+	// MOD:
+	//  hhhh dddd        (8 bits) Sample index
+	//  cccc             (4 bits) Effect type for this channel/division
+	//  bbbb aaaa        (8 bits) Effect value
+	//  gggg ffff eeee  (12 bits) Sample period
+
+	// Can we recover the instruments mapping? I don't think so as part of the original instrument index is cleared.
+	// And it doesn't really matter as long as we are consistent.
+	// However we need to make sure 31 (or 15 in MS2) is mapped to 0 in MOD.
+	// We just add 1 to all other values, and this means a 1 <-> 1 mapping for the instruments
+	for (int p = 0; p < patternNumber; ++p) {
+		for (int n = 0; n < 64; ++n) {
+			for (int k = 0; k < 4; ++k) {
+				int32* l = &(note[p][n][k]);
+				*l = note2[p][n][k];
+				int32 i = 0;
+				if (nbInstr2 == 22) { // version 1
+					i = ((*l & 0xF800) >> 11);
+					int32 e = ((*l & 0x0700) >> 8);
+					int32 e1 = invConvEff[e];
+					*l &= 0x0FFF00FF;
+					*l |= (e1 << 8);
+				} else { // version 2
+					int32 h = (*l >> 16);
+					i = ((*l & 0xF000) >> 12);
+					*l &= 0x00000FFF;
+					if (h)
+						h = 0xE000 / (h + 256);
+					*l |= (h << 16);
+					if (i == 15)
+						i = 31;
+				}
+
+				// Add back index in note
+				if (i != 31) {
+					++i;
+					*l |= ((i & 0x0F) << 12);
+					*l |= ((i & 0xF0) << 24);
+				}
+			}
+		}
+	}
+
+	for (int i = 0; i < 31; ++i) {
+		// iname is not stored in the mod file. Just set it to 'instrument#'
+		// finetune is not stored either. Assume 0.
+		memset(instr[i].iname, 0, 22);
+		sprintf(instr[i].iname, "instrument%d", i+1);
+		instr[i].length = 0;
+		instr[i].finetune = 0;
+		instr[i].volume = 0;
+		instr[i].loopStart = 0;
+		instr[i].loopLength = 0;
+
+		if (i < nbInstr2) {
+			instr[i].length = ((instr2[i].end - instr2[i].start) >> 1);
+			instr[i].loopStart = ((instr2[i].loopStart - instr2[i].start) >> 1);
+			instr[i].loopLength = (( instr2[i].loopEnd - instr2[i].loopStart) >> 1);
+			instr[i].volume = instr2[i].volume;
+		}
+	}
+
+	// The ciaaSpeed is kind of useless and not present in the MSN file.
+	// Traditionally 0x78 in SoundTracker. Was used in NoiseTracker as a restart point.
+	// ProTracker uses 0x7F. FastTracker uses it as a restart point, whereas ScreamTracker 3 uses 0x7F like ProTracker.
+	// You can use this to roughly detect which tracker made a MOD, and detection gets more accurate for more obscure MOD types.
+	char ciaaSpeed = 0x7F;
+
+	// The mark cannot be recovered either. Since we have 4 channels and 31 instrument it can be either ID='M.K.' or ID='4CHN'.
+	// Assume 'M.K.'
+	const char mark[4] = { 'M', '.', 'K', '.' };
+
+	Common::MemoryWriteStreamDynamic buffer(DisposeAfterUse::NO);
+
+	buffer.write(msnFile.getName(), 19);
+	buffer.writeByte(0);
+
+	for (int i = 0 ; i < 31 ; ++i) {
+		buffer.write(instr[i].iname, 22);
+		buffer.writeUint16BE(instr[i].length);
+		buffer.writeByte(instr[i].finetune);
+		buffer.writeByte(instr[i].volume);
+		buffer.writeUint16BE(instr[i].loopStart);
+		buffer.writeUint16BE(instr[i].loopLength);
+	}
+	buffer.writeByte((char)songLength);
+	buffer.writeByte(ciaaSpeed);
+	buffer.write(arrangement, 128);
+	buffer.write(mark, 4);
+
+	for (int p = 0 ; p < patternNumber ; ++p) {
+		for (int n = 0 ; n < 64 ; ++n) {
+			for (int k = 0 ; k < 4 ; ++k) {
+//				buffer.writeUint32BE(*((uint32*)(note[p][n]+k)));
+				buffer.writeSint32BE(note[p][n][k]);
+			}
+		}
+	}
+
+	uint nb;
+	char buf[4096];
+	while ((nb = msnFile.read(buf, 4096)) > 0)
+		buffer.write(buf, nb);
+
+	return new Common::MemoryReadStream(buffer.getData(), buffer.size(), DisposeAfterUse::YES);
+}
+*/
+
+}
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
new file mode 100644
index 0000000..84289d2
--- /dev/null
+++ b/engines/supernova2/resman.h
@@ -0,0 +1,77 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef SUPERNOVA2_RESOURCES_H
+#define SUPERNOVA2_RESOURCES_H
+
+#include "audio/audiostream.h"
+#include "common/ptr.h"
+
+#include "supernova2/graphics.h"
+//#include "supernova/sound.h"
+
+
+namespace Common {
+class MemoryReadStream;
+}
+
+namespace Supernova2 {
+
+class ResourceManager {
+public:
+	enum CursorId {
+		kCursorNormal,
+		kCursorWait
+	};
+
+public:
+	static const int kNumImageFiles = 45;
+
+public:
+	ResourceManager();
+
+	//Audio::SeekableAudioStream *getSoundStream(AudioId index);
+	//Audio::AudioStream *getSoundStream(MusicId index);
+	const MS2Image *getImage(int filenumber) const;
+	const byte *getImage(CursorId id) const;
+
+private:
+	void initSoundFiles();
+	void initGraphics();
+	void initCursorGraphics();
+	void initImages();
+
+private:
+	//Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
+	//Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
+	//Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
+	//Common::ScopedPtr<Audio::AudioStream> _musicIntro;
+	//Common::ScopedPtr<Audio::AudioStream> _musicOutro;
+	int _audioRate;
+	MS2Image _images[kNumImageFiles];
+	byte _cursorNormal[256];
+	byte _cursorWait[256];
+};
+
+}
+
+#endif
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
new file mode 100644
index 0000000..f7f76c0
--- /dev/null
+++ b/engines/supernova2/rooms.cpp
@@ -0,0 +1,183 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "graphics/palette.h"
+#include "graphics/cursorman.h"
+
+#include "supernova2/screen.h"
+#include "supernova2/supernova2.h"
+#include "supernova2/state.h"
+#include "supernova2/rooms.h"
+
+namespace Supernova2 {
+
+Room::Room() {
+	_seen = false;
+	_fileNumber = 0;
+	_id = NULLROOM;
+	_vm = nullptr;
+	_gm = nullptr;
+
+	for (int i = 0; i < kMaxSection; ++i)
+		_shown[i] = kShownFalse;
+	for (int i = 0; i < kMaxDialog; ++i)
+		_sentenceRemoved[i] = 0;
+}
+
+Room::~Room() {
+}
+
+bool Room::serialize(Common::WriteStream *out) {
+	if (out->err())
+		return false;
+
+	out->writeSint32LE(_id);
+	for (int i = 0; i < kMaxSection; ++i)
+		out->writeByte(_shown[i]);
+	for (int i = 0; i < kMaxDialog ; ++i)
+		out->writeByte(_sentenceRemoved[i]);
+
+	int numObjects = 0;
+	while ((numObjects < kMaxObject) && (_objectState[numObjects]._id != INVALIDOBJECT))
+		++numObjects;
+	out->writeSint32LE(numObjects);
+
+	for (int i = 0; i < numObjects; ++i) {
+		out->writeSint32LE(_objectState[i]._name);
+		out->writeSint32LE(_objectState[i]._description);
+		out->writeByte(_objectState[i]._roomId);
+		out->writeSint32LE(_objectState[i]._id);
+		out->writeSint32LE(_objectState[i]._type);
+		out->writeByte(_objectState[i]._click);
+		out->writeByte(_objectState[i]._click2);
+		out->writeByte(_objectState[i]._section);
+		out->writeSint32LE(_objectState[i]._exitRoom);
+		out->writeByte(_objectState[i]._direction);
+	}
+
+	out->writeByte(_seen);
+
+	return !out->err();
+}
+
+bool Room::deserialize(Common::ReadStream *in, int version) {
+	if (in->err())
+		return false;
+
+	in->readSint32LE();
+
+	for (int i = 0; i < kMaxSection; ++i)
+		_shown[i] = in->readByte();
+
+	// Prior to version 3, _sentenceRemoved was part of _shown (the last two values)
+	// But on the other hand dialog was not implemented anyway, so we don't even try to
+	// recover it.
+	for (int i = 0; i < kMaxDialog ; ++i)
+		_sentenceRemoved[i] = version < 3 ? 0 : in->readByte();
+
+	int numObjects = in->readSint32LE();
+	for (int i = 0; i < numObjects; ++i) {
+		_objectState[i]._name = static_cast<StringId>(in->readSint32LE());
+		_objectState[i]._description = static_cast<StringId>(in->readSint32LE());
+		_objectState[i]._roomId = in->readByte();
+		_objectState[i]._id = static_cast<ObjectId>(in->readSint32LE());
+		_objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
+		_objectState[i]._click = in->readByte();
+		_objectState[i]._click2 = in->readByte();
+		_objectState[i]._section = in->readByte();
+		_objectState[i]._exitRoom = static_cast<RoomId>(in->readSint32LE());
+		_objectState[i]._direction = in->readByte();
+	}
+
+	_seen = in->readByte();
+
+	return !in->err();
+}
+
+bool Room::hasSeen() {
+	return _seen;
+}
+void Room::setRoomSeen(bool seen) {
+	_seen = seen;
+}
+
+int Room::getFileNumber() const {
+	return _fileNumber;
+}
+RoomId Room::getId() const {
+	return _id;
+}
+
+void Room::setSectionVisible(uint section, bool visible) {
+	_shown[section] = visible ? kShownTrue : kShownFalse;
+}
+
+bool Room::isSectionVisible(uint index) const {
+	return _shown[index] == kShownTrue;
+}
+
+void Room::removeSentence(int sentence, int number) {
+	if (number > 0)
+		_sentenceRemoved[number - 1] |= (1 << sentence);
+}
+
+void Room::addSentence(int sentence, int number) {
+	if (number > 0)
+		_sentenceRemoved[number - 1] &= ~(1 << sentence);
+}
+
+void Room::addAllSentences(int number) {
+	if (number > 0)
+		_sentenceRemoved[number - 1] = 0;
+}
+
+bool Room::sentenceRemoved(int sentence, int number) {
+	if (number <= 0)
+		return false;
+	return (_sentenceRemoved[number - 1] & (1 << sentence));
+}
+
+bool Room::allSentencesRemoved(int maxSentence, int number) {
+	if (number <= 0)
+		return false;
+	for (int i = 0, flag = 1 ; i < maxSentence ; ++i, flag <<= 1)
+		if (!(_sentenceRemoved[number - 1] & flag))
+			return false;
+	return true;
+}
+
+Object *Room::getObject(uint index) {
+	return &_objectState[index];
+}
+
+void Room::animation() {
+}
+
+void Room::onEntrance() {
+}
+
+bool Room::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+}
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
new file mode 100644
index 0000000..26113d0
--- /dev/null
+++ b/engines/supernova2/rooms.h
@@ -0,0 +1,79 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_ROOMS_H
+#define SUPERNOVA2_ROOMS_H
+
+#include "common/str.h"
+
+#include "supernova2/ms2_def.h"
+
+namespace Common {
+class ReadStream;
+class WriteStream;
+}
+
+namespace Supernova2 {
+
+class GameManager;
+class Supernova2Engine;
+
+class Room {
+public:
+	Room();
+
+	bool hasSeen();
+	void setRoomSeen(bool seen);
+	int getFileNumber() const;
+	RoomId getId() const;
+	void setSectionVisible(uint section, bool visible);
+	bool isSectionVisible(uint index) const;
+	void removeSentence(int sentence, int number);
+	void addSentence(int sentence, int number);
+	void addAllSentences(int number);
+	bool sentenceRemoved(int sentence, int number);
+	bool allSentencesRemoved(int maxSentence, int number);
+	Object *getObject(uint index);
+
+	virtual ~Room();
+	virtual void animation();
+	virtual void onEntrance();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+	virtual bool serialize(Common::WriteStream *out);
+	virtual bool deserialize(Common::ReadStream *in, int version);
+
+protected:
+	int _fileNumber;
+	bool _shown[kMaxSection];
+	byte _sentenceRemoved[kMaxDialog];
+	Object _objectState[kMaxObject];
+	RoomId _id;
+	Supernova2Engine *_vm;
+	GameManager *_gm;
+
+private:
+	bool _seen;
+};
+
+
+}
+#endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
new file mode 100644
index 0000000..47c9535
--- /dev/null
+++ b/engines/supernova2/screen.cpp
@@ -0,0 +1,621 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "common/str.h"
+#include "common/system.h"
+#include "engines/util.h"
+#include "graphics/cursorman.h"
+#include "graphics/palette.h"
+#include "graphics/surface.h"
+
+#include "supernova2/imageid.h"
+#include "supernova2/resman.h"
+#include "supernova2/state.h"
+#include "supernova2/screen.h"
+#include "supernova2/supernova2.h"
+
+#include "supernova2/screenstatic.cpp"
+
+namespace Supernova2 {
+
+ScreenBuffer::ScreenBuffer()
+	: _x(0)
+	, _y(0)
+	, _width(0)
+	, _height(0)
+	, _pixels(nullptr) {
+}
+
+ScreenBufferStack::ScreenBufferStack()
+	: _last(_buffer) {
+}
+
+void ScreenBufferStack::push(int x, int y, int width, int height) {
+	if (_last == ARRAYEND(_buffer))
+		return;
+
+	Graphics::Surface *screenSurface = g_system->lockScreen();
+
+	if (x < 0) {
+		width += x;
+		x = 0;
+	}
+
+	if (x + width > screenSurface->w)
+		width = screenSurface->w - x;
+
+	if (y < 0) {
+		height += y;
+		y = 0;
+	}
+
+	if (y + height > screenSurface->h)
+		height = screenSurface->h - y;
+
+	_last->_pixels = new byte[width * height];
+	byte *pixels = _last->_pixels;
+	const byte *screen = static_cast<const byte *>(screenSurface->getBasePtr(x, y));
+	for (int i = 0; i < height; ++i) {
+		Common::copy(screen, screen + width, pixels);
+		screen += screenSurface->pitch;
+		pixels += width;
+	}
+	g_system->unlockScreen();
+
+	_last->_x = x;
+	_last->_y = y;
+	_last->_width = width;
+	_last->_height = height;
+
+	++_last;
+}
+
+void ScreenBufferStack::restore() {
+	if (_last == _buffer)
+		return;
+
+	--_last;
+	g_system->lockScreen()->copyRectToSurface(_last->_pixels, _last->_width, _last->_x,
+											  _last->_y, _last->_width, _last->_height);
+	g_system->unlockScreen();
+
+	delete[] _last->_pixels;
+}
+
+Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
+	: _text(text)
+	, _textBegin(text)
+	, _delay(0)
+	, _color(kColorLightBlue)
+	, _loop(false)
+	, _screen(screen) {
+	if (id == kMarqueeIntro) {
+		_y = 191;
+		_loop = true;
+	} else if (id == kMarqueeOutro) {
+		_y = 1;
+	}
+
+	_textWidth = Screen::textWidth(_text);
+	_x = kScreenWidth / 2 - _textWidth / 2;
+	_screen->_textCursorX = _x;
+	_screen->_textCursorY = _y;
+	_screen->_textColor = _color;
+}
+
+void Marquee::clearText() {
+	_screen->renderBox(_x, _y - 1, _textWidth + 1, 9, kColorBlack);
+}
+
+void Marquee::renderCharacter() {
+	if (_delay != 0) {
+		_delay--;
+		return;
+	}
+
+	switch (*_text) {
+	case '\233':
+		if (_loop) {
+			_loop = false;
+			_text = _textBegin;
+			clearText();
+			_textWidth = Screen::textWidth(_text);
+			_x = kScreenWidth / 2 - _textWidth / 2;
+			_screen->_textCursorX = _x;
+		}
+		break;
+	case '\0':
+		clearText();
+		_text++;
+		_textWidth = Screen::textWidth(_text);
+		_x = kScreenWidth / 2 - _textWidth / 2;
+		_screen->_textCursorX = _x;
+		_color = kColorLightBlue;
+		_screen->_textColor = _color;
+		break;
+	case '^':
+		_color = kColorLightYellow;
+		_screen->_textColor = _color;
+		_text++;
+		break;
+	case '#':
+		_delay = 50;
+		_text++;
+		break;
+	default:
+		_screen->renderText((uint16)*_text++);
+		_delay = 1;
+		break;
+	}
+}
+
+Screen::Screen(Supernova2Engine *vm, ResourceManager *resMan)
+	: _vm(vm)
+	, _resMan(resMan)
+	, _currentImage(nullptr)
+	, _viewportBrightness(255)
+	, _guiBrightness(255)
+	, _screenWidth(320)
+	, _screenHeight(200)
+	, _textColor(kColorBlack)
+	, _textCursorX(0)
+	, _textCursorY(0)
+	, _messageShown(false) {
+
+	CursorMan.replaceCursor(_resMan->getImage(ResourceManager::kCursorNormal),
+							16, 16, 0, 0, kColorCursorTransparent);
+	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
+	CursorMan.showMouse(true);
+}
+
+int Screen::getGuiBrightness() const {
+	return _guiBrightness;
+}
+
+void Screen::setViewportBrightness(int brightness) {
+	_viewportBrightness = brightness;
+}
+
+int Screen::getViewportBrightness() const {
+	return _viewportBrightness;
+}
+
+void Screen::setGuiBrightness(int brightness) {
+	_guiBrightness = brightness;
+}
+
+const MS2Image *Screen::getCurrentImage() const {
+	return _currentImage;
+}
+
+const Screen::ImageInfo *Screen::getImageInfo(ImageId id) const {
+	return &imageInfo[(int)id];
+}
+
+bool Screen::isMessageShown() const {
+	return _messageShown;
+}
+
+Common::Point Screen::getTextCursorPos() {
+	return Common::Point(_textCursorX, _textCursorY);
+}
+
+void Screen::setTextCursorPos(int x, int y) {
+	_textCursorX = x;
+	_textCursorY = y;
+}
+
+byte Screen::getTextCursorColor() {
+	return _textColor;
+}
+
+void Screen::setTextCursorColor(byte color) {
+	_textColor = color;
+}
+
+void Screen::renderMessage(StringId stringId, MessagePosition position,
+						   Common::String var1, Common::String var2) {
+	Common::String text = _vm->getGameString(stringId);
+
+	if (!var1.empty()) {
+		if (!var2.empty())
+			text = Common::String::format(text.c_str(), var1.c_str(), var2.c_str());
+		else
+			text = Common::String::format(text.c_str(), var1.c_str());
+	}
+
+	renderMessage(text, position);
+}
+
+void Screen::renderMessage(const Common::String &text, MessagePosition position) {
+	if (!text.empty())
+		renderMessage(text.c_str(), position);
+}
+
+void Screen::renderText(const uint16 character) {
+	char text[2];
+	text[0] = character & 0xFF;
+	text[1] = 0;
+	renderText(text, _textCursorX, _textCursorY, _textColor);
+}
+
+void Screen::renderText(const char *text) {
+	renderText(text, _textCursorX, _textCursorY, _textColor);
+}
+
+void Screen::renderText(StringId stringId) {
+	renderText(_vm->getGameString(stringId));
+}
+
+void Screen::renderText(const Common::String &text) {
+	if (!text.empty())
+		renderText(text.c_str());
+}
+
+/*void Screen::renderText(const GuiElement &guiElement) {
+	renderText(guiElement.getText(), guiElement.getTextPos().x,
+			   guiElement.getTextPos().y, guiElement.getTextColor());
+}*/
+
+void Screen::renderText(const uint16 character, int x, int y, byte color) {
+	char text[2];
+	text[0] = character & 0xFF;
+	text[1] = 0;
+	renderText(text, x, y, color);
+}
+
+void Screen::renderText(const char *text, int x, int y, byte color) {
+	Graphics::Surface *screen = _vm->_system->lockScreen();
+	byte *cursor = static_cast<byte *>(screen->getBasePtr(x, y));
+	const byte *basePtr = cursor;
+
+	byte c;
+	while ((c = *text++) != '\0') {
+		if (c < 32) {
+			continue;
+		} else if (c == 225) {
+			c = 128;
+		}
+
+		for (uint i = 0; i < 5; ++i) {
+			if (font[c - 32][i] == 0xff) {
+				break;
+			}
+
+			byte *ascentLine = cursor;
+			for (byte j = font[c - 32][i]; j != 0; j >>= 1) {
+				if (j & 1) {
+					*cursor = color;
+				}
+				cursor += kScreenWidth;
+			}
+			cursor = ++ascentLine;
+		}
+		++cursor;
+	}
+	_vm->_system->unlockScreen();
+
+	uint numChars = cursor - basePtr;
+	uint absPosition = y * kScreenWidth + x + numChars;
+	_textCursorX = absPosition % kScreenWidth;
+	_textCursorY = absPosition / kScreenWidth;
+	_textColor = color;
+}
+
+void Screen::renderText(const Common::String &text, int x, int y, byte color) {
+	if (!text.empty())
+		renderText(text.c_str(), x, y, color);
+}
+
+void Screen::renderText(StringId stringId, int x, int y, byte color) {
+	renderText(_vm->getGameString(stringId), x, y, color);
+}
+
+void Screen::renderImageSection(const MS2Image *image, int section, bool invert) {
+	// Note: inverting means we are removing the section. So we should get the rect for that
+	// section but draw the background (section 0) instead.
+	if (section > image->_numSections - 1)
+		return;
+
+	Common::Rect sectionRect(image->_section[section].x1,
+							 image->_section[section].y1,
+							 image->_section[section].x2 + 1,
+							 image->_section[section].y2 + 1);
+	if (image->_filenumber == 1 || image->_filenumber == 2) {
+		sectionRect.setWidth(640);
+		sectionRect.setHeight(480);
+		if (_screenWidth != 640) {
+			_screenWidth = 640;
+			_screenHeight = 480;
+			initGraphics(_screenWidth, _screenHeight);
+		}
+	} else {
+		if (_screenWidth != 320) {
+			_screenWidth = 320;
+			_screenHeight = 200;
+			initGraphics(_screenWidth, _screenHeight);
+		}
+	}
+
+	uint offset = 0;
+	int pitch = sectionRect.width();
+	if (invert) {
+		pitch = image->_pitch;
+		offset = image->_section[section].y1 * pitch +
+				 image->_section[section].x1;
+		section = 0;
+	}
+
+	void *pixels = image->_sectionSurfaces[section]->getPixels();
+	_vm->_system->copyRectToScreen(static_cast<const byte *>(pixels) + offset,
+								   pitch, sectionRect.left, sectionRect.top,
+								   sectionRect.width(), sectionRect.height());
+}
+
+void Screen::renderImage(ImageId id, bool removeImage) {
+	ImageInfo info = imageInfo[id];
+	const MS2Image *image = _resMan->getImage(info.filenumber);
+
+	if (_currentImage != image)
+		setCurrentImage(info.filenumber);
+
+	do {
+		renderImageSection(image, info.section, removeImage);
+		info.section = image->_section[info.section].next;
+	} while (info.section != 0);
+}
+
+void Screen::renderImage(int section) {
+	bool removeImage = false;
+	if (section > 128) {
+		removeImage = true;
+		section -= 128;
+	}
+
+	if (!_currentImage || section >= kMaxSection)
+		return;
+
+	do {
+		renderImageSection(_currentImage, section, removeImage);
+		section = _currentImage->_section[section].next;
+	} while (section != 0);
+}
+
+bool Screen::setCurrentImage(int filenumber) {
+	_currentImage = _resMan->getImage(filenumber);
+	_vm->_system->getPaletteManager()->setPalette(_currentImage->getPalette(), 16, 239);
+	paletteBrightness();
+
+	return true;
+}
+
+void Screen::saveScreen(int x, int y, int width, int height) {
+	_screenBuffer.push(x, y, width, height);
+}
+
+/*void Screen::saveScreen(const GuiElement &guiElement) {
+	saveScreen(guiElement.left, guiElement.top, guiElement.width(), guiElement.height());
+}*/
+
+void Screen::restoreScreen() {
+	_screenBuffer.restore();
+}
+
+void Screen::renderRoom(Room &room) {
+	if (room.getId() == INTRO)
+		return;
+
+	if (setCurrentImage(room.getFileNumber())) {
+		for (int i = 0; i < _currentImage->_numSections; ++i) {
+			int section = i;
+			if (room.isSectionVisible(section)) {
+				do {
+					renderImageSection(_currentImage, section, false);
+					section = _currentImage->_section[section].next;
+				} while (section != 0);
+			}
+		}
+	}
+}
+
+int Screen::textWidth(const uint16 key) {
+	char text[2];
+	text[0] = key & 0xFF;
+	text[1] = 0;
+	return textWidth(text);
+}
+
+int Screen::textWidth(const char *text) {
+	int charWidth = 0;
+	while (*text != '\0') {
+		byte c = *text++;
+		if (c < 32) {
+			continue;
+		} else if (c == 225) {
+			c = 35;
+		}
+
+		for (uint i = 0; i < 5; ++i) {
+			if (font[c - 32][i] == 0xff) {
+				break;
+			}
+			++charWidth;
+		}
+		++charWidth;
+	}
+
+	return charWidth;
+}
+
+int Screen::textWidth(const Common::String &text) {
+	return Screen::textWidth(text.c_str());
+}
+
+void Screen::renderMessage(const char *text, MessagePosition position) {
+	Common::String t(text);
+	char *row[20];
+	Common::String::iterator p = t.begin();
+	uint numRows = 0;
+	int rowWidthMax = 0;
+	int x = 0;
+	int y = 0;
+	byte textColor = 0;
+
+	while (*p != '\0') {
+		row[numRows] = p;
+		++numRows;
+		while ((*p != '\0') && (*p != '|')) {
+			++p;
+		}
+		if (*p == '|') {
+			*p = '\0';
+			++p;
+		}
+	}
+	for (uint i = 0; i < numRows; ++i) {
+		int rowWidth = textWidth(row[i]);
+		if (rowWidth > rowWidthMax)
+			rowWidthMax = rowWidth;
+	}
+
+	switch (position) {
+	case kMessageNormal:
+		x = 160 - rowWidthMax / 2;
+		textColor = kColorWhite99;
+		break;
+	case kMessageTop:
+		x = 160 - rowWidthMax / 2;
+		textColor = kColorLightYellow;
+		break;
+	case kMessageCenter:
+		x = 160 - rowWidthMax / 2;
+		textColor = kColorLightRed;
+		break;
+	case kMessageLeft:
+		x = 3;
+		textColor = kColorLightYellow;
+		break;
+	case kMessageRight:
+		x = 317 - rowWidthMax;
+		textColor = kColorLightGreen;
+		break;
+	}
+
+	if (position == kMessageNormal) {
+		y = 70 - ((numRows * 9) / 2);
+	} else if (position == kMessageTop) {
+		y = 5;
+	} else {
+		y = 142;
+	}
+
+	int message_columns = x - 3;
+	int message_rows = y - 3;
+	int message_width = rowWidthMax + 6;
+	int message_height = numRows * 9 + 5;
+	saveScreen(message_columns, message_rows, message_width, message_height);
+	renderBox(message_columns, message_rows, message_width, message_height, kColorWhite35);
+	for (uint i = 0; i < numRows; ++i) {
+		renderText(row[i], x, y, textColor);
+		y += 9;
+	}
+
+	_messageShown = true;
+}
+
+void Screen::removeMessage() {
+	if (_messageShown) {
+		restoreScreen();
+		_messageShown = false;
+	}
+}
+
+void Screen::renderBox(int x, int y, int width, int height, byte color) {
+	Graphics::Surface *screen = _vm->_system->lockScreen();
+	screen->fillRect(Common::Rect(x, y, x + width, y + height), color);
+	_vm->_system->unlockScreen();
+}
+
+/*void Screen::renderBox(const GuiElement &guiElement) {
+	renderBox(guiElement.left, guiElement.top, guiElement.width(),
+			  guiElement.height(), guiElement.getBackgroundColor());
+}*/
+
+void Screen::initPalette() {
+	g_system->getPaletteManager()->setPalette(initVGAPalette, 0, 256);
+}
+
+void Screen::paletteBrightness() {
+	byte palette[768];
+
+	_vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
+	for (uint i = 0; i < 48; ++i) {
+		palette[i] = (initVGAPalette[i] * _guiBrightness) >> 8;
+	}
+	for (uint i = 0; i < 717; ++i) {
+		const byte *imagePalette;
+		if (_currentImage && _currentImage->getPalette()) {
+			imagePalette = _currentImage->getPalette();
+		} else {
+			imagePalette = palette + 48;
+		}
+		palette[i + 48] = (imagePalette[i] * _viewportBrightness) >> 8;
+	}
+	_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
+}
+
+void Screen::paletteFadeOut() {
+	while (_guiBrightness > 10) {
+		_guiBrightness -= 10;
+		if (_viewportBrightness > _guiBrightness)
+			_viewportBrightness = _guiBrightness;
+		paletteBrightness();
+		_vm->_system->updateScreen();
+		_vm->_system->delayMillis(_vm->_delay);
+	}
+	_guiBrightness = 0;
+	_viewportBrightness = 0;
+	paletteBrightness();
+	_vm->_system->updateScreen();
+}
+
+void Screen::paletteFadeIn(int maxViewportBrightness) {
+	while (_guiBrightness < 245) {
+		if (_viewportBrightness < maxViewportBrightness)
+			_viewportBrightness += 10;
+		_guiBrightness += 10;
+		paletteBrightness();
+		_vm->_system->updateScreen();
+		_vm->_system->delayMillis(_vm->_delay);
+	}
+	_guiBrightness = 255;
+	_viewportBrightness = maxViewportBrightness;
+	paletteBrightness();
+	_vm->_system->updateScreen();
+}
+
+void Screen::setColor63(byte value) {
+	byte color[3] = {value, value, value};
+	_vm->_system->getPaletteManager()->setPalette(color, 63, 1);
+}
+
+}
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
new file mode 100644
index 0000000..104874c
--- /dev/null
+++ b/engines/supernova2/screen.h
@@ -0,0 +1,197 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#ifndef SUPERNOVA2_SCREEN_H
+#define SUPERNOVA2_SCREEN_H
+
+#include "common/array.h"
+#include "common/rect.h"
+#include "common/scummsys.h"
+
+#include "supernova2/imageid.h"
+#include "supernova2/ms2_def.h"
+
+namespace Supernova2 {
+
+class Supernova2Engine;
+class GameManager;
+class ResourceManager;
+//class GuiElement;
+class Room;
+class MS2Image;
+class Screen;
+
+const int kScreenWidth  = 320;
+const int kScreenHeight = 200;
+const int kFontWidth = 5;
+const int kFontHeight = 8;
+
+enum Color {
+	kColorBlack       =  0,
+	kColorWhite25     =  1,
+	kColorWhite35     =  2,
+	kColorWhite44     =  3,
+	kColorWhite99     =  4,
+	kColorDarkGreen   =  5,
+	kColorGreen       =  6,
+	kColorDarkRed     =  7,
+	kColorRed         =  8,
+	kColorDarkBlue    =  9,
+	kColorBlue        = 10,
+	kColorWhite63     = 11,
+	kColorLightBlue   = 12,
+	kColorLightGreen  = 13,
+	kColorLightYellow = 14,
+	kColorLightRed    = 15,
+	kColorCursorTransparent = kColorWhite25
+};
+
+class ScreenBuffer {
+	friend class ScreenBufferStack;
+
+public:
+	ScreenBuffer();
+
+private:
+	byte *_pixels;
+	int _x;
+	int _y;
+	int _width;
+	int _height;
+};
+
+class ScreenBufferStack {
+public:
+	ScreenBufferStack();
+
+	void push(int x, int y, int width, int height);
+	void restore();
+
+private:
+	ScreenBuffer _buffer[8];
+	ScreenBuffer *_last;
+};
+
+class Marquee {
+public:
+	enum MarqueeId {
+		kMarqueeIntro,
+		kMarqueeOutro
+	};
+
+	Marquee(Screen *screen, MarqueeId id, const char *text);
+
+	void renderCharacter();
+
+private:
+	void clearText();
+
+	Screen *_screen;
+	const char *const _textBegin;
+	const char *_text;
+	bool _loop;
+	int _delay;
+	int _color;
+	int _x;
+	int _y;
+	int _textWidth;
+};
+
+class Screen {
+	friend class Marquee;
+
+public:
+	struct ImageInfo {
+		int filenumber;
+		int section;
+	};
+
+public:
+	static void initPalette();
+	static int textWidth(const uint16 key);
+	static int textWidth(const char *text);
+	static int textWidth(const Common::String &text);
+
+public:
+	Screen(Supernova2Engine *vm, ResourceManager *resMan);
+
+	int getViewportBrightness() const;
+	void setViewportBrightness(int brightness);
+	int getGuiBrightness() const;
+	void setGuiBrightness(int brightness);
+	const MS2Image *getCurrentImage() const;
+	const ImageInfo *getImageInfo(ImageId id) const;
+	bool isMessageShown() const;
+	void paletteFadeIn(int maxViewportBrightness);
+	void paletteFadeOut();
+	void paletteBrightness();
+	void renderImage(ImageId id, bool removeImage = false);
+	void renderImage(int section);
+	bool setCurrentImage(int filenumber);
+	void saveScreen(int x, int y, int width, int height);
+	//void saveScreen(const GuiElement &guiElement);
+	void restoreScreen();
+	void renderRoom(Room &room);
+	void renderMessage(const char *text, MessagePosition position = kMessageNormal);
+	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
+	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
+					   Common::String var1 = "", Common::String var2 = "");
+	void removeMessage();
+	void renderText(const uint16 character);
+	void renderText(const char *text);
+	void renderText(const Common::String &text);
+	void renderText(StringId stringId);
+	void renderText(const uint16 character, int x, int y, byte color);
+	void renderText(const char *text, int x, int y, byte color);
+	void renderText(const Common::String &text, int x, int y, byte color);
+	void renderText(StringId stringId, int x, int y, byte color);
+	//void renderText(const GuiElement &guiElement);
+	void renderBox(int x, int y, int width, int height, byte color);
+	//void renderBox(const GuiElement &guiElement);
+	void setColor63(byte value);
+	Common::Point getTextCursorPos();
+	void setTextCursorPos(int x, int y);
+	byte getTextCursorColor();
+	void setTextCursorColor(byte color);
+	void update();
+
+private:
+	void renderImageSection(const MS2Image *image, int section, bool invert);
+
+private:
+	Supernova2Engine *_vm;
+	ResourceManager *_resMan;
+	const MS2Image *_currentImage;
+	ScreenBufferStack _screenBuffer;
+	int _screenWidth;
+	int _screenHeight;
+	int  _textCursorX;
+	int  _textCursorY;
+	int  _textColor;
+	byte _viewportBrightness;
+	byte _guiBrightness;
+	bool _messageShown;
+};
+
+}
+
+#endif
diff --git a/engines/supernova2/screenstatic.cpp b/engines/supernova2/screenstatic.cpp
new file mode 100644
index 0000000..9c26d58
--- /dev/null
+++ b/engines/supernova2/screenstatic.cpp
@@ -0,0 +1,329 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+namespace Supernova2 {
+
+static const Screen::ImageInfo imageInfo[] = {
+	{ 0,  0}, { 0,  1}, { 0,  2},
+	{ 1,  0},
+	{ 2,  0},
+	{ 3,  0}, { 3,  1}, { 3,  2}, { 3,  3}, { 3,  4}, { 3,  5},
+	{ 3,  6}, { 3,  7}, { 3,  8}, { 3,  9}, { 3, 10}, { 3, 11},
+	{ 4,  0}, { 4,  1}, { 4,  2}, { 4,  3},
+	{ 5,  0}, { 5,  1}, { 5,  2}, { 5,  3}, { 5,  4}, { 5,  5},
+	{ 5,  6}, { 5,  7}, { 5,  8}, { 5,  9},
+	{ 6,  0}, { 6,  1}, { 6,  2}, { 6,  3}, { 6,  4}, { 6,  5},
+	{ 6,  6}, { 6,  7}, { 6,  8}, { 6,  9}, { 6, 10}, { 6, 11},
+	{ 6, 12}, { 6, 13}, { 6, 14}, { 6, 15}, { 6, 16}, { 6, 17},
+	{ 6, 18}, { 6, 19}, { 6, 20}, { 6, 21},
+	{ 7,  0}, { 7,  1}, { 7,  2}, { 7,  3}, { 7,  4}, { 7,  5},
+	{ 7,  6}, { 7,  7}, { 7,  8}, { 7,  9}, { 7, 10}, { 7, 11},
+	{ 7, 12}, { 7, 13}, { 7, 14}, { 7, 15}, { 7, 16}, { 7, 17},
+	{ 7, 18}, { 7, 19}, { 7, 20}, { 7, 21}, { 7, 22},
+	{ 8,  0}, { 8,  1}, { 8,  2}, { 8,  3}, { 8,  4}, { 8,  5},
+	{ 8,  6}, { 8,  7}, { 8,  8}, { 8,  9}, { 8, 10}, { 8, 11},
+	{ 8, 12},
+	{ 9,  0}, { 9,  1}, { 9,  2}, { 9,  3}, { 9,  4}, { 9,  5},
+	{ 9,  6}, { 9,  7}, { 9,  8}, { 9,  9}, { 9, 10}, { 9, 11},
+	{ 9, 12}, { 9, 13}, { 9, 14}, { 9, 15}, { 9, 16}, { 9, 17},
+	{ 9, 18}, { 9, 19}, { 9, 20}, { 9, 21}, { 9, 22}, { 9, 23},
+	{10,  0}, {10,  1}, {10,  2}, {10,  3}, {10,  4}, {10,  5},
+	{10,  6}, {10,  7}, {10,  8}, {10,  9}, {10, 10}, {10, 11},
+	{10, 12}, {10, 13}, {10, 14}, {10, 15}, {10, 16},
+	{11,  0},
+	{12,  0}, {12,  1}, {12,  2}, {12,  3},
+	{13,  0}, {13,  1}, {13,  2}, {13,  3}, {13,  4}, {13,  5},
+	{13,  6}, {13,  7}, {13,  8}, {13,  9}, {13, 10}, {13, 11},
+	{13, 12}, {13, 13},
+	{14,  0}, {14,  1}, {14,  2}, {14,  3}, {14,  4}, {14,  5},
+	{14,  6}, {14,  7}, {14,  8}, {14,  9}, {14, 10}, {14, 11},
+	{14, 12}, {14, 13}, {14, 14}, {14, 15}, {14, 16}, {14, 17},
+	{14, 18}, {14, 19},
+	{15,  0}, {15,  1}, {15,  2}, {15,  3}, {15,  4}, {15,  5},
+	{16,  0}, {16,  1}, {16,  2}, {16,  3}, {16,  4}, {16,  5},
+	{16,  6}, {16,  7}, {16,  8}, {16,  9}, {16, 10}, {16, 11},
+	{16, 12}, {16, 13}, {16, 14}, {16, 15}, {16, 16}, {16, 17},
+	{16, 18}, {16, 19}, {16, 20}, {16, 21}, {16, 22}, {16, 23},
+	{16, 24}, {16, 25}, {16, 26}, {16, 27}, {16, 28}, {16, 29},
+	{16, 30}, {16, 31}, {16, 32}, {16, 33},
+	{17,  0}, {17,  1}, {17,  2}, {17,  3}, {17,  4}, {17,  5},
+	{17,  6}, {17,  7}, {17,  8}, {17,  9}, {17, 10}, {17, 11},
+	{17, 12}, {17, 13}, {17, 14}, {17, 15},
+	{18,  0}, {18,  1}, {18,  2}, {18,  3}, {18,  4}, {18,  5},
+	{18,  6}, {18,  7}, {18,  8}, {18,  9}, {18, 10}, {18, 11},
+	{18, 12}, {18, 13}, {18, 14}, {18, 15}, {18, 16}, {18, 17},
+	{18, 18}, {18, 19}, {18, 20}, {18, 21},
+	{19,  0}, {19,  1}, {19,  2}, {19,  3}, {19,  4}, {19,  5},
+	{19,  6}, {19,  7}, {19,  8}, {19,  9}, {19, 10}, {19, 11},
+	{19, 12}, {19, 13}, {19, 14}, {19, 15}, {19, 16}, {19, 17},
+	{19, 18}, {19, 19}, {19, 20}, {19, 21}, {19, 22}, {19, 23},
+	{19, 24}, {19, 25}, {19, 26}, {19, 27}, {19, 28}, {19, 29},
+	{19, 30}, {19, 31}, {19, 32}, {19, 33}, {19, 34}, {19, 35},
+	{19, 36}, {19, 37}, {19, 38}, {19, 39}, {19, 40},
+	{20,  0},
+	{21,  0}, {21,  1}, {21,  2}, {21,  3}, {21,  4}, {21,  5},
+	{21,  6}, {21,  7}, {21,  8}, {21,  9}, {21, 10}, {21, 11},
+	{21, 12}, {21, 13}, {21, 14}, {21, 15}, {21, 16}, {21, 17},
+	{21, 18}, {21, 19}, {21, 20}, {21, 21}, {21, 22}, {21, 23},
+	{21, 24}, {21, 25}, {21, 26}, {21, 27}, {21, 28}, {21, 29},
+	{21, 30}, {21, 31}, {21, 32}, {21, 33}, {21, 34}, {21, 35},
+	{21, 36}, {21, 37}, {21, 38},
+	{22,  0}, {22,  1}, {22,  2}, {22,  3}, {22,  4}, {22,  5},
+	{22,  6}, {22,  7}, {22,  8}, {22,  9}, {22, 10}, {22, 11},
+	{22, 12}, {22, 13}, {22, 14}, {22, 15}, {22, 16}, {22, 17},
+	{22, 18},
+	{23,  0},
+	{24,  0}, {24,  1}, {24,  2}, {24,  3}, {24,  4}, {24,  5},
+	{24,  6}, {24,  7}, {24,  8},
+	{25,  0}, {25,  1}, {25,  2}, {25,  3}, {25,  4}, {25,  5},
+	{25,  6}, {25,  7}, {25,  8}, {25,  9}, {25, 10}, {25, 11},
+	{25, 12}, {25, 13}, {25, 14}, {25, 15}, {25, 16}, {25, 17},
+	{25, 18},
+	{26,  0},
+	{27,  0},
+	{28,  0}, {28,  1}, {28,  2}, {28,  3}, {28,  4}, {28,  5},
+	{28,  6}, {28,  7}, {28,  8}, {28,  9}, {28, 10}, {28, 11},
+	{28, 12}, {28, 13}, {28, 14}, {28, 15}, {28, 16}, {28, 17},
+	{28, 18}, {28, 19}, {28, 20}, {28, 21}, {28, 22},
+	{29,  0}, {29,  1}, {29,  2}, {29,  3}, {29,  4}, {29,  5},
+	{29,  6}, {29,  7}, {29,  8}, {29,  9}, {29, 10}, {29, 11},
+	{29, 12}, {29, 13},
+	{30,  0}, {30,  1},
+	{31,  0}, {31,  1}, {31,  2}, {31,  3}, {31,  4}, {31,  5},
+	{31,  6},
+	{32,  0}, {32,  1}, {32,  2}, {32,  3},
+	{33,  0}, {33,  1}, {33,  2}, {33,  3}, {33,  4}, {33,  5},
+	{34,  0}, {34,  1}, {34,  2}, {34,  3}, {34,  4}, {34,  5},
+	{34,  6}, {34,  7}, {34,  8}, {34,  9}, {34, 10}, {34, 11},
+	{34, 12}, {34, 13}, {34, 14}, {34, 15}, {34, 16}, {34, 17},
+	{35,  0}, {35,  1}, {35,  2}, {35,  3}, {35,  4}, {35,  5},
+	{35,  6}, {35,  7}, {35,  8}, {35,  9}, {35, 10}, {35, 11},
+	{35, 12}, {35, 13}, {35, 14}, {35, 15}, {35, 16}, {35, 17},
+	{35, 18}, {35, 19}, {35, 20}, {35, 21},
+	{36,  0}, {36,  1}, {36,  2}, {36,  3}, {36,  4}, {36,  5},
+	{37,  0}, {37,  1}, {37,  2}, {37,  3}, {37,  4}, {37,  5},
+	{37,  6}, {37,  7}, {37,  8}, {37,  9}, {37, 10}, {37, 11},
+	{37, 12}, {37, 13}, {37, 14}, {37, 15}, {37, 16}, {37, 17},
+	{37, 18}, {37, 19}, {37, 20}, {37, 21}, {37, 22}, {37, 23},
+	{37, 24}, {37, 25}, {37, 26},
+	{38,  0}, {38,  1}, {38,  2}, {38,  3}, {38,  4}, {38,  5},
+	{38,  6}, {38,  7}, {38,  8}, {38,  9}, {38, 10}, {38, 11},
+	{38, 12},
+	{39,  0},
+	{40,  0}, {40,  1}, {40,  2}, {40,  3}, {40,  4}, {40,  5},
+	{40,  6}, {40,  7},
+	{41,  0}, {41,  1}, {41,  2}, {41,  3},
+	{42,  0}, {42,  1}, {42,  2}, {42,  3}, {42,  4}, {42,  5},
+	{42,  6}, {42,  7},	{42,  8}, {42,  9}, {42, 10}, {42, 11},
+	{43,  0}, {43,  1}, {43,  2}, {43,  3}, {43,  4}, {43,  5},
+	{43,  6}, {43,  7}, {43,  8}, {43,  9}, {43, 10}, {43, 11},
+	{43, 12}, {43, 13}, {43, 14}, {43, 15}, {43, 16}, {43, 17},
+	{43, 18}, {43, 19}, {43, 20}, {43, 21}, {43, 22}, {43, 23},
+	{43, 24}, {43, 25}, {43, 26}, {43, 27}, {43, 28}, {43, 29},
+	{43, 30}, {43, 31},
+	{55,  0}
+};
+
+// Default palette
+static const byte initVGAPalette[768] = {
+	0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
+	0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
+	0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
+	0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
+	0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
+	0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
+	0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
+	0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
+	0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
+	0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
+	0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
+	0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
+	0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
+	0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
+	0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
+	0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
+	0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
+	0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
+	0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
+	0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
+	0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
+	0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
+	0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
+	0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
+	0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
+	0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
+	0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
+	0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
+	0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
+	0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
+	0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
+	0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
+	0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
+	0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
+	0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
+	0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
+	0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
+	0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
+	0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
+	0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
+	0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
+	0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static const byte font[][5] = {
+	{0x00,0x00,0x00,0xff,0x00},
+	{0x5f,0xff,0x00,0x00,0x00},
+	{0x03,0x00,0x03,0xff,0x00},
+	{0x14,0x7f,0x14,0x7f,0x14},
+	{0x24,0x2a,0x7f,0x2a,0x12},
+	{0x61,0x10,0x08,0x04,0x43},
+	{0x38,0x4e,0x59,0x26,0x50},
+	{0x03,0xff,0x00,0x00,0x00},
+	{0x3e,0x41,0xff,0x00,0x00},
+	{0x41,0x3e,0xff,0x00,0x00},
+	{0x10,0x54,0x38,0x54,0x10},
+	{0x10,0x10,0x7c,0x10,0x10},
+	{0x80,0x40,0xff,0x00,0x00},
+	{0x10,0x10,0x10,0x10,0x10},
+	{0x40,0xff,0x00,0x00,0x00},
+	{0x60,0x10,0x08,0x04,0x03},
+
+	{0x3e,0x41,0x41,0x41,0x3e}, /* digits */
+	{0x04,0x02,0x7f,0xff,0x00},
+	{0x42,0x61,0x51,0x49,0x46},
+	{0x22,0x41,0x49,0x49,0x36},
+	{0x18,0x14,0x12,0x7f,0x10},
+	{0x27,0x45,0x45,0x45,0x39},
+	{0x3e,0x49,0x49,0x49,0x32},
+	{0x01,0x61,0x19,0x07,0x01},
+	{0x36,0x49,0x49,0x49,0x36},
+	{0x26,0x49,0x49,0x49,0x3e},
+
+	{0x44,0xff,0x00,0x00,0x00},
+	{0x80,0x44,0xff,0x00,0x00},
+	{0x10,0x28,0x44,0xff,0x00},
+	{0x28,0x28,0x28,0x28,0x28},
+	{0x44,0x28,0x10,0xff,0x00},
+	{0x02,0x01,0x51,0x09,0x06},
+	{0x3e,0x41,0x5d,0x5d,0x1e},
+
+	{0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
+	{0x7f,0x49,0x49,0x49,0x36},
+	{0x3e,0x41,0x41,0x41,0x22},
+	{0x7f,0x41,0x41,0x22,0x1c},
+	{0x7f,0x49,0x49,0x49,0xff},
+	{0x7f,0x09,0x09,0x09,0xff},
+	{0x3e,0x41,0x41,0x49,0x3a},
+	{0x7f,0x08,0x08,0x08,0x7f},
+	{0x41,0x7f,0x41,0xff,0x00},
+	{0x20,0x40,0x40,0x3f,0xff},
+	{0x7f,0x08,0x14,0x22,0x41},
+	{0x7f,0x40,0x40,0x40,0xff},
+	{0x7f,0x02,0x04,0x02,0x7f},
+	{0x7f,0x02,0x0c,0x10,0x7f},
+	{0x3e,0x41,0x41,0x41,0x3e},
+	{0x7f,0x09,0x09,0x09,0x06},
+	{0x3e,0x41,0x51,0x21,0x5e},
+	{0x7f,0x09,0x19,0x29,0x46},
+	{0x26,0x49,0x49,0x49,0x32},
+	{0x01,0x01,0x7f,0x01,0x01},
+	{0x3f,0x40,0x40,0x40,0x3f},
+	{0x07,0x18,0x60,0x18,0x07},
+	{0x1f,0x60,0x18,0x60,0x1f},
+	{0x63,0x14,0x08,0x14,0x63},
+	{0x03,0x04,0x78,0x04,0x03},
+	{0x61,0x51,0x49,0x45,0x43},
+
+	{0x7f,0x41,0x41,0xff,0x00},
+	{0x03,0x04,0x08,0x10,0x60},
+	{0x41,0x41,0x7f,0xff,0x00},
+	{0x02,0x01,0x02,0xff,0x00},
+	{0x80,0x80,0x80,0x80,0x80},
+	{0x01,0x02,0xff,0x00,0x00},
+
+	{0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
+	{0x7f,0x44,0x44,0x44,0x38},
+	{0x38,0x44,0x44,0x44,0x44},
+	{0x38,0x44,0x44,0x44,0x7f},
+	{0x38,0x54,0x54,0x54,0x58},
+	{0x04,0x7e,0x05,0x01,0xff},
+	{0x98,0xa4,0xa4,0xa4,0x7c},
+	{0x7f,0x04,0x04,0x04,0x78},
+	{0x7d,0xff,0x00,0x00,0x00},
+	{0x80,0x80,0x7d,0xff,0x00},
+	{0x7f,0x10,0x28,0x44,0xff},
+	{0x7f,0xff,0x00,0x00,0x00},
+	{0x7c,0x04,0x7c,0x04,0x78},
+	{0x7c,0x04,0x04,0x04,0x78},
+	{0x38,0x44,0x44,0x44,0x38},
+	{0xfc,0x24,0x24,0x24,0x18},
+	{0x18,0x24,0x24,0x24,0xfc},
+	{0x7c,0x08,0x04,0x04,0xff},
+	{0x48,0x54,0x54,0x54,0x24},
+	{0x04,0x3e,0x44,0x40,0xff},
+	{0x7c,0x40,0x40,0x40,0x3c},
+	{0x0c,0x30,0x40,0x30,0x0c},
+	{0x3c,0x40,0x3c,0x40,0x3c},
+	{0x44,0x28,0x10,0x28,0x44},
+	{0x9c,0xa0,0xa0,0xa0,0x7c},
+	{0x44,0x64,0x54,0x4c,0x44},
+
+	{0x08,0x36,0x41,0xff,0x00},
+	{0x77,0xff,0x00,0x00,0x00},
+	{0x41,0x36,0x08,0xff,0x00},
+	{0x02,0x01,0x02,0x01,0xff},
+	{0xff,0x00,0x00,0x00,0x00},
+
+	{0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
+
+	{0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
+
+	{0x04,0x06,0x7f,0x06,0x04}, /* arrows */
+	{0x20,0x60,0xfe,0x60,0x20},
+
+	{0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0x79,0x14,0x12,0x14,0x79},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0x38,0x45,0x44,0x45,0x38},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0xff,0x00,0x00,0x00,0x00},
+	{0x3d,0x42,0x42,0x42,0x3d},
+	{0x3d,0x40,0x40,0x40,0x3d},
+};
+
+}
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 357a166..4dd24a5 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -25,7 +25,7 @@
 #include "graphics/palette.h"
 #include "gui/message.h"
 
-//#include "supernova2/screen.h"
+#include "supernova2/screen.h"
 #include "supernova2/supernova2.h"
 #include "supernova2/state.h"
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 5c8cec4..7665d22 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -26,8 +26,8 @@
 #include "common/events.h"
 #include "common/rect.h"
 #include "common/keyboard.h"
-//#include "supernova/rooms.h"
-//#include "supernova/sound.h"
+#include "supernova2/rooms.h"
+//#include "supernova2/sound.h"
 
 namespace Supernova2 {
 
@@ -71,4 +71,4 @@ private:
 
 }
 
-#endif // SUPERNOVA_STATE_H
+#endif // SUPERNOVA2_STATE_H


Commit: 9b786ded4fbf3bcd2981c65dc30a1a278dd97de2
    https://github.com/scummvm/scummvm/commit/9b786ded4fbf3bcd2981c65dc30a1a278dd97de2
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add roughly translated room, object ID

Changed paths:
    engines/supernova2/ms2_def.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 4912850..ac0e388 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -80,12 +80,47 @@ enum Action {
 };
 
 enum RoomId {
-	INTRO, OUTRO,
+	INTRO,AIRPORT,TAXISTAND,STREET,GAMES,CABIN,KIOSK,
+	KPALAST,CASHBOX,CITY1,CITY2,ELEVATOR,APARTMENT,SHIP,
+
+	PYRAMID,PYRGANG,UPSTAIRS1,DOWNSTAIRS1,
+	BOTTOM_RIGHT_DOOR,BOTTOM_LEFT_DOOR,UPSTAIRS2,DOWNSTAIRS2,
+	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
+	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO,TOMATO,
+	MONSTER_F,MONSTER1_N,MONSTER2_N,UPSTAIRS3,DOWNSTAIRS3,
+	LGANG1,LGANG2,HOLE_ROOM,IN_HOLE,BODENTUER,BODENTUER_U,
+	BST_DOOR,HALL,COFFIN_ROOM,MASK,
+
+	MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
+	MUS9,MUS10,MUS11,MUS_RUND,
+	MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,
 	NULLROOM
 };
 
 enum ObjectId {
 	INVALIDOBJECT = -1,
+	TAXI=1,WALLET,TRANSMITTER,KNIFE,POLE,BES_CABIN,MONEY,
+	SLOT1,CHAIR,GANG,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON,
+	PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7,
+	PART8,PART9,PART10,PART11,PART12,PART13,PART14,PART15,
+	TKNIFE,ROPE,NOTE,MOUTH,
+	HOLE1,HOLE2,HOLE3,HOLE4,HOLE5,HOLE6,HOLE7,HOLE8,HOLE9,HOLE10,
+	HOLE11,HOLE12,HOLE13,HOLE14,HOLE15,HOLE16,HOLE17,HOLE18,HOLE19,HOLE20,
+	HOLE21,HOLE22,HOLE23,HOLE24,HOLE25,SHIELD,
+	SLOT,HOLE,STONES,
+	BST1,BST2,BST3,BST4,BST5,BST6,BST7,BST8,
+	BST9,BST10,BST11,BST12,BST13,BST14,BST15,BST16,
+	COFFIN,SUN,MONSTER,EYE,EYE1,EYE2,L_BALL,R_BALL,
+	PRIZE,REAR_STREET,
+	BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXIcON,PLANT,SNAKE,
+	CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
+	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
+	DOODLE,DOODLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD,
+	MAGNET,UNDER_BED,KEY,VALVE,WARDROBE,DISCMAN,
+	SMALL_DOOR,BACK_MONEY,WALL,MAMMAL,IMITATION,SP_KEYCARD,ALARM_CRACKER,
+	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,INVESTMENT,
+	HANDLE,COUNTER,DOOR_SWITCH,SUIT,MANAGEMENT,RMANAGEMENT,
+	MUSCARD,SKOPF
 	NULLOBJECT = 0
 };
 


Commit: 4b12c8d17b3df2780c255b957f7035ccb1274071
    https://github.com/scummvm/scummvm/commit/4b12c8d17b3df2780c255b957f7035ccb1274071
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Begin intro animation

Copy and modify all the code needed for animation
from supernova engine and display Mission Supernova
logo.

Changed paths:
    engines/supernova2/graphics.cpp
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/resman.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/screen.cpp
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp
index 3ea310a..6f6ee00 100644
--- a/engines/supernova2/graphics.cpp
+++ b/engines/supernova2/graphics.cpp
@@ -74,6 +74,7 @@ bool MS2Image::init(int filenumber) {
 	}
 
 	_filenumber = filenumber;
+
 	loadStream(file);
 
 	return true;
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index ac0e388..bbb2b7c 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -32,7 +32,7 @@ const int kMsecPerTick = 55;
 
 const int kMaxSection = 40;
 const int kMaxDialog = 2;
-const int kMaxObject = 25;
+const int kMaxObject = 30;
 const int kMaxCarry = 30;
 
 const int kSleepAutosaveSlot = 999;
@@ -86,7 +86,7 @@ enum RoomId {
 	PYRAMID,PYRGANG,UPSTAIRS1,DOWNSTAIRS1,
 	BOTTOM_RIGHT_DOOR,BOTTOM_LEFT_DOOR,UPSTAIRS2,DOWNSTAIRS2,
 	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
-	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO,TOMATO,
+	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO_F,TOMATO_N,
 	MONSTER_F,MONSTER1_N,MONSTER2_N,UPSTAIRS3,DOWNSTAIRS3,
 	LGANG1,LGANG2,HOLE_ROOM,IN_HOLE,BODENTUER,BODENTUER_U,
 	BST_DOOR,HALL,COFFIN_ROOM,MASK,
@@ -94,11 +94,12 @@ enum RoomId {
 	MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
 	MUS9,MUS10,MUS11,MUS_RUND,
 	MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,
-	NULLROOM
+	NUMROOMS,NULLROOM
 };
 
 enum ObjectId {
 	INVALIDOBJECT = -1,
+	NULLOBJECT = 0,
 	TAXI=1,WALLET,TRANSMITTER,KNIFE,POLE,BES_CABIN,MONEY,
 	SLOT1,CHAIR,GANG,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON,
 	PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7,
@@ -121,11 +122,133 @@ enum ObjectId {
 	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,INVESTMENT,
 	HANDLE,COUNTER,DOOR_SWITCH,SUIT,MANAGEMENT,RMANAGEMENT,
 	MUSCARD,SKOPF
-	NULLOBJECT = 0
 };
 
 enum StringId {
-	kNoString = -1, kStringDefaultDescription
+	kNoString = -1,
+kString0, kString1, kString2, kString3, kString4,
+kString5, kString6, kString7, kString8, kString9,
+kString10, kString11, kString12, kString13, kString14,
+kString15, kString16, kString17, kString18, kString19,
+kString20, kString21, kString22, kString23, kString24,
+kString25, kString26, kString27, kStringTextSpeed, kString29,
+kString30, kString31, kString32, kString33, kString34,
+kString35, kString36, kString37, kString38, kString39,
+kString40, kString41, kString42, kString43, kString44,
+kString45, kString46, kString47, kString48, kString49,
+kString50, kString51, kString52, kString53, kString54,
+kString55, kString56, kString57, kString58, kString59,
+kString60, kString61, kString62, kString63, kString64,
+kString65, kString66, kString67, kString68, kString69,
+kString70, kString71, kString72, kString73, kString74,
+kString75, kString76, kString77, kString78, kString79,
+kString80, kString81, kString82, kString83, kString84,
+kString85, kString86, kString87, kString88, kString89,
+kString90, kString91, kString92, kString93, kString94,
+kString95, kString96, kString97, kString98, kString99,
+kString100, kString101, kString102, kString103, kString104,
+kString105, kString106, kString107, kString108, kString109,
+kString110, kString111, kString112, kString113, kString114,
+kString115, kString116, kString117, kString118, kString119,
+kString120, kString121, kString122, kString123, kString124,
+kString125, kString126, kString127, kString128, kString129,
+kString130, kString131, kString132, kString133, kString134,
+kString135, kString136, kString137, kString138, kString139,
+kString140, kString141, kString142, kString143, kString144,
+kString145, kString146, kString147, kString148, kString149,
+kString150, kString151, kString152, kString153, kString154,
+kString155, kString156, kString157, kString158, kString159,
+kString160, kString161, kString162, kString163, kString164,
+kString165, kString166, kString167, kString168, kString169,
+kString170, kString171, kString172, kString173, kString174,
+kString175, kString176, kString177, kStringDefaultDescription, kString179,
+kString180, kString181, kString182, kString183, kString184,
+kString185, kString186, kString187, kString188, kString189,
+kString190, kString191, kString192, kString193, kString194,
+kString195, kString196, kString197, kString198, kString199,
+kString200, kString201, kString202, kString203, kString204,
+kString205, kString206, kString207, kString208, kString209,
+kString210, kString211, kString212, kString213, kString214,
+kString215, kString216, kString217, kString218, kString219,
+kString220, kString221, kString222, kString223, kString224,
+kString225, kString226, kString227, kString228, kString229,
+kString230, kString231, kString232, kString233, kString234,
+kString235, kString236, kString237, kString238, kString239,
+kString240, kString241, kString242, kString243, kString244,
+kString245, kString246, kString247, kString248, kString249,
+kString250, kString251, kString252, kString253, kString254,
+kString255, kString256, kString257, kString258, kString259,
+kString260, kString261, kString262, kString263, kString264,
+kString265, kString266, kString267, kString268, kString269,
+kString270, kString271, kString272, kString273, kString274,
+kString275, kString276, kString277, kString278, kString279,
+kString280, kString281, kString282, kString283, kString284,
+kString285, kString286, kString287, kString288, kString289,
+kString290, kString291, kString292, kString293, kString294,
+kString295, kString296, kString297, kString298, kString299,
+kString300, kString301, kString302, kString303, kString304,
+kString305, kString306, kString307, kString308, kString309,
+kString310, kString311, kString312, kString313, kString314,
+kString315, kString316, kString317, kString318, kString319,
+kString320, kString321, kString322, kString323, kString324,
+kString325, kString326, kString327, kString328, kString329,
+kString330, kString331, kString332, kString333, kString334,
+kString335, kString336, kString337, kString338, kString339,
+kString340, kString341, kString342, kString343, kString344,
+kString345, kString346, kString347, kString348, kString349,
+kString350, kString351, kString352, kString353, kString354,
+kString355, kString356, kString357, kString358, kString359,
+kString360, kString361, kString362, kString363, kString364,
+kString365, kString366, kString367, kString368, kString369,
+kString370, kString371, kString372, kString373, kString374,
+kString375, kString376, kString377, kString378, kString379,
+kString380, kString381, kString382, kString383, kString384,
+kString385, kString386, kString387, kString388, kString389,
+kString390, kString391, kString392, kString393, kString394,
+kString395, kString396, kString397, kString398, kString399,
+kString400, kString401, kString402, kString403, kString404,
+kString405, kString406, kString407, kString408, kString409,
+kString410, kString411, kString412, kString413, kString414,
+kString415, kString416, kString417, kString418, kString419,
+kString420, kString421, kString422, kString423, kString424,
+kString425, kString426, kString427, kString428, kString429,
+kString430, kString431, kString432, kString433, kString434,
+kString435, kString436, kString437, kString438, kString439,
+kString440, kString441, kString442, kString443, kString444,
+kString445, kString446, kString447, kString448, kString449,
+kString450, kString451, kString452, kString453, kString454,
+kString455, kString456, kString457, kString458, kString459,
+kString460, kString461, kString462, kString463, kString464,
+kString465, kString466, kString467, kString468, kString469,
+kString470, kString471, kString472, kString473, kString474,
+kString475, kString476, kString477, kString478, kString479,
+kString480, kString481, kString482, kString483, kString484,
+kString485, kString486, kString487, kString488, kString489,
+kString490, kString491, kString492, kString493, kString494,
+kString495, kString496, kString497, kString498, kString499,
+kString500, kString501, kString502, kString503, kString504,
+kString505, kString506, kString507, kString508, kString509,
+kString510, kString511, kString512, kString513, kString514,
+kString515, kString516, kString517, kString518, kString519,
+kString520, kString521, kString522, kString523, kString524,
+kString525, kString526, kString527, kString528, kString529,
+kString530, kString531, kString532, kString533, kString534,
+kString535, kString536, kString537, kString538, kString539,
+kString540, kString541, kString542, kString543, kString544,
+kString545, kString546, kString547, kString548, kString549,
+kString550, kString551, kString552, kString553, kString554,
+kString555, kString556, kString557, kString558, kString559,
+kString560, kString561, kString562, kString563, kString564,
+kString565, kString566, kString567, kString568, kString569,
+kString570, kString571, kString572, kString573, kString574,
+kString575, kString576, kString577, kString578, kString579,
+kString580, kString581, kString582, kString583, kString584,
+kString585, kString586, kString587, kString588, kString589,
+kString590, kString591, kString592, kString593, kString594,
+kString595, kString596, kString597, kString598, kString599,
+kString600, kString601, kString602, kString603, kString604,
+kString605, kString606, kString607, kString608, kString609,
+kString610, kString611, kString612, kString613 
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 259d279..a47a155 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -164,12 +164,10 @@ void ResourceManager::initCursorGraphics() {
 }
 
 void ResourceManager::initImages() {
-	for (int i = 0; i < 44; ++i) {
+	for (int i = 0; i < kNumImageFiles; ++i) {
 		if (!_images[i].init(i))
 			error("Failed reading image file ms2_data.%03d", i);
 	}
-	if (!_images[44].init(55))
-			error("Failed reading image file ms2_data.055");
 }
 
 //TODO
@@ -194,10 +192,8 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 }*/
 
 const MS2Image *ResourceManager::getImage(int filenumber) const {
-	if (filenumber < 44)
+	if (filenumber < 47)
 		return &_images[filenumber];
-	else if (filenumber == 55)
-		return &_images[44];
 	else
 		return nullptr;
 }
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
index 84289d2..72b7d78 100644
--- a/engines/supernova2/resman.h
+++ b/engines/supernova2/resman.h
@@ -44,7 +44,7 @@ public:
 	};
 
 public:
-	static const int kNumImageFiles = 45;
+	static const int kNumImageFiles = 47;
 
 public:
 	ResourceManager();
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index f7f76c0..77b4429 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -180,4 +180,53 @@ bool Room::interact(Action verb, Object &obj1, Object &obj2) {
 	return false;
 }
 
+Intro::Intro(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = -1;
+	_id = INTRO;
+}
+
+void Intro::onEntrance() {
+	_gm->_guiEnabled = false;
+	_vm->_allowSaveGame = false;
+	_vm->_allowLoadGame = false;
+	titleScreen();
+}
+
+void Intro::titleScreen() {
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->_screen->setViewportBrightness(0);
+	_vm->_screen->setGuiBrightness(0);
+	_vm->paletteBrightness();
+	_vm->setCurrentImage(1);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->getInput();
+}
+
+void Intro::titleFadeIn() {
+}
+
+bool Intro::animate(int section1, int section2, int duration) {
+	return true;
+}
+
+bool Intro::animate(int section1, int section2, int duration,
+					MessagePosition position, StringId textId) {
+	return true;
+}
+
+bool Intro::animate(int section1, int section2, int section3, int section4,
+					int duration, MessagePosition position, StringId textId) {
+	return true;
+}
+
+void Intro::cutscene() {
+}
+
+void Intro::leaveCutscene() {
+}
+
 }
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 26113d0..2fcf636 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -74,6 +74,26 @@ private:
 	bool _seen;
 };
 
+class Intro : public Room {
+public:
+	Intro(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+
+private:
+	bool animate(int section1, int section2, int duration);
+	bool animate(int section1, int section2, int duration, MessagePosition position,
+				 StringId text);
+	bool animate(int section1, int section2, int section3, int section4, int duration,
+				 MessagePosition position, StringId text);
+
+	void titleScreen();
+	void titleFadeIn();
+	void cutscene();
+	void leaveCutscene();
+
+	bool _shouldExit;
+	Common::String _introText;
+};
 
 }
 #endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 47c9535..24efe91 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -340,20 +340,10 @@ void Screen::renderImageSection(const MS2Image *image, int section, bool invert)
 							 image->_section[section].y1,
 							 image->_section[section].x2 + 1,
 							 image->_section[section].y2 + 1);
-	if (image->_filenumber == 1 || image->_filenumber == 2) {
-		sectionRect.setWidth(640);
-		sectionRect.setHeight(480);
-		if (_screenWidth != 640) {
-			_screenWidth = 640;
-			_screenHeight = 480;
-			initGraphics(_screenWidth, _screenHeight);
-		}
-	} else {
-		if (_screenWidth != 320) {
-			_screenWidth = 320;
-			_screenHeight = 200;
-			initGraphics(_screenWidth, _screenHeight);
-		}
+	if (_screenWidth != 320) {
+		_screenWidth = 320;
+		_screenHeight = 200;
+		initGraphics(_screenWidth, _screenHeight);
 	}
 
 	uint offset = 0;
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 4dd24a5..44553f2 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -45,13 +45,16 @@ namespace Supernova2 {
 GameManager::GameManager(Supernova2Engine *vm)
 	: _vm(vm)
     , _mouseClickType(Common::EVENT_INVALID) {
-		initState();
+	initRooms();
+	changeRoom(INTRO);
+	initState();
 }
 
 GameManager::~GameManager() {
 }
 
 void GameManager::initState() {
+	_processInput = false;
 	_guiEnabled = true;
 	_animationEnabled = true;
 	_mouseClicked = false;
@@ -74,5 +77,139 @@ void GameManager::initState() {
 
 	_prevImgId = 0;
 }
+
+void GameManager::initRooms() {
+	_rooms[INTRO] = new Intro(_vm, this);
+}
+
+void GameManager::updateEvents() {
+	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
+		_currentRoom->animation();
+
+	_mouseClicked = false;
+	_keyPressed = false;
+	Common::Event event;
+	while (g_system->getEventManager()->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_KEYDOWN:
+			_keyPressed = true;
+			processInput(event.kbd);
+			break;
+		case Common::EVENT_LBUTTONUP:
+			// fallthrough
+		case Common::EVENT_RBUTTONUP:
+			if (_currentRoom->getId() != INTRO)
+				return;
+			_mouseClicked = true;
+			// fallthrough
+		case Common::EVENT_MOUSEMOVE:
+			_mouseClickType = event.type;
+			_mouseX = event.mouse.x;
+			_mouseY = event.mouse.y;
+			if (_guiEnabled)
+				//processInput();
+			break;
+		default:
+			break;
+		}
+	}
+}
+void GameManager::processInput(Common::KeyState &state) {
+	_key = state;
+
+	switch (state.keycode) {
+	case Common::KEYCODE_F1:
+		// help
+		break;
+	case Common::KEYCODE_F2:
+		// show game doc
+		break;
+	case Common::KEYCODE_F3:
+		// show game info
+		break;
+	case Common::KEYCODE_F4:
+		//_vm->setTextSpeed();
+		break;
+	case Common::KEYCODE_F5:
+		// load/save
+		break;
+	case Common::KEYCODE_x:
+		if (state.flags & Common::KBD_ALT) {
+			//if (_vm->quitGameDialog())
+				_vm->quitGame();
+		}
+		break;
+	case Common::KEYCODE_d:
+		if (state.flags & Common::KBD_CTRL)
+			_vm->_console->attach();
+		break;
+	default:
+		break;
+	}
+}
+
+void GameManager::getInput() {
+	while (!_vm->shouldQuit()) {
+		updateEvents();
+		if (_mouseClicked || _keyPressed)
+			break;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+}
+
+void GameManager::changeRoom(RoomId id) {
+	_currentRoom = _rooms[id];
+	_newRoom = true;
+}
+
+void GameManager::resetInputState() {
+//	setObjectNull(_inputObject[0]);
+//	setObjectNull(_inputObject[1]);
+//	_inputVerb = ACTION_WALK;
+	_processInput = false;
+	_mouseClicked = false;
+	_keyPressed = false;
+	_key.reset();
+	_mouseClickType = Common::EVENT_MOUSEMOVE;
+
+	//processInput();
+}
+
+void GameManager::executeRoom() {
+	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
+//		handleInput();
+		if (_mouseClicked) {
+			Common::Event event;
+			event.type = Common::EVENT_MOUSEMOVE;
+			event.mouse = Common::Point(0, 0);
+			_vm->getEventManager()->pushEvent(event);
+			event.type = Common::EVENT_MOUSEMOVE;
+			event.mouse = Common::Point(_mouseX, _mouseY);
+			_vm->getEventManager()->pushEvent(event);
+		}
+
+		resetInputState();
+	}
+
+	if (_guiEnabled) {
+		if (!_vm->_screen->isMessageShown()) {
+			g_system->fillScreen(kColorBlack);
+			_vm->renderRoom(*_currentRoom);
+		}
+//		drawMapExits();
+//		drawInventory();
+//		drawStatus();
+//		drawCommandBox();
+	}
+
+	//if (_vm->_screen->getViewportBrightness() == 0)
+	//	_vm->paletteFadeIn();
+
+	if (!_currentRoom->hasSeen() && _newRoom) {
+		_newRoom = false;
+		_currentRoom->onEntrance();
+	}
+}
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 7665d22..c6d357f 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -41,6 +41,11 @@ public:
 	GameManager(Supernova2Engine *vm);
 	~GameManager();
 
+	void updateEvents();
+	void processInput(Common::KeyState &state);
+	//void processInput();
+	void executeRoom();
+
 	Supernova2Engine *_vm;
 	Common::KeyState _key;
 	Common::EventType _mouseClickType;
@@ -48,7 +53,11 @@ public:
 	bool _keyPressed;
 	int _mouseX;
 	int _mouseY;
+	Room *_currentRoom;
+	bool _newRoom;
+	Room *_rooms[NUMROOMS];
 	GameState _state;
+	bool _processInput;
 	bool _guiEnabled;
 	bool _animationEnabled;
 	uint _timePaused;
@@ -64,6 +73,10 @@ public:
 	byte _rowsStart[6];
 
 	void initState();
+	void initRooms();
+	void getInput();
+	void changeRoom(RoomId id);
+	void resetInputState();
 
 private:
 	int _prevImgId;
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 5a2acfb..fd19ab6 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -41,6 +41,8 @@
 #include "graphics/thumbnail.h"
 #include "gui/saveload.h"
 
+#include "supernova2/resman.h"
+#include "supernova2/screen.h"
 #include "supernova2/supernova2.h"
 #include "supernova2/state.h"
 
@@ -51,6 +53,8 @@ Supernova2Engine::Supernova2Engine(OSystem *syst)
 	: Engine(syst)
 	, _console(nullptr)
 	, _gm(nullptr)
+	, _resMan(nullptr)
+	, _screen(nullptr)
 	, _allowLoadGame(true)
 	, _allowSaveGame(true)
 	, _sleepAutoSave(nullptr)
@@ -68,6 +72,8 @@ Supernova2Engine::~Supernova2Engine() {
 
 	delete _console;
 	delete _gm;
+	delete _resMan;
+	delete _screen;
 	delete _sleepAutoSave;
 }
 
@@ -76,6 +82,8 @@ Common::Error Supernova2Engine::run() {
 
 	while (!shouldQuit()) {
 		uint32 start = _system->getMillis();
+		_gm->updateEvents();
+		_gm->executeRoom();
 		_console->onFrame();
 		_system->updateScreen();
 		int end = _delay - (_system->getMillis() - start);
@@ -97,11 +105,26 @@ void Supernova2Engine::init() {
 	if (status.getCode() != Common::kNoError)
 		error("Failed reading game strings");
 
+	_resMan = new ResourceManager();
 	_gm = new GameManager(this);
+	_screen = new Screen(this, _resMan);
 	_console = new Console(this, _gm);
 	setTotalPlayTime(0);
 }
 
+bool Supernova2Engine::hasFeature(EngineFeature f) const {
+	switch (f) {
+	case kSupportsRTL:
+		return true;
+	case kSupportsLoadingDuringRuntime:
+		return true;
+	case kSupportsSavingDuringRuntime:
+		return true;
+	default:
+		return false;
+	}
+}
+
 Common::Error Supernova2Engine::loadGameStrings() {
 	Common::String cur_lang = ConfMan.get("language");
 	Common::String string_id("TEXT");
@@ -171,17 +194,215 @@ void Supernova2Engine::setGameString(int idx, const Common::String &string) {
 	_gameStrings[idx] = string;
 }
 
-bool Supernova2Engine::hasFeature(EngineFeature f) const {
-	switch (f) {
-	case kSupportsRTL:
-		return true;
-	case kSupportsLoadingDuringRuntime:
-		return true;
-	case kSupportsSavingDuringRuntime:
-		return true;
-	default:
-		return false;
+void Supernova2Engine::renderImage(int section) {
+	if (section > 128)
+		_gm->_currentRoom->setSectionVisible(section - 128, false);
+	else
+		_gm->_currentRoom->setSectionVisible(section, true);
+
+	_screen->renderImage(section);
+}
+
+void Supernova2Engine::renderImage(ImageId id, bool removeImage) {
+	_gm->_currentRoom->setSectionVisible(_screen->getImageInfo(id)->section, !removeImage);
+	_screen->renderImage(id, removeImage);
+}
+
+bool Supernova2Engine::setCurrentImage(int filenumber) {
+	return _screen->setCurrentImage(filenumber);
+}
+
+void Supernova2Engine::restoreScreen() {
+	_screen->restoreScreen();
+}
+
+void Supernova2Engine::renderRoom(Room &room) {
+	_screen->renderRoom(room);
+}
+
+void Supernova2Engine::renderMessage(const char *text, MessagePosition position) {
+	_gm->_messageDuration = (Common::strnlen(text, 512) + 20) * _textSpeed / 10;
+	_screen->renderMessage(text, position);
+}
+
+void Supernova2Engine::renderMessage(const Common::String &text, MessagePosition position) {
+	_gm->_messageDuration = (text.size() + 20) * _textSpeed / 10;
+	_screen->renderMessage(text, position);
+}
+
+void Supernova2Engine::renderMessage(StringId stringId, MessagePosition position, Common::String var1, Common::String var2) {
+	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
+	_screen->renderMessage(stringId, position, var1, var2);
+}
+
+void Supernova2Engine::removeMessage() {
+	_screen->removeMessage();
+}
+
+void Supernova2Engine::renderText(const uint16 character) {
+	_screen->renderText(character);
+}
+
+void Supernova2Engine::renderText(const char *text) {
+	_screen->renderText(text);
+}
+
+void Supernova2Engine::renderText(const Common::String &text) {
+	_screen->renderText(text);
+}
+
+void Supernova2Engine::renderText(StringId stringId) {
+	_screen->renderText(stringId);
+}
+
+void Supernova2Engine::paletteBrightness() {
+	_screen->paletteBrightness();
+}
+
+void Supernova2Engine::paletteFadeOut() {
+	_screen->paletteFadeOut();
+}
+
+void Supernova2Engine::paletteFadeIn() {
+	_screen->paletteFadeIn(255);
+}
+
+void Supernova2Engine::setColor63(byte value) {
+	_screen->setColor63(value);
+}
+
+/*void Supernova2Engine::setTextSpeed() {
+	const Common::String &textSpeedString = getGameString(kStringTextSpeed);
+	int stringWidth = Screen::textWidth(textSpeedString);
+	int textX = (kScreenWidth - stringWidth) / 2;
+	int textY = 100;
+	stringWidth += 4;
+	int boxX = stringWidth > 110 ? (kScreenWidth - stringWidth) / 2 : 105;
+	int boxY = 97;
+	int boxWidth = stringWidth > 110 ? stringWidth : 110;
+	int boxHeight = 27;
+
+	_gm->animationOff();
+	_gm->saveTime();
+	saveScreen(boxX, boxY, boxWidth, boxHeight);
+
+	renderBox(boxX, boxY, boxWidth, boxHeight, kColorBlue);
+	renderText(textSpeedString, textX, textY, kColorWhite99); // Text speed
+
+	// Find the closest index in kTextSpeed for the current _textSpeed.
+	// Important note: values in kTextSpeed decrease with the index.
+	int speedIndex = 0;
+	while (speedIndex < 4 && _textSpeed < (kTextSpeed[speedIndex] + kTextSpeed[speedIndex+1]) / 2)
+		++speedIndex;
+
+	char nbString[2];
+	nbString[1] = 0;
+	for (int i = 0; i < 5; ++i) {
+		byte color = i == speedIndex ? kColorWhite63 : kColorWhite35;
+		renderBox(110 + 21 * i, 111, 16, 10, color);
+
+		nbString[0] = '1' + i;
+		renderText(nbString, 115 + 21 * i, 112, kColorWhite99);
 	}
+	do {
+		_gm->getInput();
+		int key = _gm->_keyPressed ? _gm->_key.keycode : Common::KEYCODE_INVALID;
+		if (!_gm->_keyPressed && _gm->_mouseClicked && _gm->_mouseY >= 111 && _gm->_mouseY < 121 && (_gm->_mouseX + 16) % 21 < 16)
+			key = Common::KEYCODE_0 - 5 + (_gm->_mouseX + 16) / 21;
+		if (key == Common::KEYCODE_ESCAPE)
+			break;
+		else if (key >= Common::KEYCODE_1 && key <= Common::KEYCODE_5) {
+			speedIndex = key - Common::KEYCODE_1;
+			_textSpeed = kTextSpeed[speedIndex];
+			ConfMan.setInt("textspeed", _textSpeed);
+			break;
+		}
+	} while (!shouldQuit());
+	_gm->resetInputState();
+
+	restoreScreen();
+	_gm->loadTime();
+	_gm->animationOn();
+}*/
+
+/*bool Supernova2Engine::quitGameDialog() {
+	bool quit = false;
+
+	GuiElement guiQuitBox;
+	guiQuitBox.setColor(kColorRed, kColorWhite99, kColorRed, kColorWhite99);
+	guiQuitBox.setSize(112, 97, 112 + 96, 97 + 27);
+	guiQuitBox.setText(getGameString(kStringLeaveGame).c_str());
+	guiQuitBox.setTextPosition(guiQuitBox.left + 3, guiQuitBox.top + 3);
+	GuiElement guiQuitYes;
+	guiQuitYes.setColor(kColorWhite35, kColorWhite99, kColorWhite35, kColorWhite99);
+	guiQuitYes.setSize(115, 111, 158, 121);
+	guiQuitYes.setText(getGameString(kStringYes).c_str());
+	guiQuitYes.setTextPosition(132, 112);
+	GuiElement guiQuitNo;
+	guiQuitNo.setColor(kColorWhite35, kColorWhite99, kColorWhite35, kColorWhite99);
+	guiQuitNo.setSize(162, 111, 205, 121);
+	guiQuitNo.setText(getGameString(kStringNo).c_str());
+	guiQuitNo.setTextPosition(173, 112);
+
+	_gm->animationOff();
+	_gm->saveTime();
+	saveScreen(guiQuitBox);
+
+	renderBox(guiQuitBox);
+	renderText(guiQuitBox);
+	renderBox(guiQuitYes);
+	renderText(guiQuitYes);
+	renderBox(guiQuitNo);
+	renderText(guiQuitNo);
+
+	do {
+		_gm->getInput();
+		if (_gm->_keyPressed) {
+			if (_gm->_key.keycode == Common::KEYCODE_j) {
+				quit = true;
+				break;
+			} else if (_gm->_key.keycode == Common::KEYCODE_n) {
+				quit = false;
+				break;
+			}
+		}
+		if (_gm->_mouseClicked) {
+			if (guiQuitYes.contains(_gm->_mouseX, _gm->_mouseY)) {
+				quit = true;
+				break;
+			} else if (guiQuitNo.contains(_gm->_mouseX, _gm->_mouseY)) {
+				quit = false;
+				break;
+			}
+		}
+	} while (true);
+
+	_gm->resetInputState();
+	restoreScreen();
+	_gm->loadTime();
+	_gm->animationOn();
+
+	return quit;
+}*/
+
+void Supernova2Engine::renderText(const uint16 character, int x, int y, byte color) {
+	_screen->renderText(character, x, y, color);
+}
+
+void Supernova2Engine::renderText(const char *text, int x, int y, byte color) {
+	_screen->renderText(text, x, y, color);
+}
+
+void Supernova2Engine::renderText(const Common::String &text, int x, int y, byte color) {
+	_screen->renderText(text, x, y, color);
+}
+
+void Supernova2Engine::renderText(StringId stringId, int x, int y, byte color) {
+	_screen->renderText(stringId, x, y, color);
+}
+
+void Supernova2Engine::renderBox(int x, int y, int width, int height, byte color) {
+	_screen->renderBox(x, y, width, height, color);
 }
 
 }
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index 043c5cd..e5798d9 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -31,6 +31,10 @@
 #include "common/file.h"
 
 #include "supernova2/console.h"
+#include "supernova2/graphics.h"
+#include "supernova2/ms2_def.h"
+#include "supernova2/rooms.h"
+#include "supernova2/imageid.h"
 
 namespace Common {
 	class MemoryReadWriteStream;
@@ -45,8 +49,10 @@ namespace Supernova2 {
 #define SUPERNOVA2_DAT_VERSION 1
 
 class GuiElement;
+class ResourceManager;
 class console;
 class GameManager;
+class Screen;
 
 class Supernova2Engine : public Engine {
 public:
@@ -58,6 +64,8 @@ public:
 
 	GameManager *_gm;
 	Console *_console;
+	ResourceManager *_resMan;
+	Screen *_screen;
 	bool _allowLoadGame;
 	bool _allowSaveGame;
 	Common::StringArray _gameStrings;
@@ -81,6 +89,29 @@ public:
 	void setGameString(int idx, const Common::String &string);
 
 	// forwarding calls
+	void paletteFadeIn();
+	void paletteFadeOut();
+	void paletteBrightness();
+	void renderImage(int section);
+	void renderImage(ImageId id, bool removeImage = false);
+	bool setCurrentImage(int filenumber);
+	void restoreScreen();
+	void renderRoom(Room &room);
+	void renderMessage(const char *text, MessagePosition position = kMessageNormal);
+	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
+	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
+					   Common::String var1 = "", Common::String var2 = "");
+	void removeMessage();
+	void renderText(const uint16 character);
+	void renderText(const char *text);
+	void renderText(const Common::String &text);
+	void renderText(StringId stringId);
+	void renderText(const uint16 character, int x, int y, byte color);
+	void renderText(const char *text, int x, int y, byte color);
+	void renderText(const Common::String &text, int x, int y, byte color);
+	void renderText(StringId stringId, int x, int y, byte color);
+	void renderBox(int x, int y, int width, int height, byte color);
+	void setColor63(byte value);
 };
 
 }


Commit: f10135bb76203c9c5289333e33b2756b0259d50a
    https://github.com/scummvm/scummvm/commit/f10135bb76203c9c5289333e33b2756b0259d50a
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Remove code for rendering newspapers

Changed paths:
    engines/supernova2/graphics.cpp


diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp
index 6f6ee00..630fa46 100644
--- a/engines/supernova2/graphics.cpp
+++ b/engines/supernova2/graphics.cpp
@@ -221,39 +221,21 @@ bool MS2Image::loadStream(Common::SeekableReadStream &stream) {
 }
 
 bool MS2Image::loadSections() {
-	bool isNewspaper = false;
-	int imageWidth = isNewspaper ? 640 : 320;
-	int imageHeight = isNewspaper ? 480 : 200;
-	_pitch = imageWidth;
+	_pitch = 320;
 
 	for (int section = 0; section < _numSections; ++section) {
 		Graphics::Surface *surface = new Graphics::Surface;
 		_sectionSurfaces.push_back(surface);
 
-		if (isNewspaper) {
-			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
-			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
-			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
-				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
-			}
-		} else {
-			uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
-			if (offset == kInvalidAddress || _section[section].x2 == 0) {
-				return false;
-			}
-			int width = _section[section].x2 - _section[section].x1 + 1;
-			int height = _section[section].y2 - _section[section].y1 + 1;
-			surface->create(width, height, g_system->getScreenFormat());
-			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
-			Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels);
+		uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
+		if (offset == kInvalidAddress || _section[section].x2 == 0) {
+			return false;
 		}
+		int width = _section[section].x2 - _section[section].x1 + 1;
+		int height = _section[section].y2 - _section[section].y1 + 1;
+		surface->create(width, height, g_system->getScreenFormat());
+		byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+		Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels);
 	}
 
 	return true;


Commit: e99dc80446f5ef5f9e6f6ef2460161c4a1e40f07
    https://github.com/scummvm/scummvm/commit/e99dc80446f5ef5f9e6f6ef2460161c4a1e40f07
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Rewrite palette to 1 RGB color per row

Changed paths:
    engines/supernova2/screenstatic.cpp


diff --git a/engines/supernova2/screenstatic.cpp b/engines/supernova2/screenstatic.cpp
index 9c26d58..b325f50 100644
--- a/engines/supernova2/screenstatic.cpp
+++ b/engines/supernova2/screenstatic.cpp
@@ -145,49 +145,262 @@ static const Screen::ImageInfo imageInfo[] = {
 
 // Default palette
 static const byte initVGAPalette[768] = {
-	0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
-	0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
-	0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
-	0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
-	0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
-	0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
-	0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
-	0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
-	0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
-	0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
-	0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
-	0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
-	0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
-	0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
-	0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
-	0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
-	0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
-	0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
-	0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
-	0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
-	0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
-	0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
-	0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
-	0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
-	0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
-	0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
-	0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
-	0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
-	0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
-	0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
-	0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
-	0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
-	0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
-	0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
-	0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
-	0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
-	0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
-	0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
-	0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
-	0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
-	0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
-	0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+	0x00, 0x00, 0x00,
+	0x40, 0x40, 0x40,
+	0x58, 0x58, 0x58,
+	0x70, 0x70, 0x70,
+	0xfc, 0xfc, 0xfc,
+	0x00, 0xd0, 0x00,
+	0x00, 0xfc, 0x00,
+	0xd8, 0x00, 0x00,
+	0xfc, 0x00, 0x00,
+	0x00, 0x00, 0x78,
+	0x00, 0x00, 0xb0,
+	0xa0, 0xa0, 0xa0,
+	0x50, 0xc8, 0xfc,
+	0x28, 0xfc, 0x28,
+	0xf0, 0xf0, 0x00,
+	0xfc, 0x28, 0x28,
+	0x00, 0x00, 0x00,
+	0x14, 0x14, 0x14,
+	0x20, 0x20, 0x20,
+	0x2c, 0x2c, 0x2c,
+	0x38, 0x38, 0x38,
+	0x44, 0x44, 0x44,
+	0x50, 0x50, 0x50,
+	0x60, 0x60, 0x60,
+	0x70, 0x70, 0x70,
+	0x80, 0x80, 0x80,
+	0x90, 0x90, 0x90,
+	0xa0, 0xa0, 0xa0,
+	0xb4, 0xb4, 0xb4,
+	0xc8, 0xc8, 0xc8,
+	0xe0, 0xe0, 0xe0,
+	0xfc, 0xfc, 0xfc,
+	0x00, 0x00, 0xfc,
+	0x40, 0x00, 0xfc,
+	0x7c, 0x00, 0xfc,
+	0xbc, 0x00, 0xfc,
+	0xfc, 0x00, 0xfc,
+	0xfc, 0x00, 0xbc,
+	0xfc, 0x00, 0x7c,
+	0xfc, 0x00, 0x40,
+	0xfc, 0x00, 0x00,
+	0xfc, 0x40, 0x00,
+	0xfc, 0x7c, 0x00,
+	0xfc, 0xbc, 0x00,
+	0xfc, 0xfc, 0x00,
+	0xbc, 0xfc, 0x00,
+	0x7c, 0xfc, 0x00,
+	0x40, 0xfc, 0x00,
+	0x00, 0xfc, 0x00,
+	0x00, 0xfc, 0x40,
+	0x00, 0xfc, 0x7c,
+	0x00, 0xfc, 0xbc,
+	0x00, 0xfc, 0xfc,
+	0x00, 0xbc, 0xfc,
+	0x00, 0x7c, 0xfc,
+	0x00, 0x40, 0xfc,
+	0x7c, 0x7c, 0xfc,
+	0x9c, 0x7c, 0xfc,
+	0xbc, 0x7c, 0xfc,
+	0xdc, 0x7c, 0xfc,
+	0xfc, 0x7c, 0xfc,
+	0xfc, 0x7c, 0xdc,
+	0xfc, 0x7c, 0xbc,
+	0xfc, 0x7c, 0x9c,
+	0xfc, 0x7c, 0x7c,
+	0xfc, 0x9c, 0x7c,
+	0xfc, 0xbc, 0x7c,
+	0xfc, 0xdc, 0x7c,
+	0xfc, 0xfc, 0x7c,
+	0xdc, 0xfc, 0x7c,
+	0xbc, 0xfc, 0x7c,
+	0x9c, 0xfc, 0x7c,
+	0x7c, 0xfc, 0x7c,
+	0x7c, 0xfc, 0x9c,
+	0x7c, 0xfc, 0xbc,
+	0x7c, 0xfc, 0xdc,
+	0x7c, 0xfc, 0xfc,
+	0x7c, 0xdc, 0xfc,
+	0x7c, 0xbc, 0xfc,
+	0x7c, 0x9c, 0xfc,
+	0xb4, 0xb4, 0xfc,
+	0xc4, 0xb4, 0xfc,
+	0xd8, 0xb4, 0xfc,
+	0xe8, 0xb4, 0xfc,
+	0xfc, 0xb4, 0xfc,
+	0xfc, 0xb4, 0xe8,
+	0xfc, 0xb4, 0xd8,
+	0xfc, 0xb4, 0xc4,
+	0xfc, 0xb4, 0xb4,
+	0xfc, 0xc4, 0xb4,
+	0xfc, 0xd8, 0xb4,
+	0xfc, 0xe8, 0xb4,
+	0xfc, 0xfc, 0xb4,
+	0xe8, 0xfc, 0xb4,
+	0xd8, 0xfc, 0xb4,
+	0xc4, 0xfc, 0xb4,
+	0xb4, 0xfc, 0xb4,
+	0xb4, 0xfc, 0xc4,
+	0xb4, 0xfc, 0xd8,
+	0xb4, 0xfc, 0xe8,
+	0xb4, 0xfc, 0xfc,
+	0xb4, 0xe8, 0xfc,
+	0xb4, 0xd8, 0xfc,
+	0xb4, 0xc4, 0xfc,
+	0x00, 0x00, 0x70,
+	0x1c, 0x00, 0x70,
+	0x38, 0x00, 0x70,
+	0x54, 0x00, 0x70,
+	0x70, 0x00, 0x70,
+	0x70, 0x00, 0x54,
+	0x70, 0x00, 0x38,
+	0x70, 0x00, 0x1c,
+	0x70, 0x00, 0x00,
+	0x70, 0x1c, 0x00,
+	0x70, 0x38, 0x00,
+	0x70, 0x54, 0x00,
+	0x70, 0x70, 0x00,
+	0x54, 0x70, 0x00,
+	0x38, 0x70, 0x00,
+	0x1c, 0x70, 0x00,
+	0x00, 0x70, 0x00,
+	0x00, 0x70, 0x1c,
+	0x00, 0x70, 0x38,
+	0x00, 0x70, 0x54,
+	0x00, 0x70, 0x70,
+	0x00, 0x54, 0x70,
+	0x00, 0x38, 0x70,
+	0x00, 0x1c, 0x70,
+	0x38, 0x38, 0x70,
+	0x44, 0x38, 0x70,
+	0x54, 0x38, 0x70,
+	0x60, 0x38, 0x70,
+	0x70, 0x38, 0x70,
+	0x70, 0x38, 0x60,
+	0x70, 0x38, 0x54,
+	0x70, 0x38, 0x44,
+	0x70, 0x38, 0x38,
+	0x70, 0x44, 0x38,
+	0x70, 0x54, 0x38,
+	0x70, 0x60, 0x38,
+	0x70, 0x70, 0x38,
+	0x60, 0x70, 0x38,
+	0x54, 0x70, 0x38,
+	0x44, 0x70, 0x38,
+	0x38, 0x70, 0x38,
+	0x38, 0x70, 0x44,
+	0x38, 0x70, 0x54,
+	0x38, 0x70, 0x60,
+	0x38, 0x70, 0x70,
+	0x38, 0x60, 0x70,
+	0x38, 0x54, 0x70,
+	0x38, 0x44, 0x70,
+	0x50, 0x50, 0x70,
+	0x58, 0x50, 0x70,
+	0x60, 0x50, 0x70,
+	0x68, 0x50, 0x70,
+	0x70, 0x50, 0x70,
+	0x70, 0x50, 0x68,
+	0x70, 0x50, 0x60,
+	0x70, 0x50, 0x58,
+	0x70, 0x50, 0x50,
+	0x70, 0x58, 0x50,
+	0x70, 0x60, 0x50,
+	0x70, 0x68, 0x50,
+	0x70, 0x70, 0x50,
+	0x68, 0x70, 0x50,
+	0x60, 0x70, 0x50,
+	0x58, 0x70, 0x50,
+	0x50, 0x70, 0x50,
+	0x50, 0x70, 0x58,
+	0x50, 0x70, 0x60,
+	0x50, 0x70, 0x68,
+	0x50, 0x70, 0x70,
+	0x50, 0x68, 0x70,
+	0x50, 0x60, 0x70,
+	0x50, 0x58, 0x70,
+	0x00, 0x00, 0x40,
+	0x10, 0x00, 0x40,
+	0x20, 0x00, 0x40,
+	0x30, 0x00, 0x40,
+	0x40, 0x00, 0x40,
+	0x40, 0x00, 0x30,
+	0x40, 0x00, 0x20,
+	0x40, 0x00, 0x10,
+	0x40, 0x00, 0x00,
+	0x40, 0x10, 0x00,
+	0x40, 0x20, 0x00,
+	0x40, 0x30, 0x00,
+	0x40, 0x40, 0x00,
+	0x30, 0x40, 0x00,
+	0x20, 0x40, 0x00,
+	0x10, 0x40, 0x00,
+	0x00, 0x40, 0x00,
+	0x00, 0x40, 0x10,
+	0x00, 0x40, 0x20,
+	0x00, 0x40, 0x30,
+	0x00, 0x40, 0x40,
+	0x00, 0x30, 0x40,
+	0x00, 0x20, 0x40,
+	0x00, 0x10, 0x40,
+	0x20, 0x20, 0x40,
+	0x28, 0x20, 0x40,
+	0x30, 0x20, 0x40,
+	0x38, 0x20, 0x40,
+	0x40, 0x20, 0x40,
+	0x40, 0x20, 0x38,
+	0x40, 0x20, 0x30,
+	0x40, 0x20, 0x28,
+	0x40, 0x20, 0x20,
+	0x40, 0x28, 0x20,
+	0x40, 0x30, 0x20,
+	0x40, 0x38, 0x20,
+	0x40, 0x40, 0x20,
+	0x38, 0x40, 0x20,
+	0x30, 0x40, 0x20,
+	0x28, 0x40, 0x20,
+	0x20, 0x40, 0x20,
+	0x20, 0x40, 0x28,
+	0x20, 0x40, 0x30,
+	0x20, 0x40, 0x38,
+	0x20, 0x40, 0x40,
+	0x20, 0x38, 0x40,
+	0x20, 0x30, 0x40,
+	0x20, 0x28, 0x40,
+	0x2c, 0x2c, 0x40,
+	0x30, 0x2c, 0x40,
+	0x34, 0x2c, 0x40,
+	0x3c, 0x2c, 0x40,
+	0x40, 0x2c, 0x40,
+	0x40, 0x2c, 0x3c,
+	0x40, 0x2c, 0x34,
+	0x40, 0x2c, 0x30,
+	0x40, 0x2c, 0x2c,
+	0x40, 0x30, 0x2c,
+	0x40, 0x34, 0x2c,
+	0x40, 0x3c, 0x2c,
+	0x40, 0x40, 0x2c,
+	0x3c, 0x40, 0x2c,
+	0x34, 0x40, 0x2c,
+	0x30, 0x40, 0x2c,
+	0x2c, 0x40, 0x2c,
+	0x2c, 0x40, 0x30,
+	0x2c, 0x40, 0x34,
+	0x2c, 0x40, 0x3c,
+	0x2c, 0x40, 0x40,
+	0x2c, 0x3c, 0x40,
+	0x2c, 0x34, 0x40,
+	0x2c, 0x30, 0x40,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00
 };
 
 static const byte font[][5] = {


Commit: a86a397b261eceb2830a15f030e0aa5f50651343
    https://github.com/scummvm/scummvm/commit/a86a397b261eceb2830a15f030e0aa5f50651343
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Programm intro title screen

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index bbb2b7c..005f44c 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -135,7 +135,7 @@ kString25, kString26, kString27, kStringTextSpeed, kString29,
 kString30, kString31, kString32, kString33, kString34,
 kString35, kString36, kString37, kString38, kString39,
 kString40, kString41, kString42, kString43, kString44,
-kString45, kString46, kString47, kString48, kString49,
+kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
 kString50, kString51, kString52, kString53, kString54,
 kString55, kString56, kString57, kString58, kString59,
 kString60, kString61, kString62, kString63, kString64,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 77b4429..ea06d0c 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -186,6 +186,20 @@ Intro::Intro(Supernova2Engine *vm, GameManager *gm) {
 
 	_fileNumber = -1;
 	_id = INTRO;
+	_introText = 
+		_vm->getGameString(kStringIntro1) + '\0' + 
+		_vm->getGameString(kStringIntro2) + '\0' + 
+		_vm->getGameString(kStringIntro3) + '\0' + 
+		_vm->getGameString(kStringIntro4) + '\0' + 
+		_vm->getGameString(kStringIntro5) + '\0' + 
+		"^Matthias Neef#" + '\0' +
+		"^Sascha Otterbach#" + '\0' +
+		"^Thomas Mazzoni#" + '\0' +
+		"^Matthias Klein#" + '\0' +
+		"^Gerrit Rothmaier#" + '\0' +
+		"^Thomas Hassler#" + '\0' +
+		"^Rene Kach#" + '\0' +
+		'\233' + '\0';
 }
 
 void Intro::onEntrance() {
@@ -196,6 +210,7 @@ void Intro::onEntrance() {
 }
 
 void Intro::titleScreen() {
+	CursorMan.showMouse(false);
 	_vm->_system->fillScreen(kColorBlack);
 	_vm->_screen->setViewportBrightness(0);
 	_vm->_screen->setGuiBrightness(0);
@@ -203,10 +218,45 @@ void Intro::titleScreen() {
 	_vm->setCurrentImage(1);
 	_vm->renderImage(0);
 	_vm->paletteFadeIn();
+	_gm->wait(15);
+	//titleFadeIn();
+	_vm->renderImage(1);
+	_gm->wait(15);
+	_vm->renderImage(2);
+	const Common::String title1 = "V1.02";
+	_vm->_screen->renderText(title1, 295, 190, 3);
+
+	Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
+	while (!_vm->shouldQuit()) {
+		_gm->updateEvents();
+		marquee.renderCharacter();
+		if (_gm->_mouseClicked || _gm->_keyPressed)
+			break;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+
+	_gm->wait(1);
 	_gm->getInput();
 }
 
 void Intro::titleFadeIn() {
+	byte titlePaletteColor[] = {0xfe, 0xeb};
+	byte titleNewColor[2][3] = {{255, 255, 255}, {199, 21, 21}};
+	byte newColors[2][3];
+
+	for (int brightness = 1; brightness <= 40; ++brightness) {
+		for (int colorIndex = 0; colorIndex < 2; ++colorIndex) {
+			for (int i = 0; i < 3; ++i) {
+				newColors[colorIndex][i] = (titleNewColor[colorIndex][i] * brightness) / 40;
+			}
+		}
+
+		_vm->_system->getPaletteManager()->setPalette(newColors[0], titlePaletteColor[0], 1);
+		_vm->_system->getPaletteManager()->setPalette(newColors[1], titlePaletteColor[1], 1);
+		_vm->_system->updateScreen();
+		_vm->_system->delayMillis(_vm->_delay);
+	}
 }
 
 bool Intro::animate(int section1, int section2, int duration) {
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 24efe91..af9b2b9 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -105,7 +105,7 @@ Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
 	: _text(text)
 	, _textBegin(text)
 	, _delay(0)
-	, _color(kColorLightBlue)
+	, _color(kColorPurple)
 	, _loop(false)
 	, _screen(screen) {
 	if (id == kMarqueeIntro) {
@@ -149,8 +149,8 @@ void Marquee::renderCharacter() {
 		_textWidth = Screen::textWidth(_text);
 		_x = kScreenWidth / 2 - _textWidth / 2;
 		_screen->_textCursorX = _x;
-		_color = kColorLightBlue;
-		_screen->_textColor = _color;
+		_color = kColorBlue;
+		_screen->_textColor = kColorPurple;
 		break;
 	case '^':
 		_color = kColorLightYellow;
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index 104874c..dbfeb42 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -62,6 +62,7 @@ enum Color {
 	kColorLightGreen  = 13,
 	kColorLightYellow = 14,
 	kColorLightRed    = 15,
+	kColorPurple	  = 35,
 	kColorCursorTransparent = kColorWhite25
 };
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 44553f2..24b8689 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -158,6 +158,15 @@ void GameManager::getInput() {
 	}
 }
 
+void GameManager::wait(int ticks) {
+	uint32 end = g_system->getMillis() + ticksToMsec(ticks);
+	do {
+		g_system->delayMillis(_vm->_delay);
+		updateEvents();
+		g_system->updateScreen();
+	} while (g_system->getMillis() < end && !_vm->shouldQuit());
+}
+
 void GameManager::changeRoom(RoomId id) {
 	_currentRoom = _rooms[id];
 	_newRoom = true;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index c6d357f..8672a41 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -76,6 +76,7 @@ public:
 	void initRooms();
 	void getInput();
 	void changeRoom(RoomId id);
+	void wait(int ticks);
 	void resetInputState();
 
 private:


Commit: b6b26bb6bbc34c8f81ef938d74f885efb3f11b6f
    https://github.com/scummvm/scummvm/commit/b6b26bb6bbc34c8f81ef938d74f885efb3f11b6f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add intro animation

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 005f44c..a221814 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -166,7 +166,7 @@ kString180, kString181, kString182, kString183, kString184,
 kString185, kString186, kString187, kString188, kString189,
 kString190, kString191, kString192, kString193, kString194,
 kString195, kString196, kString197, kString198, kString199,
-kString200, kString201, kString202, kString203, kString204,
+kStringAirportEntrance, kString201, kString202, kString203, kString204,
 kString205, kString206, kString207, kString208, kString209,
 kString210, kString211, kString212, kString213, kString214,
 kString215, kString216, kString217, kString218, kString219,
@@ -244,11 +244,11 @@ kString570, kString571, kString572, kString573, kString574,
 kString575, kString576, kString577, kString578, kString579,
 kString580, kString581, kString582, kString583, kString584,
 kString585, kString586, kString587, kString588, kString589,
-kString590, kString591, kString592, kString593, kString594,
-kString595, kString596, kString597, kString598, kString599,
-kString600, kString601, kString602, kString603, kString604,
-kString605, kString606, kString607, kString608, kString609,
-kString610, kString611, kString612, kString613 
+kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
+kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
+kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
+kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
+kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index ea06d0c..107eeb4 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -183,6 +183,7 @@ bool Room::interact(Action verb, Object &obj1, Object &obj2) {
 Intro::Intro(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
+	_restTime = 0;
 
 	_fileNumber = -1;
 	_id = INTRO;
@@ -206,7 +207,14 @@ void Intro::onEntrance() {
 	_gm->_guiEnabled = false;
 	_vm->_allowSaveGame = false;
 	_vm->_allowLoadGame = false;
+
 	titleScreen();
+	thoughts1() && tvDialogue() && thoughts2();
+
+	_gm->changeRoom(AIRPORT);
+	_gm->_guiEnabled = true;
+	_vm->_allowSaveGame = true;
+	_vm->_allowLoadGame = true;
 }
 
 void Intro::titleScreen() {
@@ -219,7 +227,6 @@ void Intro::titleScreen() {
 	_vm->renderImage(0);
 	_vm->paletteFadeIn();
 	_gm->wait(15);
-	//titleFadeIn();
 	_vm->renderImage(1);
 	_gm->wait(15);
 	_vm->renderImage(2);
@@ -235,48 +242,260 @@ void Intro::titleScreen() {
 		g_system->updateScreen();
 		g_system->delayMillis(_vm->_delay);
 	}
-
-	_gm->wait(1);
-	_gm->getInput();
+	_vm->paletteFadeOut();
+	CursorMan.showMouse(true);
 }
 
-void Intro::titleFadeIn() {
-	byte titlePaletteColor[] = {0xfe, 0xeb};
-	byte titleNewColor[2][3] = {{255, 255, 255}, {199, 21, 21}};
-	byte newColors[2][3];
+bool Intro::tvSay(int mod1, int mod2, int rest, MessagePosition pos, StringId id) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	const Common::String& text = _vm->getGameString(id);
+
+	_vm->renderMessage(text, pos);
+	int animation_count = (text.size() + 20) * (10 - rest) * _vm->_textSpeed / 400;
+	_restTime =  (text.size() + 20) * rest * _vm->_textSpeed / 400;
 
-	for (int brightness = 1; brightness <= 40; ++brightness) {
-		for (int colorIndex = 0; colorIndex < 2; ++colorIndex) {
-			for (int i = 0; i < 3; ++i) {
-				newColors[colorIndex][i] = (titleNewColor[colorIndex][i] * brightness) / 40;
-			}
+	while (animation_count) {
+		if (mod1)
+			_vm->renderImage(mod1);
+
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
 		}
+		if (mod2)
+			_vm->renderImage(mod2);
 
-		_vm->_system->getPaletteManager()->setPalette(newColors[0], titlePaletteColor[0], 1);
-		_vm->_system->getPaletteManager()->setPalette(newColors[1], titlePaletteColor[1], 1);
-		_vm->_system->updateScreen();
-		_vm->_system->delayMillis(_vm->_delay);
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
+		}
+		animation_count--;
 	}
+	if (_restTime == 0)
+		_vm->removeMessage();
+
+	return true;
 }
 
-bool Intro::animate(int section1, int section2, int duration) {
+bool Intro::tvRest(int mod1, int mod2, int rest) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	while (rest) {
+		_vm->renderImage(mod1);
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
+		}
+		_vm->renderImage(mod2);
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
+		}
+		rest--;
+	}
 	return true;
 }
 
-bool Intro::animate(int section1, int section2, int duration,
-					MessagePosition position, StringId textId) {
+bool Intro::displayThoughtMessage(StringId id) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	const Common::String& text = _vm->getGameString(id);
+	_vm->renderMessage(text, kMessageNormal);
+	if (_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10, key)) {
+		_vm->removeMessage();
+		return key != Common::KEYCODE_ESCAPE;
+	}
+	_vm->removeMessage();
 	return true;
 }
 
-bool Intro::animate(int section1, int section2, int section3, int section4,
-					int duration, MessagePosition position, StringId textId) {
+bool Intro::thoughts1() {
+	_vm->setCurrentImage(41);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+
+	if(!displayThoughtMessage(kStringIntro6))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro7))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro8))
+		return false;
+
+	_vm->paletteFadeOut();
+	return true;
+}
+
+bool Intro::thoughts2() {
+	_vm->setCurrentImage(41);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+
+	if(!displayThoughtMessage(kStringIntro9))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro10))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro11))
+		return false;
+
+	_vm->paletteFadeOut();
+
+	_vm->setCurrentImage(2);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->paletteFadeIn();
+
+	for (int i = 0; i < 35; i++)
+	{
+		_vm->renderImage((i % 3) + 2);
+		_gm->wait(3);
+	}
+	_vm->paletteFadeOut();
+
+	_vm->setCurrentImage(41);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->paletteFadeIn();
+
+	if(!displayThoughtMessage(kStringIntro12))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro13))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro14))
+		return false;
+
+	_vm->paletteFadeOut();
 	return true;
 }
 
-void Intro::cutscene() {
+bool Intro::tvDialogue() {
+	_vm->setCurrentImage(39);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->wait(50);
+	_vm->setCurrentImage(40);
+	_vm->renderImage(0);
+	for (int i = 1; i < 11; i++)
+	{
+		_gm->wait(3);
+		_vm->renderImage(i);
+	}
+	_gm->wait(30);
+	_vm->renderImage(11);
+	_gm->wait(60);
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->setCurrentImage(42);
+	_vm->renderImage(0);
+
+	if(!tvSay(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
+		return false;
+
+	_vm->renderImage(4);
+	_gm->wait(3);
+	_vm->renderImage(6);
+
+	if(!tvSay(8, 6, 7, kMessageLeft, kStringIntroTV2))
+		return false;
+
+	_vm->renderImage(10);
+
+	if(!tvRest(8, 6, _restTime))
+		return false;
+
+	_vm->removeMessage();
+
+	if(!tvSay(8, 6, 0, kMessageLeft, kStringIntroTV3))
+		return false;
+
+	if(!tvSay(8, 6, 0, kMessageLeft, kStringIntroTV4))
+		return false;
+
+	_vm->renderImage(10 + 128);
+	_gm->wait(3);
+	_vm->renderImage(5);
+	_gm->wait(3);
+	_vm->renderImage(7);
+
+	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV5))
+		return false;
+
+	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV6))
+		return false;
+
+	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV7))
+		return false;
+
+	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
+		return false;
+
+	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
+		return false;
+
+	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV10))
+		return false;
+
+	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
+		return false;
+
+	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
+		return false;
+
+	if(!tvSay(9, 7, 8, kMessageCenter, kStringIntroTV13))
+		return false;
+
+	_vm->renderImage(4);
+
+	if(!tvRest(9, 7, 1))
+		return false;
+
+	_vm->renderImage(4 + 128);
+
+	if(!tvRest(9, 7, 3))
+		return false;
+
+	_vm->renderImage(4);
+
+	if(!tvRest(9, 7, 1))
+		return false;
+
+	_vm->renderImage(6);
+
+	if(!tvRest(9, 7, _restTime - 5))
+		return false;
+
+	_vm->removeMessage();
+
+	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
+		return false;
+
+	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
+		return false;
+
+	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV16))
+		return false;
+
+	_vm->paletteFadeOut();
+	return true;
 }
 
-void Intro::leaveCutscene() {
+Airport::Airport(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 2;
+	_id = AIRPORT;
+	_shown[0] = kShownTrue;
+
 }
 
+void Airport::onEntrance() {
+	if (hasSeen() == false) {
+		_vm->renderMessage(kStringAirportEntrance);
+	}
+	setRoomSeen(true);
+}
 }
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 2fcf636..9dbc6c4 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -80,20 +80,25 @@ public:
 	virtual void onEntrance();
 
 private:
-	bool animate(int section1, int section2, int duration);
-	bool animate(int section1, int section2, int duration, MessagePosition position,
-				 StringId text);
-	bool animate(int section1, int section2, int section3, int section4, int duration,
-				 MessagePosition position, StringId text);
-
 	void titleScreen();
-	void titleFadeIn();
-	void cutscene();
-	void leaveCutscene();
-
-	bool _shouldExit;
+	bool tvSay(int mod1, int mod2, int rest, MessagePosition pos, StringId id);
+	bool tvRest(int mod1, int mod2, int rest);
+	bool displayThoughtMessage(StringId id);
+	bool thoughts1();
+	bool tvDialogue();
+	bool thoughts2();
+
+	int _restTime;
 	Common::String _introText;
 };
 
+class Airport : public Room {
+public:
+	Airport(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+
+private:
+};
+
 }
 #endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 24b8689..71adbf0 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -80,6 +80,7 @@ void GameManager::initState() {
 
 void GameManager::initRooms() {
 	_rooms[INTRO] = new Intro(_vm, this);
+	_rooms[AIRPORT] = new Airport(_vm, this);
 }
 
 void GameManager::updateEvents() {
@@ -167,6 +168,32 @@ void GameManager::wait(int ticks) {
 	} while (g_system->getMillis() < end && !_vm->shouldQuit());
 }
 
+void GameManager::waitOnInput(int ticks) {
+	uint32 end = g_system->getMillis() + ticksToMsec(ticks);
+	do {
+		g_system->delayMillis(_vm->_delay);
+		updateEvents();
+		g_system->updateScreen();
+	} while (g_system->getMillis() < end && !_vm->shouldQuit() && !_keyPressed && !_mouseClicked);
+}
+
+bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
+	keycode = Common::KEYCODE_INVALID;
+	uint32 end = g_system->getMillis() + ticksToMsec(ticks);
+	do {
+		g_system->delayMillis(_vm->_delay);
+		updateEvents();
+		g_system->updateScreen();
+		if (_keyPressed) {
+			keycode = _key.keycode;
+			_key.reset();
+			return true;
+		} else if (_mouseClicked)
+			return true;
+	} while (g_system->getMillis() < end  && !_vm->shouldQuit());
+	return false;
+}
+
 void GameManager::changeRoom(RoomId id) {
 	_currentRoom = _rooms[id];
 	_newRoom = true;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 8672a41..9c7ad22 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -77,6 +77,8 @@ public:
 	void getInput();
 	void changeRoom(RoomId id);
 	void wait(int ticks);
+	void waitOnInput(int ticks);
+	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void resetInputState();
 
 private:
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index fd19ab6..f2a21a6 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -60,7 +60,7 @@ Supernova2Engine::Supernova2Engine(OSystem *syst)
 	, _sleepAutoSave(nullptr)
 	, _sleepAuoSaveVersion(-1)
 	, _delay(33)
-	, _textSpeed(1) {
+	, _textSpeed(kTextSpeed[2]) {
 	if (ConfMan.hasKey("textspeed"))
 		_textSpeed = ConfMan.getInt("textspeed");
 


Commit: 86acda73a76f3c20c204c23dc05d397184fa9126
    https://github.com/scummvm/scummvm/commit/86acda73a76f3c20c204c23dc05d397184fa9126
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Correct overlook in comment and define

Changed paths:
    devtools/create_supernova2/create_supernova2.cpp
    devtools/create_supernova2/create_supernova2.h


diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp
index ff19728..a67ab80 100644
--- a/devtools/create_supernova2/create_supernova2.cpp
+++ b/devtools/create_supernova2/create_supernova2.cpp
@@ -165,7 +165,7 @@ int main(int argc, char *argv[]) {
 	}
 
 	// The generated file is of the form:
-	// 3 bytes: 'MSN'
+	// 3 bytes: 'MS2'
 	// 1 byte:  version
 	// -- data blocks
 	// 4 bytes: header  'IMG1' and 'IMG2' for newspaper images (for file 1 and file 2 respectively),
diff --git a/devtools/create_supernova2/create_supernova2.h b/devtools/create_supernova2/create_supernova2.h
index 7447a7e..dadf3d0 100644
--- a/devtools/create_supernova2/create_supernova2.h
+++ b/devtools/create_supernova2/create_supernova2.h
@@ -23,11 +23,11 @@
  * as translations and is required for the engine to work properly.
  */
 
-#ifndef CREATE_SUPERNOVA_H
-#define CREATE_SUPERNOVA_H
+#ifndef CREATE_SUPERNOVA2_H
+#define CREATE_SUPERNOVA2_H
 
 #define VERSION 1
 
 
 
-#endif // CREATE_SUPERNOVA_H
+#endif // CREATE_SUPERNOVA2_H


Commit: df1fbcbf4dcd276994d94b08138cff3dc4e1e5f8
    https://github.com/scummvm/scummvm/commit/df1fbcbf4dcd276994d94b08138cff3dc4e1e5f8
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add string, divide long line in string

Changed paths:
    devtools/create_supernova2/gametext.h
    devtools/create_supernova2/strings-en.po


diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index 6b4cf1e..7db7289 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -772,6 +772,8 @@ const char *gameText[] = {
 "\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das Raumschiff! Auf Wiedersehen!\"",    //"I hope you had a nice flight.|Please leave the spaceship! Goodbye!"
 "W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.",    //While the other passengers|are disembarking, you are trying|to handle the shock.
 "\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
+"\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"",
+	//"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
 NULL
 };
 
diff --git a/devtools/create_supernova2/strings-en.po b/devtools/create_supernova2/strings-en.po
index 624f975..17646ce 100644
--- a/devtools/create_supernova2/strings-en.po
+++ b/devtools/create_supernova2/strings-en.po
@@ -2720,7 +2720,7 @@ msgid ""
 "Aha, mich interessiert auáerdem,|ob es hier auf Axacuss etwas gibt,|das Sie "
 "besonders m”gen."
 msgstr ""
-"I see. I'm also interested in|whether there's anything here on Axacuss that "
+"I see. I'm also interested in|whether there's anything here on Axacuss |that "
 "you particularly like."
 
 #: ../../ms2/ms2_s.c:152


Commit: 977d67b27216a98be36e128432f09f0bbcc8e9f1
    https://github.com/scummvm/scummvm/commit/977d67b27216a98be36e128432f09f0bbcc8e9f1
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Synchronize with main repository

Better support for pbm format was added to
create_supernova in main repository, this
commit just mirrors theese changes

Changed paths:
    devtools/create_supernova2/create_supernova2.cpp
    devtools/create_supernova2/file.cpp
    devtools/create_supernova2/file.h


diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp
index a67ab80..5c9e22f 100644
--- a/devtools/create_supernova2/create_supernova2.cpp
+++ b/devtools/create_supernova2/create_supernova2.cpp
@@ -32,27 +32,81 @@ void writeImage(File& outputFile, const char *name, const char* language) {
 	char str[256];
 
 	// Read header (and check we have a binary PBM file)
-	imgFile.readString(str, 256);
-	if (strcmp(str, "P4") != 0) {
-		imgFile.close();
-		printf("File '%s' doesn't seem to be a binary pbm file! This image will be skipped.\n", fileName);
-		return;
-	}
+	// See http://netpbm.sourceforge.net/doc/pbm.html
+	// Header is in the form:
+	// - A "magic number" for identifying the file type ("P4" for binary pdm)
+	// - Whitespace (blanks, TABs, CRs, LFs).
+	// - The width in pixels of the image, formatted as ASCII characters in decimal.
+	// - Whitespace.
+	// - The height in pixels of the image, again in ASCII decimal.
+	// - A single whitespace character (usually a newline).
+	// - The raster data.
+	// Before the whitespace character that delimits the raster, any characters from a "#"
+	// through the next carriage return or newline character, is a comment and is ignored.
+	// Note that the comment can starts in the middle of a line. Note also that if you have
+	// a comment right before the raster, the newline at the end of the comment is not
+	// sufficient to delimit the raster.
 
-	// Skip comments and then read and check size
-	do {
-		imgFile.readString(str, 256);
-	} while (str[0] == '#');
 	int w = 0, h = 0;
-	if (sscanf(str, "%d %d", &w, &h) != 2 || w != 640 || h != 480) {
-		imgFile.close();
-		printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480, read: %dx%d). This image will be skipped.\n", fileName, w, h);
-		return;
-	}
+	enum PbmState { PbmMagic, PbmWidth, PbmHeight};
+	PbmState state = PbmMagic;
+	int i = 0;
+	do {
+		char c = (char)imgFile.readByte();
+		if (c == '#') {
+			do {
+				c = (char)imgFile.readByte();
+			} while (c != '\r' && c != '\n' && !imgFile.eof());
+			// If the comment is after the height, we need to read one more character
+			// before the raster data begin.
+			if (state == PbmHeight && i > 0)
+				c = (char)imgFile.readByte();
+		}
+		if (isspace(c)) {
+			if (i > 0) {
+				str[i] = 0;
+				i = 0;
+				if (state == PbmMagic) {
+					if (strcmp(str, "P4") != 0) {
+						imgFile.close();
+						printf("File '%s' doesn't seem to be a binary pbm file! This image will be skipped.\n", fileName);
+						return;
+					}
+				} else {
+					int *s = state == PbmWidth ? &w : &h;
+					if (sscanf(str, "%d", s) != 1) {
+						imgFile.close();
+						printf("Failed to read image size in binary pbm file '%s'. This image will be skipped.\n", fileName);
+						return;
+					}
+				}
+				if (state == PbmMagic)
+					state = PbmWidth;
+				else if (state == PbmWidth)
+					state = PbmHeight;
+				else {
+					// We have finished reading the header.
+					// Check the size is as expected.
+					if (w != 640 || h != 480) {
+						imgFile.close();
+						printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480, read: %dx%d). This image will be skipped.\n", fileName, w, h);
+						return;
+					}
+					// And break out of the loop.
+					break;
+				}
+			}
+		} else
+			str[i++] = c;
+		if (imgFile.eof()) {
+			printf("Unexpected end of file in '%s' while reading pbm header! This image will be skipped.\n", fileName);
+			return;
+		}
+	} while (1);
 
 	// Write block header in output file (4 bytes).
 	// We convert the image name to upper case.
-	for (int i = 0 ; i < 4 ; ++i) {
+	for (i = 0 ; i < 4 ; ++i) {
 		if (name[i] >= 97 && name[i] <= 122)
 			outputFile.writeByte(name[i] - 32);
 		else
@@ -60,7 +114,7 @@ void writeImage(File& outputFile, const char *name, const char* language) {
 	}
 	// And write the language code on 4 bytes as well (padded with 0 if needed).
 	int languageLength = strlen(language);
-	for (int i = 0 ; i < 4 ; ++i) {
+	for (i = 0 ; i < 4 ; ++i) {
 		if (i < languageLength)
 			outputFile.writeByte(language[i]);
 		else
@@ -73,7 +127,7 @@ void writeImage(File& outputFile, const char *name, const char* language) {
 	// Write all the bytes. We should have 38400 bytes (640 * 480 / 8)
 	// However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
 	// but pbm uses 0 for white and 1 for black.
-	for (int i = 0 ; i < 38400 ; ++i) {
+	for (i = 0 ; i < 38400 ; ++i) {
 		byte b = imgFile.readByte();
 		outputFile.writeByte(~b);
 	}
diff --git a/devtools/create_supernova2/file.cpp b/devtools/create_supernova2/file.cpp
index 5fb842a..d54258d 100644
--- a/devtools/create_supernova2/file.cpp
+++ b/devtools/create_supernova2/file.cpp
@@ -21,6 +21,10 @@ void File::write(const void *buffer, int len) {
 	fwrite(buffer, 1, len, f);
 }
 
+bool File::eof() {
+	return feof(f) != 0;
+}
+
 byte File::readByte() {
 	byte v;
 	read(&v, sizeof(byte));
@@ -39,16 +43,6 @@ uint32 File::readLong() {
 	return FROM_LE_32(v);
 }
 
-void File::readString(char* string, int bufferLength) {
-	int i = 0;
-	while (i < bufferLength - 1 && fread(string + i, 1, 1, f) == 1) {
-		if (string[i] == '\n' || string[i] == 0)
-			break;
-		++ i;
-	}
-	string[i] = 0;
-}
-
 void File::writeByte(byte v) {
 	write(&v, sizeof(byte));
 }
diff --git a/devtools/create_supernova2/file.h b/devtools/create_supernova2/file.h
index dd33e41..f285293 100644
--- a/devtools/create_supernova2/file.h
+++ b/devtools/create_supernova2/file.h
@@ -45,11 +45,11 @@ public:
 	uint32 pos();
 	long read(void *buffer, int len);
 	void write(const void *buffer, int len);
+	bool eof();
 
 	byte readByte();
 	uint16 readWord();
 	uint32 readLong();
-	void readString(char*, int bufferLength);
 	void writeByte(byte v);
 	void writeWord(uint16 v);
 	void writeLong(uint32 v);


Commit: 777040557d7a48eb6c408ea5b66d3048434afdfb
    https://github.com/scummvm/scummvm/commit/777040557d7a48eb6c408ea5b66d3048434afdfb
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add inventory from supernova

Changed paths:
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 71adbf0..2d44b2a 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -42,8 +42,59 @@ namespace Supernova2 {
 //	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
 //};
 
+void Inventory::add(Object &obj) {
+	if (_numObjects < kMaxCarry) {
+		_inventory[_numObjects++] = &obj;
+		obj.setProperty(CARRIED);
+	}
+
+	if (getSize() > _inventoryScroll + 8) {
+		_inventoryScroll = getSize() - 8;
+		_inventoryScroll += _inventoryScroll % 2;
+	}
+}
+
+void Inventory::remove(Object &obj) {
+	for (int i = 0; i < _numObjects; ++i) {
+		if (_inventory[i] == &obj) {
+			if (_inventoryScroll >= 2 && getSize() % 2)
+				_inventoryScroll -= 2;
+
+			--_numObjects;
+			while (i < _numObjects) {
+				_inventory[i] = _inventory[i + 1];
+				++i;
+			}
+			obj.disableProperty(CARRIED);
+		}
+	}
+}
+
+void Inventory::clear() {
+	for (int i = 0; i < _numObjects; ++i)
+		_inventory[i]->disableProperty(CARRIED);
+	_numObjects = 0;
+	_inventoryScroll = 0;
+}
+
+Object *Inventory::get(int index) const {
+	if (index < _numObjects)
+		return _inventory[index];
+
+	return _nullObject;
+}
+
+Object *Inventory::get(ObjectId id) const {
+	for (int i = 0; i < _numObjects; ++i) {
+		if (_inventory[i]->_id == id)
+			return _inventory[i];
+	}
+
+	return _nullObject;
+}
 GameManager::GameManager(Supernova2Engine *vm)
-	: _vm(vm)
+	: _inventory(&_nullObject, _inventoryScroll)
+	, _vm(vm)
     , _mouseClickType(Common::EVENT_INVALID) {
 	initRooms();
 	changeRoom(INTRO);
@@ -54,6 +105,9 @@ GameManager::~GameManager() {
 }
 
 void GameManager::initState() {
+	_currentInputObject = &_nullObject;
+	_inputObject[0] = &_nullObject;
+	_inputObject[1] = &_nullObject;
 	_processInput = false;
 	_guiEnabled = true;
 	_animationEnabled = true;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 9c7ad22..a8e3b36 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -36,6 +36,30 @@ const int32 kMaxTimerValue = 0x7FFFFFFF;
 struct GameState {
 };
 
+class Inventory {
+public:
+	Inventory(Object *nullObject, int &inventoryScroll)
+		: _numObjects(0)
+		, _nullObject(nullObject)
+	    , _inventoryScroll(inventoryScroll) {
+		for (int i = 0; i < kMaxCarry; ++i)
+			_inventory[i] = nullptr;
+	}
+
+	void add(Object &obj);
+	void remove(Object &obj);
+	void clear();
+	Object *get(int index) const;
+	Object *get(ObjectId id) const;
+	int getSize() const { return _numObjects; }
+
+private:
+	Object *_inventory[kMaxCarry];
+	Object *_nullObject;
+	int &_inventoryScroll;
+	int _numObjects;
+};
+
 class GameManager {
 public:
 	GameManager(Supernova2Engine *vm);
@@ -56,10 +80,14 @@ public:
 	Room *_currentRoom;
 	bool _newRoom;
 	Room *_rooms[NUMROOMS];
+	Inventory _inventory;
 	GameState _state;
 	bool _processInput;
 	bool _guiEnabled;
 	bool _animationEnabled;
+	Object _nullObject;
+	Object *_currentInputObject;
+	Object *_inputObject[2];
 	uint _timePaused;
 	bool _timerPaused;
 	int32 _messageDuration;


Commit: 5c8171eed688380a4173d61a066fde03bbf0f822
    https://github.com/scummvm/scummvm/commit/5c8171eed688380a4173d61a066fde03bbf0f822
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add gui commands to game manager

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index a221814..e686500 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -126,11 +126,11 @@ enum ObjectId {
 
 enum StringId {
 	kNoString = -1,
-kString0, kString1, kString2, kString3, kString4,
-kString5, kString6, kString7, kString8, kString9,
-kString10, kString11, kString12, kString13, kString14,
-kString15, kString16, kString17, kString18, kString19,
-kString20, kString21, kString22, kString23, kString24,
+kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
+kString10, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
+kStringStatusCommandClose, kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk,
+kStringStatusCommandGive, kString21, kString22, kString23, kString24,
 kString25, kString26, kString27, kStringTextSpeed, kString29,
 kString30, kString31, kString32, kString33, kString34,
 kString35, kString36, kString37, kString38, kString39,
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 2d44b2a..ef05df9 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -32,15 +32,15 @@
 namespace Supernova2 {
 
 
-//StringId GameManager::guiCommands[] = {
-//	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
-//	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
-//};
-
-//StringId GameManager::guiStatusCommands[] = {
-//	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
-//	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
-//};
+StringId GameManager::guiCommands[] = {
+	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
+};
+
+StringId GameManager::guiStatusCommands[] = {
+	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
+	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
+};
 
 void Inventory::add(Object &obj) {
 	if (_numObjects < kMaxCarry) {
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index a8e3b36..56860d9 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -70,6 +70,8 @@ public:
 	//void processInput();
 	void executeRoom();
 
+	static StringId guiCommands[];
+	static StringId guiStatusCommands[];
 	Supernova2Engine *_vm;
 	Common::KeyState _key;
 	Common::EventType _mouseClickType;


Commit: cb9c28a37464fcc19836fda5e5e95edb7d29870b
    https://github.com/scummvm/scummvm/commit/cb9c28a37464fcc19836fda5e5e95edb7d29870b
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add room deletion to game manager

Changed paths:
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index ef05df9..e2fc600 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -102,6 +102,12 @@ GameManager::GameManager(Supernova2Engine *vm)
 }
 
 GameManager::~GameManager() {
+	destroyRooms();
+}
+
+void GameManager::destroyRooms() {
+	delete _rooms[INTRO];
+	delete _rooms[AIRPORT];
 }
 
 void GameManager::initState() {
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 56860d9..84e9f2c 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -104,6 +104,7 @@ public:
 
 	void initState();
 	void initRooms();
+	void destroyRooms();
 	void getInput();
 	void changeRoom(RoomId id);
 	void wait(int ticks);


Commit: f82e55a7f14ae25d24fb420eb0c189292ec8d1ea
    https://github.com/scummvm/scummvm/commit/f82e55a7f14ae25d24fb420eb0c189292ec8d1ea
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add gui element from supernova

Changed paths:
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index e2fc600..33a3d95 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -92,6 +92,55 @@ Object *Inventory::get(ObjectId id) const {
 
 	return _nullObject;
 }
+
+GuiElement::GuiElement()
+	: _isHighlighted(false)
+	, _bgColorNormal(kColorWhite25)
+	, _bgColorHighlighted(kColorWhite44)
+	, _bgColor(kColorWhite25)
+	, _textColorNormal(kColorGreen)
+	, _textColorHighlighted(kColorLightGreen)
+	, _textColor(kColorGreen)
+{
+	memset(_text, 0, sizeof(_text));
+}
+
+void GuiElement::setText(const char *text) {
+	strncpy(_text, text, sizeof(_text) - 1);
+}
+
+void GuiElement::setTextPosition(int x, int y) {
+	_textPosition = Common::Point(x, y);
+}
+
+void GuiElement::setSize(int x1, int y1, int x2, int y2) {
+	this->left = x1;
+	this->top = y1;
+	this->right = x2;
+	this->bottom = y2;
+
+	_textPosition = Common::Point(x1 + 1, y1 + 1);
+}
+
+void GuiElement::setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted) {
+	_bgColor = bgColor;
+	_textColor = textColor;
+	_bgColorNormal = bgColor;
+	_textColorNormal = textColor;
+	_bgColorHighlighted = bgColorHighlighted;
+	_textColorHighlighted = textColorHightlighted;
+}
+
+void GuiElement::setHighlight(bool isHighlighted_) {
+	if (isHighlighted_) {
+		_bgColor = _bgColorHighlighted;
+		_textColor = _textColorHighlighted;
+	} else {
+		_bgColor = _bgColorNormal;
+		_textColor = _textColorNormal;
+	}
+}
+
 GameManager::GameManager(Supernova2Engine *vm)
 	: _inventory(&_nullObject, _inventoryScroll)
 	, _vm(vm)
@@ -99,6 +148,7 @@ GameManager::GameManager(Supernova2Engine *vm)
 	initRooms();
 	changeRoom(INTRO);
 	initState();
+	initGui();
 }
 
 GameManager::~GameManager() {
@@ -143,6 +193,48 @@ void GameManager::initRooms() {
 	_rooms[AIRPORT] = new Airport(_vm, this);
 }
 
+void GameManager::initGui() {
+	int cmdCount = ARRAYSIZE(_guiCommandButton);
+	int cmdAvailableSpace = 320 - (cmdCount - 1) * 2;
+	for (int i = 0; i < cmdCount; ++i) {
+		const Common::String &text = _vm->getGameString(guiCommands[i]);
+		cmdAvailableSpace -= Screen::textWidth(text);
+	}
+
+	int commandButtonX = 0;
+	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
+		const Common::String &text = _vm->getGameString(guiCommands[i]);
+		int width;
+		if (i < cmdCount - 1) {
+			int space = cmdAvailableSpace / (cmdCount - i);
+			cmdAvailableSpace -= space;
+			width = Screen::textWidth(text) + space;
+		} else
+			width = 320 - commandButtonX;
+
+		_guiCommandButton[i].setSize(commandButtonX, 150, commandButtonX + width, 159);
+		_guiCommandButton[i].setText(text.c_str());
+		_guiCommandButton[i].setColor(kColorWhite25, kColorDarkGreen, kColorWhite44, kColorGreen);
+		commandButtonX += width + 2;
+	}
+
+	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
+		int inventoryX = 136 * (i % 2);
+		int inventoryY = 161 + 10 * (i / 2);
+
+		_guiInventory[i].setSize(inventoryX, inventoryY, inventoryX + 135, inventoryY + 9);
+		_guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+	}
+	_guiInventoryArrow[0].setSize(272, 161, 279, 180);
+	_guiInventoryArrow[0].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+	_guiInventoryArrow[0].setText("\x82");
+	_guiInventoryArrow[0].setTextPosition(273, 166);
+	_guiInventoryArrow[1].setSize(272, 181, 279, 200);
+	_guiInventoryArrow[1].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+	_guiInventoryArrow[1].setText("\x83");
+	_guiInventoryArrow[1].setTextPosition(273, 186);
+}
+
 void GameManager::updateEvents() {
 	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
 		_currentRoom->animation();
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 84e9f2c..7ed65cc 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -60,6 +60,44 @@ private:
 	int _numObjects;
 };
 
+class GuiElement : public Common::Rect {
+public:
+	GuiElement();
+
+	void setSize(int x1, int y1, int x2, int y2);
+	void setText(const char *text);
+	void setTextPosition(int x, int y);
+	void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
+	void setHighlight(bool isHighlighted);
+
+	const char *getText() const {
+		return _text;
+	}
+	int getBackgroundColor() const {
+		return _bgColor;
+	}
+	int getTextColor() const {
+		return _textColor;
+	}
+	const Common::Point &getTextPos() const {
+		return _textPosition;
+	}
+	bool isHighlighted() const {
+		return _isHighlighted;
+	}
+
+private:
+	Common::Point _textPosition;
+	char _text[128];
+	int _bgColor;
+	int _textColor;
+	int _bgColorNormal;
+	int _bgColorHighlighted;
+	int _textColorNormal;
+	int _textColorHighlighted;
+	bool _isHighlighted;
+};
+
 class GameManager {
 public:
 	GameManager(Supernova2Engine *vm);
@@ -96,6 +134,9 @@ public:
 	int32 _animationTimer;
 	int _inventoryScroll;
 	int _exitList[25];
+	GuiElement _guiCommandButton[10];
+	GuiElement _guiInventory[8];
+	GuiElement _guiInventoryArrow[2];
 	// Dialog
 	int _currentSentence;
 	int _sentenceNumber[6];
@@ -105,6 +146,7 @@ public:
 	void initState();
 	void initRooms();
 	void destroyRooms();
+	void initGui();
 	void getInput();
 	void changeRoom(RoomId id);
 	void wait(int ticks);


Commit: dd5f1778ff20d7624ed3490ceeea1c8aa9e9fde8
    https://github.com/scummvm/scummvm/commit/dd5f1778ff20d7624ed3490ceeea1c8aa9e9fde8
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Render GUI

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index e686500..987fc5f 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -130,7 +130,7 @@ kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kS
 kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
 kString10, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
 kStringStatusCommandClose, kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk,
-kStringStatusCommandGive, kString21, kString22, kString23, kString24,
+kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kString23, kString24,
 kString25, kString26, kString27, kStringTextSpeed, kString29,
 kString30, kString31, kString32, kString33, kString34,
 kString35, kString36, kString37, kString38, kString39,
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index af9b2b9..6237a6e 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -271,10 +271,10 @@ void Screen::renderText(const Common::String &text) {
 		renderText(text.c_str());
 }
 
-/*void Screen::renderText(const GuiElement &guiElement) {
+void Screen::renderText(const GuiElement &guiElement) {
 	renderText(guiElement.getText(), guiElement.getTextPos().x,
 			   guiElement.getTextPos().y, guiElement.getTextColor());
-}*/
+}
 
 void Screen::renderText(const uint16 character, int x, int y, byte color) {
 	char text[2];
@@ -545,10 +545,10 @@ void Screen::renderBox(int x, int y, int width, int height, byte color) {
 	_vm->_system->unlockScreen();
 }
 
-/*void Screen::renderBox(const GuiElement &guiElement) {
+void Screen::renderBox(const GuiElement &guiElement) {
 	renderBox(guiElement.left, guiElement.top, guiElement.width(),
 			  guiElement.height(), guiElement.getBackgroundColor());
-}*/
+}
 
 void Screen::initPalette() {
 	g_system->getPaletteManager()->setPalette(initVGAPalette, 0, 256);
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index dbfeb42..252e4df 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -35,7 +35,7 @@ namespace Supernova2 {
 class Supernova2Engine;
 class GameManager;
 class ResourceManager;
-//class GuiElement;
+class GuiElement;
 class Room;
 class MS2Image;
 class Screen;
@@ -165,9 +165,9 @@ public:
 	void renderText(const char *text, int x, int y, byte color);
 	void renderText(const Common::String &text, int x, int y, byte color);
 	void renderText(StringId stringId, int x, int y, byte color);
-	//void renderText(const GuiElement &guiElement);
+	void renderText(const GuiElement &guiElement);
 	void renderBox(int x, int y, int width, int height, byte color);
-	//void renderBox(const GuiElement &guiElement);
+	void renderBox(const GuiElement &guiElement);
 	void setColor63(byte value);
 	Common::Point getTextCursorPos();
 	void setTextCursorPos(int x, int y);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 33a3d95..49fba40 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -164,6 +164,7 @@ void GameManager::initState() {
 	_currentInputObject = &_nullObject;
 	_inputObject[0] = &_nullObject;
 	_inputObject[1] = &_nullObject;
+	_inputVerb = ACTION_WALK;
 	_processInput = false;
 	_guiEnabled = true;
 	_animationEnabled = true;
@@ -171,6 +172,7 @@ void GameManager::initState() {
 	_keyPressed = false;
 	_mouseX = -1;
 	_mouseY = -1;
+	_mouseField = -1;
 	_inventoryScroll = 0;
 	_timerPaused = 0;
 	_timePaused = false;
@@ -251,8 +253,6 @@ void GameManager::updateEvents() {
 		case Common::EVENT_LBUTTONUP:
 			// fallthrough
 		case Common::EVENT_RBUTTONUP:
-			if (_currentRoom->getId() != INTRO)
-				return;
 			_mouseClicked = true;
 			// fallthrough
 		case Common::EVENT_MOUSEMOVE:
@@ -260,7 +260,7 @@ void GameManager::updateEvents() {
 			_mouseX = event.mouse.x;
 			_mouseY = event.mouse.y;
 			if (_guiEnabled)
-				//processInput();
+				processInput();
 			break;
 		default:
 			break;
@@ -301,6 +301,305 @@ void GameManager::processInput(Common::KeyState &state) {
 	}
 }
 
+void GameManager::resetInputState() {
+	setObjectNull(_inputObject[0]);
+	setObjectNull(_inputObject[1]);
+	_inputVerb = ACTION_WALK;
+	_processInput = false;
+	_mouseClicked = false;
+	_keyPressed = false;
+	_key.reset();
+	_mouseClickType = Common::EVENT_MOUSEMOVE;
+
+	processInput();
+}
+
+
+void GameManager::processInput() {
+	enum {
+		onNone,
+		onObject,
+		onCmdButton,
+		onInventory,
+		onInventoryArrowUp,
+		onInventoryArrowDown
+	} mouseLocation;
+
+	if (_mouseField >= 0 && _mouseField < 256)
+		mouseLocation = onObject;
+	else if (_mouseField >= 256 && _mouseField < 512)
+		mouseLocation = onCmdButton;
+	else if (_mouseField >= 512 && _mouseField < 768)
+		mouseLocation = onInventory;
+	else if (_mouseField == 768)
+		mouseLocation = onInventoryArrowUp;
+	else if (_mouseField == 769)
+		mouseLocation = onInventoryArrowDown;
+	else
+		mouseLocation = onNone;
+
+	if (_mouseClickType == Common::EVENT_LBUTTONUP) {
+		if (_vm->_screen->isMessageShown()) {
+			// Hide the message and consume the event
+			_vm->removeMessage();
+			if (mouseLocation != onCmdButton)
+				return;
+		}
+
+		switch(mouseLocation) {
+		case onObject:
+		case onInventory:
+			// Fallthrough
+			if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
+				if (isNullObject(_inputObject[0])) {
+					_inputObject[0] = _currentInputObject;
+					if (!_inputObject[0]->hasProperty(COMBINABLE))
+						_processInput = true;
+				} else {
+					_inputObject[1] = _currentInputObject;
+					_processInput = true;
+				}
+			} else {
+				_inputObject[0] = _currentInputObject;
+				if (!isNullObject(_currentInputObject))
+					_processInput = true;
+			}
+			break;
+		case onCmdButton:
+			resetInputState();
+			_inputVerb = static_cast<Action>(_mouseField - 256);
+			break;
+		case onInventoryArrowUp:
+			if (_inventoryScroll >= 2)
+				_inventoryScroll -= 2;
+			break;
+		case onInventoryArrowDown:
+			if (_inventoryScroll < _inventory.getSize() - ARRAYSIZE(_guiInventory))
+				_inventoryScroll += 2;
+			break;
+		case onNone:
+			break;
+		}
+
+	} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
+		if (_vm->_screen->isMessageShown()) {
+			// Hide the message and consume the event
+			_vm->removeMessage();
+			return;
+		}
+
+		if (isNullObject(_currentInputObject))
+			return;
+
+		if (mouseLocation == onObject || mouseLocation == onInventory) {
+			_inputObject[0] = _currentInputObject;
+			ObjectTypes type = _inputObject[0]->_type;
+			if (type & OPENABLE)
+				_inputVerb = (type & OPENED) ? ACTION_CLOSE : ACTION_OPEN;
+			else if (type & PRESS)
+				_inputVerb = ACTION_PRESS;
+			else if (type & TALK)
+				_inputVerb = ACTION_TALK;
+			else
+				_inputVerb = ACTION_LOOK;
+
+			_processInput = true;
+		}
+
+	} else if (_mouseClickType == Common::EVENT_MOUSEMOVE) {
+		int field = -1;
+		int click = -1;
+
+		if ((_mouseY >= _guiCommandButton[0].top) && (_mouseY <= _guiCommandButton[0].bottom)) {
+			/* command row */
+			field = 9;
+			while (_mouseX < _guiCommandButton[field].left - 1)
+				field--;
+			field += 256;
+		} else if ((_mouseX >= 283) && (_mouseX <= 317) && (_mouseY >= 163) && (_mouseY <= 197)) {
+			/* exit box */
+			field = _exitList[(_mouseX - 283) / 7 + 5 * ((_mouseY - 163) / 7)];
+		} else if ((_mouseY >= 161) && (_mouseX <= 270)) {
+			/* inventory box */
+			field = (_mouseX + 1) / 136 + ((_mouseY - 161) / 10) * 2;
+			if (field + _inventoryScroll < _inventory.getSize())
+				field += 512;
+			else
+				field = -1;
+		} else if ((_mouseY >= 161) && (_mouseX >= 271) && (_mouseX < 279)) {
+			/* inventory arrows */
+			field = (_mouseY > 180) ? 769 : 768;
+		} else {
+			/* normal item */
+			for (int i = 0; (_currentRoom->getObject(i)->_id != INVALIDOBJECT) &&
+							(field == -1) && i < kMaxObject; i++) {
+				click = _currentRoom->getObject(i)->_click;
+				const MS2Image *image = _vm->_screen->getCurrentImage();
+				if (click != 255 && image) {
+					const MS2Image::ClickField *clickField = image->_clickField;
+					do {
+						if ((_mouseX >= clickField[click].x1) && (_mouseX <= clickField[click].x2) &&
+							(_mouseY >= clickField[click].y1) && (_mouseY <= clickField[click].y2))
+							field = i;
+
+						click = clickField[click].next;
+					} while ((click != 0) && (field == -1));
+				}
+			}
+		}
+
+		if (_mouseField != field) {
+			switch (mouseLocation) {
+			case onInventoryArrowUp:
+			case onInventoryArrowDown:
+				// Fallthrough
+				_guiInventoryArrow[_mouseField - 768].setHighlight(false);
+				break;
+			case onInventory:
+				_guiInventory[_mouseField - 512].setHighlight(false);
+				break;
+			case onCmdButton:
+				_guiCommandButton[_mouseField - 256].setHighlight(false);
+				break;
+			case onObject:
+			case onNone:
+				// Fallthrough
+				break;
+			}
+
+			setObjectNull(_currentInputObject);
+
+			_mouseField = field;
+			if (_mouseField >= 0 && _mouseField < 256)
+				mouseLocation = onObject;
+			else if (_mouseField >= 256 && _mouseField < 512)
+				mouseLocation = onCmdButton;
+			else if (_mouseField >= 512 && _mouseField < 768)
+				mouseLocation = onInventory;
+			else if (_mouseField == 768)
+				mouseLocation = onInventoryArrowUp;
+			else if (_mouseField == 769)
+				mouseLocation = onInventoryArrowDown;
+			else
+				mouseLocation = onNone;
+
+			switch (mouseLocation) {
+			case onInventoryArrowUp:
+			case onInventoryArrowDown:
+				// Fallthrough
+				_guiInventoryArrow[_mouseField - 768].setHighlight(true);
+				break;
+			case onInventory:
+				_guiInventory[_mouseField - 512].setHighlight(true);
+				_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
+				break;
+			case onCmdButton:
+				_guiCommandButton[_mouseField - 256].setHighlight(true);
+				break;
+			case onObject:
+				_currentInputObject = _currentRoom->getObject(_mouseField);
+				break;
+			case onNone:
+				break;
+			}
+		}
+	}
+}
+
+void GameManager::setObjectNull(Object *&obj) {
+	obj = &_nullObject;
+}
+
+bool GameManager::isNullObject(Object *obj) {
+	return obj == &_nullObject;
+}
+
+void GameManager::showMenu() {
+	_vm->renderBox(0, 138, 320, 62, 0);
+	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
+	drawCommandBox();
+	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+	drawInventory();
+}
+
+void GameManager::drawStatus() {
+	int index = static_cast<int>(_inputVerb);
+	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
+	_vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
+
+	if (isNullObject(_inputObject[0]))
+		_vm->renderText(_currentInputObject->_name);
+	else {
+		_vm->renderText(_inputObject[0]->_name);
+		if (_inputVerb == ACTION_GIVE)
+			_vm->renderText(kPhrasalVerbParticleGiveTo);
+		else if (_inputVerb == ACTION_USE)
+			_vm->renderText(kPhrasalVerbParticleUseWith);
+
+		_vm->renderText(_currentInputObject->_name);
+	}
+}
+
+void GameManager::drawCommandBox() {
+	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
+		_vm->renderBox(_guiCommandButton[i]);
+		int space = (_guiCommandButton[i].width() - Screen::textWidth(_guiCommandButton[i].getText())) / 2;
+		_vm->renderText(_guiCommandButton[i].getText(),
+						_guiCommandButton[i].getTextPos().x + space,
+						_guiCommandButton[i].getTextPos().y,
+						_guiCommandButton[i].getTextColor());
+	}
+}
+
+void GameManager::drawInventory() {
+	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
+		_vm->renderBox(_guiInventory[i]);
+		_vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
+						_guiInventory[i].getTextPos().x,
+						_guiInventory[i].getTextPos().y,
+						_guiInventory[i].getTextColor());
+	}
+
+	_vm->renderBox(_guiInventoryArrow[0]);
+	_vm->renderBox(_guiInventoryArrow[1]);
+	if (_inventory.getSize() > ARRAYSIZE(_guiInventory)) {
+		if (_inventoryScroll != 0)
+			_vm->renderText(_guiInventoryArrow[0]);
+		if (_inventoryScroll + ARRAYSIZE(_guiInventory) < _inventory.getSize())
+			_vm->renderText(_guiInventoryArrow[1]);
+	}
+}
+
+uint16 GameManager::getKeyInput(bool blockForPrintChar) {
+	while (!_vm->shouldQuit()) {
+		updateEvents();
+		if (_keyPressed) {
+			if (blockForPrintChar) {
+				if (Common::isPrint(_key.keycode) ||
+					_key.keycode == Common::KEYCODE_BACKSPACE ||
+					_key.keycode == Common::KEYCODE_DELETE ||
+					_key.keycode == Common::KEYCODE_RETURN ||
+					_key.keycode == Common::KEYCODE_SPACE ||
+					_key.keycode == Common::KEYCODE_ESCAPE ||
+					_key.keycode == Common::KEYCODE_UP ||
+					_key.keycode == Common::KEYCODE_DOWN ||
+					_key.keycode == Common::KEYCODE_LEFT ||
+					_key.keycode == Common::KEYCODE_RIGHT) {
+					if (_key.flags & Common::KBD_SHIFT)
+						return toupper(_key.ascii);
+					else
+						return tolower(_key.ascii);
+				}
+			} else {
+				return _key.ascii;
+			}
+		}
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+	return 0;
+}
+
 void GameManager::getInput() {
 	while (!_vm->shouldQuit()) {
 		updateEvents();
@@ -311,6 +610,11 @@ void GameManager::getInput() {
 	}
 }
 
+void GameManager::changeRoom(RoomId id) {
+	_currentRoom = _rooms[id];
+	_newRoom = true;
+}
+
 void GameManager::wait(int ticks) {
 	uint32 end = g_system->getMillis() + ticksToMsec(ticks);
 	do {
@@ -346,24 +650,6 @@ bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
 	return false;
 }
 
-void GameManager::changeRoom(RoomId id) {
-	_currentRoom = _rooms[id];
-	_newRoom = true;
-}
-
-void GameManager::resetInputState() {
-//	setObjectNull(_inputObject[0]);
-//	setObjectNull(_inputObject[1]);
-//	_inputVerb = ACTION_WALK;
-	_processInput = false;
-	_mouseClicked = false;
-	_keyPressed = false;
-	_key.reset();
-	_mouseClickType = Common::EVENT_MOUSEMOVE;
-
-	//processInput();
-}
-
 void GameManager::executeRoom() {
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
 //		handleInput();
@@ -386,9 +672,9 @@ void GameManager::executeRoom() {
 			_vm->renderRoom(*_currentRoom);
 		}
 //		drawMapExits();
-//		drawInventory();
-//		drawStatus();
-//		drawCommandBox();
+		drawInventory();
+		drawStatus();
+		drawCommandBox();
 	}
 
 	//if (_vm->_screen->getViewportBrightness() == 0)
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 7ed65cc..b32d2d2 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -105,7 +105,7 @@ public:
 
 	void updateEvents();
 	void processInput(Common::KeyState &state);
-	//void processInput();
+	void processInput();
 	void executeRoom();
 
 	static StringId guiCommands[];
@@ -117,6 +117,7 @@ public:
 	bool _keyPressed;
 	int _mouseX;
 	int _mouseY;
+	int _mouseField;
 	Room *_currentRoom;
 	bool _newRoom;
 	Room *_rooms[NUMROOMS];
@@ -125,6 +126,7 @@ public:
 	bool _processInput;
 	bool _guiEnabled;
 	bool _animationEnabled;
+	Action _inputVerb;
 	Object _nullObject;
 	Object *_currentInputObject;
 	Object *_inputObject[2];
@@ -143,15 +145,23 @@ public:
 	byte _rows[6];
 	byte _rowsStart[6];
 
+	void setObjectNull(Object *&obj);
+	bool isNullObject(Object *obj);
+
 	void initState();
 	void initRooms();
 	void destroyRooms();
 	void initGui();
+	uint16 getKeyInput(bool blockForPrintChar = false);
 	void getInput();
-	void changeRoom(RoomId id);
 	void wait(int ticks);
 	void waitOnInput(int ticks);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
+	void showMenu();
+	void drawStatus();
+	void drawCommandBox();
+	void drawInventory();
+	void changeRoom(RoomId id);
 	void resetInputState();
 
 private:
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index f2a21a6..d617ced 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -255,6 +255,27 @@ void Supernova2Engine::renderText(StringId stringId) {
 	_screen->renderText(stringId);
 }
 
+void Supernova2Engine::renderText(const GuiElement &guiElement) {
+	_screen->renderText(guiElement);
+}
+
+void Supernova2Engine::renderText(const uint16 character, int x, int y, byte color) {
+	_screen->renderText(character, x, y, color);
+}
+
+void Supernova2Engine::renderText(const char *text, int x, int y, byte color) {
+	_screen->renderText(text, x, y, color);
+}
+
+void Supernova2Engine::renderText(const Common::String &text, int x, int y, byte color) {
+	_screen->renderText(text, x, y, color);
+}
+
+void Supernova2Engine::renderText(StringId stringId, int x, int y, byte color) {
+	_screen->renderText(stringId, x, y, color);
+}
+
+
 void Supernova2Engine::paletteBrightness() {
 	_screen->paletteBrightness();
 }
@@ -385,24 +406,12 @@ void Supernova2Engine::setColor63(byte value) {
 	return quit;
 }*/
 
-void Supernova2Engine::renderText(const uint16 character, int x, int y, byte color) {
-	_screen->renderText(character, x, y, color);
-}
-
-void Supernova2Engine::renderText(const char *text, int x, int y, byte color) {
-	_screen->renderText(text, x, y, color);
-}
-
-void Supernova2Engine::renderText(const Common::String &text, int x, int y, byte color) {
-	_screen->renderText(text, x, y, color);
-}
-
-void Supernova2Engine::renderText(StringId stringId, int x, int y, byte color) {
-	_screen->renderText(stringId, x, y, color);
-}
-
 void Supernova2Engine::renderBox(int x, int y, int width, int height, byte color) {
 	_screen->renderBox(x, y, width, height, color);
 }
 
+void Supernova2Engine::renderBox(const GuiElement &guiElement) {
+	_screen->renderBox(guiElement);
+}
+
 }
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index e5798d9..2667392 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -110,7 +110,9 @@ public:
 	void renderText(const char *text, int x, int y, byte color);
 	void renderText(const Common::String &text, int x, int y, byte color);
 	void renderText(StringId stringId, int x, int y, byte color);
+	void renderText(const GuiElement &guiElement);
 	void renderBox(int x, int y, int width, int height, byte color);
+	void renderBox(const GuiElement &guiElement);
 	void setColor63(byte value);
 };
 


Commit: 38904b405f3f4869764d2f524d1935109c39fc61
    https://github.com/scummvm/scummvm/commit/38904b405f3f4869764d2f524d1935109c39fc61
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add airport objects

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/supernova2.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 987fc5f..26a847dc 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -182,7 +182,7 @@ kString260, kString261, kString262, kString263, kString264,
 kString265, kString266, kString267, kString268, kString269,
 kString270, kString271, kString272, kString273, kString274,
 kString275, kString276, kString277, kString278, kString279,
-kString280, kString281, kString282, kString283, kString284,
+kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kString284,
 kString285, kString286, kString287, kString288, kString289,
 kString290, kString291, kString292, kString293, kString294,
 kString295, kString296, kString297, kString298, kString299,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 107eeb4..83268aa 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -490,6 +490,8 @@ Airport::Airport(Supernova2Engine *vm, GameManager *gm) {
 	_id = AIRPORT;
 	_shown[0] = kShownTrue;
 
+	_objectState[0] = Object(_id, kStringSpaceship, kStringSpaceshipDescription, NULLOBJECT, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+	_objectState[1] = Object(_id, kStringVehicles, kStringVehiclesDescription, NULLOBJECT, EXIT, 1, 1, 0, TAXISTAND, 8);
 }
 
 void Airport::onEntrance() {
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index d617ced..10c87ec 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -49,6 +49,30 @@
 
 namespace Supernova2 {
 
+ObjectType operator|(ObjectType a, ObjectType b) {
+	return static_cast<ObjectType>(+a | +b);
+}
+
+ObjectType operator&(ObjectType a, ObjectType b) {
+	return static_cast<ObjectType>(+a & +b);
+}
+
+ObjectType operator^(ObjectType a, ObjectType b) {
+	return static_cast<ObjectType>(+a ^ +b);
+}
+
+ObjectType &operator|=(ObjectType &a, ObjectType b) {
+	return a = a | b;
+}
+
+ObjectType &operator&=(ObjectType &a, ObjectType b) {
+	return a = a & b;
+}
+
+ObjectType &operator^=(ObjectType &a, ObjectType b) {
+	return a = a ^ b;
+}
+
 Supernova2Engine::Supernova2Engine(OSystem *syst)
 	: Engine(syst)
 	, _console(nullptr)


Commit: 3300c358dbd6f7df1f20d56be5ddf61ae10436c3
    https://github.com/scummvm/scummvm/commit/3300c358dbd6f7df1f20d56be5ddf61ae10436c3
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add starting items

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 26a847dc..7a6e75b 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -118,7 +118,7 @@ enum ObjectId {
 	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
 	DOODLE,DOODLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD,
 	MAGNET,UNDER_BED,KEY,VALVE,WARDROBE,DISCMAN,
-	SMALL_DOOR,BACK_MONEY,WALL,MAMMAL,IMITATION,SP_KEYCARD,ALARM_CRACKER,
+	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
 	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,INVESTMENT,
 	HANDLE,COUNTER,DOOR_SWITCH,SUIT,MANAGEMENT,RMANAGEMENT,
 	MUSCARD,SKOPF
@@ -146,8 +146,8 @@ kString80, kString81, kString82, kString83, kString84,
 kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kString93, kString94,
 kString95, kString96, kString97, kString98, kString99,
-kString100, kString101, kString102, kString103, kString104,
-kString105, kString106, kString107, kString108, kString109,
+kString100, kString101, kString102, kStringDinosaurHead, kString104,
+kString105, kStringSuctionCup, kString107, kString108, kString109,
 kString110, kString111, kString112, kString113, kString114,
 kString115, kString116, kString117, kString118, kString119,
 kString120, kString121, kString122, kString123, kString124,
@@ -179,9 +179,9 @@ kString245, kString246, kString247, kString248, kString249,
 kString250, kString251, kString252, kString253, kString254,
 kString255, kString256, kString257, kString258, kString259,
 kString260, kString261, kString262, kString263, kString264,
-kString265, kString266, kString267, kString268, kString269,
-kString270, kString271, kString272, kString273, kString274,
-kString275, kString276, kString277, kString278, kString279,
+kString265, kString266, kString267, kString268, kStringKnife,
+kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription, kStringSuctionCupDescription,
+kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard,
 kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kString284,
 kString285, kString286, kString287, kString288, kString289,
 kString290, kString291, kString292, kString293, kString294,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 83268aa..4aa196d 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -187,6 +187,17 @@ Intro::Intro(Supernova2Engine *vm, GameManager *gm) {
 
 	_fileNumber = -1;
 	_id = INTRO;
+
+	_objectState[0] = Object(_id, kStringKnife, kStringKnifeDescription, KNIFE, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+	_objectState[1] = Object(_id, kStringMoney, kStringDefaultDescription, MONEY, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+	_objectState[2] = Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringSuctionCup, kStringSuctionCupDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[4] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[5] = Object(_id, kStringSpecialCard, kStringSpecialCardDescription, SP_KEYCARD, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[6] = Object(_id, kStringAlarmCracker, kStringAlarmCrackerDescription, ALARM_CRACKER, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[7] = Object(_id, kStringDinosaurHead, kStringDefaultDescription, NULLOBJECT, TAKE, 255, 255, 0);
+	_objectState[8] = Object(_id, kStringKeycard, kStringDefaultDescription, MUSCARD, TAKE, 255, 255, 0);
+
 	_introText = 
 		_vm->getGameString(kStringIntro1) + '\0' + 
 		_vm->getGameString(kStringIntro2) + '\0' + 
@@ -495,6 +506,10 @@ Airport::Airport(Supernova2Engine *vm, GameManager *gm) {
 }
 
 void Airport::onEntrance() {
+	for (int i = 0; i < 3; ++i)
+		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
+
+	setRoomSeen(true);
 	if (hasSeen() == false) {
 		_vm->renderMessage(kStringAirportEntrance);
 	}


Commit: 3cb1cf16991b28df96738ae03818a767dd26eb91
    https://github.com/scummvm/scummvm/commit/3cb1cf16991b28df96738ae03818a767dd26eb91
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add drawMapExits from supernova

I am keeping there the TODO from the original code,
which can be resolved pretty easily, but I want to
leave the code as similar to supernova engine as possible
so it could eventualy be merged together.

Changed paths:
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 49fba40..6a4c855 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -522,6 +522,23 @@ void GameManager::showMenu() {
 	drawInventory();
 }
 
+void GameManager::drawMapExits() {
+// TODO: Preload _exitList on room entry instead on every call
+	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+
+	for (int i = 0; i < 25; i++)
+		_exitList[i] = -1;
+	for (int i = 0; i < kMaxObject; i++) {
+		if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
+			byte r = _currentRoom->getObject(i)->_direction;
+			_exitList[r] = i;
+			int x = 284 + 7 * (r % 5);
+			int y = 164 + 7 * (r / 5);
+			_vm->renderBox(x, y, 5, 5, kColorDarkRed);
+		}
+	}
+}
+
 void GameManager::drawStatus() {
 	int index = static_cast<int>(_inputVerb);
 	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
@@ -671,14 +688,14 @@ void GameManager::executeRoom() {
 			g_system->fillScreen(kColorBlack);
 			_vm->renderRoom(*_currentRoom);
 		}
-//		drawMapExits();
+		drawMapExits();
 		drawInventory();
 		drawStatus();
 		drawCommandBox();
 	}
 
-	//if (_vm->_screen->getViewportBrightness() == 0)
-	//	_vm->paletteFadeIn();
+	if (_vm->_screen->getViewportBrightness() == 0)
+		_vm->paletteFadeIn();
 
 	if (!_currentRoom->hasSeen() && _newRoom) {
 		_newRoom = false;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index b32d2d2..4569b24 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -158,6 +158,7 @@ public:
 	void waitOnInput(int ticks);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void showMenu();
+	void drawMapExits();
 	void drawStatus();
 	void drawCommandBox();
 	void drawInventory();


Commit: 6bd7e561b4325b48255d0d71a654432fd1c84889
    https://github.com/scummvm/scummvm/commit/6bd7e561b4325b48255d0d71a654432fd1c84889
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add interaction with room objects

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 7a6e75b..1891e36 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -132,9 +132,9 @@ kString10, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusComman
 kStringStatusCommandClose, kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk,
 kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kString23, kString24,
 kString25, kString26, kString27, kStringTextSpeed, kString29,
-kString30, kString31, kString32, kString33, kString34,
-kString35, kString36, kString37, kString38, kString39,
-kString40, kString41, kString42, kString43, kString44,
+kString30, kString31, kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3,
+kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8,
+kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
 kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
 kString50, kString51, kString52, kString53, kString54,
 kString55, kString56, kString57, kString58, kString59,
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 6a4c855..00b54c1 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -557,6 +557,16 @@ void GameManager::drawStatus() {
 	}
 }
 
+void GameManager::takeObject(Object &obj) {
+	if (obj.hasProperty(CARRIED))
+		return;
+
+	if (obj._section != 0)
+		_vm->renderImage(obj._section);
+	obj._click = obj._click2 = 255;
+	_inventory.add(obj);
+}
+
 void GameManager::drawCommandBox() {
 	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
 		_vm->renderBox(_guiCommandButton[i]);
@@ -667,9 +677,115 @@ bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
 	return false;
 }
 
+int GameManager::invertSection(int section) {
+	if (section < 128)
+		section += 128;
+	else
+		section -= 128;
+
+	return section;
+}
+
+bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+void GameManager::handleInput() {
+	bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
+	if (!validCommand)
+		validCommand = _currentRoom->interact(_inputVerb, *_inputObject[0], *_inputObject[1]);
+	if (!validCommand) {
+		switch (_inputVerb) {
+		case ACTION_LOOK:
+			_vm->renderMessage(_inputObject[0]->_description);
+			break;
+
+		case ACTION_WALK:
+			if (_inputObject[0]->hasProperty(CARRIED)) {
+				// You already carry this.
+				_vm->renderMessage(kStringGenericInteract1);
+			} else if (!_inputObject[0]->hasProperty(EXIT)) {
+				// You're already there.
+				_vm->renderMessage(kStringGenericInteract2);
+			} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
+				// This is closed
+				_vm->renderMessage(kStringGenericInteract3);
+			} else
+				changeRoom(_inputObject[0]->_exitRoom);
+
+			break;
+
+		case ACTION_TAKE:
+			if (_inputObject[0]->hasProperty(OPENED)) {
+				// You already have that
+				_vm->renderMessage(kStringGenericInteract4);
+			} else if (_inputObject[0]->hasProperty(UNNECESSARY)) {
+				// You do not need that.
+				_vm->renderMessage(kStringGenericInteract5);
+			} else if (!_inputObject[0]->hasProperty(TAKE)) {
+				// You can't take that.
+				_vm->renderMessage(kStringGenericInteract6);
+			} else
+				takeObject(*_inputObject[0]);
+
+			break;
+
+		case ACTION_OPEN:
+			if (!_inputObject[0]->hasProperty(OPENABLE)) {
+				// This can't be opened
+				_vm->renderMessage(kStringGenericInteract7);
+			} else if (_inputObject[0]->hasProperty(OPENED)) {
+				// This is already opened.
+				_vm->renderMessage(kStringGenericInteract8);
+			} else if (_inputObject[0]->hasProperty(CLOSED)) {
+				// This is locked.
+				_vm->renderMessage(kStringGenericInteract9);
+			} else {
+				_vm->renderImage(_inputObject[0]->_section);
+				_inputObject[0]->setProperty(OPENED);
+				byte i = _inputObject[0]->_click;
+				_inputObject[0]->_click  = _inputObject[0]->_click2;
+				_inputObject[0]->_click2 = i;
+				//_sound->play(kAudioDoorOpen);
+			}
+			break;
+
+		case ACTION_CLOSE:
+			if (!_inputObject[0]->hasProperty(OPENABLE) ||
+				(_inputObject[0]->hasProperty(CLOSED) &&
+				 _inputObject[0]->hasProperty(OPENED))) {
+				// This can't be closed.
+				_vm->renderMessage(kStringGenericInteract10);
+			} else if (!_inputObject[0]->hasProperty(OPENED)) {
+				// This is already closed.
+				_vm->renderMessage(kStringGenericInteract11);
+			} else {
+				_vm->renderImage(invertSection(_inputObject[0]->_section));
+				_inputObject[0]->disableProperty(OPENED);
+				byte i = _inputObject[0]->_click;
+				_inputObject[0]->_click  = _inputObject[0]->_click2;
+				_inputObject[0]->_click2 = i;
+				//_sound->play(kAudioDoorClose);
+			}
+			break;
+
+		case ACTION_GIVE:
+			if (_inputObject[0]->hasProperty(CARRIED)) {
+				// Better keep it!
+				_vm->renderMessage(kStringGenericInteract12);
+			}
+			break;
+
+		default:
+			// This is not possible.
+			_vm->renderMessage(kStringGenericInteract13);
+		}
+	}
+}
+
 void GameManager::executeRoom() {
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
-//		handleInput();
+		handleInput();
 		if (_mouseClicked) {
 			Common::Event event;
 			event.type = Common::EVENT_MOUSEMOVE;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 4569b24..27e5631 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -145,6 +145,7 @@ public:
 	byte _rows[6];
 	byte _rowsStart[6];
 
+	void takeObject(Object &obj);
 	void setObjectNull(Object *&obj);
 	bool isNullObject(Object *obj);
 
@@ -152,18 +153,21 @@ public:
 	void initRooms();
 	void destroyRooms();
 	void initGui();
+	bool genericInteract(Action verb, Object &obj1, Object &obj2);
 	uint16 getKeyInput(bool blockForPrintChar = false);
 	void getInput();
 	void wait(int ticks);
 	void waitOnInput(int ticks);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void showMenu();
+	int invertSection(int section);
 	void drawMapExits();
 	void drawStatus();
 	void drawCommandBox();
 	void drawInventory();
 	void changeRoom(RoomId id);
 	void resetInputState();
+	void handleInput();
 
 private:
 	int _prevImgId;


Commit: 701a9570070009dfc45f93330d19645b6f6ed1ce
    https://github.com/scummvm/scummvm/commit/701a9570070009dfc45f93330d19645b6f6ed1ce
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add taxi stand room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 1891e36..a495adf 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -145,7 +145,7 @@ kString75, kString76, kString77, kString78, kString79,
 kString80, kString81, kString82, kString83, kString84,
 kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kString93, kString94,
-kString95, kString96, kString97, kString98, kString99,
+kStringEntrance, kString96, kString97, kString98, kString99,
 kString100, kString101, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kString108, kString109,
 kString110, kString111, kString112, kString113, kString114,
@@ -166,8 +166,8 @@ kString180, kString181, kString182, kString183, kString184,
 kString185, kString186, kString187, kString188, kString189,
 kString190, kString191, kString192, kString193, kString194,
 kString195, kString196, kString197, kString198, kString199,
-kStringAirportEntrance, kString201, kString202, kString203, kString204,
-kString205, kString206, kString207, kString208, kString209,
+kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
+kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kString208, kString209,
 kString210, kString211, kString212, kString213, kString214,
 kString215, kString216, kString217, kString218, kString219,
 kString220, kString221, kString222, kString223, kString224,
@@ -182,9 +182,9 @@ kString260, kString261, kString262, kString263, kString264,
 kString265, kString266, kString267, kString268, kStringKnife,
 kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription, kStringSuctionCupDescription,
 kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard,
-kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kString284,
-kString285, kString286, kString287, kString288, kString289,
-kString290, kString291, kString292, kString293, kString294,
+kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kStringVehicle,
+kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWalletDescription, kStringDevice,
+kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kString293, kString294,
 kString295, kString296, kString297, kString298, kString299,
 kString300, kString301, kString302, kString303, kString304,
 kString305, kString306, kString307, kString308, kString309,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 4aa196d..7b96ee3 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -509,10 +509,66 @@ void Airport::onEntrance() {
 	for (int i = 0; i < 3; ++i)
 		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
 
-	setRoomSeen(true);
 	if (hasSeen() == false) {
 		_vm->renderMessage(kStringAirportEntrance);
 	}
 	setRoomSeen(true);
 }
+
+TaxiStand::TaxiStand(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 3;
+	_id = TAXISTAND;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownFalse;
+	_shown[4] = kShownFalse;
+	_shown[5] = kShownFalse;
+	_shown[6] = kShownFalse;
+	_shown[7] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringVehicle, kStringVehicleDescription, TAXI, NULLTYPE, 2, 2, 0, NULLROOM, 11);
+	_objectState[1] = Object(_id, kStringVehicle, kStringVehicleDescription, NULLOBJECT, NULLTYPE, 1, 1, 0);
+	_objectState[2] = Object(_id, kStringEntrance, kStringEntranceDescription, DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, NULLROOM, 1);
+	_objectState[3] = Object(_id, kStringWallet, kStringWalletDescription, WALLET, TAKE, 0, 0, 7 + 128);
+	_objectState[4] = Object(_id, kStringDevice, kStringDeviceDescription, TRANSMITTER, TAKE | PRESS, 255, 255, 0);
+	_objectState[5] = Object(_id, kStringIdCard, kStringIdCardDescription, ID_CARD, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[5] = Object(_id, kStringAirport, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, AIRPORT, 22);
+}
+
+void TaxiStand::onEntrance() {
+	setRoomSeen(true);
+}
+
+void TaxiStand::animation() {
+	if (isSectionVisible(4)) {
+		setSectionVisible(1, kShownFalse);
+		setSectionVisible(2, kShownFalse);
+		setSectionVisible(3, kShownFalse);
+		setSectionVisible(4, kShownFalse);
+	}
+	else if (isSectionVisible(3))
+		setSectionVisible(4, kShownTrue);
+	else if (isSectionVisible(2))
+		setSectionVisible(3, kShownTrue);
+	else if (isSectionVisible(1))
+		setSectionVisible(2, kShownTrue);
+	else
+		setSectionVisible(1, kShownTrue);
+	_gm->setAnimationTimer(7);
+}
+
+bool TaxiStand::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_WALK && obj1._id == TAXI && isSectionVisible(6))
+		;//taxi
+	else if ((verb == ACTION_WALK || verb == ACTION_OPEN) && obj1._id == DOOR)
+		_vm->renderMessage(obj1._description);
+	else 
+		return false;
+	return true;
+}
+
 }
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 9dbc6c4..547fcf4 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -100,5 +100,15 @@ public:
 private:
 };
 
+class TaxiStand : public Room {
+public:
+	TaxiStand(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
 }
 #endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 00b54c1..4a10522 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -158,6 +158,7 @@ GameManager::~GameManager() {
 void GameManager::destroyRooms() {
 	delete _rooms[INTRO];
 	delete _rooms[AIRPORT];
+	delete _rooms[TAXISTAND];
 }
 
 void GameManager::initState() {
@@ -174,6 +175,7 @@ void GameManager::initState() {
 	_mouseY = -1;
 	_mouseField = -1;
 	_inventoryScroll = 0;
+	_oldTime = g_system->getMillis();
 	_timerPaused = 0;
 	_timePaused = false;
 	_messageDuration = 0;
@@ -193,6 +195,7 @@ void GameManager::initState() {
 void GameManager::initRooms() {
 	_rooms[INTRO] = new Intro(_vm, this);
 	_rooms[AIRPORT] = new Airport(_vm, this);
+	_rooms[TAXISTAND] = new TaxiStand(_vm, this);
 }
 
 void GameManager::initGui() {
@@ -238,6 +241,7 @@ void GameManager::initGui() {
 }
 
 void GameManager::updateEvents() {
+	handleTime();
 	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
 		_currentRoom->animation();
 
@@ -677,6 +681,24 @@ bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
 	return false;
 }
 
+void GameManager::setAnimationTimer(int ticks) {
+	_animationTimer = ticksToMsec(ticks);
+}
+
+void GameManager::handleTime() {
+	if (_timerPaused)
+		return;
+	int32 newTime = g_system->getMillis();
+	int32 delta = newTime - _oldTime;
+
+	if (_animationTimer > delta)
+		_animationTimer -= delta;
+	else
+		_animationTimer = 0;
+
+	_oldTime = newTime;
+}
+
 int GameManager::invertSection(int section) {
 	if (section < 128)
 		section += 128;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 27e5631..b849cde 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -130,6 +130,7 @@ public:
 	Object _nullObject;
 	Object *_currentInputObject;
 	Object *_inputObject[2];
+	int32 _oldTime;
 	uint _timePaused;
 	bool _timerPaused;
 	int32 _messageDuration;
@@ -168,6 +169,8 @@ public:
 	void changeRoom(RoomId id);
 	void resetInputState();
 	void handleInput();
+	void handleTime();
+	void setAnimationTimer(int ticks);
 
 private:
 	int _prevImgId;


Commit: 43393fc29fbda09d5df0bbe58d76ecb854c87b74
    https://github.com/scummvm/scummvm/commit/43393fc29fbda09d5df0bbe58d76ecb854c87b74
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Dialogues from supernova engine

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index a495adf..0f40497 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -128,7 +128,7 @@ enum StringId {
 	kNoString = -1,
 kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
 kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
-kString10, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
+kStringConversationEnd, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
 kStringStatusCommandClose, kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk,
 kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kString23, kString24,
 kString25, kString26, kString27, kStringTextSpeed, kString29,
@@ -248,7 +248,8 @@ kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
 kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
 kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
 kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
-kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14
+kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14,
+kStringDialogSeparator
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 4a10522..204264e 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -184,7 +184,7 @@ void GameManager::initState() {
 	_currentSentence = -1;
 	for (int i = 0 ; i < 6 ; ++i) {
 		_sentenceNumber[i] = -1;
-//		_texts[i] = kNoString;
+		_texts[i] = kNoString;
 		_rows[i] = 0;
 		_rowsStart[i] = 0;
 	}
@@ -561,6 +561,132 @@ void GameManager::drawStatus() {
 	}
 }
 
+void GameManager::sentence(int number, bool brightness) {
+	if (number < 0)
+		return;
+	_vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, kColorWhite44);
+	if (_texts[_rowsStart[number]] == kStringDialogSeparator)
+		_vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, kColorRed);
+	else {
+		for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r)
+			_vm->renderText(_texts[r], 1, 142 + r * 10, kColorGreen);
+	}
+}
+
+void GameManager::say(StringId textId) {
+	Common::String str = _vm->getGameString(textId);
+	if (!str.empty())
+		say(str.c_str());
+}
+
+void GameManager::say(const char *text) {
+	Common::String t(text);
+	char *row[6];
+	Common::String::iterator p = t.begin();
+	uint numRows = 0;
+	while (*p) {
+		row[numRows++] = p;
+		while ((*p != '\0') && (*p != '|')) {
+			++p;
+		}
+		if (*p == '|') {
+			*p = 0;
+			++p;
+		}
+	}
+
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+	_vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
+	for (uint r = 0; r < numRows; ++r)
+		_vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
+	waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+}
+
+void GameManager::reply(StringId textId, int aus1, int aus2) {
+	Common::String str = _vm->getGameString(textId);
+	if (!str.empty())
+		reply(str.c_str(), aus1, aus2);
+}
+
+void GameManager::reply(const char *text, int aus1, int aus2) {
+	if (*text != '|')
+		_vm->renderMessage(text, kMessageTop);
+
+	for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
+		_vm->renderImage(aus1);
+		waitOnInput(2);
+		if (_keyPressed || _mouseClicked)
+			z = 1;
+		_vm->renderImage(aus2);
+		waitOnInput(2);
+		if (_keyPressed || _mouseClicked)
+			z = 1;
+	}
+	if (*text != '|')
+		_vm->removeMessage();
+}
+
+int GameManager::dialog(int num, byte rowLength[6], StringId text[6], int number) {
+	_vm->_allowLoadGame = false;
+	_guiEnabled = false;
+
+	bool remove[6];
+	for (int i = 0; i < 5; ++i)
+		remove[i] = _currentRoom->sentenceRemoved(i, number);
+	// The original does not initialize remove[5]!!!
+	// Set it to false/0. But maybe the loop above should use 6 instead of 5?
+	remove[5] = false;
+
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+	for (int i = 0; i < 6 ; ++i)
+		_sentenceNumber[i] = -1;
+
+	int r = 0, rq = 0;
+	for (int i = 0; i < num; ++i) {
+		if (!remove[i]) {
+			_rowsStart[i] = r;
+			_rows[i] = rowLength[i];
+			for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
+				_texts[r] = text[rq];
+				_sentenceNumber[r] = i;
+			}
+			sentence(i, false);
+		} else
+			rq += rowLength[i];
+	}
+
+	_currentSentence = -1;
+	do {
+		do {
+			updateEvents();
+			mousePosDialog(_mouseX, _mouseY);
+			g_system->updateScreen();
+			g_system->delayMillis(_vm->_delay);
+		} while (!_mouseClicked && !_vm->shouldQuit());
+	} while (_currentSentence == -1 && !_vm->shouldQuit());
+
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+	if (number && _currentSentence != -1 && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator)
+		_currentRoom->removeSentence(_currentSentence, number);
+
+	_guiEnabled = true;
+	_vm->_allowLoadGame = true;
+
+	return _currentSentence;
+}
+
+void GameManager::mousePosDialog(int x, int y) {
+	int a = y < 141 ? -1 : _sentenceNumber[(y - 141) / 10];
+	if (a != _currentSentence) {
+		sentence(_currentSentence, false);
+		_currentSentence = a;
+		sentence(_currentSentence, true);
+	}
+}
+
 void GameManager::takeObject(Object &obj) {
 	if (obj.hasProperty(CARRIED))
 		return;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index b849cde..237298f 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -143,6 +143,7 @@ public:
 	// Dialog
 	int _currentSentence;
 	int _sentenceNumber[6];
+	StringId _texts[6];
 	byte _rows[6];
 	byte _rowsStart[6];
 
@@ -171,6 +172,13 @@ public:
 	void handleInput();
 	void handleTime();
 	void setAnimationTimer(int ticks);
+	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
+	void sentence(int number, bool brightness);
+	void say(StringId textId);
+	void say(const char *text);
+	void reply(StringId textId, int aus1, int aus2);
+	void reply(const char *text, int aus1, int aus2);
+	void mousePosDialog(int x, int y);
 
 private:
 	int _prevImgId;


Commit: 800e41ddd21820aeb285988f47947eee9f4fd419
    https://github.com/scummvm/scummvm/commit/800e41ddd21820aeb285988f47947eee9f4fd419
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Finish taxistand, add taxi

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 0f40497..d5eddb3 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -81,9 +81,9 @@ enum Action {
 
 enum RoomId {
 	INTRO,AIRPORT,TAXISTAND,STREET,GAMES,CABIN,KIOSK,
-	KPALAST,CASHBOX,CITY1,CITY2,ELEVATOR,APARTMENT,SHIP,
+	CULTURE_PALACE,CASHBOX,CITY1,CITY2,ELEVATOR,APARTMENT,SHIP,
 
-	PYRAMID,PYRGANG,UPSTAIRS1,DOWNSTAIRS1,
+	PYRAMID,PYR_ENTRANCE,UPSTAIRS1,DOWNSTAIRS1,
 	BOTTOM_RIGHT_DOOR,BOTTOM_LEFT_DOOR,UPSTAIRS2,DOWNSTAIRS2,
 	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
 	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO_F,TOMATO_N,
@@ -162,7 +162,7 @@ kString160, kString161, kString162, kString163, kString164,
 kString165, kString166, kString167, kString168, kString169,
 kString170, kString171, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kString179,
-kString180, kString181, kString182, kString183, kString184,
+kString180, kString181, kStringEmpty, kStringWalletOpen, kString184,
 kString185, kString186, kString187, kString188, kString189,
 kString190, kString191, kString192, kString193, kString194,
 kString195, kString196, kString197, kString198, kString199,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 7b96ee3..dcda68d 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -563,7 +563,7 @@ void TaxiStand::animation() {
 
 bool TaxiStand::interact(Action verb, Object &obj1, Object &obj2) {
 	if (verb == ACTION_WALK && obj1._id == TAXI && isSectionVisible(6))
-		;//taxi
+		_gm->taxi();
 	else if ((verb == ACTION_WALK || verb == ACTION_OPEN) && obj1._id == DOOR)
 		_vm->renderMessage(obj1._description);
 	else 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 204264e..0a08d12 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -180,6 +180,7 @@ void GameManager::initState() {
 	_timePaused = false;
 	_messageDuration = 0;
 	_animationTimer = 0;
+	_taxi_possibility = 4;
 
 	_currentSentence = -1;
 	for (int i = 0 ; i < 6 ; ++i) {
@@ -187,9 +188,12 @@ void GameManager::initState() {
 		_texts[i] = kNoString;
 		_rows[i] = 0;
 		_rowsStart[i] = 0;
+		_dials[i] = 1;
 	}
 
 	_prevImgId = 0;
+
+	_state._money = 20;
 }
 
 void GameManager::initRooms() {
@@ -543,6 +547,11 @@ void GameManager::drawMapExits() {
 	}
 }
 
+void GameManager::takeMoney(int amount) {
+	_state._money += amount;
+	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
+}
+
 void GameManager::drawStatus() {
 	int index = static_cast<int>(_inputVerb);
 	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
@@ -835,7 +844,28 @@ int GameManager::invertSection(int section) {
 }
 
 bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
-	return false;
+	if (verb == ACTION_OPEN && obj1._id == WALLET) {
+		if (_rooms[TAXISTAND]->getObject(4)->_type & CARRIED)
+			_vm->renderMessage(kStringEmpty);
+		else {
+			_vm->renderMessage(kStringWalletOpen);
+			takeObject(*_rooms[TAXISTAND]->getObject(4));
+			takeObject(*_rooms[TAXISTAND]->getObject(5));
+			takeMoney(1);
+		}
+	} else if (verb == ACTION_PRESS && obj1._id == TRANSMITTER) {
+		if (_currentRoom == _rooms[TAXISTAND]) {
+			if (_currentRoom->getObject(0)->_type != EXIT) {
+				_vm->renderImage(5);
+				wait(3);
+				_vm->renderImage(6);
+				_currentRoom->getObject(0)->_type = EXIT;
+				drawMapExits();
+			}
+		}
+	} else
+		return false;
+	return true;
 }
 
 void GameManager::handleInput() {
@@ -966,5 +996,35 @@ void GameManager::executeRoom() {
 		_currentRoom->onEntrance();
 	}
 }
+void GameManager::taxi() {
+	static StringId dest[] = {
+		kStringAirport,
+		kStringDowntown,
+		kStringCulturePalace,
+		kStringEarth,
+		kStringPrivateApartment,
+		kStringLeaveTaxi
+	};
+
+	static StringId answers[] = {
+		kStringPay,
+		kStringLeaveTaxi
+	};
+
+	Room *previousRoom = _currentRoom;
+	_currentRoom = _rooms[INTRO];
+	_vm->setCurrentImage(4);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(2);
+
+	int possibility = _taxi_possibility;
+
+	if (previousRoom == _rooms[AIRPORT]) possibility += 1;
+	else if (previousRoom == _rooms[STREET]) possibility += 2;
+	else if (previousRoom == _rooms[CULTURE_PALACE]) possibility += 4;
+	debug("%d", dialog(6, _dials, dest, 1));
+
+}
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 237298f..a3beb17 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -34,6 +34,7 @@ namespace Supernova2 {
 const int32 kMaxTimerValue = 0x7FFFFFFF;
 
 struct GameState {
+	int16 _money;
 };
 
 class Inventory {
@@ -146,6 +147,8 @@ public:
 	StringId _texts[6];
 	byte _rows[6];
 	byte _rowsStart[6];
+	byte _dials[6];
+	int _taxi_possibility;
 
 	void takeObject(Object &obj);
 	void setObjectNull(Object *&obj);
@@ -179,6 +182,8 @@ public:
 	void reply(StringId textId, int aus1, int aus2);
 	void reply(const char *text, int aus1, int aus2);
 	void mousePosDialog(int x, int y);
+	void takeMoney(int amount);
+	void taxi();
 
 private:
 	int _prevImgId;


Commit: 291cd5c9ff65421a8dbd4ff6cde654ab45112d11
    https://github.com/scummvm/scummvm/commit/291cd5c9ff65421a8dbd4ff6cde654ab45112d11
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix missing fadeout after intro skip

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index dcda68d..9ead0af 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -221,6 +221,7 @@ void Intro::onEntrance() {
 
 	titleScreen();
 	thoughts1() && tvDialogue() && thoughts2();
+	_vm->paletteFadeOut();
 
 	_gm->changeRoom(AIRPORT);
 	_gm->_guiEnabled = true;
@@ -489,7 +490,6 @@ bool Intro::tvDialogue() {
 	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV16))
 		return false;
 
-	_vm->paletteFadeOut();
 	return true;
 }
 


Commit: da8275ac628823c73a55bd649d101acd301d664a
    https://github.com/scummvm/scummvm/commit/da8275ac628823c73a55bd649d101acd301d664a
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix dialog mouse hover color change

Changed paths:
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 0a08d12..7a3e395 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -573,12 +573,12 @@ void GameManager::drawStatus() {
 void GameManager::sentence(int number, bool brightness) {
 	if (number < 0)
 		return;
-	_vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, kColorWhite44);
+	_vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, brightness ? kColorWhite44 : kColorWhite25);
 	if (_texts[_rowsStart[number]] == kStringDialogSeparator)
-		_vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, kColorRed);
+		_vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, brightness ? kColorRed : kColorDarkRed);
 	else {
 		for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r)
-			_vm->renderText(_texts[r], 1, 142 + r * 10, kColorGreen);
+			_vm->renderText(_texts[r], 1, 142 + r * 10, brightness ? kColorGreen : kColorDarkGreen);
 	}
 }
 


Commit: f744adec4eff6d613054e8561db0ec471df7e7e0
    https://github.com/scummvm/scummvm/commit/f744adec4eff6d613054e8561db0ec471df7e7e0
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix object indexing in taxi stand

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9ead0af..92e05b6 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -536,7 +536,7 @@ TaxiStand::TaxiStand(Supernova2Engine *vm, GameManager *gm) {
 	_objectState[3] = Object(_id, kStringWallet, kStringWalletDescription, WALLET, TAKE, 0, 0, 7 + 128);
 	_objectState[4] = Object(_id, kStringDevice, kStringDeviceDescription, TRANSMITTER, TAKE | PRESS, 255, 255, 0);
 	_objectState[5] = Object(_id, kStringIdCard, kStringIdCardDescription, ID_CARD, TAKE | COMBINABLE, 255, 255, 0);
-	_objectState[5] = Object(_id, kStringAirport, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, AIRPORT, 22);
+	_objectState[6] = Object(_id, kStringAirport, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, AIRPORT, 22);
 }
 
 void TaxiStand::onEntrance() {


Commit: 88973057fed32a7845ce628f79d854776a2b2a31
    https://github.com/scummvm/scummvm/commit/88973057fed32a7845ce628f79d854776a2b2a31
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add dialog separator to gametext.h

Changed paths:
    devtools/create_supernova2/gametext.h


diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index 7db7289..89d46d3 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -774,6 +774,7 @@ const char *gameText[] = {
 "\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
 "\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"",
 	//"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
+"|", //Dialog separator
 NULL
 };
 


Commit: b437266c662a9ab4a8085c3b97107c11dbb212e1
    https://github.com/scummvm/scummvm/commit/b437266c662a9ab4a8085c3b97107c11dbb212e1
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Finish taxi destination choosing

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index d5eddb3..5dae14d 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -167,8 +167,8 @@ kString185, kString186, kString187, kString188, kString189,
 kString190, kString191, kString192, kString193, kString194,
 kString195, kString196, kString197, kString198, kString199,
 kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
-kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kString208, kString209,
-kString210, kString211, kString212, kString213, kString214,
+kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
+kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kString213, kString214,
 kString215, kString216, kString217, kString218, kString219,
 kString220, kString221, kString222, kString223, kString224,
 kString225, kString226, kString227, kString228, kString229,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 92e05b6..e56d162 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -136,6 +136,12 @@ bool Room::isSectionVisible(uint index) const {
 	return _shown[index] == kShownTrue;
 }
 
+void Room::removeSentenceByMask(int mask, int number) {
+	if (number > 0) {
+		_sentenceRemoved[number - 1] |= mask;
+	}
+}
+
 void Room::removeSentence(int sentence, int number) {
 	if (number > 0)
 		_sentenceRemoved[number - 1] |= (1 << sentence);
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 547fcf4..6e326d3 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -48,6 +48,7 @@ public:
 	void setSectionVisible(uint section, bool visible);
 	bool isSectionVisible(uint index) const;
 	void removeSentence(int sentence, int number);
+	void removeSentenceByMask(int mask, int number);
 	void addSentence(int sentence, int number);
 	void addAllSentences(int number);
 	bool sentenceRemoved(int sentence, int number);
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 6237a6e..5e27569 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -523,7 +523,7 @@ void Screen::renderMessage(const char *text, MessagePosition position) {
 	int message_width = rowWidthMax + 6;
 	int message_height = numRows * 9 + 5;
 	saveScreen(message_columns, message_rows, message_width, message_height);
-	renderBox(message_columns, message_rows, message_width, message_height, kColorWhite35);
+	renderBox(message_columns, message_rows, message_width, message_height, kColorWhite25);
 	for (uint i = 0; i < numRows; ++i) {
 		renderText(row[i], x, y, textColor);
 		y += 9;
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index 252e4df..a35223c 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -42,7 +42,7 @@ class Screen;
 
 const int kScreenWidth  = 320;
 const int kScreenHeight = 200;
-const int kFontWidth = 5;
+const int kFontWidth = 4;
 const int kFontHeight = 8;
 
 enum Color {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 7a3e395..97c5f2a 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -194,6 +194,8 @@ void GameManager::initState() {
 	_prevImgId = 0;
 
 	_state._money = 20;
+	_state._addressKnown = false;
+	_state._previousRoom = _currentRoom;
 }
 
 void GameManager::initRooms() {
@@ -547,6 +549,74 @@ void GameManager::drawMapExits() {
 	}
 }
 
+void GameManager::edit(Common::String &input, int x, int y, uint length) {
+	bool isEditing = true;
+	uint cursorIndex = input.size();
+	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
+	int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
+						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
+
+	while (isEditing) {
+		_vm->_screen->setTextCursorPos(x, y);
+		_vm->_screen->setTextCursorColor(kColorWhite99);
+		_vm->renderBox(x, y - 1, overdrawWidth, 9, kColorWhite35);
+		for (uint i = 0; i < input.size(); ++i) {
+			// Draw char highlight depending on cursor position
+			if (i == cursorIndex) {
+				_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1,
+							   Screen::textWidth(input[i]), 9, kColorWhite99);
+				_vm->_screen->setTextCursorColor(kColorWhite35);
+				_vm->renderText(input[i]);
+				_vm->_screen->setTextCursorColor(kColorWhite99);
+			} else
+				_vm->renderText(input[i]);
+		}
+
+		if (cursorIndex == input.size()) {
+			_vm->renderBox(_vm->_screen->getTextCursorPos().x + 1, y - 1, 6, 9, kColorWhite35);
+			_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1, 1, 9, kColorWhite99);
+		}
+
+		getKeyInput(true);
+		if (_vm->shouldQuit())
+			break;
+		switch (_key.keycode) {
+		case Common::KEYCODE_RETURN:
+		case Common::KEYCODE_ESCAPE:
+			isEditing = false;
+			break;
+		case Common::KEYCODE_UP:
+		case Common::KEYCODE_DOWN:
+			cursorIndex = input.size();
+			break;
+		case Common::KEYCODE_LEFT:
+			if (cursorIndex != 0)
+				--cursorIndex;
+			break;
+		case Common::KEYCODE_RIGHT:
+			if (cursorIndex != input.size())
+				++cursorIndex;
+			break;
+		case Common::KEYCODE_DELETE:
+			if (cursorIndex != input.size())
+				input.deleteChar(cursorIndex);
+			break;
+		case Common::KEYCODE_BACKSPACE:
+			if (cursorIndex != 0) {
+				--cursorIndex;
+				input.deleteChar(cursorIndex);
+			}
+			break;
+		default:
+			if (Common::isPrint(_key.ascii) && input.size() < length) {
+				input.insertChar(_key.ascii, cursorIndex);
+				++cursorIndex;
+			}
+			break;
+		}
+	}
+}
+
 void GameManager::takeMoney(int amount) {
 	_state._money += amount;
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -641,11 +711,8 @@ int GameManager::dialog(int num, byte rowLength[6], StringId text[6], int number
 	_guiEnabled = false;
 
 	bool remove[6];
-	for (int i = 0; i < 5; ++i)
+	for (int i = 0; i < 6; ++i)
 		remove[i] = _currentRoom->sentenceRemoved(i, number);
-	// The original does not initialize remove[5]!!!
-	// Set it to false/0. But maybe the loop above should use 6 instead of 5?
-	remove[5] = false;
 
 	_vm->renderBox(0, 138, 320, 62, kColorBlack);
 
@@ -996,6 +1063,80 @@ void GameManager::executeRoom() {
 		_currentRoom->onEntrance();
 	}
 }
+
+void GameManager::leaveTaxi() {
+	_currentRoom = _state._previousRoom;
+	_vm->renderRoom(*_currentRoom);
+	_guiEnabled = true;
+}
+
+void GameManager::taxiUnknownDestination() {
+	_vm->renderImage(invertSection(2));
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(4);
+	waitOnInput(_vm->_textSpeed * 3);
+	_vm->renderImage(invertSection(4));
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(2);
+}
+
+void GameManager::taxiPayment(int price, int destination) {
+	static StringId answers[] = {
+		kStringPay,
+		kStringLeaveTaxi
+	};
+	if (dialog(2, _dials, answers, 0)) {
+		leaveTaxi();
+	} else if (_state._money < price) {
+		Common::String t = _vm->getGameString(kStringNotEnoughMoney);
+		_vm->renderMessage(t);
+		waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+		leaveTaxi();
+	} else {
+		takeMoney(-price);
+		_vm->renderImage(invertSection(5));
+		_vm->renderImage(invertSection(6));
+		_vm->renderImage(0);
+		_vm->renderImage(1);
+		_vm->renderImage(3);
+
+		Common::String t = _vm->getGameString(kStringTaxiAccelerating);
+		_vm->renderMessage(t);
+		waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+
+		_vm->paletteFadeOut();
+		_vm->_system->fillScreen(kColorBlack);
+		_vm->paletteFadeIn();
+
+		Common::String t2 = _vm->getGameString(kString5MinutesLater);
+		_vm->renderMessage(t2);
+		waitOnInput((t2.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+
+		switch (destination) {
+		case 0:
+			changeRoom(TAXISTAND);
+			break;
+		case 1:
+			changeRoom(STREET);
+			break;
+		case 2:
+			changeRoom(CULTURE_PALACE);
+			break;
+		case 10:
+			changeRoom(CITY1);
+			break;
+		case 11:
+			changeRoom(CITY2);
+			break;
+		}
+	}
+}
+
 void GameManager::taxi() {
 	static StringId dest[] = {
 		kStringAirport,
@@ -1005,25 +1146,80 @@ void GameManager::taxi() {
 		kStringPrivateApartment,
 		kStringLeaveTaxi
 	};
+	Common::String input;
+	int possibility = _taxi_possibility;
+	bool paid = false;
 
-	static StringId answers[] = {
-		kStringPay,
-		kStringLeaveTaxi
-	};
-
-	Room *previousRoom = _currentRoom;
+	_state._previousRoom = _currentRoom;
 	_currentRoom = _rooms[INTRO];
 	_vm->setCurrentImage(4);
 	_vm->renderImage(0);
 	_vm->renderImage(1);
 	_vm->renderImage(2);
 
-	int possibility = _taxi_possibility;
+	if (_state._previousRoom == _rooms[TAXISTAND]) possibility += 1;
+	else if (_state._previousRoom == _rooms[STREET]) possibility += 2;
+	else if (_state._previousRoom == _rooms[CULTURE_PALACE]) possibility += 4;
+	int answer;
+	do {
+		_currentRoom->removeSentenceByMask(possibility, 1);
+		switch (answer = dialog(6, _dials, dest, 1)) {
+		case 3:
+			_taxi_possibility += 8;
+			possibility += 8;
+			taxiUnknownDestination();
+			break;
+		case 5:
+			leaveTaxi();
+			break;
+		case 4:
+			_vm->renderMessage(kStringAddress);
+			do {
+				edit(input, 101, 70, 18);
+			} while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE) && !_vm->shouldQuit());
 
-	if (previousRoom == _rooms[AIRPORT]) possibility += 1;
-	else if (previousRoom == _rooms[STREET]) possibility += 2;
-	else if (previousRoom == _rooms[CULTURE_PALACE]) possibility += 4;
-	debug("%d", dialog(6, _dials, dest, 1));
+			_vm->removeMessage();
+			if (_key.keycode == Common::KEYCODE_ESCAPE) {
+				leaveTaxi();
+				break;
+			}
+			input.toUppercase();
+			if (input == "115AY2,96A" || input == "115AY2,96B")
+				answer = 10;
+			else if (input == "341,105A" || input == "341,105B") {
+				if (_state._addressKnown)
+					answer = 11;
+				else {
+					Common::String t = _vm->getGameString(kStringCheater);
+					_vm->renderMessage(t);
+					waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+					_vm->removeMessage();
+
+					leaveTaxi();
+					break;
+				}
+			} else {
+				answer = 3;
+				input = "";
+				taxiUnknownDestination();
+				break;
+			}
+			_vm->renderImage(invertSection(2));
+			_vm->renderImage(0);
+			_vm->renderImage(1);
+			_vm->renderImage(6);
+			taxiPayment(14, answer);
+			break;
+		default:
+			_vm->renderImage(invertSection(2));
+			_vm->renderImage(0);
+			_vm->renderImage(1);
+			_vm->renderImage(5);
+			taxiPayment(8, answer);
+			break;
+		}
+	_rooms[INTRO]->addAllSentences(1);
+	} while(answer == 3 && !_vm->shouldQuit());
 
 }
 }
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index a3beb17..195c536 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -35,6 +35,8 @@ const int32 kMaxTimerValue = 0x7FFFFFFF;
 
 struct GameState {
 	int16 _money;
+	bool _addressKnown;
+	Room *_previousRoom;
 };
 
 class Inventory {
@@ -165,6 +167,7 @@ public:
 	void waitOnInput(int ticks);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void showMenu();
+	void edit(Common::String &input, int x, int y, uint length);
 	int invertSection(int section);
 	void drawMapExits();
 	void drawStatus();
@@ -184,6 +187,9 @@ public:
 	void mousePosDialog(int x, int y);
 	void takeMoney(int amount);
 	void taxi();
+	void leaveTaxi();
+	void taxiUnknownDestination();
+	void taxiPayment(int price, int destination);
 
 private:
 	int _prevImgId;


Commit: 19d0a3cce923572eae6a502226a57f0512d7113c
    https://github.com/scummvm/scummvm/commit/19d0a3cce923572eae6a502226a57f0512d7113c
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix airport message rendering

In the original game, the message or airport that
all other passangers left gets rendered only if
the intro isn't skipped. This commit does that.

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index e56d162..8c9a0f6 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -226,9 +226,13 @@ void Intro::onEntrance() {
 	_vm->_allowLoadGame = false;
 
 	titleScreen();
-	thoughts1() && tvDialogue() && thoughts2();
+	if (!(thoughts1() && tvDialogue() && thoughts2()))
+		_gm->_rooms[AIRPORT]->setRoomSeen(true);
 	_vm->paletteFadeOut();
 
+	for (int i = 0; i < 3; ++i)
+		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
+
 	_gm->changeRoom(AIRPORT);
 	_gm->_guiEnabled = true;
 	_vm->_allowSaveGame = true;
@@ -512,9 +516,6 @@ Airport::Airport(Supernova2Engine *vm, GameManager *gm) {
 }
 
 void Airport::onEntrance() {
-	for (int i = 0; i < 3; ++i)
-		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
-
 	if (hasSeen() == false) {
 		_vm->renderMessage(kStringAirportEntrance);
 	}


Commit: 83b0da1ebd24c1ad0aa5f01c290f5ae2348380c4
    https://github.com/scummvm/scummvm/commit/83b0da1ebd24c1ad0aa5f01c290f5ae2348380c4
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix of overlooked save pattern

Changed paths:
    engines/supernova2/detection.cpp


diff --git a/engines/supernova2/detection.cpp b/engines/supernova2/detection.cpp
index 396ac68..ecc2d9c 100644
--- a/engines/supernova2/detection.cpp
+++ b/engines/supernova2/detection.cpp
@@ -115,7 +115,7 @@ bool Supernova2MetaEngine::createInstance(OSystem *syst, Engine **engine, const
 
 SaveStateList Supernova2MetaEngine::listSaves(const char *target) const {
 	Common::StringArray filenames;
-	Common::String pattern("msn_save.###");
+	Common::String pattern("ms2_save.###");
 
 	filenames = g_system->getSavefileManager()->listSavefiles(pattern);
 


Commit: c331b69bbd8b8ec8c99b04f9ed04ab11b1829a53
    https://github.com/scummvm/scummvm/commit/c331b69bbd8b8ec8c99b04f9ed04ab11b1829a53
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add load and save mechanism

Changed paths:
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 5e27569..9f04def 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -402,9 +402,9 @@ void Screen::saveScreen(int x, int y, int width, int height) {
 	_screenBuffer.push(x, y, width, height);
 }
 
-/*void Screen::saveScreen(const GuiElement &guiElement) {
+void Screen::saveScreen(const GuiElement &guiElement) {
 	saveScreen(guiElement.left, guiElement.top, guiElement.width(), guiElement.height());
-}*/
+}
 
 void Screen::restoreScreen() {
 	_screenBuffer.restore();
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index a35223c..e952006 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -149,7 +149,7 @@ public:
 	void renderImage(int section);
 	bool setCurrentImage(int filenumber);
 	void saveScreen(int x, int y, int width, int height);
-	//void saveScreen(const GuiElement &guiElement);
+	void saveScreen(const GuiElement &guiElement);
 	void restoreScreen();
 	void renderRoom(Room &room);
 	void renderMessage(const char *text, MessagePosition position = kMessageNormal);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 97c5f2a..a0c1ef7 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -31,6 +31,69 @@
 
 namespace Supernova2 {
 
+bool GameManager::serialize(Common::WriteStream *out) {
+	if (out->err())
+		return false;
+
+	// GameState
+	out->writeSint16LE(_state._money);
+	out->writeByte(_state._addressKnown);
+
+	// Inventory
+	out->writeSint32LE(_inventory.getSize());
+	out->writeSint32LE(_inventoryScroll);
+	for (int i = 0; i < _inventory.getSize(); ++i) {
+		Object *objectStateBegin = _rooms[_inventory.get(i)->_roomId]->getObject(0);
+		byte objectIndex = _inventory.get(i) - objectStateBegin;
+		out->writeSint32LE(_inventory.get(i)->_roomId);
+		out->writeSint32LE(objectIndex);
+	}
+
+	// Rooms
+	out->writeByte(_currentRoom->getId());
+	for (int i = 0; i < 3; ++i) {
+		_rooms[i]->serialize(out);
+	}
+
+	return !out->err();
+}
+
+
+bool GameManager::deserialize(Common::ReadStream *in, int version) {
+	if (in->err())
+		return false;
+
+	// GameState
+	_state._money = in->readSint16LE();
+	_state._addressKnown = in->readByte();
+	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
+
+	_oldTime = g_system->getMillis();
+
+	// Inventory
+	int inventorySize = in->readSint32LE();
+	_inventoryScroll = in->readSint32LE();
+	_inventory.clear();
+	for (int i = 0; i < inventorySize; ++i) {
+		RoomId objectRoom = static_cast<RoomId>(in->readSint32LE());
+		int objectIndex = in->readSint32LE();
+		_inventory.add(*_rooms[objectRoom]->getObject(objectIndex));
+	}
+
+	// Rooms
+	RoomId curRoomId = static_cast<RoomId>(in->readByte());
+	for (int i = 0; i < 3; ++i) {
+		_rooms[i]->deserialize(in, version);
+	}
+	changeRoom(curRoomId);
+
+	// Some additional variables
+	_state._previousRoom = _rooms[INTRO];
+	_guiEnabled = true;
+	_animationEnabled = true;
+
+	return !in->err();
+}
 
 StringId GameManager::guiCommands[] = {
 	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
@@ -1138,6 +1201,7 @@ void GameManager::taxiPayment(int price, int destination) {
 }
 
 void GameManager::taxi() {
+	_vm->_allowSaveGame = false;
 	static StringId dest[] = {
 		kStringAirport,
 		kStringDowntown,
@@ -1148,7 +1212,6 @@ void GameManager::taxi() {
 	};
 	Common::String input;
 	int possibility = _taxi_possibility;
-	bool paid = false;
 
 	_state._previousRoom = _currentRoom;
 	_currentRoom = _rooms[INTRO];
@@ -1220,6 +1283,7 @@ void GameManager::taxi() {
 		}
 	_rooms[INTRO]->addAllSentences(1);
 	} while(answer == 3 && !_vm->shouldQuit());
+	_vm->_allowSaveGame = true;
 
 }
 }
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 195c536..d26e822 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -110,6 +110,8 @@ public:
 	void processInput(Common::KeyState &state);
 	void processInput();
 	void executeRoom();
+	bool serialize(Common::WriteStream *out);
+	bool deserialize(Common::ReadStream *in, int version);
 
 	static StringId guiCommands[];
 	static StringId guiStatusCommands[];
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 10c87ec..5572ac2 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -133,7 +133,14 @@ void Supernova2Engine::init() {
 	_gm = new GameManager(this);
 	_screen = new Screen(this, _resMan);
 	_console = new Console(this, _gm);
+
 	setTotalPlayTime(0);
+
+	int saveSlot = ConfMan.getInt("save_slot");
+	if (saveSlot >= 0) {
+		if (loadGameState(saveSlot).getCode() != Common::kNoError)
+			error("Failed to load save game from slot %i", saveSlot);
+	}
 }
 
 bool Supernova2Engine::hasFeature(EngineFeature f) const {
@@ -236,6 +243,14 @@ bool Supernova2Engine::setCurrentImage(int filenumber) {
 	return _screen->setCurrentImage(filenumber);
 }
 
+void Supernova2Engine::saveScreen(int x, int y, int width, int height) {
+	_screen->saveScreen(x, y, width, height);
+}
+
+void Supernova2Engine::saveScreen(const GuiElement &guiElement) {
+	_screen->saveScreen(guiElement);
+}
+
 void Supernova2Engine::restoreScreen() {
 	_screen->restoreScreen();
 }
@@ -299,6 +314,13 @@ void Supernova2Engine::renderText(StringId stringId, int x, int y, byte color) {
 	_screen->renderText(stringId, x, y, color);
 }
 
+void Supernova2Engine::renderBox(int x, int y, int width, int height, byte color) {
+	_screen->renderBox(x, y, width, height, color);
+}
+
+void Supernova2Engine::renderBox(const GuiElement &guiElement) {
+	_screen->renderBox(guiElement);
+}
 
 void Supernova2Engine::paletteBrightness() {
 	_screen->paletteBrightness();
@@ -430,12 +452,163 @@ void Supernova2Engine::setColor63(byte value) {
 	return quit;
 }*/
 
-void Supernova2Engine::renderBox(int x, int y, int width, int height, byte color) {
-	_screen->renderBox(x, y, width, height, color);
+bool Supernova2Engine::canLoadGameStateCurrently() {
+	return _allowLoadGame;
 }
 
-void Supernova2Engine::renderBox(const GuiElement &guiElement) {
-	_screen->renderBox(guiElement);
+Common::Error Supernova2Engine::loadGameState(int slot) {
+	return (loadGame(slot) ? Common::kNoError : Common::kReadingFailed);
+}
+
+bool Supernova2Engine::canSaveGameStateCurrently() {
+	// Do not allow saving when either _allowSaveGame, _animationEnabled or _guiEnabled is false
+	return _allowSaveGame && _gm->_animationEnabled && _gm->_guiEnabled;
+}
+
+Common::Error Supernova2Engine::saveGameState(int slot, const Common::String &desc) {
+	return (saveGame(slot, desc) ? Common::kNoError : Common::kWritingFailed);
+}
+
+bool Supernova2Engine::serialize(Common::WriteStream *out) {
+	if (!_gm->serialize(out))
+		return false;
+	out->writeByte(_screen->getGuiBrightness());
+	out->writeByte(_screen->getViewportBrightness());
+	return true;
+}
+
+bool Supernova2Engine::deserialize(Common::ReadStream *in, int version) {
+	if (!_gm->deserialize(in, version))
+		return false;
+	if (version >= 5) {
+		_screen->setGuiBrightness(in->readByte());
+		_screen->setViewportBrightness(in->readByte());
+	} else {
+		_screen->setGuiBrightness(255);
+		_screen->setViewportBrightness(255);
+	}
+	return true;
+}
+
+bool Supernova2Engine::loadGame(int slot) {
+	if (slot < 0)
+		return false;
+
+	// Make sure no message is displayed as this would otherwise delay the
+	// switch to the new location until a mouse click.
+	removeMessage();
+
+	if (slot == kSleepAutosaveSlot) {
+		if (_sleepAutoSave != nullptr && deserialize(_sleepAutoSave, _sleepAuoSaveVersion)) {
+			// We no longer need the sleep autosave
+			delete _sleepAutoSave;
+			_sleepAutoSave = nullptr;
+			return true;
+		}
+		// Old version used to save it literally in the kSleepAutosaveSlot, so
+		// continue to try to load it from there.
+	}
+
+	Common::String filename = Common::String::format("ms2_save.%03d", slot);
+	Common::InSaveFile *savefile = _saveFileMan->openForLoading(filename);
+	if (!savefile)
+		return false;
+
+	uint saveHeader = savefile->readUint32LE();
+	if (saveHeader != SAVEGAME_HEADER) {
+		warning("No header found in '%s'", filename.c_str());
+		delete savefile;
+		return false; //Common::kUnknownError
+	}
+
+	byte saveVersion = savefile->readByte();
+	if (saveVersion > SAVEGAME_VERSION) {
+		warning("Save game version %i not supported", saveVersion);
+		delete savefile;
+		return false; //Common::kUnknownError;
+	}
+
+	int descriptionSize = savefile->readSint16LE();
+	savefile->skip(descriptionSize);
+	savefile->skip(6);
+	setTotalPlayTime(savefile->readUint32LE() * 1000);
+	Graphics::skipThumbnail(*savefile);
+	if (!deserialize(savefile, saveVersion)) {
+		delete savefile;
+		return false;
+	};
+
+	// With version 9 onward the sleep auto-save is save at the end of a normal save.
+	delete _sleepAutoSave;
+	_sleepAutoSave = nullptr;
+	if (saveVersion >= 9) {
+		_sleepAuoSaveVersion = saveVersion;
+		byte hasAutoSave = savefile->readByte();
+		if (hasAutoSave) {
+			_sleepAutoSave = new Common::MemoryReadWriteStream(DisposeAfterUse::YES);
+			uint nb;
+			char buf[4096];
+			while ((nb = savefile->read(buf, 4096)) > 0)
+				_sleepAutoSave->write(buf, nb);
+		}
+	}
+
+	delete savefile;
+
+	return true;
+}
+
+bool Supernova2Engine::saveGame(int slot, const Common::String &description) {
+	if (slot < 0)
+		return false;
+
+	if (slot == kSleepAutosaveSlot) {
+		delete _sleepAutoSave;
+		_sleepAutoSave = new Common::MemoryReadWriteStream(DisposeAfterUse::YES);
+		_sleepAuoSaveVersion = SAVEGAME_VERSION;
+		serialize(_sleepAutoSave);
+		return true;
+	}
+
+	Common::String filename = Common::String::format("ms2_save.%03d", slot);
+	Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename);
+	if (!savefile)
+		return false;
+
+	savefile->writeUint32LE(SAVEGAME_HEADER);
+	savefile->writeByte(SAVEGAME_VERSION);
+
+	TimeDate currentDate;
+	_system->getTimeAndDate(currentDate);
+	uint32 saveDate = (currentDate.tm_mday & 0xFF) << 24 | ((currentDate.tm_mon + 1) & 0xFF) << 16 | ((currentDate.tm_year + 1900) & 0xFFFF);
+	uint16 saveTime = (currentDate.tm_hour & 0xFF) << 8 | ((currentDate.tm_min) & 0xFF);
+
+	savefile->writeSint16LE(description.size() + 1);
+	savefile->write(description.c_str(), description.size() + 1);
+	savefile->writeUint32LE(saveDate);
+	savefile->writeUint16LE(saveTime);
+	savefile->writeUint32LE(getTotalPlayTime() / 1000);
+	Graphics::saveThumbnail(*savefile);
+	serialize(savefile);
+
+	if (_sleepAutoSave == nullptr)
+		savefile->writeByte(0);
+	else {
+		savefile->writeByte(1);
+		savefile->write(_sleepAutoSave->getData(), _sleepAutoSave->size());
+	}
+
+	savefile->finalize();
+	delete savefile;
+
+	return true;
+}
+
+void Supernova2Engine::errorTempSave(bool saving) {
+	GUIErrorMessage(saving
+		? "Failed to save temporary game state. Make sure your save game directory is set in ScummVM and that you can write to it."
+		: "Failed to load temporary game state.");
+	error("Unrecoverable error");
 }
 
 }
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index 2667392..4fa80b5 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -60,6 +60,10 @@ public:
 	~Supernova2Engine();
 
 	virtual Common::Error run();
+	virtual Common::Error loadGameState(int slot);
+	virtual bool canLoadGameStateCurrently();
+	virtual Common::Error saveGameState(int slot, const Common::String &desc);
+	virtual bool canSaveGameStateCurrently();
 	virtual bool hasFeature(EngineFeature f) const;
 
 	GameManager *_gm;
@@ -95,6 +99,8 @@ public:
 	void renderImage(int section);
 	void renderImage(ImageId id, bool removeImage = false);
 	bool setCurrentImage(int filenumber);
+	void saveScreen(int x, int y, int width, int height);
+	void saveScreen(const GuiElement &guiElement);
 	void restoreScreen();
 	void renderRoom(Room &room);
 	void renderMessage(const char *text, MessagePosition position = kMessageNormal);


Commit: 1985c5bf578faa4d8b3e67ad03a5af35d58e1e86
    https://github.com/scummvm/scummvm/commit/1985c5bf578faa4d8b3e67ad03a5af35d58e1e86
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add downtown street

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 5dae14d..9884086 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -100,7 +100,7 @@ enum RoomId {
 enum ObjectId {
 	INVALIDOBJECT = -1,
 	NULLOBJECT = 0,
-	TAXI=1,WALLET,TRANSMITTER,KNIFE,POLE,BES_CABIN,MONEY,
+	TAXI=1,WALLET,TRANSMITTER,KNIFE,ROD,BES_CABIN,MONEY,
 	SLOT1,CHAIR,GANG,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON,
 	PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7,
 	PART8,PART9,PART10,PART11,PART12,PART13,PART14,PART15,
@@ -113,7 +113,7 @@ enum ObjectId {
 	BST9,BST10,BST11,BST12,BST13,BST14,BST15,BST16,
 	COFFIN,SUN,MONSTER,EYE,EYE1,EYE2,L_BALL,R_BALL,
 	PRIZE,REAR_STREET,
-	BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXIcON,PLANT,SNAKE,
+	BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXICON,PLANT,SNAKE,
 	CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
 	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
 	DOODLE,DOODLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD,
@@ -161,15 +161,15 @@ kString155, kString156, kString157, kString158, kString159,
 kString160, kString161, kString162, kString163, kString164,
 kString165, kString166, kString167, kString168, kString169,
 kString170, kString171, kString172, kString173, kString174,
-kString175, kString176, kString177, kStringDefaultDescription, kString179,
-kString180, kString181, kStringEmpty, kStringWalletOpen, kString184,
+kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
+kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kString184,
 kString185, kString186, kString187, kString188, kString189,
 kString190, kString191, kString192, kString193, kString194,
 kString195, kString196, kString197, kString198, kString199,
 kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
-kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kString213, kString214,
-kString215, kString216, kString217, kString218, kString219,
+kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
+kStringOnlyShop, kString216, kString217, kString218, kString219,
 kString220, kString221, kString222, kString223, kString224,
 kString225, kString226, kString227, kString228, kString229,
 kString230, kString231, kString232, kString233, kString234,
@@ -184,8 +184,8 @@ kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription
 kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard,
 kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kStringVehicle,
 kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWalletDescription, kStringDevice,
-kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kString293, kString294,
-kString295, kString296, kString297, kString298, kString299,
+kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription,
+kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost, kStringRailing,
 kString300, kString301, kString302, kString303, kString304,
 kString305, kString306, kString307, kString308, kString309,
 kString310, kString311, kString312, kString313, kString314,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 8c9a0f6..1969d84 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -129,7 +129,10 @@ RoomId Room::getId() const {
 }
 
 void Room::setSectionVisible(uint section, bool visible) {
-	_shown[section] = visible ? kShownTrue : kShownFalse;
+	if (section < kMaxSection)
+		_shown[section] = visible ? kShownTrue : kShownFalse;
+	else
+		_shown[section - 128] = visible ? kShownFalse : kShownTrue;
 }
 
 bool Room::isSectionVisible(uint index) const {
@@ -578,4 +581,110 @@ bool TaxiStand::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
+Street::Street(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 5;
+	_id = STREET;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, GAMES, 10);
+	_objectState[1] = Object(_id, kStringStaircase, kStringStaircaseDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[2] = Object(_id, kStringBusinessStreet, kStringBusinessStreetDescription, REAR_STREET, EXIT, 3, 3, 0, KIOSK, 3);
+	_objectState[3] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 7, 7, 22);
+	_objectState[4] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 6, 6, 0);
+	_objectState[5] = Object(_id, kStringPost, kStringLooksMetal, NULLOBJECT, NULLTYPE, 4, 4, 0);
+	_objectState[6] = Object(_id, kStringRailing, kStringLooksMetal, NULLOBJECT, NULLTYPE, 5, 5, 0);
+}
+
+void Street::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Street::animation() {
+	static int ltab[36] = {
+		8, 9 + 128, 10, 11 + 128, 6, 12, 13 + 128, 9, 14, 15 + 128, 19,
+		16, 17 + 128, 9 + 128, 18, 19 + 128, 6 + 128, 20, 21 + 128,
+		8 + 128, 9, 10 + 128, 11, 6, 12 + 128, 13, 14 + 128, 15, 19,
+		16 + 128, 17, 18 + 128, 19 + 128, 6 + 128, 20 + 128, 21
+	};
+
+	static int i, banks, light;
+
+	if (isSectionVisible(7))
+		setSectionVisible(7, kShownFalse);
+	else
+		setSectionVisible(7, kShownTrue);
+
+	if (++i == 4) {
+		i = 0;
+		switch (banks) {
+		case 0:
+			setSectionVisible(1, kShownTrue);
+			break;
+		case 1:
+			setSectionVisible(2, kShownTrue);
+			break;
+		case 2:
+			setSectionVisible(3, kShownTrue);
+			break;
+		case 3:
+			setSectionVisible(4, kShownTrue);
+			break;
+		case 4:
+			setSectionVisible(5, kShownTrue);
+			break;
+		case 5:
+			// fall through
+		case 7:
+			// fall through
+		case 9:
+			setSectionVisible(1, kShownFalse);
+			setSectionVisible(2, kShownFalse);
+			setSectionVisible(3, kShownFalse);
+			setSectionVisible(4, kShownFalse);
+			setSectionVisible(5, kShownFalse);
+			break;
+		case 6:
+			// fall through
+		case 8:
+			setSectionVisible(1, kShownTrue);
+			setSectionVisible(2, kShownTrue);
+			setSectionVisible(3, kShownTrue);
+			setSectionVisible(4, kShownTrue);
+			setSectionVisible(5, kShownTrue);
+			break;
+		}
+		banks++;
+		if (banks == 10) banks = 0;
+	}
+	setSectionVisible(ltab[light], kShownTrue);
+	light++;
+	if (light == 36)
+		light = 0;
+	_gm->setAnimationTimer(2);
+}
+
+bool Street::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, KNIFE, ROD)) {
+		if (getObject(3)->_type & CARRIED)
+			_vm->renderMessage(kStringAlreadyHavePole);
+		else {
+			_vm->renderMessage(kStringSawPole);
+			_gm->takeObject(*getObject(3));
+		}
+	}
+	else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
+		Common::String text = _vm->getGameString(kStringOnlyShop);
+		_vm->renderMessage(text);
+		_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+		return false;
+	}
+	else 
+		return false;
+	return true;
+}
+
 }
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 6e326d3..15bdea6 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -111,5 +111,14 @@ public:
 private:
 };
 
+class Street : public Room {
+public:
+	Street(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
 }
 #endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index a0c1ef7..8455ade 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -51,7 +51,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 
 	// Rooms
 	out->writeByte(_currentRoom->getId());
-	for (int i = 0; i < 3; ++i) {
+	for (int i = 0; i < 4; ++i) {
 		_rooms[i]->serialize(out);
 	}
 
@@ -82,7 +82,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 
 	// Rooms
 	RoomId curRoomId = static_cast<RoomId>(in->readByte());
-	for (int i = 0; i < 3; ++i) {
+	for (int i = 0; i < 4; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
 	changeRoom(curRoomId);
@@ -222,6 +222,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[INTRO];
 	delete _rooms[AIRPORT];
 	delete _rooms[TAXISTAND];
+	delete _rooms[STREET];
 }
 
 void GameManager::initState() {
@@ -265,6 +266,7 @@ void GameManager::initRooms() {
 	_rooms[INTRO] = new Intro(_vm, this);
 	_rooms[AIRPORT] = new Airport(_vm, this);
 	_rooms[TAXISTAND] = new TaxiStand(_vm, this);
+	_rooms[STREET] = new Street(_vm, this);
 }
 
 void GameManager::initGui() {
@@ -992,7 +994,17 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 				_currentRoom->getObject(0)->_type = EXIT;
 				drawMapExits();
 			}
-		}
+		} else if (_currentRoom == _rooms[STREET]	      ||
+				   _currentRoom == _rooms[CULTURE_PALACE] ||
+				   _currentRoom == _rooms[CITY1]          ||
+				   _currentRoom == _rooms[CITY2]) {
+			Common::String t = _vm->getGameString(kStringTaxiArrives);
+			_vm->renderMessage(t);
+			waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+			_vm->removeMessage();
+			taxi();
+		} else
+			_vm->renderMessage(kStringNothingHappens);
 	} else
 		return false;
 	return true;


Commit: b9c528425ae154660e2c2c3041b5dc285a1621e0
    https://github.com/scummvm/scummvm/commit/b9c528425ae154660e2c2c3041b5dc285a1621e0
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add some more generic interactoins

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 9884086..697c4ac 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -162,9 +162,9 @@ kString160, kString161, kString162, kString163, kString164,
 kString165, kString166, kString167, kString168, kString169,
 kString170, kString171, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
-kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kString184,
-kString185, kString186, kString187, kString188, kString189,
-kString190, kString191, kString192, kString193, kString194,
+kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
+kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
+kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kString194,
 kString195, kString196, kString197, kString198, kString199,
 kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 8455ade..766529a 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -38,6 +38,8 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	// GameState
 	out->writeSint16LE(_state._money);
 	out->writeByte(_state._addressKnown);
+	out->writeByte(_state._poleMagnet);
+	out->writeByte(_state._admission);
 
 	// Inventory
 	out->writeSint32LE(_inventory.getSize());
@@ -66,6 +68,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	// GameState
 	_state._money = in->readSint16LE();
 	_state._addressKnown = in->readByte();
+	_state._poleMagnet = in->readByte();
+	_state._admission = in->readByte();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
 
 	_oldTime = g_system->getMillis();
@@ -260,6 +264,8 @@ void GameManager::initState() {
 	_state._money = 20;
 	_state._addressKnown = false;
 	_state._previousRoom = _currentRoom;
+	_state._poleMagnet = false;
+	_state._admission = 0;
 }
 
 void GameManager::initRooms() {
@@ -1005,6 +1011,78 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 			taxi();
 		} else
 			_vm->renderMessage(kStringNothingHappens);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROD, MAGNET)) {
+		Object *o1, *o2;
+		if (obj2._type == ROD) {
+			o1 = &obj2;
+			o2 = &obj1;
+		} else {
+			o1 = &obj1;
+			o2 = &obj2;
+		}
+		if (!(o1->_type & CARRIED))
+			return false;
+
+		if (!(o2->_type & CARRIED))
+			takeObject(*o2);
+
+		_vm->renderMessage(kStringAttachMagnet);
+		o1->_name = kStringPoleMagnet;
+		o1->_description = kStringCunning;
+		_inventory.remove(*o2);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CHIP, PLAYER)) {
+		Object *o1, *o2;
+		if (obj2._id == CHIP) {
+			o1 = &obj2;
+			o2 = &obj1;
+		} else {
+			o1 = &obj1;
+			o2 = &obj2;
+		}
+		if (!(o2->_type & CARRIED))
+			_vm->renderMessage(kStringMustBuyFirst);
+		else {
+			if (!(o1->_type & CARRIED))
+			{
+				_vm->renderImage(1);
+				_vm->renderImage(2 + 128);
+				_currentRoom->getObject(0)->_click = 255;
+			}
+			else
+				_inventory.remove(*o1);
+
+			_vm->renderMessage(kStringInsertChip);
+			if (_state._admission)
+				_state._admission = 2;
+			else
+				_state._admission = 1;
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, DISCMAN, PLAYER)) {
+		switch (_state._admission) {
+		case 1:
+			// fall through
+		case 2:
+			_vm->renderMessage(kStringTransferCD);
+			_state._admission = 2;
+			break;
+		default:
+			_vm->renderMessage(kStringCDNotInserted);
+		}
+	} else if (verb == ACTION_OPEN && Object::combine(obj1, obj2, DISCMAN, PLAYER)) {
+		switch (_state._admission) {
+		case 1:
+			_state._admission = 0;
+			playerTakeOut();
+			break;
+		case 2:
+			_state._admission = 3;
+			playerTakeOut();
+			break;
+		default:
+			_vm->renderMessage(kStringChipNotInserted);
+		}
+	} else if (verb == ACTION_OPEN && obj1._id == DISCMAN) {
+		_vm->renderMessage(kStringWhatFor);
 	} else
 		return false;
 	return true;
@@ -1298,5 +1376,12 @@ void GameManager::taxi() {
 	_vm->_allowSaveGame = true;
 
 }
+
+void GameManager::playerTakeOut() {
+	_vm->renderMessage(kStringRemoveChip);
+	Object *o = _rooms[APARTMENT]->getObject(0);
+	o->_section = 0;
+	takeObject(*o);
+}
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index d26e822..a355fac 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -37,6 +37,8 @@ struct GameState {
 	int16 _money;
 	bool _addressKnown;
 	Room *_previousRoom;
+	bool _poleMagnet;
+	char _admission;
 };
 
 class Inventory {
@@ -192,6 +194,7 @@ public:
 	void leaveTaxi();
 	void taxiUnknownDestination();
 	void taxiPayment(int price, int destination);
+	void playerTakeOut();
 
 private:
 	int _prevImgId;


Commit: 63ca424ac30e8651969983507edd30dc43dc1d35
    https://github.com/scummvm/scummvm/commit/63ca424ac30e8651969983507edd30dc43dc1d35
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add sound to all rooms currently coded

Changed paths:
  A engines/supernova2/sound.cpp
  A engines/supernova2/sound.h
    engines/supernova2/module.mk
    engines/supernova2/resman.cpp
    engines/supernova2/resman.h
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/module.mk b/engines/supernova2/module.mk
index f62af5f..7135c9c 100644
--- a/engines/supernova2/module.mk
+++ b/engines/supernova2/module.mk
@@ -8,6 +8,7 @@ MODULE_OBJS := \
 	rooms.o \
 	screen.o \
 	console.o \
+	sound.o \
 	supernova2.o
 
 MODULE_DIRS += \
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index a47a155..ac060ac 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -42,30 +42,20 @@ struct AudioInfo {
 	int _offsetEnd;
 };
 
-//static Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
-
-/*static const AudioInfo audioInfo[kAudioNumSamples] = {
-	{44,     0,    -1},
-	{45,     0,    -1},
-	{46,     0,  2510},
-	{46,  2510,  4020},
-	{46,  4020,    -1},
-	{47,     0, 24010},
-	{47, 24010,    -1},
-	{48,     0,  2510},
-	{48,  2510, 10520},
-	{48, 10520, 13530},
-	{48, 13530,    -1},
-	{50,     0, 12786},
-	{50, 12786,    -1},
-	{51,     0,    -1},
+static Common::MemoryReadStream *convertToMod(const char *filename, int version = 2);
+
+static const AudioInfo audioInfo[kAudioNumSamples] = {
+	{55,     18230,    -1},
+	{47,     0,    16010},
+	{47,     16010,    -1},
+	{49,     8010,    -1},
+	{49,     0,    8010},
+	{52,     0,    -1},
 	{53,     0,    -1},
-	{54,     0,  8010},
-	{54,  8010, 24020},
-	{54, 24020, 30030},
-	{54, 30030, 31040},
-	{54, 31040,    -1}
-};*/
+	{54,     0,    -1},
+	{55,     0,    -1},
+	{56,     0,    -1},
+};
 
 static const byte mouseNormal[64] = {
 	0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
@@ -94,12 +84,11 @@ static const byte mouseWait[64] = {
 
 ResourceManager::ResourceManager()
 	: _audioRate(11931) {
-	//initSoundFiles();
+	initSoundFiles();
 	initGraphics();
 }
 
-//TODO
-/*void ResourceManager::initSoundFiles() {
+void ResourceManager::initSoundFiles() {
 	// Sound
 	// Note:
 	//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
@@ -109,7 +98,7 @@ ResourceManager::ResourceManager()
 	Common::File file;
 
 	for (int i = 0; i < kAudioNumSamples; ++i) {
-		if (!file.open(Common::String::format("msn_data.%03d", audioInfo[i]._filenumber))) {
+		if (!file.open(Common::String::format("ms2_data.%03d", audioInfo[i]._filenumber))) {
 			error("File %s could not be read!", file.getName());
 		}
 
@@ -132,9 +121,9 @@ ResourceManager::ResourceManager()
 													streamFlag, DisposeAfterUse::YES));
 	}
 
-	_musicIntroBuffer.reset(convertToMod("msn_data.052"));
-	_musicOutroBuffer.reset(convertToMod("msn_data.049"));
-}*/
+	_musicIntroBuffer.reset(convertToMod("ms2_data.052"));
+	_musicOutroBuffer.reset(convertToMod("ms2_data.049"));
+}
 
 void ResourceManager::initGraphics() {
 	Screen::initPalette();
@@ -170,8 +159,7 @@ void ResourceManager::initImages() {
 	}
 }
 
-//TODO
-/*Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
+Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
 	Audio::SeekableAudioStream *stream = _soundSamples[index].get();
 	stream->rewind();
 
@@ -189,7 +177,7 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	default:
 		error("Invalid music constant in playAudio()");
 	}
-}*/
+}
 
 const MS2Image *ResourceManager::getImage(int filenumber) const {
 	if (filenumber < 47)
@@ -209,10 +197,8 @@ const byte *ResourceManager::getImage(CursorId id) const {
 	}
 }
 
-//TODO
-/*
 static Common::MemoryReadStream *convertToMod(const char *filename, int version) {
-	// MSN format
+	// MS2 format
 	struct {
 		uint16 seg;
 		uint16 start;
@@ -396,6 +382,6 @@ static Common::MemoryReadStream *convertToMod(const char *filename, int version)
 
 	return new Common::MemoryReadStream(buffer.getData(), buffer.size(), DisposeAfterUse::YES);
 }
-*/
+
 
 }
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
index 72b7d78..16e237e 100644
--- a/engines/supernova2/resman.h
+++ b/engines/supernova2/resman.h
@@ -27,7 +27,7 @@
 #include "common/ptr.h"
 
 #include "supernova2/graphics.h"
-//#include "supernova/sound.h"
+#include "supernova2/sound.h"
 
 
 namespace Common {
@@ -49,8 +49,8 @@ public:
 public:
 	ResourceManager();
 
-	//Audio::SeekableAudioStream *getSoundStream(AudioId index);
-	//Audio::AudioStream *getSoundStream(MusicId index);
+	Audio::SeekableAudioStream *getSoundStream(AudioId index);
+	Audio::AudioStream *getSoundStream(MusicId index);
 	const MS2Image *getImage(int filenumber) const;
 	const byte *getImage(CursorId id) const;
 
@@ -61,11 +61,11 @@ private:
 	void initImages();
 
 private:
-	//Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
-	//Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
-	//Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
-	//Common::ScopedPtr<Audio::AudioStream> _musicIntro;
-	//Common::ScopedPtr<Audio::AudioStream> _musicOutro;
+	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
+	Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
+	Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
+	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
+	Common::ScopedPtr<Audio::AudioStream> _musicOutro;
 	int _audioRate;
 	MS2Image _images[kNumImageFiles];
 	byte _cursorNormal[256];
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 1969d84..a95c522 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -258,6 +258,7 @@ void Intro::titleScreen() {
 	const Common::String title1 = "V1.02";
 	_vm->_screen->renderText(title1, 295, 190, 3);
 
+	_vm->playSound(kMusicIntro);
 	Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
 	while (!_vm->shouldQuit()) {
 		_gm->updateEvents();
@@ -267,6 +268,7 @@ void Intro::titleScreen() {
 		g_system->updateScreen();
 		g_system->delayMillis(_vm->_delay);
 	}
+	_vm->stopSound();
 	_vm->paletteFadeOut();
 	CursorMan.showMouse(true);
 }
@@ -408,8 +410,10 @@ bool Intro::tvDialogue() {
 		_gm->wait(3);
 		_vm->renderImage(i);
 	}
+	_vm->playSound(kAudioIntroDing);
 	_gm->wait(30);
 	_vm->renderImage(11);
+	_vm->playSound(kAudioIntroDing);
 	_gm->wait(60);
 
 	_vm->_system->fillScreen(kColorBlack);
@@ -673,6 +677,7 @@ bool Street::interact(Action verb, Object &obj1, Object &obj2) {
 		else {
 			_vm->renderMessage(kStringSawPole);
 			_gm->takeObject(*getObject(3));
+			_vm->playSound(kAudioSuccess);
 		}
 	}
 	else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
diff --git a/engines/supernova2/sound.cpp b/engines/supernova2/sound.cpp
new file mode 100644
index 0000000..f08158a
--- /dev/null
+++ b/engines/supernova2/sound.cpp
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+*
+* ScummVM is the legal property of its developers, whose names
+* are too numerous to list here. Please refer to the COPYRIGHT
+* file distributed with this source distribution.
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+*/
+
+#include "audio/audiostream.h"
+#include "audio/mixer.h"
+#include "audio/decoders/raw.h"
+#include "audio/mods/protracker.h"
+#include "common/system.h"
+
+#include "supernova2/resman.h"
+#include "supernova2/sound.h"
+#include "supernova2/supernova2.h"
+
+namespace Supernova2 {
+
+Sound::Sound(Audio::Mixer *mixer, ResourceManager *resMan)
+	: _mixer(mixer)
+	, _resMan(resMan) {
+}
+
+void Sound::play(AudioId index) {
+	Audio::AudioStream *stream = _resMan->getSoundStream(index);
+
+	stop();
+	_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, stream,
+					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
+}
+
+void Sound::play(MusicId index) {
+	Audio::AudioStream *stream = _resMan->getSoundStream(index);
+
+	stop();
+	_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, stream,
+					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
+}
+
+bool Sound::isPlaying() {
+	return _mixer->isSoundHandleActive(_soundHandle);
+}
+
+void Sound::stop() {
+	if (_mixer->isSoundHandleActive(_soundHandle))
+		_mixer->stopHandle(_soundHandle);
+}
+
+}
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
new file mode 100644
index 0000000..30c05ee
--- /dev/null
+++ b/engines/supernova2/sound.h
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_SOUND_H
+#define SUPERNOVA2_SOUND_H
+
+#include "audio/mixer.h"
+
+namespace Supernova2 {
+
+class Supernova2Engine;
+class ResourceManager;
+
+enum AudioId {
+	kAudioIntroDing,
+	kAudioSuccess,
+	kAudioTaxiOpen,
+	kAudioTaxiLeaving,
+	kAudioTaxiArriving,
+	kAudioNumSamples = 10 //TODO find out how many samples there are
+};
+
+enum MusicId {
+	kMusicIntro = 52,
+	kMusicOutro = 56
+};
+
+class Sound {
+public:
+
+public:
+	Sound(Audio::Mixer *mixer, ResourceManager *resMan);
+
+	void play(AudioId index);
+	void play(MusicId index);
+	void stop();
+	bool isPlaying();
+private:
+	Audio::Mixer *_mixer;
+	ResourceManager *_resMan;
+	Audio::SoundHandle _soundHandle;
+};
+
+}
+
+#endif
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 766529a..d179011 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -972,6 +972,18 @@ void GameManager::handleTime() {
 	_oldTime = newTime;
 }
 
+void GameManager::pauseTimer(bool pause) {
+	if (pause == _timerPaused)
+		return;
+
+	if (pause) {
+		_timerPaused = true;
+	} else {
+		_oldTime = g_system->getMillis();
+		_timerPaused = false;
+	}
+}
+
 int GameManager::invertSection(int section) {
 	if (section < 128)
 		section += 128;
@@ -990,6 +1002,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 			takeObject(*_rooms[TAXISTAND]->getObject(4));
 			takeObject(*_rooms[TAXISTAND]->getObject(5));
 			takeMoney(1);
+			_vm->playSound(kAudioSuccess);
 		}
 	} else if (verb == ACTION_PRESS && obj1._id == TRANSMITTER) {
 		if (_currentRoom == _rooms[TAXISTAND]) {
@@ -997,6 +1010,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderImage(5);
 				wait(3);
 				_vm->renderImage(6);
+				_vm->playSound(kAudioTaxiOpen);
 				_currentRoom->getObject(0)->_type = EXIT;
 				drawMapExits();
 			}
@@ -1064,6 +1078,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		case 2:
 			_vm->renderMessage(kStringTransferCD);
 			_state._admission = 2;
+			_vm->playSound(kAudioSuccess);
 			break;
 		default:
 			_vm->renderMessage(kStringCDNotInserted);
@@ -1258,6 +1273,9 @@ void GameManager::taxiPayment(int price, int destination) {
 
 		Common::String t = _vm->getGameString(kStringTaxiAccelerating);
 		_vm->renderMessage(t);
+		_vm->playSound(kAudioTaxiLeaving);
+		while(_vm->_sound->isPlaying())
+			wait(1);
 		waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
 		_vm->removeMessage();
 
@@ -1267,6 +1285,9 @@ void GameManager::taxiPayment(int price, int destination) {
 
 		Common::String t2 = _vm->getGameString(kString5MinutesLater);
 		_vm->renderMessage(t2);
+		_vm->playSound(kAudioTaxiArriving);
+		while(_vm->_sound->isPlaying())
+			wait(1);
 		waitOnInput((t2.size() + 20) * _vm->_textSpeed / 10);
 		_vm->removeMessage();
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index a355fac..c69aebc 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -27,7 +27,7 @@
 #include "common/rect.h"
 #include "common/keyboard.h"
 #include "supernova2/rooms.h"
-//#include "supernova2/sound.h"
+#include "supernova2/sound.h"
 
 namespace Supernova2 {
 
@@ -181,6 +181,7 @@ public:
 	void resetInputState();
 	void handleInput();
 	void handleTime();
+	void pauseTimer(bool pause);
 	void setAnimationTimer(int ticks);
 	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
 	void sentence(int number, bool brightness);
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 5572ac2..683d711 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -42,6 +42,7 @@
 #include "gui/saveload.h"
 
 #include "supernova2/resman.h"
+#include "supernova2/sound.h"
 #include "supernova2/screen.h"
 #include "supernova2/supernova2.h"
 #include "supernova2/state.h"
@@ -77,6 +78,7 @@ Supernova2Engine::Supernova2Engine(OSystem *syst)
 	: Engine(syst)
 	, _console(nullptr)
 	, _gm(nullptr)
+	, _sound(nullptr)
 	, _resMan(nullptr)
 	, _screen(nullptr)
 	, _allowLoadGame(true)
@@ -99,6 +101,7 @@ Supernova2Engine::~Supernova2Engine() {
 	delete _resMan;
 	delete _screen;
 	delete _sleepAutoSave;
+	delete _sound;
 }
 
 Common::Error Supernova2Engine::run() {
@@ -130,6 +133,7 @@ void Supernova2Engine::init() {
 		error("Failed reading game strings");
 
 	_resMan = new ResourceManager();
+	_sound = new Sound(_mixer, _resMan);
 	_gm = new GameManager(this);
 	_screen = new Screen(this, _resMan);
 	_console = new Console(this, _gm);
@@ -156,6 +160,12 @@ bool Supernova2Engine::hasFeature(EngineFeature f) const {
 	}
 }
 
+void Supernova2Engine::pauseEngineIntern(bool pause) {
+	_mixer->pauseAll(pause);
+	_gm->pauseTimer(pause);
+}
+
+
 Common::Error Supernova2Engine::loadGameStrings() {
 	Common::String cur_lang = ConfMan.get("language");
 	Common::String string_id("TEXT");
@@ -225,6 +235,14 @@ void Supernova2Engine::setGameString(int idx, const Common::String &string) {
 	_gameStrings[idx] = string;
 }
 
+void Supernova2Engine::playSound(AudioId sample) {
+	_sound->play(sample);
+}
+
+void Supernova2Engine::playSound(MusicId index) {
+	_sound->play(index);
+}
+
 void Supernova2Engine::renderImage(int section) {
 	if (section > 128)
 		_gm->_currentRoom->setSectionVisible(section - 128, false);
@@ -611,4 +629,8 @@ void Supernova2Engine::errorTempSave(bool saving) {
 	error("Unrecoverable error");
 }
 
+void Supernova2Engine::stopSound() {
+	_sound->stop();
+}
+
 }
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index 4fa80b5..0e1b0c0 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -34,6 +34,7 @@
 #include "supernova2/graphics.h"
 #include "supernova2/ms2_def.h"
 #include "supernova2/rooms.h"
+#include "supernova2/sound.h"
 #include "supernova2/imageid.h"
 
 namespace Common {
@@ -50,6 +51,7 @@ namespace Supernova2 {
 
 class GuiElement;
 class ResourceManager;
+class Sound;
 class console;
 class GameManager;
 class Screen;
@@ -65,9 +67,11 @@ public:
 	virtual Common::Error saveGameState(int slot, const Common::String &desc);
 	virtual bool canSaveGameStateCurrently();
 	virtual bool hasFeature(EngineFeature f) const;
+	virtual void pauseEngineIntern(bool pause);
 
 	GameManager *_gm;
 	Console *_console;
+	Sound *_sound;
 	ResourceManager *_resMan;
 	Screen *_screen;
 	bool _allowLoadGame;
@@ -93,6 +97,8 @@ public:
 	void setGameString(int idx, const Common::String &string);
 
 	// forwarding calls
+	void playSound(AudioId sample);
+	void playSound(MusicId index);
 	void paletteFadeIn();
 	void paletteFadeOut();
 	void paletteBrightness();
@@ -120,6 +126,7 @@ public:
 	void renderBox(int x, int y, int width, int height, byte color);
 	void renderBox(const GuiElement &guiElement);
 	void setColor63(byte value);
+	void stopSound();
 };
 
 }


Commit: beadc80462421b3b4de0e56c9e422f1b9ee1fa8b
    https://github.com/scummvm/scummvm/commit/beadc80462421b3b4de0e56c9e422f1b9ee1fa8b
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix not quiting during intro

While trying to quit the game during intro, the
intro only sped up instead of quiting and quit
only when the intro ended

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a95c522..a5ea68f 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -287,14 +287,14 @@ bool Intro::tvSay(int mod1, int mod2, int rest, MessagePosition pos, StringId id
 
 		if (_gm->waitOnInput(2, key)) {
 			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
 		}
 		if (mod2)
 			_vm->renderImage(mod2);
 
 		if (_gm->waitOnInput(2, key)) {
 			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
 		}
 		animation_count--;
 	}
@@ -310,12 +310,12 @@ bool Intro::tvRest(int mod1, int mod2, int rest) {
 		_vm->renderImage(mod1);
 		if (_gm->waitOnInput(2, key)) {
 			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
 		}
 		_vm->renderImage(mod2);
 		if (_gm->waitOnInput(2, key)) {
 			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
 		}
 		rest--;
 	}
@@ -328,13 +328,16 @@ bool Intro::displayThoughtMessage(StringId id) {
 	_vm->renderMessage(text, kMessageNormal);
 	if (_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10, key)) {
 		_vm->removeMessage();
-		return key != Common::KEYCODE_ESCAPE;
+		return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
 	}
 	_vm->removeMessage();
 	return true;
 }
 
 bool Intro::thoughts1() {
+	if(_vm->shouldQuit())
+		return false;
+
 	_vm->setCurrentImage(41);
 	_vm->renderImage(0);
 	_vm->paletteFadeIn();
@@ -353,6 +356,9 @@ bool Intro::thoughts1() {
 }
 
 bool Intro::thoughts2() {
+	if(_vm->shouldQuit())
+		return false;
+
 	_vm->setCurrentImage(41);
 	_vm->renderImage(0);
 	_vm->paletteFadeIn();
@@ -399,6 +405,9 @@ bool Intro::thoughts2() {
 }
 
 bool Intro::tvDialogue() {
+	if(_vm->shouldQuit())
+		return false;
+
 	_vm->setCurrentImage(39);
 	_vm->renderImage(0);
 	_vm->paletteFadeIn();
@@ -429,6 +438,7 @@ bool Intro::tvDialogue() {
 
 	if(!tvSay(8, 6, 7, kMessageLeft, kStringIntroTV2))
 		return false;
+	debug("%d", _vm->shouldQuit());
 
 	_vm->renderImage(10);
 


Commit: f9c30a58bdcd7f4b28ee12f6ba97cf3e992984cd
    https://github.com/scummvm/scummvm/commit/f9c30a58bdcd7f4b28ee12f6ba97cf3e992984cd
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add the games room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 697c4ac..c3d9d03 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -100,7 +100,7 @@ enum RoomId {
 enum ObjectId {
 	INVALIDOBJECT = -1,
 	NULLOBJECT = 0,
-	TAXI=1,WALLET,TRANSMITTER,KNIFE,ROD,BES_CABIN,MONEY,
+	TAXI=1,WALLET,TRANSMITTER,KNIFE,ROD,OCCUPIED_CABIN,MONEY,
 	SLOT1,CHAIR,GANG,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON,
 	PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7,
 	PART8,PART9,PART10,PART11,PART12,PART13,PART14,PART15,
@@ -159,7 +159,7 @@ kString145, kString146, kString147, kString148, kString149,
 kString150, kString151, kString152, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
 kString160, kString161, kString162, kString163, kString164,
-kString165, kString166, kString167, kString168, kString169,
+kString165, kString166, kString167, kString168, kStringExit,
 kString170, kString171, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
@@ -169,7 +169,7 @@ kString195, kString196, kString197, kString198, kString199,
 kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
 kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
-kStringOnlyShop, kString216, kString217, kString218, kString219,
+kStringOnlyShop, kStringCabinOccupiedSay, kString217, kString218, kString219,
 kString220, kString221, kString222, kString223, kString224,
 kString225, kString226, kString227, kString228, kString229,
 kString230, kString231, kString232, kString233, kString234,
@@ -186,8 +186,8 @@ kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesD
 kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWalletDescription, kStringDevice,
 kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription,
 kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost, kStringRailing,
-kString300, kString301, kString302, kString303, kString304,
-kString305, kString306, kString307, kString308, kString309,
+kStringPoster, kStringPosterDescription, kStringCabin, kStringCabinFree, kStringCabinOccupied,
+kStringFeet, kStringFeetDescription, kString307, kString308, kString309,
 kString310, kString311, kString312, kString313, kString314,
 kString315, kString316, kString317, kString318, kString319,
 kString320, kString321, kString322, kString323, kString324,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a5ea68f..9f93e77 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -702,4 +702,36 @@ bool Street::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
+Games::Games(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = GAMES;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringPoster, kStringPosterDescription, POSTER, UNNECESSARY, 3, 3, 0);
+	_objectState[1] = Object(_id, kStringCabin, kStringCabinFree, NULLOBJECT, EXIT, 1, 1, 0, CABIN, 9);
+	_objectState[2] = Object(_id, kStringCabin, kStringCabinOccupied, OCCUPIED_CABIN, NULLTYPE, 0, 0, 0);
+	_objectState[3] = Object(_id, kStringFeet, kStringFeetDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[4] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
+}
+
+void Games::onEntrance() {
+	setRoomSeen(true);
+}
+
+bool Games::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_WALK && obj1._id == OCCUPIED_CABIN) {
+		_vm->renderMessage(kStringCabinOccupiedSay);
+	}
+	else if (verb == ACTION_LOOK && obj1._id == POSTER) {
+		_gm->_taxi_possibility &= ~4; // add culture palace
+		return false;
+	}
+	else 
+		return false;
+	return true;
+}
+
 }
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 15bdea6..8c595b4 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -120,5 +120,13 @@ public:
 
 private:
 };
+class Games : public Room {
+public:
+	Games(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
 }
 #endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index d179011..2751db7 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -53,7 +53,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 
 	// Rooms
 	out->writeByte(_currentRoom->getId());
-	for (int i = 0; i < 4; ++i) {
+	for (int i = 0; i < 5; ++i) {
 		_rooms[i]->serialize(out);
 	}
 
@@ -86,7 +86,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 
 	// Rooms
 	RoomId curRoomId = static_cast<RoomId>(in->readByte());
-	for (int i = 0; i < 4; ++i) {
+	for (int i = 0; i < 5; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
 	changeRoom(curRoomId);
@@ -227,6 +227,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[AIRPORT];
 	delete _rooms[TAXISTAND];
 	delete _rooms[STREET];
+	delete _rooms[GAMES];
 }
 
 void GameManager::initState() {
@@ -273,6 +274,7 @@ void GameManager::initRooms() {
 	_rooms[AIRPORT] = new Airport(_vm, this);
 	_rooms[TAXISTAND] = new TaxiStand(_vm, this);
 	_rooms[STREET] = new Street(_vm, this);
+	_rooms[GAMES] = new Games(_vm, this);
 }
 
 void GameManager::initGui() {


Commit: 247deea4fcee03156b8c3e471081083ce4785a80
    https://github.com/scummvm/scummvm/commit/247deea4fcee03156b8c3e471081083ce4785a80
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add skeleton for the rest of the rooms

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9f93e77..936c827 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -734,4 +734,1324 @@ bool Games::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
+Cabin::Cabin(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = CABIN;
+	_shown[0] = kShownTrue;
+}
+
+void Cabin::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Cabin::animation() {
+}
+
+bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Kiosk::Kiosk(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = KIOSK;
+	_shown[0] = kShownTrue;
+}
+
+void Kiosk::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Kiosk::animation() {
+}
+
+bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+CulturePalace::CulturePalace(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = CULTURE_PALACE;
+	_shown[0] = kShownTrue;
+}
+
+void CulturePalace::onEntrance() {
+	setRoomSeen(true);
+}
+
+void CulturePalace::animation() {
+}
+
+bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Cashbox::Cashbox(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = CASHBOX;
+	_shown[0] = kShownTrue;
+}
+
+void Cashbox::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Cashbox::animation() {
+}
+
+bool Cashbox::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+City1::City1(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = CITY1;
+	_shown[0] = kShownTrue;
+}
+
+void City1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void City1::animation() {
+}
+
+bool City1::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+City2::City2(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = CITY2;
+	_shown[0] = kShownTrue;
+}
+
+void City2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void City2::animation() {
+}
+
+bool City2::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Elevator::Elevator(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = ELEVATOR;
+	_shown[0] = kShownTrue;
+}
+
+void Elevator::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Elevator::animation() {
+}
+
+bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Apartment::Apartment(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = APARTMENT;
+	_shown[0] = kShownTrue;
+}
+
+void Apartment::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Apartment::animation() {
+}
+
+bool Apartment::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Ship::Ship(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = SHIP;
+	_shown[0] = kShownTrue;
+}
+
+void Ship::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Ship::animation() {
+}
+
+bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Pyramid::Pyramid(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = PYRAMID;
+	_shown[0] = kShownTrue;
+}
+
+void Pyramid::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Pyramid::animation() {
+}
+
+bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+PyrEntrance::PyrEntrance(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = PYR_ENTRANCE;
+	_shown[0] = kShownTrue;
+}
+
+void PyrEntrance::onEntrance() {
+	setRoomSeen(true);
+}
+
+void PyrEntrance::animation() {
+}
+
+bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Upstairs1::Upstairs1(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = UPSTAIRS1;
+	_shown[0] = kShownTrue;
+}
+
+void Upstairs1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Upstairs1::animation() {
+}
+
+bool Upstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Downstairs1::Downstairs1(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = DOWNSTAIRS1;
+	_shown[0] = kShownTrue;
+}
+
+void Downstairs1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Downstairs1::animation() {
+}
+
+bool Downstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+BottomRightDoor::BottomRightDoor(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = BOTTOM_RIGHT_DOOR;
+	_shown[0] = kShownTrue;
+}
+
+void BottomRightDoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void BottomRightDoor::animation() {
+}
+
+bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+BottomLeftDoor::BottomLeftDoor(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = BOTTOM_LEFT_DOOR;
+	_shown[0] = kShownTrue;
+}
+
+void BottomLeftDoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void BottomLeftDoor::animation() {
+}
+
+bool BottomLeftDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Upstairs2::Upstairs2(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = UPSTAIRS2;
+	_shown[0] = kShownTrue;
+}
+
+void Upstairs2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Upstairs2::animation() {
+}
+
+bool Upstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Downstairs2::Downstairs2(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = DOWNSTAIRS2;
+	_shown[0] = kShownTrue;
+}
+
+void Downstairs2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Downstairs2::animation() {
+}
+
+bool Downstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+UpperDoor::UpperDoor(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = UPPER_DOOR;
+	_shown[0] = kShownTrue;
+}
+
+void UpperDoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void UpperDoor::animation() {
+}
+
+bool UpperDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+PuzzleFront::PuzzleFront(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = PUZZLE_FRONT;
+	_shown[0] = kShownTrue;
+}
+
+void PuzzleFront::onEntrance() {
+	setRoomSeen(true);
+}
+
+void PuzzleFront::animation() {
+}
+
+bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+PuzzleBehind::PuzzleBehind(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = PUZZLE_BEHIND;
+	_shown[0] = kShownTrue;
+}
+
+void PuzzleBehind::onEntrance() {
+	setRoomSeen(true);
+}
+
+void PuzzleBehind::animation() {
+}
+
+bool PuzzleBehind::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Formula1F::Formula1F(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = FORMULA1_F;
+	_shown[0] = kShownTrue;
+}
+
+void Formula1F::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula1F::animation() {
+}
+
+bool Formula1F::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Formula1N::Formula1N(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = FORMULA1_N;
+	_shown[0] = kShownTrue;
+}
+
+void Formula1N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula1N::animation() {
+}
+
+bool Formula1N::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Formula2F::Formula2F(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = FORMULA2_F;
+	_shown[0] = kShownTrue;
+}
+
+void Formula2F::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula2F::animation() {
+}
+
+bool Formula2F::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Formula2N::Formula2N(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = FORMULA2_N;
+	_shown[0] = kShownTrue;
+}
+
+void Formula2N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula2N::animation() {
+}
+
+bool Formula2N::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+TomatoF::TomatoF(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = TOMATO_F;
+	_shown[0] = kShownTrue;
+}
+
+void TomatoF::onEntrance() {
+	setRoomSeen(true);
+}
+
+void TomatoF::animation() {
+}
+
+bool TomatoF::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+TomatoN::TomatoN(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = TOMATO_N;
+	_shown[0] = kShownTrue;
+}
+
+void TomatoN::onEntrance() {
+	setRoomSeen(true);
+}
+
+void TomatoN::animation() {
+}
+
+bool TomatoN::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+MonsterF::MonsterF(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MONSTER_F;
+	_shown[0] = kShownTrue;
+}
+
+void MonsterF::onEntrance() {
+	setRoomSeen(true);
+}
+
+void MonsterF::animation() {
+}
+
+bool MonsterF::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Monster1N::Monster1N(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MONSTER1_N;
+	_shown[0] = kShownTrue;
+}
+
+void Monster1N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Monster1N::animation() {
+}
+
+bool Monster1N::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Monster2N::Monster2N(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MONSTER2_N;
+	_shown[0] = kShownTrue;
+}
+
+void Monster2N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Monster2N::animation() {
+}
+
+bool Monster2N::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Upstairs3::Upstairs3(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = UPSTAIRS3;
+	_shown[0] = kShownTrue;
+}
+
+void Upstairs3::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Upstairs3::animation() {
+}
+
+bool Upstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Downstairs3::Downstairs3(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = DOWNSTAIRS3;
+	_shown[0] = kShownTrue;
+}
+
+void Downstairs3::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Downstairs3::animation() {
+}
+
+bool Downstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+LGang1::LGang1(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = LGANG1;
+	_shown[0] = kShownTrue;
+}
+
+void LGang1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void LGang1::animation() {
+}
+
+bool LGang1::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+LGang2::LGang2(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = LGANG2;
+	_shown[0] = kShownTrue;
+}
+
+void LGang2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void LGang2::animation() {
+}
+
+bool LGang2::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+HoleRoom::HoleRoom(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = HOLE_ROOM;
+	_shown[0] = kShownTrue;
+}
+
+void HoleRoom::onEntrance() {
+	setRoomSeen(true);
+}
+
+void HoleRoom::animation() {
+}
+
+bool HoleRoom::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+InHole::InHole(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = IN_HOLE;
+	_shown[0] = kShownTrue;
+}
+
+void InHole::onEntrance() {
+	setRoomSeen(true);
+}
+
+void InHole::animation() {
+}
+
+bool InHole::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Bodentuer::Bodentuer(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = BODENTUER;
+	_shown[0] = kShownTrue;
+}
+
+void Bodentuer::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Bodentuer::animation() {
+}
+
+bool Bodentuer::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+BodentuerU::BodentuerU(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = BODENTUER_U;
+	_shown[0] = kShownTrue;
+}
+
+void BodentuerU::onEntrance() {
+	setRoomSeen(true);
+}
+
+void BodentuerU::animation() {
+}
+
+bool BodentuerU::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+BstDoor::BstDoor(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = BST_DOOR;
+	_shown[0] = kShownTrue;
+}
+
+void BstDoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void BstDoor::animation() {
+}
+
+bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Hall::Hall(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = HALL;
+	_shown[0] = kShownTrue;
+}
+
+void Hall::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Hall::animation() {
+}
+
+bool Hall::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+CoffinRoom::CoffinRoom(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = COFFIN_ROOM;
+	_shown[0] = kShownTrue;
+}
+
+void CoffinRoom::onEntrance() {
+	setRoomSeen(true);
+}
+
+void CoffinRoom::animation() {
+}
+
+bool CoffinRoom::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mask::Mask(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MASK;
+	_shown[0] = kShownTrue;
+}
+
+void Mask::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mask::animation() {
+}
+
+bool Mask::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Museum::Museum(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUSEUM;
+	_shown[0] = kShownTrue;
+}
+
+void Museum::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Museum::animation() {
+}
+
+bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+MusEing::MusEing(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS_EING;
+	_shown[0] = kShownTrue;
+}
+
+void MusEing::onEntrance() {
+	setRoomSeen(true);
+}
+
+void MusEing::animation() {
+}
+
+bool MusEing::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus1::Mus1(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS1;
+	_shown[0] = kShownTrue;
+}
+
+void Mus1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus1::animation() {
+}
+
+bool Mus1::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS2;
+	_shown[0] = kShownTrue;
+}
+
+void Mus2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus2::animation() {
+}
+
+bool Mus2::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus3::Mus3(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS3;
+	_shown[0] = kShownTrue;
+}
+
+void Mus3::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus3::animation() {
+}
+
+bool Mus3::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus4::Mus4(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS4;
+	_shown[0] = kShownTrue;
+}
+
+void Mus4::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus4::animation() {
+}
+
+bool Mus4::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus5::Mus5(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS5;
+	_shown[0] = kShownTrue;
+}
+
+void Mus5::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus5::animation() {
+}
+
+bool Mus5::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus6::Mus6(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS6;
+	_shown[0] = kShownTrue;
+}
+
+void Mus6::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus6::animation() {
+}
+
+bool Mus6::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus7::Mus7(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS7;
+	_shown[0] = kShownTrue;
+}
+
+void Mus7::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus7::animation() {
+}
+
+bool Mus7::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus8::Mus8(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS8;
+	_shown[0] = kShownTrue;
+}
+
+void Mus8::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus8::animation() {
+}
+
+bool Mus8::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus9::Mus9(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS9;
+	_shown[0] = kShownTrue;
+}
+
+void Mus9::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus9::animation() {
+}
+
+bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus10::Mus10(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS10;
+	_shown[0] = kShownTrue;
+}
+
+void Mus10::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus10::animation() {
+}
+
+bool Mus10::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus11::Mus11(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS11;
+	_shown[0] = kShownTrue;
+}
+
+void Mus11::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus11::animation() {
+}
+
+bool Mus11::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+MusRund::MusRund(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS_RUND;
+	_shown[0] = kShownTrue;
+}
+
+void MusRund::onEntrance() {
+	setRoomSeen(true);
+}
+
+void MusRund::animation() {
+}
+
+bool MusRund::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus12::Mus12(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS12;
+	_shown[0] = kShownTrue;
+}
+
+void Mus12::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus12::animation() {
+}
+
+bool Mus12::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus13::Mus13(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS13;
+	_shown[0] = kShownTrue;
+}
+
+void Mus13::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus13::animation() {
+}
+
+bool Mus13::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus14::Mus14(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS14;
+	_shown[0] = kShownTrue;
+}
+
+void Mus14::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus14::animation() {
+}
+
+bool Mus14::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus15::Mus15(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS15;
+	_shown[0] = kShownTrue;
+}
+
+void Mus15::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus15::animation() {
+}
+
+bool Mus15::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus16::Mus16(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS16;
+	_shown[0] = kShownTrue;
+}
+
+void Mus16::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus16::animation() {
+}
+
+bool Mus16::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus17::Mus17(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS17;
+	_shown[0] = kShownTrue;
+}
+
+void Mus17::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus17::animation() {
+}
+
+bool Mus17::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus18::Mus18(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS18;
+	_shown[0] = kShownTrue;
+}
+
+void Mus18::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus18::animation() {
+}
+
+bool Mus18::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus19::Mus19(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS19;
+	_shown[0] = kShownTrue;
+}
+
+void Mus19::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus19::animation() {
+}
+
+bool Mus19::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus20::Mus20(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS20;
+	_shown[0] = kShownTrue;
+}
+
+void Mus20::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus20::animation() {
+}
+
+bool Mus20::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus21::Mus21(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS21;
+	_shown[0] = kShownTrue;
+}
+
+void Mus21::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus21::animation() {
+}
+
+bool Mus21::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
+Mus22::Mus22(Supernova2Engine *vm, GameManager *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = MUS22;
+	_shown[0] = kShownTrue;
+}
+
+void Mus22::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus22::animation() {
+}
+
+bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
+	return true;
+}
+
 }
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 8c595b4..b82229b 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -120,6 +120,7 @@ public:
 
 private:
 };
+
 class Games : public Room {
 public:
 	Games(Supernova2Engine *vm, GameManager *gm);
@@ -128,5 +129,666 @@ public:
 
 private:
 };
+
+class Cabin : public Room {
+public:
+	Cabin(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Kiosk : public Room {
+public:
+	Kiosk(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class CulturePalace : public Room {
+public:
+	CulturePalace(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Cashbox : public Room {
+public:
+	Cashbox(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class City1 : public Room {
+public:
+	City1(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class City2 : public Room {
+public:
+	City2(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Elevator : public Room {
+public:
+	Elevator(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Apartment : public Room {
+public:
+	Apartment(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Ship : public Room {
+public:
+	Ship(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Pyramid : public Room {
+public:
+	Pyramid(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class PyrEntrance : public Room {
+public:
+	PyrEntrance(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Upstairs1 : public Room {
+public:
+	Upstairs1(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Downstairs1 : public Room {
+public:
+	Downstairs1(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class BottomRightDoor : public Room {
+public:
+	BottomRightDoor(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class BottomLeftDoor : public Room {
+public:
+	BottomLeftDoor(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Upstairs2 : public Room {
+public:
+	Upstairs2(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Downstairs2 : public Room {
+public:
+	Downstairs2(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class UpperDoor : public Room {
+public:
+	UpperDoor(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class PuzzleFront : public Room {
+public:
+	PuzzleFront(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class PuzzleBehind : public Room {
+public:
+	PuzzleBehind(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Formula1F : public Room {
+public:
+	Formula1F(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Formula1N : public Room {
+public:
+	Formula1N(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Formula2F : public Room {
+public:
+	Formula2F(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Formula2N : public Room {
+public:
+	Formula2N(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class TomatoF : public Room {
+public:
+	TomatoF(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class TomatoN : public Room {
+public:
+	TomatoN(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class MonsterF : public Room {
+public:
+	MonsterF(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Monster1N : public Room {
+public:
+	Monster1N(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Monster2N : public Room {
+public:
+	Monster2N(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Upstairs3 : public Room {
+public:
+	Upstairs3(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Downstairs3 : public Room {
+public:
+	Downstairs3(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class LGang1 : public Room {
+public:
+	LGang1(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class LGang2 : public Room {
+public:
+	LGang2(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class HoleRoom : public Room {
+public:
+	HoleRoom(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class InHole : public Room {
+public:
+	InHole(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Bodentuer : public Room {
+public:
+	Bodentuer(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class BodentuerU : public Room {
+public:
+	BodentuerU(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class BstDoor : public Room {
+public:
+	BstDoor(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Hall : public Room {
+public:
+	Hall(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class CoffinRoom : public Room {
+public:
+	CoffinRoom(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mask : public Room {
+public:
+	Mask(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Museum : public Room {
+public:
+	Museum(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class MusEing : public Room {
+public:
+	MusEing(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus1 : public Room {
+public:
+	Mus1(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus2 : public Room {
+public:
+	Mus2(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus3 : public Room {
+public:
+	Mus3(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus4 : public Room {
+public:
+	Mus4(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus5 : public Room {
+public:
+	Mus5(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus6 : public Room {
+public:
+	Mus6(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus7 : public Room {
+public:
+	Mus7(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus8 : public Room {
+public:
+	Mus8(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus9 : public Room {
+public:
+	Mus9(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus10 : public Room {
+public:
+	Mus10(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus11 : public Room {
+public:
+	Mus11(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class MusRund : public Room {
+public:
+	MusRund(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus12 : public Room {
+public:
+	Mus12(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus13 : public Room {
+public:
+	Mus13(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus14 : public Room {
+public:
+	Mus14(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus15 : public Room {
+public:
+	Mus15(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus16 : public Room {
+public:
+	Mus16(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus17 : public Room {
+public:
+	Mus17(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus18 : public Room {
+public:
+	Mus18(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus19 : public Room {
+public:
+	Mus19(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus20 : public Room {
+public:
+	Mus20(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus21 : public Room {
+public:
+	Mus21(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
+class Mus22 : public Room {
+public:
+	Mus22(Supernova2Engine *vm, GameManager *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+};
+
 }
 #endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 2751db7..3cfed25 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -53,7 +53,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 
 	// Rooms
 	out->writeByte(_currentRoom->getId());
-	for (int i = 0; i < 5; ++i) {
+	for (int i = 0; i < NUMROOMS; ++i) {
 		_rooms[i]->serialize(out);
 	}
 
@@ -86,7 +86,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 
 	// Rooms
 	RoomId curRoomId = static_cast<RoomId>(in->readByte());
-	for (int i = 0; i < 5; ++i) {
+	for (int i = 0; i < NUMROOMS; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
 	changeRoom(curRoomId);
@@ -228,6 +228,72 @@ void GameManager::destroyRooms() {
 	delete _rooms[TAXISTAND];
 	delete _rooms[STREET];
 	delete _rooms[GAMES];
+	delete _rooms[CABIN];
+	delete _rooms[KIOSK];
+	delete _rooms[CULTURE_PALACE];
+	delete _rooms[CASHBOX];
+	delete _rooms[CITY1];
+	delete _rooms[CITY2];
+	delete _rooms[ELEVATOR];
+	delete _rooms[APARTMENT];
+	delete _rooms[SHIP];
+	delete _rooms[PYRAMID];
+	delete _rooms[PYR_ENTRANCE];
+	delete _rooms[UPSTAIRS1];
+	delete _rooms[DOWNSTAIRS1];
+	delete _rooms[BOTTOM_RIGHT_DOOR];
+	delete _rooms[BOTTOM_LEFT_DOOR];
+	delete _rooms[UPSTAIRS2];
+	delete _rooms[DOWNSTAIRS2];
+	delete _rooms[UPPER_DOOR];
+	delete _rooms[PUZZLE_FRONT];
+	delete _rooms[PUZZLE_BEHIND];
+	delete _rooms[FORMULA1_F];
+	delete _rooms[FORMULA1_N];
+	delete _rooms[FORMULA2_F];
+	delete _rooms[FORMULA2_N];
+	delete _rooms[TOMATO_F];
+	delete _rooms[TOMATO_N];
+	delete _rooms[MONSTER_F];
+	delete _rooms[MONSTER1_N];
+	delete _rooms[MONSTER2_N];
+	delete _rooms[UPSTAIRS3];
+	delete _rooms[DOWNSTAIRS3];
+	delete _rooms[LGANG1];
+	delete _rooms[LGANG2];
+	delete _rooms[HOLE_ROOM];
+	delete _rooms[IN_HOLE];
+	delete _rooms[BODENTUER];
+	delete _rooms[BODENTUER_U];
+	delete _rooms[BST_DOOR];
+	delete _rooms[HALL];
+	delete _rooms[COFFIN_ROOM];
+	delete _rooms[MASK];
+	delete _rooms[MUSEUM];
+	delete _rooms[MUS_EING];
+	delete _rooms[MUS1];
+	delete _rooms[MUS2];
+	delete _rooms[MUS3];
+	delete _rooms[MUS4];
+	delete _rooms[MUS5];
+	delete _rooms[MUS6];
+	delete _rooms[MUS7];
+	delete _rooms[MUS8];
+	delete _rooms[MUS9];
+	delete _rooms[MUS10];
+	delete _rooms[MUS11];
+	delete _rooms[MUS_RUND];
+	delete _rooms[MUS12];
+	delete _rooms[MUS13];
+	delete _rooms[MUS14];
+	delete _rooms[MUS15];
+	delete _rooms[MUS16];
+	delete _rooms[MUS17];
+	delete _rooms[MUS18];
+	delete _rooms[MUS19];
+	delete _rooms[MUS20];
+	delete _rooms[MUS21];
+	delete _rooms[MUS22];
 }
 
 void GameManager::initState() {
@@ -275,6 +341,72 @@ void GameManager::initRooms() {
 	_rooms[TAXISTAND] = new TaxiStand(_vm, this);
 	_rooms[STREET] = new Street(_vm, this);
 	_rooms[GAMES] = new Games(_vm, this);
+	_rooms[CABIN] = new Cabin(_vm, this);
+	_rooms[KIOSK] = new Kiosk(_vm, this);
+	_rooms[CULTURE_PALACE] = new CulturePalace(_vm, this);
+	_rooms[CASHBOX] = new Cashbox(_vm, this);
+	_rooms[CITY1] = new City1(_vm, this);
+	_rooms[CITY2] = new City2(_vm, this);
+	_rooms[ELEVATOR] = new Elevator(_vm, this);
+	_rooms[APARTMENT] = new Apartment(_vm, this);
+	_rooms[SHIP] = new Ship(_vm, this);
+	_rooms[PYRAMID] = new Pyramid(_vm, this);
+	_rooms[PYR_ENTRANCE] = new PyrEntrance(_vm, this);
+	_rooms[UPSTAIRS1] = new Upstairs1(_vm, this);
+	_rooms[DOWNSTAIRS1] = new Downstairs1(_vm, this);
+	_rooms[BOTTOM_RIGHT_DOOR] = new BottomRightDoor(_vm, this);
+	_rooms[BOTTOM_LEFT_DOOR] = new BottomLeftDoor(_vm, this);
+	_rooms[UPSTAIRS2] = new Upstairs2(_vm, this);
+	_rooms[DOWNSTAIRS2] = new Downstairs2(_vm, this);
+	_rooms[UPPER_DOOR] = new UpperDoor(_vm, this);
+	_rooms[PUZZLE_FRONT] = new PuzzleFront(_vm, this);
+	_rooms[PUZZLE_BEHIND] = new PuzzleBehind(_vm, this);
+	_rooms[FORMULA1_F] = new Formula1F(_vm, this);
+	_rooms[FORMULA1_N] = new Formula1N(_vm, this);
+	_rooms[FORMULA2_F] = new Formula2F(_vm, this);
+	_rooms[FORMULA2_N] = new Formula2N(_vm, this);
+	_rooms[TOMATO_F] = new TomatoF(_vm, this);
+	_rooms[TOMATO_N] = new TomatoN(_vm, this);
+	_rooms[MONSTER_F] = new MonsterF(_vm, this);
+	_rooms[MONSTER1_N] = new Monster1N(_vm, this);
+	_rooms[MONSTER2_N] = new Monster2N(_vm, this);
+	_rooms[UPSTAIRS3] = new Upstairs3(_vm, this);
+	_rooms[DOWNSTAIRS3] = new Downstairs3(_vm, this);
+	_rooms[LGANG1] = new LGang1(_vm, this);
+	_rooms[LGANG2] = new LGang2(_vm, this);
+	_rooms[HOLE_ROOM] = new HoleRoom(_vm, this);
+	_rooms[IN_HOLE] = new InHole(_vm, this);
+	_rooms[BODENTUER] = new Bodentuer(_vm, this);
+	_rooms[BODENTUER_U] = new BodentuerU(_vm, this);
+	_rooms[BST_DOOR] = new BstDoor(_vm, this);
+	_rooms[HALL] = new Hall(_vm, this);
+	_rooms[COFFIN_ROOM] = new CoffinRoom(_vm, this);
+	_rooms[MASK] = new Mask(_vm, this);
+	_rooms[MUSEUM] = new Museum(_vm, this);
+	_rooms[MUS_EING] = new MusEing(_vm, this);
+	_rooms[MUS1] = new Mus1(_vm, this);
+	_rooms[MUS2] = new Mus2(_vm, this);
+	_rooms[MUS3] = new Mus3(_vm, this);
+	_rooms[MUS4] = new Mus4(_vm, this);
+	_rooms[MUS5] = new Mus5(_vm, this);
+	_rooms[MUS6] = new Mus6(_vm, this);
+	_rooms[MUS7] = new Mus7(_vm, this);
+	_rooms[MUS8] = new Mus8(_vm, this);
+	_rooms[MUS9] = new Mus9(_vm, this);
+	_rooms[MUS10] = new Mus10(_vm, this);
+	_rooms[MUS11] = new Mus11(_vm, this);
+	_rooms[MUS_RUND] = new MusRund(_vm, this);
+	_rooms[MUS12] = new Mus12(_vm, this);
+	_rooms[MUS13] = new Mus13(_vm, this);
+	_rooms[MUS14] = new Mus14(_vm, this);
+	_rooms[MUS15] = new Mus15(_vm, this);
+	_rooms[MUS16] = new Mus16(_vm, this);
+	_rooms[MUS17] = new Mus17(_vm, this);
+	_rooms[MUS18] = new Mus18(_vm, this);
+	_rooms[MUS19] = new Mus19(_vm, this);
+	_rooms[MUS20] = new Mus20(_vm, this);
+	_rooms[MUS21] = new Mus21(_vm, this);
+	_rooms[MUS22] = new Mus22(_vm, this);
 }
 
 void GameManager::initGui() {


Commit: 286f12c830eff01f94fac339eb7037162e54e7fc
    https://github.com/scummvm/scummvm/commit/286f12c830eff01f94fac339eb7037162e54e7fc
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add cabin room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index c3d9d03..ecebb37 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -107,7 +107,7 @@ enum ObjectId {
 	TKNIFE,ROPE,NOTE,MOUTH,
 	HOLE1,HOLE2,HOLE3,HOLE4,HOLE5,HOLE6,HOLE7,HOLE8,HOLE9,HOLE10,
 	HOLE11,HOLE12,HOLE13,HOLE14,HOLE15,HOLE16,HOLE17,HOLE18,HOLE19,HOLE20,
-	HOLE21,HOLE22,HOLE23,HOLE24,HOLE25,SHIELD,
+	HOLE21,HOLE22,HOLE23,HOLE24,HOLE25,SIGN,
 	SLOT,HOLE,STONES,
 	BST1,BST2,BST3,BST4,BST5,BST6,BST7,BST8,
 	BST9,BST10,BST11,BST12,BST13,BST14,BST15,BST16,
@@ -116,7 +116,7 @@ enum ObjectId {
 	BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXICON,PLANT,SNAKE,
 	CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
 	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
-	DOODLE,DOODLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD,
+	SCRIBBLE1,SCRIBBLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD,
 	MAGNET,UNDER_BED,KEY,VALVE,WARDROBE,DISCMAN,
 	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
 	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,INVESTMENT,
@@ -153,12 +153,12 @@ kString115, kString116, kString117, kString118, kString119,
 kString120, kString121, kString122, kString123, kString124,
 kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kString132, kString133, kString134,
-kString135, kString136, kString137, kString138, kString139,
+kString135, kString136, kStringSign, kString138, kString139,
 kString140, kString141, kString142, kString143, kString144,
 kString145, kString146, kString147, kString148, kString149,
 kString150, kString151, kString152, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
-kString160, kString161, kString162, kString163, kString164,
+kString160, kString161, kString162, kStringSlot, kString164,
 kString165, kString166, kString167, kString168, kStringExit,
 kString170, kString171, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
@@ -169,8 +169,8 @@ kString195, kString196, kString197, kString198, kString199,
 kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
 kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
-kStringOnlyShop, kStringCabinOccupiedSay, kString217, kString218, kString219,
-kString220, kString221, kString222, kString223, kString224,
+kStringOnlyShop, kStringCabinOccupiedSay, kStringTakeMoney, kStringAlreadyPaid, kStringNoMoney,
+kStringPay10Xa, kStringWillPassOut, kStringRest, kString223, kString224,
 kString225, kString226, kString227, kString228, kString229,
 kString230, kString231, kString232, kString233, kString234,
 kString235, kString236, kString237, kString238, kString239,
@@ -187,9 +187,9 @@ kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWal
 kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription,
 kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost, kStringRailing,
 kStringPoster, kStringPosterDescription, kStringCabin, kStringCabinFree, kStringCabinOccupied,
-kStringFeet, kStringFeetDescription, kString307, kString308, kString309,
-kString310, kString311, kString312, kString313, kString314,
-kString315, kString316, kString317, kString318, kString319,
+kStringFeet, kStringFeetDescription, kStringHood, kStringHoodDescription, kString400Xa,
+kString10Xa, kStringSlotDescription1, kStringSlotDescription2, kStringChair, kStringChairDescription,
+kStringScribble, kStringFace, kStringFaceDescription, kString318, kString319,
 kString320, kString321, kString322, kString323, kString324,
 kString325, kString326, kString327, kString328, kString329,
 kString330, kString331, kString332, kString333, kString334,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 936c827..f15c03f 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -737,10 +737,23 @@ bool Games::interact(Action verb, Object &obj1, Object &obj2) {
 Cabin::Cabin(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
+	_paid = false;
 
-	_fileNumber = 6;
+	_fileNumber = 7;
 	_id = CABIN;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, GAMES, 22);
+	_objectState[1] = Object(_id, kStringHood, kStringHoodDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kString400Xa, kStringDefaultDescription, PRIZE, TAKE, 255, 255, 2 + 180);
+	_objectState[3] = Object(_id, kString10Xa, kStringDefaultDescription, BACK_MONEY, TAKE, 255, 255, 2 + 128);
+	_objectState[4] = Object(_id, kStringSlot, kStringSlotDescription1, SLOT1, COMBINABLE, 2, 2, 0);
+	_objectState[5] = Object(_id, kStringSlot, kStringSlotDescription2, NULLOBJECT, COMBINABLE, 3, 3, 0);
+	_objectState[6] = Object(_id, kStringChair, kStringChairDescription, CHAIR, NULLTYPE, 4, 4, 0);
+	_objectState[7] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE1, NULLTYPE, 5, 5, 0);
+	_objectState[8] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE2, NULLTYPE, 6, 6, 0);
+	_objectState[9] = Object(_id, kStringFace, kStringFaceDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
+	_objectState[10] = Object(_id, kStringSign, kStringDefaultDescription, SIGN, UNNECESSARY, 1, 1, 0);
 }
 
 void Cabin::onEntrance() {
@@ -748,9 +761,72 @@ void Cabin::onEntrance() {
 }
 
 void Cabin::animation() {
+	if (_paid) {
+		if (isSectionVisible(1))
+			_vm->renderImage(1 + 128);
+		else
+			_vm->renderImage(1);
+	}
+	_gm->setAnimationTimer(4);
 }
 
 bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, MONEY, SLOT1)) {
+		if (isSectionVisible(2))
+			_vm->renderMessage(kStringTakeMoney);
+		else if (_paid)
+			_vm->renderMessage(kStringAlreadyPaid);
+		else if (_gm->_state._money < 10)
+			_vm->renderMessage(kStringNoMoney);
+		else {
+			_vm->renderMessage(kStringPay10Xa);
+			_gm->takeMoney(-10);
+			_paid = true;
+		}
+	}
+	else if (verb == ACTION_USE && obj1._id == CHAIR) {
+		if (_paid) {
+			if (_var2) {
+				_vm->paletteFadeOut();
+				_vm->setCurrentImage(31);
+				_vm->renderImage(0);
+				_vm->paletteFadeIn();
+				_paid = true;
+				_gm->waitOnInput(100000);
+				_vm->paletteFadeOut();
+				_vm->setCurrentImage(7);
+				_vm->renderImage(0);
+				setSectionVisible(1, kShownFalse);
+				_paid = false;
+				_vm->renderRoom(*this);
+				_vm->renderImage(2);
+				_gm->drawMapExits();
+				_gm->drawInventory();
+				_gm->drawStatus();
+				_gm->drawCommandBox();
+				_vm->paletteFadeIn();
+				getObject(3)->_click = 8;
+			} else {
+				_gm->_state._tipsy = false;
+				_vm->paletteFadeOut();
+				_vm->_system->fillScreen(kColorBlack);
+				Common::String text = _vm->getGameString(kStringWillPassOut);
+				_vm->renderMessage(text);
+				_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+				_vm->removeMessage();
+				_vm->saveGame(kSleepAutosaveSlot, "autosave");
+				_gm->_inventory.clear();
+				_gm->changeRoom(PYRAMID);
+				_gm->drawStatus();
+				_gm->drawInventory();
+				_gm->drawMapExits();
+				_gm->drawCommandBox();
+			}
+		} else
+			_vm->renderMessage(kStringRest);
+	}
+	else 
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index b82229b..288023c 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -138,6 +138,8 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	bool _paid;
+	bool _var2; // Not sure what this variable means yet
 };
 
 class Kiosk : public Room {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 3cfed25..c60b504 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -40,6 +40,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._addressKnown);
 	out->writeByte(_state._poleMagnet);
 	out->writeByte(_state._admission);
+	out->writeByte(_state._tipsy);
 
 	// Inventory
 	out->writeSint32LE(_inventory.getSize());
@@ -70,6 +71,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._addressKnown = in->readByte();
 	_state._poleMagnet = in->readByte();
 	_state._admission = in->readByte();
+	_state._tipsy = in->readByte();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
 
 	_oldTime = g_system->getMillis();
@@ -333,6 +335,7 @@ void GameManager::initState() {
 	_state._previousRoom = _currentRoom;
 	_state._poleMagnet = false;
 	_state._admission = 0;
+	_state._tipsy = false;
 }
 
 void GameManager::initRooms() {
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index c69aebc..3d8b650 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -39,6 +39,7 @@ struct GameState {
 	Room *_previousRoom;
 	bool _poleMagnet;
 	char _admission;
+	bool _tipsy;
 };
 
 class Inventory {


Commit: c20f60002606d85d824f2b55f9762eb6e5503023
    https://github.com/scummvm/scummvm/commit/c20f60002606d85d824f2b55f9762eb6e5503023
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add partialy finished kiosk room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index ecebb37..e23a3a2 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -160,7 +160,7 @@ kString150, kString151, kString152, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
 kString160, kString161, kString162, kStringSlot, kString164,
 kString165, kString166, kString167, kString168, kStringExit,
-kString170, kString171, kString172, kString173, kString174,
+kString170, kStringToothbrush, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
 kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
@@ -189,10 +189,10 @@ kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost
 kStringPoster, kStringPosterDescription, kStringCabin, kStringCabinFree, kStringCabinOccupied,
 kStringFeet, kStringFeetDescription, kStringHood, kStringHoodDescription, kString400Xa,
 kString10Xa, kStringSlotDescription1, kStringSlotDescription2, kStringChair, kStringChairDescription,
-kStringScribble, kStringFace, kStringFaceDescription, kString318, kString319,
-kString320, kString321, kString322, kString323, kString324,
-kString325, kString326, kString327, kString328, kString329,
-kString330, kString331, kString332, kString333, kString334,
+kStringScribble, kStringFace, kStringFaceDescription, kStringBooks, kStringDictionary,
+kStringPlant, kStringMask, kStringSnake, kStringCup, kStringJoystick,
+kStringToothbrushDescription, kStringMusic, kStringMusicDescription, kStringBottle, kStringBottleDescription,
+kStringBox, kStringSeller, kString332, kString333, kString334,
 kString335, kString336, kString337, kString338, kString339,
 kString340, kString341, kString342, kString343, kString344,
 kString345, kString346, kString347, kString348, kString349,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index f15c03f..f46ee56 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -834,9 +834,33 @@ Kiosk::Kiosk(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 19;
 	_id = KIOSK;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownFalse;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
+	_objectState[1] = Object(_id, kStringBooks, kStringDefaultDescription, BOOKS, UNNECESSARY, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringDictionary, kStringDefaultDescription, LEXICON, UNNECESSARY, 1, 1, 0);
+	_objectState[3] = Object(_id, kStringPlant, kStringDefaultDescription, PLANT, UNNECESSARY, 2, 2, 0);
+	_objectState[4] = Object(_id, kStringMask, kStringDefaultDescription, BMASK, UNNECESSARY, 4, 4, 2 + 128);
+	_objectState[5] = Object(_id, kStringSnake, kStringDefaultDescription, SNAKE, UNNECESSARY, 3, 3, 0);
+	_objectState[6] = Object(_id, kStringCup, kStringDefaultDescription, CUP, UNNECESSARY, 5, 5, 0);
+	_objectState[7] = Object(_id, kStringJoystick, kStringDefaultDescription, JOYSTICK, UNNECESSARY, 6, 6, 0);
+	_objectState[8] = Object(_id, kStringToothbrush, kStringToothbrushDescription, TOOTHBRUSH, TAKE, 7, 7, 5 + 128);
+	_objectState[9] = Object(_id, kStringMusic, kStringMusicDescription, PLAYER, TAKE | COMBINABLE, 8, 8, 4 + 128);
+	_objectState[10] = Object(_id, kStringBottle, kStringBottleDescription, BOTTLE, TAKE, 9, 9, 3 + 128);
+	_objectState[11] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE1, UNNECESSARY, 10, 10, 0);
+	_objectState[12] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE2, UNNECESSARY, 11, 11, 0);
+	_objectState[13] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE3, UNNECESSARY, 12, 12, 0);
+	_objectState[14] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE4, UNNECESSARY, 13, 13, 0);
+	_objectState[15] = Object(_id, kStringBox, kStringDefaultDescription, BOX, UNNECESSARY, 14, 14, 0);
+	_objectState[16] = Object(_id, kStringFace, kStringDefaultDescription, FACES, UNNECESSARY, 15, 15, 0);
+	_objectState[17] = Object(_id, kStringSeller, kStringDefaultDescription, SELLER, TALK, 16, 16, 0);
 }
 
 void Kiosk::onEntrance() {


Commit: 0a7ec13c3c9d960bc5a979ff08ab4dbc98f45f08
    https://github.com/scummvm/scummvm/commit/0a7ec13c3c9d960bc5a979ff08ab4dbc98f45f08
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Finish Kiosk room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/sound.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index e23a3a2..ba71339 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -170,16 +170,16 @@ kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, k
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
 kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
 kStringOnlyShop, kStringCabinOccupiedSay, kStringTakeMoney, kStringAlreadyPaid, kStringNoMoney,
-kStringPay10Xa, kStringWillPassOut, kStringRest, kString223, kString224,
-kString225, kString226, kString227, kString228, kString229,
-kString230, kString231, kString232, kString233, kString234,
-kString235, kString236, kString237, kString238, kString239,
-kString240, kString241, kString242, kString243, kString244,
-kString245, kString246, kString247, kString248, kString249,
-kString250, kString251, kString252, kString253, kString254,
-kString255, kString256, kString257, kString258, kString259,
-kString260, kString261, kString262, kString263, kString264,
-kString265, kString266, kString267, kString268, kStringKnife,
+kStringPay10Xa, kStringWillPassOut, kStringRest, kString223, kStringWillTakeIt,
+kStringTooExpensive, kStringWouldBuy, kStringMeHorstHummel, kStringHaveMusicChip, kStringGreatMask,
+kStringThreeYears, kStringStrongDrink, kStringMusicDevice, kStringArtusToothbrush, kStringSellInBulk,
+kStringRarityBooks, kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words, kStringNotSale,
+kStringGaveOne, kStringExcited, kStringFromGame, kStringRobust, kStringCheapSwill,
+kStringStickers, kStringDishes, kStringUgly, kStringSellsWell, kStringThatCosts,
+kStringTakeALook, kStringNonsense, kStringImSorry, kStringGoodEvening, kStringHello,
+kStringScaredMe, kStringHowSo, kStringDisguise, kStringWhatDisguise, kStringStopPretending,
+kStringYouDisguised, kStringIAmHorstHummel, kStringGiveItUp, kStringGestures, kStringMovesDifferently,
+kStringHeIsRobot, kStringYouAreCrazy, kStringYouIdiot, kStringShutUp, kStringKnife,
 kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription, kStringSuctionCupDescription,
 kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard,
 kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kStringVehicle,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index ac060ac..b3c0e11 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -50,7 +50,7 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{47,     16010,    -1},
 	{49,     8010,    -1},
 	{49,     0,    8010},
-	{52,     0,    -1},
+	{53,     30020,    -1},
 	{53,     0,    -1},
 	{54,     0,    -1},
 	{55,     0,    -1},
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index f46ee56..329f529 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -864,13 +864,130 @@ Kiosk::Kiosk(Supernova2Engine *vm, GameManager *gm) {
 }
 
 void Kiosk::onEntrance() {
-	setRoomSeen(true);
+	static StringId dialEntry[2] = {
+		kStringGoodEvening,
+		kStringHello
+	};
+
+	if (!hasSeen()) {
+		_gm->dialog(2, _gm->_dials, dialEntry, 0);
+		_vm->renderImage(6);
+		_vm->playSound(kAudioKiosk);
+		_gm->wait(8);
+		_vm->renderImage(6 + 128);
+		_gm->reply(kStringScaredMe, 1, 1 +128);
+		_gm->say(kStringHowSo);
+		_gm->reply(kStringDisguise, 1, 1 +128);
+		_gm->say(kStringWhatDisguise);
+		_gm->reply(kStringStopPretending, 1, 1 +128);
+		_gm->reply(kStringYouDisguised, 1, 1 +128);
+		_gm->say(kStringIAmHorstHummel);
+		_gm->reply(kStringGiveItUp, 1, 1 +128);
+		_gm->reply(kStringGestures, 1, 1 +128);
+		_gm->reply(kStringMovesDifferently, 1, 1 +128);
+		_gm->say(kStringHeIsRobot);
+		_gm->reply(kStringYouAreCrazy, 1, 1 +128);
+		_gm->say(kStringYouIdiot);
+		_gm->reply(kStringShutUp, 1, 1 +128);
+		_gm->drawStatus();
+		_gm->drawInventory();
+		_gm->drawMapExits();
+		_gm->drawCommandBox();
+		setRoomSeen(true);
+	}
 }
 
 void Kiosk::animation() {
 }
 
 bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
+	static StringId dialPrice[2] = {
+		kStringWillTakeIt,
+		kStringTooExpensive
+	};
+	static StringId dialSay[3] = {
+		kStringWouldBuy,
+		kStringMeHorstHummel,
+		kStringHaveMusicChip
+	};
+	static StringId dialSeller[16][3] = {
+		{kStringGreatMask, kStringThreeYears, kNoString},
+		{kStringStrongDrink, kNoString, kNoString},
+		{kStringMusicDevice, kNoString, kNoString},
+		{kStringArtusToothbrush, kStringSellInBulk, kNoString},
+		{kStringRarityBooks, kNoString, kNoString},
+		{kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words},
+		{kStringNotSale, kNoString, kNoString},
+		{kStringGaveOne, kStringExcited, kNoString},
+		{kStringFromGame, kNoString, kNoString},
+		{kStringRobust, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringStickers, kNoString, kNoString},
+		{kStringDishes, kStringUgly, kStringSellsWell}
+	};
+
+	if (verb == ACTION_TAKE && !(obj1._type & CARRIED) &&
+		obj1._id >= BOTTLE && obj1._id <= TOOTHBRUSH) {
+		int price;
+		switch (obj1._id) {
+		case BOTTLE:
+			price = 30;
+			break;
+		case PLAYER:
+			price = 50;
+			break;
+		case TOOTHBRUSH:
+			price = 5;
+			break;
+		default:
+			break;
+		}
+		Common::String format = _vm->getGameString(kStringThatCosts);
+		Common::String cost = Common::String::format(format.c_str(), price);
+		_vm->renderMessage(cost, kMessageTop);
+		_gm->reply(cost.c_str(), 1, 1 +128);
+
+		if (_gm->_state._money < price)
+			_gm->say(dialPrice[1]);
+		else if (_gm->dialog(2, _gm->_dials, dialPrice, 0) == 0) {
+			_gm->takeObject(obj1);
+			_gm->takeMoney(-price);
+		}
+		_gm->drawStatus();
+		_gm->drawInventory();
+		_gm->drawMapExits();
+		_gm->drawCommandBox();
+	}
+	else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
+		for(int i = 0; i < 3; i++) {
+			_gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + 128);
+		}
+	}
+	else if (verb == ACTION_TALK && obj1._id >= SELLER) {
+		int i = 2;
+		if (getObject(9)->_type & CARRIED)
+			i++;
+		switch (_gm->dialog(i, _gm->_dials, dialSay, 0)) {
+		case 0:
+			_gm->reply(kStringTakeALook, 1, 1 + 128);
+			break;
+		case 1:
+			_gm->reply(kStringNonsense, 1, 1 + 128);
+			break;
+		case 2:
+			_gm->reply(kStringImSorry, 1, 1 + 128);
+			break;
+		}
+		_gm->drawStatus();
+		_gm->drawInventory();
+		_gm->drawMapExits();
+		_gm->drawCommandBox();
+	}
+	else 
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 30c05ee..877f3fa 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -36,6 +36,7 @@ enum AudioId {
 	kAudioTaxiOpen,
 	kAudioTaxiLeaving,
 	kAudioTaxiArriving,
+	kAudioKiosk,
 	kAudioNumSamples = 10 //TODO find out how many samples there are
 };
 


Commit: 6b6466b4b354867fbcaf4d52a83b3f0b67edfeab
    https://github.com/scummvm/scummvm/commit/6b6466b4b354867fbcaf4d52a83b3f0b67edfeab
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add more generic interactions

The original file ms2_r1.c is finished.
In the original game, pressing the discman should play
only the first 2 patterns of the song. I couldn't
figure out how to stop playing the music in the right
moment, so instead the whole music is played but
the it can be stopped by pressing a mouse button.

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/resman.h
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index ba71339..40ce6d7 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -164,8 +164,8 @@ kString170, kStringToothbrush, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
 kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
-kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kString194,
-kString195, kString196, kString197, kString198, kString199,
+kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD,
+kStringChipEmpty, kStringListeningToCD, kStringNoChip, kStringTipsy, kString199,
 kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
 kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index b3c0e11..b4becd8 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -122,6 +122,7 @@ void ResourceManager::initSoundFiles() {
 	}
 
 	_musicIntroBuffer.reset(convertToMod("ms2_data.052"));
+	_musicMadMonkeysBuffer.reset(convertToMod("ms2_data.056"));
 	_musicOutroBuffer.reset(convertToMod("ms2_data.049"));
 }
 
@@ -171,6 +172,9 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	case kMusicIntro:
 		_musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get()));
 		return _musicIntro.get();
+	case kMusicMadMonkeys:
+		_musicMadMonkeys.reset(Audio::makeProtrackerStream(_musicMadMonkeysBuffer.get()));
+		return _musicMadMonkeys.get();
 	case kMusicOutro:
 		_musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get()));
 		return _musicOutro.get();
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
index 16e237e..325cfb2 100644
--- a/engines/supernova2/resman.h
+++ b/engines/supernova2/resman.h
@@ -63,8 +63,10 @@ private:
 private:
 	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
 	Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
+	Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
 	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
+	Common::ScopedPtr<Audio::AudioStream> _musicMadMonkeys;
 	Common::ScopedPtr<Audio::AudioStream> _musicOutro;
 	int _audioRate;
 	MS2Image _images[kNumImageFiles];
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 877f3fa..2bbc982 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -42,7 +42,8 @@ enum AudioId {
 
 enum MusicId {
 	kMusicIntro = 52,
-	kMusicOutro = 56
+	kMusicMadMonkeys = 56,
+	kMusicOutro = 55
 };
 
 class Sound {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index c60b504..db26601 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -41,6 +41,8 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._poleMagnet);
 	out->writeByte(_state._admission);
 	out->writeByte(_state._tipsy);
+	out->writeUint32LE(_state._eventTime);
+	out->writeSint32LE(_state._eventCallback);
 
 	// Inventory
 	out->writeSint32LE(_inventory.getSize());
@@ -72,6 +74,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._poleMagnet = in->readByte();
 	_state._admission = in->readByte();
 	_state._tipsy = in->readByte();
+	_state._eventTime = in->readUint32LE();
+	_state._eventCallback = (EventFunction)in->readSint32LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
 
 	_oldTime = g_system->getMillis();
@@ -336,6 +340,8 @@ void GameManager::initState() {
 	_state._poleMagnet = false;
 	_state._admission = 0;
 	_state._tipsy = false;
+	_state._eventTime = kMaxTimerValue;
+	_state._eventCallback = kNoFn;
 }
 
 void GameManager::initRooms() {
@@ -459,6 +465,24 @@ void GameManager::updateEvents() {
 	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
 		_currentRoom->animation();
 
+	if (_state._eventCallback != kNoFn && g_system->getMillis() >= _state._eventTime) {
+		_vm->_allowLoadGame = false;
+		_vm->_allowSaveGame = false;
+		_state._eventTime = kMaxTimerValue;
+		EventFunction fn = _state._eventCallback;
+		_state._eventCallback = kNoFn;
+		switch (fn) {
+		case kNoFn:
+			break;
+		case kSoberFn:
+			sober();
+			break;
+		}
+		_vm->_allowLoadGame = true;
+		_vm->_allowSaveGame = true;
+		return;
+	}
+
 	_mouseClicked = false;
 	_keyPressed = false;
 	Common::Event event;
@@ -1220,7 +1244,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		default:
 			_vm->renderMessage(kStringCDNotInserted);
 		}
-	} else if (verb == ACTION_OPEN && Object::combine(obj1, obj2, DISCMAN, PLAYER)) {
+	} else if (verb == ACTION_OPEN && obj1._id == PLAYER) {
 		switch (_state._admission) {
 		case 1:
 			_state._admission = 0;
@@ -1235,11 +1259,56 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		}
 	} else if (verb == ACTION_OPEN && obj1._id == DISCMAN) {
 		_vm->renderMessage(kStringWhatFor);
+	} else if (verb == ACTION_PRESS && obj1._id == DISCMAN) {
+		_vm->renderMessage(kStringMMCD);
+		playCD();
+	} else if (verb == ACTION_PRESS && obj1._id == PLAYER) {
+		switch (_state._admission) {
+		case 1:
+			_vm->renderMessage(kStringChipEmpty);
+			break;
+		case 2:
+			_vm->renderMessage(kStringListeningToCD);
+			playCD();
+			break;
+		default:
+			_vm->renderMessage(kStringNoChip);
+		}
+	} else if ((verb == ACTION_OPEN || verb == ACTION_USE) &&
+			   obj1._id == BOTTLE && (obj1._type & CARRIED)) {
+		_vm->renderMessage(kStringTipsy);
+		_state._tipsy = true;
+		_state._eventTime = g_system->getMillis() + 60000;
+		_state._eventCallback = kSoberFn;
+	} else if (verb == ACTION_LOOK && obj1._id == MUSCARD) {
+		_vm->setCurrentImage(30);
+		_vm->renderImage(0);
+		//karte_an = true
+		waitOnInput(100000);
+		//karte_an = false
+		_vm->removeMessage();
+		_vm->renderRoom(*_currentRoom);
+		drawMapExits();
+		drawInventory();
+		drawStatus();
+		drawCommandBox();
 	} else
 		return false;
 	return true;
 }
 
+void GameManager::playCD() {
+		CursorMan.showMouse(false);
+		_vm->playSound(kMusicMadMonkeys);
+		Common::KeyCode k = Common::KEYCODE_INVALID;
+		while(_vm->_sound->isPlaying())
+			if (waitOnInput(1, k))
+				break;
+		_vm->_sound->stop();
+		_vm->removeMessage();
+		CursorMan.showMouse(true);
+}
+
 void GameManager::handleInput() {
 	bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
 	if (!validCommand)
@@ -1541,5 +1610,11 @@ void GameManager::playerTakeOut() {
 	o->_section = 0;
 	takeObject(*o);
 }
+
+void GameManager::sober()
+{
+	_state._tipsy = false;
+}
+
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 3d8b650..32037fd 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -33,6 +33,8 @@ namespace Supernova2 {
 
 const int32 kMaxTimerValue = 0x7FFFFFFF;
 
+enum EventFunction { kNoFn, kSoberFn};
+
 struct GameState {
 	int16 _money;
 	bool _addressKnown;
@@ -40,6 +42,8 @@ struct GameState {
 	bool _poleMagnet;
 	char _admission;
 	bool _tipsy;
+	EventFunction _eventCallback;
+	uint32 _eventTime;
 };
 
 class Inventory {
@@ -197,6 +201,8 @@ public:
 	void taxiUnknownDestination();
 	void taxiPayment(int price, int destination);
 	void playerTakeOut();
+	void sober();
+	void playCD();
 
 private:
 	int _prevImgId;


Commit: 856b38764114403f9ecfa56c0c33c10fdca14372
    https://github.com/scummvm/scummvm/commit/856b38764114403f9ecfa56c0c33c10fdca14372
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add palace of culture

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 40ce6d7..a216bba 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -192,13 +192,13 @@ kString10Xa, kStringSlotDescription1, kStringSlotDescription2, kStringChair, kSt
 kStringScribble, kStringFace, kStringFaceDescription, kStringBooks, kStringDictionary,
 kStringPlant, kStringMask, kStringSnake, kStringCup, kStringJoystick,
 kStringToothbrushDescription, kStringMusic, kStringMusicDescription, kStringBottle, kStringBottleDescription,
-kStringBox, kStringSeller, kString332, kString333, kString334,
-kString335, kString336, kString337, kString338, kString339,
-kString340, kString341, kString342, kString343, kString344,
-kString345, kString346, kString347, kString348, kString349,
-kString350, kString351, kString352, kString353, kString354,
-kString355, kString356, kString357, kString358, kString359,
-kString360, kString361, kString362, kString363, kString364,
+kStringBox, kStringSeller, kStringWhat, kStringNotInformed, kStringHorstHummel,
+kStringNiceWeather, kStringTellTicket, kStringHereIsXa, kString500Xa, kString1000Xa,
+kString5000Xa, kString10000Xa, kStringThankYou, kStringWhatYouOffer, kStringHello2,
+kStringWhatYouWant, kStringWhoAreYou, kStringHorstHummel2, kStringNeverHeard, kStringYouDontKnow,
+kStringImOnTV, kStringIDontKnow, kStringFunny, kStringAha, kStringICan,
+kStringFromWhom, kStringCost, kStringAsYouSay, kStringGetCard, kStringOnlyParticipation,
+kStringWhatForIt, kStringMakeOffer, kStringGoodOffer, kStringGiveCard, kStringIdiot,
 kString365, kString366, kString367, kString368, kString369,
 kString370, kString371, kString372, kString373, kString374,
 kString375, kString376, kString377, kString378, kString379,
@@ -235,8 +235,8 @@ kString525, kString526, kString527, kString528, kString529,
 kString530, kString531, kString532, kString533, kString534,
 kString535, kString536, kString537, kString538, kString539,
 kString540, kString541, kString542, kString543, kString544,
-kString545, kString546, kString547, kString548, kString549,
-kString550, kString551, kString552, kString553, kString554,
+kString545, kString546, kStringFascinating, kStringTaxis, kStringTaxisDescription,
+kStringAxacussan, kStringParticipationCard, kString552, kString553, kString554,
 kString555, kString556, kString557, kString558, kString559,
 kString560, kString561, kString562, kString563, kString564,
 kString565, kString566, kString567, kString568, kString569,
@@ -249,7 +249,7 @@ kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntro
 kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
 kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
 kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14,
-kStringDialogSeparator
+kStringDialogSeparator, kStringForMusicConcert
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 329f529..6641f6a 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -763,9 +763,9 @@ void Cabin::onEntrance() {
 void Cabin::animation() {
 	if (_paid) {
 		if (isSectionVisible(1))
-			_vm->renderImage(1 + 128);
+			setSectionVisible(1, kShownFalse);
 		else
-			_vm->renderImage(1);
+			setSectionVisible(1, kShownTrue);
 	}
 	_gm->setAnimationTimer(4);
 }
@@ -995,9 +995,19 @@ CulturePalace::CulturePalace(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 20;
 	_id = CULTURE_PALACE;
 	_shown[0] = kShownTrue;
+
+	_var1 = false;
+	_var2 = false;
+	_var3 = false;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, CASHBOX, 6);
+	_objectState[1] = Object(_id, kStringCulturePalace, kStringFascinating, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringTaxis, kStringTaxisDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[3] = Object(_id, kStringAxacussan, kStringDefaultDescription, AXACUSSER, TALK, 4, 4, 0);
+	_objectState[4] = Object(_id, kStringParticipationCard, kStringDefaultDescription, CARD, TAKE, 255, 255, 0);
 }
 
 void CulturePalace::onEntrance() {
@@ -1005,9 +1015,143 @@ void CulturePalace::onEntrance() {
 }
 
 void CulturePalace::animation() {
+	static int i;
+	if (isSectionVisible(4))
+		setSectionVisible(4, kShownFalse);
+	else
+		setSectionVisible(4, kShownTrue);
+	i--;
+	if (i <= 0) {
+		if (isSectionVisible(3)) {
+			setSectionVisible(3, kShownFalse);
+			i = 4;
+		} else {
+			setSectionVisible(3, kShownTrue);
+			i = 10;
+		}
+	}
+	_gm->setAnimationTimer(2);
+}
+
+void CulturePalace::notEnoughMoney() {
+	_gm->reply(kStringWhat, 2, 1);
+	_gm->reply(kStringNotInformed, 2, 1);
+	_vm->renderImage(1 + 128);
+	setSectionVisible(2, kShownFalse);
 }
 
 bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
+	static StringId dial1[4] = {
+		kStringHorstHummel,
+		kStringNiceWeather,
+		kStringTellTicket,
+		kStringForMusicConcert
+	};
+	static byte dials1[] = {1, 1, 2};
+
+	static StringId dial2[2] = {
+		kStringHereIsXa,
+		kStringYouAreCrazy
+	};
+	static StringId dial3[4] = {
+		kString500Xa,
+		kString1000Xa,
+		kString5000Xa,
+		kString10000Xa
+	};
+
+	int e;
+	if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
+		if (_var3) {
+			_vm->renderImage(1);
+			_gm->reply(kStringThankYou, 2, 1);
+		} else if (_var2) {
+			_vm->renderImage(1);
+			_gm->reply(kStringWhatYouOffer, 2, 1);
+		} else {
+			_gm->say(kStringHello2);
+			_vm->renderImage(1);
+			_gm->reply(kStringWhatYouWant, 2, 1);
+			addSentence(1, 1);
+			switch (_gm->dialog(3, dials1, dial1, 1)) {
+			case 0:
+				_gm->reply(kStringWhoAreYou, 2, 1);
+				_gm->say(kStringHorstHummel2);
+				_gm->reply(kStringNeverHeard, 2, 1);
+				_gm->say(kStringYouDontKnow);
+				_gm->say(kStringImOnTV);
+				_gm->reply(kStringIDontKnow, 2, 1);
+				_gm->say(kStringFunny);
+				break;
+			case 1:
+				_gm->reply(kStringAha, 2, 1);
+				break;
+			case 2:
+				_gm->reply(kStringICan, 2, 1);
+				_gm->say(kStringFromWhom);
+				_gm->reply(kStringCost, 2, 1);
+				if(!_gm->_state._money)
+					addSentence(2, 1);
+				else if (_gm->dialog(2, _gm->_dials, dial2, 0)) {
+					_gm->reply(kStringAsYouSay, 2, 1);
+					addSentence(2, 1);
+				} else {
+					_gm->takeMoney(-1);
+					_gm->reply(kStringGetCard, 2, 1);
+					_gm->reply(kStringOnlyParticipation, 2, 1);
+					_gm->say(kStringWhatForIt);
+					_gm->reply(kStringMakeOffer, 2, 1);
+					_var2 = true;
+				}
+				break;
+			}
+		}
+		_vm->renderImage(1 + 128);
+		setSectionVisible(2, kShownFalse);
+		_gm->drawStatus();
+		_gm->drawInventory();
+		_gm->drawMapExits();
+		_gm->drawCommandBox();
+	}
+	else if (verb == ACTION_GIVE && obj2._id == AXACUSSER && _var2) {
+		_vm->renderImage(1);
+		if (obj1._id != MONEY)
+			notEnoughMoney();
+		else {
+			if (_gm->_state._money >= 10000) {
+				if ((e = _gm->dialog(4, _gm->_dials, dial3, 0)) >= 2) {
+					_gm->reply(kStringGoodOffer, 2, 1);
+					_vm->playSound(kAudioSuccess);
+					_gm->reply(kStringGiveCard, 2, 1);
+					if (e == 2)
+						_gm->takeMoney(-5000);
+					else
+						_gm->takeMoney(-10000);
+					_gm->takeObject(*getObject(4));
+					_vm->renderImage(1 + 128);
+					setSectionVisible(2, false);
+					_gm->reply(kStringIdiot, 0, 0);
+					_var2 = false;
+					_var3 = true;
+					_gm->_rooms[CASHBOX]->addSentence(1,1);
+					_gm->drawStatus();
+					_gm->drawInventory();
+					_gm->drawMapExits();
+					_gm->drawCommandBox();
+				} else {
+					notEnoughMoney();
+					_gm->drawStatus();
+					_gm->drawInventory();
+					_gm->drawMapExits();
+					_gm->drawCommandBox();
+				}
+			}
+			else 
+				notEnoughMoney();
+		}
+	}
+	else 
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 288023c..6045fb5 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -160,6 +160,10 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	void notEnoughMoney();
+	bool _var1;
+	bool _var2;
+	bool _var3;
 };
 
 class Cashbox : public Room {


Commit: 93561220b741a6f9a604205836a7b10e5af3abe5
    https://github.com/scummvm/scummvm/commit/93561220b741a6f9a604205836a7b10e5af3abe5
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add partialy implemented checkout room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index a216bba..c1f3aa8 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -81,7 +81,7 @@ enum Action {
 
 enum RoomId {
 	INTRO,AIRPORT,TAXISTAND,STREET,GAMES,CABIN,KIOSK,
-	CULTURE_PALACE,CASHBOX,CITY1,CITY2,ELEVATOR,APARTMENT,SHIP,
+	CULTURE_PALACE,CHECKOUT,CITY1,CITY2,ELEVATOR,APARTMENT,SHIP,
 
 	PYRAMID,PYR_ENTRANCE,UPSTAIRS1,DOWNSTAIRS1,
 	BOTTOM_RIGHT_DOOR,BOTTOM_LEFT_DOOR,UPSTAIRS2,DOWNSTAIRS2,
@@ -209,8 +209,8 @@ kString395, kString396, kString397, kString398, kString399,
 kString400, kString401, kString402, kString403, kString404,
 kString405, kString406, kString407, kString408, kString409,
 kString410, kString411, kString412, kString413, kString414,
-kString415, kString416, kString417, kString418, kString419,
-kString420, kString421, kString422, kString423, kString424,
+kString415, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon,
+kStringIWillProof, kStringIWillPerform, kString422, kString423, kString424,
 kString425, kString426, kString427, kString428, kString429,
 kString430, kString431, kString432, kString433, kString434,
 kString435, kString436, kString437, kString438, kString439,
@@ -236,7 +236,7 @@ kString530, kString531, kString532, kString533, kString534,
 kString535, kString536, kString537, kString538, kString539,
 kString540, kString541, kString542, kString543, kString544,
 kString545, kString546, kStringFascinating, kStringTaxis, kStringTaxisDescription,
-kStringAxacussan, kStringParticipationCard, kString552, kString553, kString554,
+kStringAxacussan, kStringParticipationCard, kStringAxacussian, kString553, kString554,
 kString555, kString556, kString557, kString558, kString559,
 kString560, kString561, kString562, kString563, kString564,
 kString565, kString566, kString567, kString568, kString569,
@@ -249,7 +249,7 @@ kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntro
 kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
 kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
 kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14,
-kStringDialogSeparator, kStringForMusicConcert
+kStringDialogSeparator
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 6641f6a..a769b8c 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1003,7 +1003,7 @@ CulturePalace::CulturePalace(Supernova2Engine *vm, GameManager *gm) {
 	_var2 = false;
 	_var3 = false;
 
-	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, CASHBOX, 6);
+	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, CHECKOUT, 6);
 	_objectState[1] = Object(_id, kStringCulturePalace, kStringFascinating, NULLOBJECT, NULLTYPE, 0, 0, 0);
 	_objectState[2] = Object(_id, kStringTaxis, kStringTaxisDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
 	_objectState[3] = Object(_id, kStringAxacussan, kStringDefaultDescription, AXACUSSER, TALK, 4, 4, 0);
@@ -1041,11 +1041,10 @@ void CulturePalace::notEnoughMoney() {
 }
 
 bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
-	static StringId dial1[4] = {
+	static StringId dial1[3] = {
 		kStringHorstHummel,
 		kStringNiceWeather,
 		kStringTellTicket,
-		kStringForMusicConcert
 	};
 	static byte dials1[] = {1, 1, 2};
 
@@ -1133,7 +1132,7 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 					_gm->reply(kStringIdiot, 0, 0);
 					_var2 = false;
 					_var3 = true;
-					_gm->_rooms[CASHBOX]->addSentence(1,1);
+					_gm->_rooms[CHECKOUT]->addSentence(1,1);
 					_gm->drawStatus();
 					_gm->drawInventory();
 					_gm->drawMapExits();
@@ -1155,23 +1154,45 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-Cashbox::Cashbox(Supernova2Engine *vm, GameManager *gm) {
+Checkout::Checkout(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
-	_id = CASHBOX;
+	_fileNumber = 21;
+	_id = CHECKOUT;
 	_shown[0] = kShownTrue;
+
+	_var1 = false;
+	_var2 = false;
+	_var3 = false;
+
+	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, KP_ENTRANCE, EXIT, 0, 0, 0, NULLROOM, 3);
+	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CULTURE_PALACE, 22);
+	_objectState[2] = Object(_id, kStringAxacussian, kStringDefaultDescription, AXACUSSER, TALK, 1, 1, 0);
 }
 
-void Cashbox::onEntrance() {
+void Checkout::onEntrance() {
+	if (!_var3) {
+		_var3 = true;
+		_gm->reply(kStringAtMusicContest, 1, 1 + 128);
+		_gm->say(kStringNoImitation);
+		_gm->reply(kStringGoodJoke, 1, 1 + 128);
+		_gm->say(kStringIAmHorstHummel);
+		_gm->reply(kStringCommon, 1, 1 + 128);
+		_gm->say(kStringIWillProof);
+		_gm->say(kStringIWillPerform);
+		_gm->drawStatus();
+		_gm->drawInventory();
+		_gm->drawMapExits();
+		_gm->drawCommandBox();
+	}
 	setRoomSeen(true);
 }
 
-void Cashbox::animation() {
+void Checkout::animation() {
 }
 
-bool Cashbox::interact(Action verb, Object &obj1, Object &obj2) {
+bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 6045fb5..71c8637 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -166,14 +166,17 @@ private:
 	bool _var3;
 };
 
-class Cashbox : public Room {
+class Checkout : public Room {
 public:
-	Cashbox(Supernova2Engine *vm, GameManager *gm);
+	Checkout(Supernova2Engine *vm, GameManager *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	bool _var1;
+	bool _var2;
+	bool _var3;
 };
 
 class City1 : public Room {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index db26601..4313aad 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -237,7 +237,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[CABIN];
 	delete _rooms[KIOSK];
 	delete _rooms[CULTURE_PALACE];
-	delete _rooms[CASHBOX];
+	delete _rooms[CHECKOUT];
 	delete _rooms[CITY1];
 	delete _rooms[CITY2];
 	delete _rooms[ELEVATOR];
@@ -353,7 +353,7 @@ void GameManager::initRooms() {
 	_rooms[CABIN] = new Cabin(_vm, this);
 	_rooms[KIOSK] = new Kiosk(_vm, this);
 	_rooms[CULTURE_PALACE] = new CulturePalace(_vm, this);
-	_rooms[CASHBOX] = new Cashbox(_vm, this);
+	_rooms[CHECKOUT] = new Checkout(_vm, this);
 	_rooms[CITY1] = new City1(_vm, this);
 	_rooms[CITY2] = new City2(_vm, this);
 	_rooms[ELEVATOR] = new Elevator(_vm, this);


Commit: 3a5ea64e9cb41c83dd85eec32db228ebcfd850f6
    https://github.com/scummvm/scummvm/commit/3a5ea64e9cb41c83dd85eec32db228ebcfd850f6
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Finish the Checkout, add TV appearence

The TV appearence is for now just a guess, since
right now I don't actually know how to get to it
in the original game, so I don't know how it really
looks like. Also the player cannot get to it yet,
because the room containing the music chip (which
is needed) isn't added yet.

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/resman.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index c1f3aa8..adf345c 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -199,24 +199,24 @@ kStringWhatYouWant, kStringWhoAreYou, kStringHorstHummel2, kStringNeverHeard, kS
 kStringImOnTV, kStringIDontKnow, kStringFunny, kStringAha, kStringICan,
 kStringFromWhom, kStringCost, kStringAsYouSay, kStringGetCard, kStringOnlyParticipation,
 kStringWhatForIt, kStringMakeOffer, kStringGoodOffer, kStringGiveCard, kStringIdiot,
-kString365, kString366, kString367, kString368, kString369,
-kString370, kString371, kString372, kString373, kString374,
-kString375, kString376, kString377, kString378, kString379,
-kString380, kString381, kString382, kString383, kString384,
-kString385, kString386, kString387, kString388, kString389,
-kString390, kString391, kString392, kString393, kString394,
-kString395, kString396, kString397, kString398, kString399,
-kString400, kString401, kString402, kString403, kString404,
-kString405, kString406, kString407, kString408, kString409,
-kString410, kString411, kString412, kString413, kString414,
-kString415, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon,
-kStringIWillProof, kStringIWillPerform, kString422, kString423, kString424,
-kString425, kString426, kString427, kString428, kString429,
-kString430, kString431, kString432, kString433, kString434,
-kString435, kString436, kString437, kString438, kString439,
-kString440, kString441, kString442, kString443, kString444,
-kString445, kString446, kString447, kString448, kString449,
-kString450, kString451, kString452, kString453, kString454,
+kStringCheckout1, kStringCheckout2, kStringCheckout3, kStringYes, kStringNo,
+kStringCheckout4, kStringCheckout5, kStringCheckout6, kStringCheckout7, kStringCheckout8,
+kStringCheckout9, kStringCheckout10, kStringCheckout11, kStringCheckout12, kStringCheckout13,
+kStringCheckout14, kStringCheckout15, kStringCheckout16, kStringCheckout17, kStringCheckout18,
+kStringCheckout19, kStringCheckout20, kStringCheckout21, kStringCheckout22, kStringCheckout23,
+kStringCheckout24, kStringCheckout25, kStringCheckout26, kStringCheckout27, kStringCheckout28,
+kStringCheckout29, kStringCheckout30, kStringCheckout31, kStringCheckout32, kStringCheckout33,
+kStringCheckout34, kStringCheckout35, kStringCheckout36, kStringCheckout37, kStringCheckout38,
+kStringCheckout39, kStringCheckout40, kStringCheckout41, kStringCheckout42, kStringCheckout43,
+kStringCheckout44, kStringCheckout45, kStringCheckout46, kStringCheckout47, kStringCheckout48,
+kStringCheckout49, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon,
+kStringIWillProof, kStringIWillPerform, kString422, kStringAppearance1, kStringAppearance2,
+kStringAppearance3, kStringAppearance4, kStringAppearance5, kStringAppearance6, kStringAppearance7,
+kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11, kStringAppearance12,
+kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17,
+kStringAppearance18, kStringAppearance19, kStringAppearance20, kStringAppearance21, kStringAppearance22,
+kStringAppearance23, kStringAppearance24, kStringAppearance25, kStringAppearance26, kStringAppearance27,
+kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kString454,
 kString455, kString456, kString457, kString458, kString459,
 kString460, kString461, kString462, kString463, kString464,
 kString465, kString466, kString467, kString468, kString469,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index b4becd8..29a272d 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -46,15 +46,16 @@ static Common::MemoryReadStream *convertToMod(const char *filename, int version
 
 static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{55,     18230,    -1},
-	{47,     0,    16010},
+	{47,     0,     16010},
 	{47,     16010,    -1},
-	{49,     8010,    -1},
-	{49,     0,    8010},
+	{49,     8010,     -1},
+	{49,     0,      8010},
 	{53,     30020,    -1},
-	{53,     0,    -1},
-	{54,     0,    -1},
-	{55,     0,    -1},
-	{56,     0,    -1},
+	{55,     7010,  17020},
+	{55,     0,      7010},
+	{53,     5010,  30020},
+	{55,     18230,    -1},
+	{55,     17020,    18230}
 };
 
 static const byte mouseNormal[64] = {
@@ -183,14 +184,14 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	}
 }
 
-const MS2Image *ResourceManager::getImage(int filenumber) const {
+MS2Image *ResourceManager::getImage(int filenumber) {
 	if (filenumber < 47)
 		return &_images[filenumber];
 	else
 		return nullptr;
 }
 
-const byte *ResourceManager::getImage(CursorId id) const {
+const byte *ResourceManager::getCursor(CursorId id) const {
 	switch (id) {
 	case kCursorNormal:
 		return _cursorNormal;
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
index 325cfb2..edcd294 100644
--- a/engines/supernova2/resman.h
+++ b/engines/supernova2/resman.h
@@ -51,8 +51,8 @@ public:
 
 	Audio::SeekableAudioStream *getSoundStream(AudioId index);
 	Audio::AudioStream *getSoundStream(MusicId index);
-	const MS2Image *getImage(int filenumber) const;
-	const byte *getImage(CursorId id) const;
+	MS2Image *getImage(int filenumber);
+	const byte *getCursor(CursorId id) const;
 
 private:
 	void initSoundFiles();
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a769b8c..6d22da7 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -28,6 +28,7 @@
 #include "supernova2/supernova2.h"
 #include "supernova2/state.h"
 #include "supernova2/rooms.h"
+#include "supernova2/graphics.h"
 
 namespace Supernova2 {
 
@@ -192,7 +193,6 @@ bool Room::interact(Action verb, Object &obj1, Object &obj2) {
 Intro::Intro(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
-	_restTime = 0;
 
 	_fileNumber = -1;
 	_id = INTRO;
@@ -273,55 +273,6 @@ void Intro::titleScreen() {
 	CursorMan.showMouse(true);
 }
 
-bool Intro::tvSay(int mod1, int mod2, int rest, MessagePosition pos, StringId id) {
-	Common::KeyCode key = Common::KEYCODE_INVALID;
-	const Common::String& text = _vm->getGameString(id);
-
-	_vm->renderMessage(text, pos);
-	int animation_count = (text.size() + 20) * (10 - rest) * _vm->_textSpeed / 400;
-	_restTime =  (text.size() + 20) * rest * _vm->_textSpeed / 400;
-
-	while (animation_count) {
-		if (mod1)
-			_vm->renderImage(mod1);
-
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
-		}
-		if (mod2)
-			_vm->renderImage(mod2);
-
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
-		}
-		animation_count--;
-	}
-	if (_restTime == 0)
-		_vm->removeMessage();
-
-	return true;
-}
-
-bool Intro::tvRest(int mod1, int mod2, int rest) {
-	Common::KeyCode key = Common::KEYCODE_INVALID;
-	while (rest) {
-		_vm->renderImage(mod1);
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
-		}
-		_vm->renderImage(mod2);
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
-		}
-		rest--;
-	}
-	return true;
-}
-
 bool Intro::displayThoughtMessage(StringId id) {
 	Common::KeyCode key = Common::KEYCODE_INVALID;
 	const Common::String& text = _vm->getGameString(id);
@@ -429,28 +380,28 @@ bool Intro::tvDialogue() {
 	_vm->setCurrentImage(42);
 	_vm->renderImage(0);
 
-	if(!tvSay(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
+	if(!_gm->talk(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
 		return false;
 
 	_vm->renderImage(4);
 	_gm->wait(3);
 	_vm->renderImage(6);
 
-	if(!tvSay(8, 6, 7, kMessageLeft, kStringIntroTV2))
+	if(!_gm->talk(8, 6, 7, kMessageLeft, kStringIntroTV2))
 		return false;
 	debug("%d", _vm->shouldQuit());
 
 	_vm->renderImage(10);
 
-	if(!tvRest(8, 6, _restTime))
+	if(!_gm->talkRest(8, 6, _gm->_restTime))
 		return false;
 
 	_vm->removeMessage();
 
-	if(!tvSay(8, 6, 0, kMessageLeft, kStringIntroTV3))
+	if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV3))
 		return false;
 
-	if(!tvSay(8, 6, 0, kMessageLeft, kStringIntroTV4))
+	if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV4))
 		return false;
 
 	_vm->renderImage(10 + 128);
@@ -459,62 +410,62 @@ bool Intro::tvDialogue() {
 	_gm->wait(3);
 	_vm->renderImage(7);
 
-	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV5))
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV5))
 		return false;
 
-	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV6))
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV6))
 		return false;
 
-	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV7))
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV7))
 		return false;
 
-	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
 		return false;
 
-	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
 		return false;
 
-	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV10))
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV10))
 		return false;
 
-	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
 		return false;
 
-	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
 		return false;
 
-	if(!tvSay(9, 7, 8, kMessageCenter, kStringIntroTV13))
+	if(!_gm->talk(9, 7, 8, kMessageCenter, kStringIntroTV13))
 		return false;
 
 	_vm->renderImage(4);
 
-	if(!tvRest(9, 7, 1))
+	if(!_gm->talkRest(9, 7, 1))
 		return false;
 
 	_vm->renderImage(4 + 128);
 
-	if(!tvRest(9, 7, 3))
+	if(!_gm->talkRest(9, 7, 3))
 		return false;
 
 	_vm->renderImage(4);
 
-	if(!tvRest(9, 7, 1))
+	if(!_gm->talkRest(9, 7, 1))
 		return false;
 
 	_vm->renderImage(6);
 
-	if(!tvRest(9, 7, _restTime - 5))
+	if(!_gm->talkRest(9, 7, _gm->_restTime - 5))
 		return false;
 
 	_vm->removeMessage();
 
-	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
 		return false;
 
-	if(!tvSay(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
 		return false;
 
-	if(!tvSay(9, 7, 0, kMessageCenter, kStringIntroTV16))
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV16))
 		return false;
 
 	return true;
@@ -810,6 +761,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 				_gm->_state._tipsy = false;
 				_vm->paletteFadeOut();
 				_vm->_system->fillScreen(kColorBlack);
+				_vm->paletteFadeIn();
 				Common::String text = _vm->getGameString(kStringWillPassOut);
 				_vm->renderMessage(text);
 				_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
@@ -1163,8 +1115,10 @@ Checkout::Checkout(Supernova2Engine *vm, GameManager *gm) {
 	_shown[0] = kShownTrue;
 
 	_var1 = false;
-	_var2 = false;
+	_var2 = 0;
 	_var3 = false;
+	_var4 = false;
+	_var5 = false;
 
 	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, KP_ENTRANCE, EXIT, 0, 0, 0, NULLROOM, 3);
 	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CULTURE_PALACE, 22);
@@ -1193,9 +1147,381 @@ void Checkout::animation() {
 }
 
 bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
+	static StringId dialCheckout1[3] = {
+		kStringCheckout1,
+		kStringCheckout2,
+		kStringCheckout3
+	};
+	static StringId dialCheckout2[2] = {
+		kStringYes,
+		kStringNo
+	};
+	static StringId dialStage1[3] = {
+		kStringCheckout4,
+		kStringCheckout5,
+		kStringCheckout6
+	};
+	static StringId dialStage2[2] = {
+		kStringCheckout7,
+		kStringCheckout8
+	};
+	static StringId dialStage3[3] = {
+		kStringCheckout9,
+		kStringCheckout10,
+		kStringCheckout11
+	};
+	static StringId dialStage4[3] = {
+		kStringCheckout12,
+		kStringCheckout13
+	};
+	if (verb == ACTION_WALK && obj1._id == KP_ENTRANCE) {
+		if (_var4) {
+			_vm->renderImage(2);
+			_gm->reply(kStringCheckout14, 0, 0);
+			_vm->renderImage(2 + 128);
+		} else if (_var2 == 0) {
+			_vm->renderImage(2);
+			//_gm->reply("atnuhh", 0, 0);
+			_gm->reply(kStringCheckout15, 0, 0);
+			_vm->renderImage(2 + 128);
+			if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
+				_gm->say(kStringCheckout16);
+				_gm->reply(kStringCheckout17, 0, 0);
+			} else
+				_gm->say(kStringCheckout18);
+			_gm->drawGUI();
+		} else if (_var2 == 1) {
+			_gm->reply(kStringCheckout19, 1, 1 + 128);
+		} else {
+			if (_gm->_state._tipsy) {
+				_vm->setCurrentImage(22);
+				_vm->renderImage(0);
+				if (_var5 && _gm->_state._admission >= 2)
+					appearance();
+				else {
+					_gm->dialog(3, _gm->_dials, dialStage1, 0);
+					_gm->dialog(2, _gm->_dials, dialStage2, 0);
+					_vm->renderMessage(kStringCheckout20, 100, 70);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_vm->renderMessage(kStringCheckout21, 200, 40);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->say(kStringCheckout22);
+					_gm->dialog(3, _gm->_dials, dialStage3, 0);
+					_vm->renderMessage(kStringCheckout23, 120, 70);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->say(kStringCheckout24);
+					_vm->renderMessage(kStringCheckout25, 40, 100);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->dialog(2, _gm->_dials, dialStage4, 0);
+					_vm->playSound(kAudioStage1);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage1);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage2);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage2);
+					_vm->renderMessage(kStringCheckout26, 250, 80);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage1);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->removeMessage();
+					_vm->playSound(kAudioStage2);
+					_vm->renderMessage(kStringCheckout27, 140, 60);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage2);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_gm->wait(2);
+					_vm->removeMessage();
+					_vm->playSound(kAudioStage2);
+					_vm->renderMessage(kStringCheckout26, 180, 50);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_vm->renderMessage(kStringCheckout28, 50, 110);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->say(kStringCheckout29);
+					_vm->renderRoom(*this);
+					if (_var5)
+						_vm->renderMessage(kStringCheckout30);
+					else
+						_vm->renderMessage(kStringCheckout31);
+					_var4 = true;
+					_gm->drawGUI();
+				}
+			} else {
+				_vm->renderMessage(kStringCheckout32);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->renderMessage(kStringCheckout33);
+			}
+		}
+	} else if (verb == ACTION_GIVE && obj1._id == CHIP && obj2._id == AXACUSSER &&
+			_var2 == 1) {
+		_gm->_inventory.remove(obj1);
+		_var5 = true;
+		_gm->reply(kStringCheckout37, 1, 1 + 128);
+		_var2 = 2;
+		_gm->drawGUI();
+	} else if (verb == ACTION_GIVE && obj1._id == CARD && obj2._id == AXACUSSER) {
+		_gm->_inventory.remove(*_gm->_rooms[CULTURE_PALACE]->getObject(4));
+		_gm->reply(kStringCheckout34, 1, 1 + 128);
+		_gm->reply(kStringCheckout35, 1, 1 + 128);
+		if (_gm->dialog(2, _gm->_dials, dialCheckout2, 0) == 1) {
+			_gm->reply(kStringCheckout36, 1, 1 + 128);
+			_var2 = 1;
+		} else {
+			_gm->reply(kStringCheckout37, 1, 1 + 128);
+			_var2 = 2;
+		}
+		_gm->drawGUI();
+	} else if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
+		if (_var4) {
+			_gm->say(kStringCheckout38);
+			_gm->reply(kStringCheckout39, 1, 1 + 128);
+			_gm->drawGUI();
+		} else {
+			switch (_var2) {
+			case 0:
+				addSentence(2, 1);
+				switch (_gm->dialog(3, _gm->_dials, dialCheckout1, 1)) {
+				case 0:
+					_gm->reply(kStringCheckout40, 1, 1 + 128);
+					_gm->say(kStringNo);
+					_gm->reply(kStringCheckout41, 1, 1 + 128);
+					_gm->say(kStringCheckout42);
+					break;
+				case 1:
+					_gm->reply(kStringCheckout43, 1, 1 + 128);
+					if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
+						_gm->say(kStringCheckout44);
+						return interact(ACTION_GIVE,
+								*_gm->_rooms[CULTURE_PALACE]->getObject(4),
+								*_gm->_rooms[CHECKOUT]->getObject(2));
+					} else {
+						_gm->say(kStringNo);
+						_gm->reply(kStringCheckout45, 1, 1 + 128);
+						_gm->say(kStringCheckout46);
+					}
+					break;
+				case 2:
+					_gm->reply(kStringCheckout47, 1, 1 + 128);
+					break;
+				}
+				_gm->drawGUI();
+				break;
+			case 1:
+				_gm->reply(kStringCheckout48, 1, 1 + 128);
+				break;
+			case 2:
+				_gm->reply(kStringCheckout49, 1, 1 + 128);
+				break;
+			}
+		}
+	} else 
+		return false;
 	return true;
 }
 
+void Checkout::appearance() {
+	int xp = 0;
+	_gm->playCD();
+	_vm->removeMessage();
+	_vm->playSound(kAudioAppearance1);
+	while (_vm->_sound->isPlaying())
+		_gm->wait(1);
+	_vm->paletteFadeOut();
+
+	_vm->setCurrentImage(39);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->wait(50);
+	_vm->setCurrentImage(40);
+	_vm->renderImage(0);
+	for (int i = 1; i < 11; i++) {
+		_gm->wait(3);
+		_vm->renderImage(i);
+	}
+	_vm->playSound(kAudioAppearance2);
+	_gm->wait(30);
+	_vm->renderImage(11);
+	_vm->playSound(kAudioAppearance2);
+	_gm->wait(60);
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->setCurrentImage(42);
+	_vm->renderImage(0);
+	_vm->renderImage(11);
+	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance1);
+	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance2);
+	_vm->renderImage(4);
+	_gm->wait(3);
+	_vm->renderImage(6);
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance3);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance4);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance5);
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance6);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance7);
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance8);
+	_gm->talk(12, 13, 4, kMessageCenter, kStringAppearance9);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(4 + 128);
+	_gm->talkRest(12, 13, 4);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(6);
+	_gm->talkRest(12, 13, _gm->_restTime + 6);
+	_vm->removeMessage();
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance10);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance11);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance12);
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance13);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance14);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance15);
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance16);
+	_gm->talk(12, 13, 2, kMessageCenter, kStringAppearance17);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(4 + 128);
+	_gm->talkRest(12, 13, 4);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(6);
+	_gm->talkRest(12, 13, _gm->_restTime + 6);
+	_vm->removeMessage();
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance18);
+	_gm->talk(12, 13, 1, kMessageCenter, kStringAppearance19);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(4 + 128);
+	_gm->talkRest(12, 13, 4);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(6);
+	_gm->talkRest(12, 13, _gm->_restTime + 6);
+	_vm->removeMessage();
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance20);
+	_gm->talk(12, 13, 1, kMessageCenter, kStringAppearance21);
+	_vm->renderImage(17);
+	_gm->wait(2);
+	_vm->renderImage(18);
+	_gm->wait(2);
+	_vm->renderImage(19);
+	_gm->wait(2);
+	_vm->renderImage(20);
+	_gm->wait(3);
+	_vm->renderImage(21);
+	_vm->renderImage(19);
+	_gm->wait(1);
+	_vm->renderImage(21+128);
+	_vm->renderImage(22);
+	_vm->renderImage(18);
+	_gm->wait(1);
+	_vm->renderImage(22+128);
+	_vm->renderImage(23);
+	_gm->wait(1);
+	_vm->renderImage(23+128);
+	_vm->renderImage(24);
+	_vm->renderImage(17);
+	_gm->wait(1);
+	_vm->renderImage(24+128);
+	_vm->renderImage(25);
+	_gm->wait(1);
+	_vm->renderImage(25+128);
+	_vm->renderImage(32);
+	_vm->renderImage(11);
+	_vm->renderImage(26);
+	_vm->playSound(kAudioAppearance3);
+	_gm->wait(2);
+	_vm->renderImage(32+128);
+	_vm->renderImage(33);
+	_vm->renderImage(27);
+	_gm->wait(2);
+	_vm->renderImage(33+128);
+	_vm->renderImage(34);
+	_vm->renderImage(28);
+	_gm->wait(2);
+	_vm->renderImage(29);
+	_gm->wait(2);
+	_vm->renderImage(30);
+	_gm->wait(2);
+	_vm->renderImage(31);
+	_gm->wait(2);
+	_gm->wait(50);
+	_vm->paletteFadeOut();
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->paletteFadeIn();
+	_vm->renderMessage(kStringAppearance22);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance23);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance24);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance25);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance26);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance27);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->setCurrentImage(44);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+
+	MS2Image *image = _vm->_screen->getCurrentImage();
+
+	int i = 0;
+	do {
+		_vm->renderImage(1);
+		_gm->wait(1);
+		_vm->renderImage(1 + 128);
+		image->_section[1].x1 += xp;
+		image->_section[1].x2 += xp;
+		image->_section[1].y1 -= 2;
+		image->_section[1].y2 -= 2;
+		i++;
+		if (i == 6) {
+			i = 0;
+			xp++;
+		}
+	} while (image->_section[1].y1 < 200);
+	_vm->paletteFadeOut();
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->paletteFadeIn();
+	_vm->renderMessage(kStringAppearance28);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance29);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance30);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance31);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_gm->changeRoom(SHIP);
+	_gm->_state._dark = true;
+	_gm->drawGUI();
+}
+
 City1::City1(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 71c8637..16865a0 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -89,7 +89,6 @@ private:
 	bool tvDialogue();
 	bool thoughts2();
 
-	int _restTime;
 	Common::String _introText;
 };
 
@@ -174,9 +173,12 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	void appearance();
 	bool _var1;
-	bool _var2;
+	int _var2;
 	bool _var3;
+	bool _var4;
+	bool _var5;
 };
 
 class City1 : public Room {
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 9f04def..29aa52e 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -181,7 +181,7 @@ Screen::Screen(Supernova2Engine *vm, ResourceManager *resMan)
 	, _textCursorY(0)
 	, _messageShown(false) {
 
-	CursorMan.replaceCursor(_resMan->getImage(ResourceManager::kCursorNormal),
+	CursorMan.replaceCursor(_resMan->getCursor(ResourceManager::kCursorNormal),
 							16, 16, 0, 0, kColorCursorTransparent);
 	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
 	CursorMan.showMouse(true);
@@ -203,7 +203,7 @@ void Screen::setGuiBrightness(int brightness) {
 	_guiBrightness = brightness;
 }
 
-const MS2Image *Screen::getCurrentImage() const {
+MS2Image *Screen::getCurrentImage() {
 	return _currentImage;
 }
 
@@ -460,7 +460,7 @@ int Screen::textWidth(const Common::String &text) {
 	return Screen::textWidth(text.c_str());
 }
 
-void Screen::renderMessage(const char *text, MessagePosition position) {
+void Screen::renderMessage(const char *text, MessagePosition position, int positionX, int positionY) {
 	Common::String t(text);
 	char *row[20];
 	Common::String::iterator p = t.begin();
@@ -518,6 +518,11 @@ void Screen::renderMessage(const char *text, MessagePosition position) {
 		y = 142;
 	}
 
+	if (positionX != -1 && positionY != -1) {
+		x = positionX;
+		y = positionY;
+	}
+
 	int message_columns = x - 3;
 	int message_rows = y - 3;
 	int message_width = rowWidthMax + 6;
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index e952006..7b9c964 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -139,7 +139,7 @@ public:
 	void setViewportBrightness(int brightness);
 	int getGuiBrightness() const;
 	void setGuiBrightness(int brightness);
-	const MS2Image *getCurrentImage() const;
+	MS2Image *getCurrentImage();
 	const ImageInfo *getImageInfo(ImageId id) const;
 	bool isMessageShown() const;
 	void paletteFadeIn(int maxViewportBrightness);
@@ -152,7 +152,7 @@ public:
 	void saveScreen(const GuiElement &guiElement);
 	void restoreScreen();
 	void renderRoom(Room &room);
-	void renderMessage(const char *text, MessagePosition position = kMessageNormal);
+	void renderMessage(const char *text, MessagePosition position = kMessageNormal, int positionX = -1, int positionY = -1);
 	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
 	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
 					   Common::String var1 = "", Common::String var2 = "");
@@ -181,7 +181,7 @@ private:
 private:
 	Supernova2Engine *_vm;
 	ResourceManager *_resMan;
-	const MS2Image *_currentImage;
+	MS2Image *_currentImage;
 	ScreenBufferStack _screenBuffer;
 	int _screenWidth;
 	int _screenHeight;
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 2bbc982..7798c7a 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -37,7 +37,12 @@ enum AudioId {
 	kAudioTaxiLeaving,
 	kAudioTaxiArriving,
 	kAudioKiosk,
-	kAudioNumSamples = 10 //TODO find out how many samples there are
+	kAudioStage1,
+	kAudioStage2,
+	kAudioAppearance1,
+	kAudioAppearance2,
+	kAudioAppearance3,
+	kAudioNumSamples
 };
 
 enum MusicId {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 4313aad..25d3acc 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -41,6 +41,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._poleMagnet);
 	out->writeByte(_state._admission);
 	out->writeByte(_state._tipsy);
+	out->writeByte(_state._dark);
 	out->writeUint32LE(_state._eventTime);
 	out->writeSint32LE(_state._eventCallback);
 
@@ -74,6 +75,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._poleMagnet = in->readByte();
 	_state._admission = in->readByte();
 	_state._tipsy = in->readByte();
+	_state._dark = in->readByte();
 	_state._eventTime = in->readUint32LE();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -316,6 +318,7 @@ void GameManager::initState() {
 	_mouseY = -1;
 	_mouseField = -1;
 	_inventoryScroll = 0;
+	_restTime = 0;
 	_oldTime = g_system->getMillis();
 	_timerPaused = 0;
 	_timePaused = false;
@@ -340,6 +343,7 @@ void GameManager::initState() {
 	_state._poleMagnet = false;
 	_state._admission = 0;
 	_state._tipsy = false;
+	_state._dark = false;
 	_state._eventTime = kMaxTimerValue;
 	_state._eventCallback = kNoFn;
 }
@@ -925,11 +929,13 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
 		_vm->renderMessage(text, kMessageTop);
 
 	for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
-		_vm->renderImage(aus1);
+		if (aus1)
+			_vm->renderImage(aus1);
 		waitOnInput(2);
 		if (_keyPressed || _mouseClicked)
 			z = 1;
-		_vm->renderImage(aus2);
+		if (aus2)
+			_vm->renderImage(aus2);
 		waitOnInput(2);
 		if (_keyPressed || _mouseClicked)
 			z = 1;
@@ -1297,6 +1303,13 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
+void GameManager::drawGUI() {
+		drawMapExits();
+		drawInventory();
+		drawStatus();
+		drawCommandBox();
+}
+
 void GameManager::playCD() {
 		CursorMan.showMouse(false);
 		_vm->playSound(kMusicMadMonkeys);
@@ -1611,10 +1624,58 @@ void GameManager::playerTakeOut() {
 	takeObject(*o);
 }
 
-void GameManager::sober()
-{
+void GameManager::sober() {
 	_state._tipsy = false;
 }
 
+bool GameManager::talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	const Common::String& text = _vm->getGameString(id);
+
+	_vm->renderMessage(text, pos);
+	int animation_count = (text.size() + 20) * (10 - rest) * _vm->_textSpeed / 400;
+	_restTime =  (text.size() + 20) * rest * _vm->_textSpeed / 400;
+
+	while (animation_count) {
+		if (mod1)
+			_vm->renderImage(mod1);
+
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		if (mod2)
+			_vm->renderImage(mod2);
+
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		animation_count--;
+	}
+	if (_restTime == 0)
+		_vm->removeMessage();
+
+	return true;
+}
+
+bool GameManager::talkRest(int mod1, int mod2, int rest) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	while (rest) {
+		_vm->renderImage(mod1);
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		_vm->renderImage(mod2);
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		rest--;
+	}
+	return true;
+}
+
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 32037fd..2382cd0 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -42,6 +42,7 @@ struct GameState {
 	bool _poleMagnet;
 	char _admission;
 	bool _tipsy;
+	bool _dark;
 	EventFunction _eventCallback;
 	uint32 _eventTime;
 };
@@ -145,6 +146,7 @@ public:
 	int32 _oldTime;
 	uint _timePaused;
 	bool _timerPaused;
+	int _restTime;
 	int32 _messageDuration;
 	int32 _animationTimer;
 	int _inventoryScroll;
@@ -203,6 +205,9 @@ public:
 	void playerTakeOut();
 	void sober();
 	void playCD();
+	void drawGUI();
+	bool talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id);
+	bool talkRest(int mod1, int mod2, int rest);
 
 private:
 	int _prevImgId;
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 683d711..0427172 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -291,6 +291,10 @@ void Supernova2Engine::renderMessage(StringId stringId, MessagePosition position
 	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
 	_screen->renderMessage(stringId, position, var1, var2);
 }
+void Supernova2Engine::renderMessage(StringId stringId, int x, int y) {
+	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
+	_screen->renderMessage(getGameString(stringId).c_str(), kMessageNormal, x, y);
+}
 
 void Supernova2Engine::removeMessage() {
 	_screen->removeMessage();
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index 0e1b0c0..748eef3 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -113,6 +113,7 @@ public:
 	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
 	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
 					   Common::String var1 = "", Common::String var2 = "");
+	void renderMessage(StringId stringId, int x, int y);
 	void removeMessage();
 	void renderText(const uint16 character);
 	void renderText(const char *text);


Commit: be450f096794093ee6c7fa9d97cbd43038e35242
    https://github.com/scummvm/scummvm/commit/be450f096794093ee6c7fa9d97cbd43038e35242
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Change saving of room variables

Change the way room variables are saved, so it is
more like the original code and also thanks to this
they get saved and loaded when the game is saved/loaded

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 6d22da7..ceaccba 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -737,7 +737,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 	}
 	else if (verb == ACTION_USE && obj1._id == CHAIR) {
 		if (_paid) {
-			if (_var2) {
+			if (_shown[kMaxSection - 2]) {
 				_vm->paletteFadeOut();
 				_vm->setCurrentImage(31);
 				_vm->renderImage(0);
@@ -951,10 +951,6 @@ CulturePalace::CulturePalace(Supernova2Engine *vm, GameManager *gm) {
 	_id = CULTURE_PALACE;
 	_shown[0] = kShownTrue;
 
-	_var1 = false;
-	_var2 = false;
-	_var3 = false;
-
 	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, CHECKOUT, 6);
 	_objectState[1] = Object(_id, kStringCulturePalace, kStringFascinating, NULLOBJECT, NULLTYPE, 0, 0, 0);
 	_objectState[2] = Object(_id, kStringTaxis, kStringTaxisDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
@@ -1013,10 +1009,10 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 
 	int e;
 	if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
-		if (_var3) {
+		if (_shown[kMaxSection - 3]) {
 			_vm->renderImage(1);
 			_gm->reply(kStringThankYou, 2, 1);
-		} else if (_var2) {
+		} else if (_shown[kMaxSection - 2]) {
 			_vm->renderImage(1);
 			_gm->reply(kStringWhatYouOffer, 2, 1);
 		} else {
@@ -1052,7 +1048,7 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 					_gm->reply(kStringOnlyParticipation, 2, 1);
 					_gm->say(kStringWhatForIt);
 					_gm->reply(kStringMakeOffer, 2, 1);
-					_var2 = true;
+					_shown[kMaxSection - 2] = true;
 				}
 				break;
 			}
@@ -1064,7 +1060,7 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->drawMapExits();
 		_gm->drawCommandBox();
 	}
-	else if (verb == ACTION_GIVE && obj2._id == AXACUSSER && _var2) {
+	else if (verb == ACTION_GIVE && obj2._id == AXACUSSER && _shown[kMaxSection - 2]) {
 		_vm->renderImage(1);
 		if (obj1._id != MONEY)
 			notEnoughMoney();
@@ -1082,8 +1078,8 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 					_vm->renderImage(1 + 128);
 					setSectionVisible(2, false);
 					_gm->reply(kStringIdiot, 0, 0);
-					_var2 = false;
-					_var3 = true;
+					_shown[kMaxSection - 2] = false;
+					_shown[kMaxSection - 3] = true;
 					_gm->_rooms[CHECKOUT]->addSentence(1,1);
 					_gm->drawStatus();
 					_gm->drawInventory();
@@ -1114,20 +1110,14 @@ Checkout::Checkout(Supernova2Engine *vm, GameManager *gm) {
 	_id = CHECKOUT;
 	_shown[0] = kShownTrue;
 
-	_var1 = false;
-	_var2 = 0;
-	_var3 = false;
-	_var4 = false;
-	_var5 = false;
-
 	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, KP_ENTRANCE, EXIT, 0, 0, 0, NULLROOM, 3);
 	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CULTURE_PALACE, 22);
 	_objectState[2] = Object(_id, kStringAxacussian, kStringDefaultDescription, AXACUSSER, TALK, 1, 1, 0);
 }
 
 void Checkout::onEntrance() {
-	if (!_var3) {
-		_var3 = true;
+	if (!_shown[kMaxSection - 3]) {
+		_shown[kMaxSection - 3] = true;
 		_gm->reply(kStringAtMusicContest, 1, 1 + 128);
 		_gm->say(kStringNoImitation);
 		_gm->reply(kStringGoodJoke, 1, 1 + 128);
@@ -1175,11 +1165,11 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 		kStringCheckout13
 	};
 	if (verb == ACTION_WALK && obj1._id == KP_ENTRANCE) {
-		if (_var4) {
+		if (_shown[kMaxSection - 4]) {
 			_vm->renderImage(2);
 			_gm->reply(kStringCheckout14, 0, 0);
 			_vm->renderImage(2 + 128);
-		} else if (_var2 == 0) {
+		} else if (_shown[kMaxSection - 2] == 0) {
 			_vm->renderImage(2);
 			//_gm->reply("atnuhh", 0, 0);
 			_gm->reply(kStringCheckout15, 0, 0);
@@ -1190,13 +1180,13 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 			} else
 				_gm->say(kStringCheckout18);
 			_gm->drawGUI();
-		} else if (_var2 == 1) {
+		} else if (_shown[kMaxSection - 2] == 1) {
 			_gm->reply(kStringCheckout19, 1, 1 + 128);
 		} else {
 			if (_gm->_state._tipsy) {
 				_vm->setCurrentImage(22);
 				_vm->renderImage(0);
-				if (_var5 && _gm->_state._admission >= 2)
+				if (_shown[kMaxSection - 5] && _gm->_state._admission >= 2)
 					appearance();
 				else {
 					_gm->dialog(3, _gm->_dials, dialStage1, 0);
@@ -1252,11 +1242,11 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 					_vm->removeMessage();
 					_gm->say(kStringCheckout29);
 					_vm->renderRoom(*this);
-					if (_var5)
+					if (_shown[kMaxSection - 5])
 						_vm->renderMessage(kStringCheckout30);
 					else
 						_vm->renderMessage(kStringCheckout31);
-					_var4 = true;
+					_shown[kMaxSection - 4] = true;
 					_gm->drawGUI();
 				}
 			} else {
@@ -1267,11 +1257,11 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 			}
 		}
 	} else if (verb == ACTION_GIVE && obj1._id == CHIP && obj2._id == AXACUSSER &&
-			_var2 == 1) {
+			_shown[kMaxSection - 2] == 1) {
 		_gm->_inventory.remove(obj1);
-		_var5 = true;
+		_shown[kMaxSection - 5] = true;
 		_gm->reply(kStringCheckout37, 1, 1 + 128);
-		_var2 = 2;
+		_shown[kMaxSection - 2] = 2;
 		_gm->drawGUI();
 	} else if (verb == ACTION_GIVE && obj1._id == CARD && obj2._id == AXACUSSER) {
 		_gm->_inventory.remove(*_gm->_rooms[CULTURE_PALACE]->getObject(4));
@@ -1279,19 +1269,19 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->reply(kStringCheckout35, 1, 1 + 128);
 		if (_gm->dialog(2, _gm->_dials, dialCheckout2, 0) == 1) {
 			_gm->reply(kStringCheckout36, 1, 1 + 128);
-			_var2 = 1;
+			_shown[kMaxSection - 2] = 1;
 		} else {
 			_gm->reply(kStringCheckout37, 1, 1 + 128);
-			_var2 = 2;
+			_shown[kMaxSection - 2] = 2;
 		}
 		_gm->drawGUI();
 	} else if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
-		if (_var4) {
+		if (_shown[kMaxSection - 4]) {
 			_gm->say(kStringCheckout38);
 			_gm->reply(kStringCheckout39, 1, 1 + 128);
 			_gm->drawGUI();
 		} else {
-			switch (_var2) {
+			switch (_shown[kMaxSection - 2]) {
 			case 0:
 				addSentence(2, 1);
 				switch (_gm->dialog(3, _gm->_dials, dialCheckout1, 1)) {
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 16865a0..3e0f75c 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -64,7 +64,7 @@ public:
 
 protected:
 	int _fileNumber;
-	bool _shown[kMaxSection];
+	char _shown[kMaxSection];
 	byte _sentenceRemoved[kMaxDialog];
 	Object _objectState[kMaxObject];
 	RoomId _id;
@@ -138,7 +138,6 @@ public:
 
 private:
 	bool _paid;
-	bool _var2; // Not sure what this variable means yet
 };
 
 class Kiosk : public Room {
@@ -160,9 +159,6 @@ public:
 
 private:
 	void notEnoughMoney();
-	bool _var1;
-	bool _var2;
-	bool _var3;
 };
 
 class Checkout : public Room {
@@ -174,11 +170,6 @@ public:
 
 private:
 	void appearance();
-	bool _var1;
-	int _var2;
-	bool _var3;
-	bool _var4;
-	bool _var5;
 };
 
 class City1 : public Room {


Commit: d2e67fca8fb61848af51e06fdbf4013b50f2df05
    https://github.com/scummvm/scummvm/commit/d2e67fca8fb61848af51e06fdbf4013b50f2df05
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add City1 and City2 rooms

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index adf345c..f99c008 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -145,7 +145,7 @@ kString75, kString76, kString77, kString78, kString79,
 kString80, kString81, kString82, kString83, kString84,
 kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kString93, kString94,
-kStringEntrance, kString96, kString97, kString98, kString99,
+kStringEntrance, kStringDoor, kString97, kString98, kString99,
 kString100, kString101, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kString108, kString109,
 kString110, kString111, kString112, kString113, kString114,
@@ -236,8 +236,8 @@ kString530, kString531, kString532, kString533, kString534,
 kString535, kString536, kString537, kString538, kString539,
 kString540, kString541, kString542, kString543, kString544,
 kString545, kString546, kStringFascinating, kStringTaxis, kStringTaxisDescription,
-kStringAxacussan, kStringParticipationCard, kStringAxacussian, kString553, kString554,
-kString555, kString556, kString557, kString558, kString559,
+kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
+kStringSign3Description, kStringSign4Description, kString557, kString558, kString559,
 kString560, kString561, kString562, kString563, kString564,
 kString565, kString566, kString567, kString568, kString569,
 kString570, kString571, kString572, kString573, kString574,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index ceaccba..9ce7a54 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1516,9 +1516,14 @@ City1::City1(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 23;
 	_id = CITY1;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSign, kStringSign1Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[1] = Object(_id, kStringSign, kStringSign2Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR, 10);
+	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR, 14);
 }
 
 void City1::onEntrance() {
@@ -1529,16 +1534,36 @@ void City1::animation() {
 }
 
 bool City1::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
+		_objectState[0]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
+		_objectState[0]._click = 2;
+	} else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
+		_objectState[1]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
+		_objectState[1]._click = 3;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
+		_gm->_state._elevatorNumber = 1;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
+		_gm->_state._elevatorNumber = 2;
+	}
+	_gm->_rooms[ELEVATOR]->getObject(5)->_exitRoom = CITY1;
+	_gm->_state._elevatorE = 0;
+	return false;
 }
 
 City2::City2(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 23;
 	_id = CITY2;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSign, kStringSign3Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[1] = Object(_id, kStringSign, kStringSign4Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR, 10);
+	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR, 14);
 }
 
 void City2::onEntrance() {
@@ -1549,7 +1574,22 @@ void City2::animation() {
 }
 
 bool City2::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
+		_objectState[0]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
+		_objectState[0]._click = 2;
+	} else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
+		_objectState[1]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
+		_objectState[1]._click = 3;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
+		_gm->_state._elevatorNumber = 3;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
+		_gm->_state._elevatorNumber = 4;
+	}
+	_gm->_rooms[ELEVATOR]->getObject(5)->_exitRoom = CITY2;
+	_gm->_state._elevatorE = 0;
+	return false;
 }
 
 Elevator::Elevator(Supernova2Engine *vm, GameManager *gm) {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 25d3acc..8f3a3cf 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -42,6 +42,8 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._admission);
 	out->writeByte(_state._tipsy);
 	out->writeByte(_state._dark);
+	out->writeByte(_state._elevatorE);
+	out->writeByte(_state._elevatorNumber);
 	out->writeUint32LE(_state._eventTime);
 	out->writeSint32LE(_state._eventCallback);
 
@@ -76,6 +78,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._admission = in->readByte();
 	_state._tipsy = in->readByte();
 	_state._dark = in->readByte();
+	_state._elevatorE = in->readByte();
+	_state._elevatorNumber = in->readByte();
 	_state._eventTime = in->readUint32LE();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -344,6 +348,8 @@ void GameManager::initState() {
 	_state._admission = 0;
 	_state._tipsy = false;
 	_state._dark = false;
+	_state._elevatorE = 0;
+	_state._elevatorNumber = 0;
 	_state._eventTime = kMaxTimerValue;
 	_state._eventCallback = kNoFn;
 }
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 2382cd0..927bca3 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -43,6 +43,8 @@ struct GameState {
 	char _admission;
 	bool _tipsy;
 	bool _dark;
+	char _elevatorE;
+	char _elevatorNumber;
 	EventFunction _eventCallback;
 	uint32 _eventTime;
 };


Commit: b4c59bee451f6715c368d9607786eb5ddb40b6f0
    https://github.com/scummvm/scummvm/commit/b4c59bee451f6715c368d9607786eb5ddb40b6f0
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add partialy finished Elevator room.

Changed paths:
  A engines/supernova2/-
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/- b/engines/supernova2/-
new file mode 100644
index 0000000..beda2e2
--- /dev/null
+++ b/engines/supernova2/-
@@ -0,0 +1,221 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_STATE_H
+#define SUPERNOVA2_STATE_H
+
+#include "common/events.h"
+#include "common/rect.h"
+#include "common/keyboard.h"
+#include "supernova2/rooms.h"
+#include "supernova2/sound.h"
+
+namespace Supernova2 {
+
+const int32 kMaxTimerValue = 0x7FFFFFFF;
+
+enum EventFunction { kNoFn, kSoberFn};
+
+struct GameState {
+	int16 _money;
+	bool _addressKnown;
+	Room *_previousRoom;
+	bool _poleMagnet;
+	char _admission;
+	bool _tipsy;
+	bool _dark;
+	char _elevatorE;
+	char _elevatorNumber;
+	bool _toMuseum;
+	EventFunction _eventCallback;
+	uint32 _eventTime;
+};
+
+class Inventory {
+public:
+	Inventory(Object *nullObject, int &inventoryScroll)
+		: _numObjects(0)
+		, _nullObject(nullObject)
+	    , _inventoryScroll(inventoryScroll) {
+		for (int i = 0; i < kMaxCarry; ++i)
+			_inventory[i] = nullptr;
+	}
+
+	void add(Object &obj);
+	void remove(Object &obj);
+	void clear();
+	Object *get(int index) const;
+	Object *get(ObjectId id) const;
+	int getSize() const { return _numObjects; }
+
+private:
+	Object *_inventory[kMaxCarry];
+	Object *_nullObject;
+	int &_inventoryScroll;
+	int _numObjects;
+};
+
+class GuiElement : public Common::Rect {
+public:
+	GuiElement();
+
+	void setSize(int x1, int y1, int x2, int y2);
+	void setText(const char *text);
+	void setTextPosition(int x, int y);
+	void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
+	void setHighlight(bool isHighlighted);
+
+	const char *getText() const {
+		return _text;
+	}
+	int getBackgroundColor() const {
+		return _bgColor;
+	}
+	int getTextColor() const {
+		return _textColor;
+	}
+	const Common::Point &getTextPos() const {
+		return _textPosition;
+	}
+	bool isHighlighted() const {
+		return _isHighlighted;
+	}
+
+private:
+	Common::Point _textPosition;
+	char _text[128];
+	int _bgColor;
+	int _textColor;
+	int _bgColorNormal;
+	int _bgColorHighlighted;
+	int _textColorNormal;
+	int _textColorHighlighted;
+	bool _isHighlighted;
+};
+
+class GameManager {
+public:
+	GameManager(Supernova2Engine *vm);
+	~GameManager();
+
+	void updateEvents();
+	void processInput(Common::KeyState &state);
+	void processInput();
+	void executeRoom();
+	bool serialize(Common::WriteStream *out);
+	bool deserialize(Common::ReadStream *in, int version);
+
+	static StringId guiCommands[];
+	static StringId guiStatusCommands[];
+	Supernova2Engine *_vm;
+	Common::KeyState _key;
+	Common::EventType _mouseClickType;
+	bool _mouseClicked;
+	bool _keyPressed;
+	int _mouseX;
+	int _mouseY;
+	int _mouseField;
+	Room *_currentRoom;
+	bool _newRoom;
+	Room *_rooms[NUMROOMS];
+	Inventory _inventory;
+	GameState _state;
+	bool _processInput;
+	bool _guiEnabled;
+	bool _animationEnabled;
+	Action _inputVerb;
+	Object _nullObject;
+	Object *_currentInputObject;
+	Object *_inputObject[2];
+	int32 _oldTime;
+	uint _timePaused;
+	bool _timerPaused;
+	int _restTime;
+	int32 _messageDuration;
+	int32 _animationTimer;
+	int _inventoryScroll;
+	int _exitList[25];
+	GuiElement _guiCommandButton[10];
+	GuiElement _guiInventory[8];
+	GuiElement _guiInventoryArrow[2];
+	// Dialog
+	int _currentSentence;
+	int _sentenceNumber[6];
+	StringId _texts[6];
+	byte _rows[6];
+	byte _rowsStart[6];
+	byte _dials[6];
+	int _taxi_possibility;
+
+	void takeObject(Object &obj);
+	void setObjectNull(Object *&obj);
+	bool isNullObject(Object *obj);
+
+	void initState();
+	void initRooms();
+	void destroyRooms();
+	void initGui();
+	bool genericInteract(Action verb, Object &obj1, Object &obj2);
+	uint16 getKeyInput(bool blockForPrintChar = false);
+	void getInput();
+	void wait(int ticks);
+	void waitOnInput(int ticks);
+	bool waitOnInput(int ticks, Common::KeyCode &keycode);
+	void showMenu();
+	void edit(Common::String &input, int x, int y, uint length);
+	int invertSection(int section);
+	void drawMapExits();
+	void drawStatus();
+	void drawCommandBox();
+	void drawInventory();
+	void changeRoom(RoomId id);
+	void resetInputState();
+	void handleInput();
+	void handleTime();
+	void pauseTimer(bool pause);
+	void setAnimationTimer(int ticks);
+	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
+	void sentence(int number, bool brightness);
+	void say(StringId textId);
+	void say(const char *text);
+	void reply(StringId textId, int aus1, int aus2);
+	void reply(const char *text, int aus1, int aus2);
+	void mousePosDialog(int x, int y);
+	void takeMoney(int amount);
+	void taxi();
+	void leaveTaxi();
+	void taxiUnknownDestination();
+	void taxiPayment(int price, int destination);
+	void playerTakeOut();
+	void sober();
+	void playCD();
+	void drawGUI();
+	bool talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id);
+	bool talkRest(int mod1, int mod2, int rest);
+
+private:
+	int _prevImgId;
+};
+
+}
+
+#endif // SUPERNOVA2_STATE_H
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index f99c008..f3cc21f 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -116,12 +116,12 @@ enum ObjectId {
 	BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXICON,PLANT,SNAKE,
 	CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
 	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
-	SCRIBBLE1,SCRIBBLE2,BELL,GROPE,DOOR_L,DOOR_R,ID_CARD,
+	SCRIBBLE1,SCRIBBLE2,BELL,KEYPAD,DOOR_L,DOOR_R,ID_CARD,
 	MAGNET,UNDER_BED,KEY,VALVE,WARDROBE,DISCMAN,
 	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
 	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,INVESTMENT,
 	HANDLE,COUNTER,DOOR_SWITCH,SUIT,MANAGEMENT,RMANAGEMENT,
-	MUSCARD,SKOPF
+	MUSCARD,SKOPF, DISPLAY
 };
 
 enum StringId {
@@ -216,19 +216,19 @@ kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11
 kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17,
 kStringAppearance18, kStringAppearance19, kStringAppearance20, kStringAppearance21, kStringAppearance22,
 kStringAppearance23, kStringAppearance24, kStringAppearance25, kStringAppearance26, kStringAppearance27,
-kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kString454,
-kString455, kString456, kString457, kString458, kString459,
-kString460, kString461, kString462, kString463, kString464,
-kString465, kString466, kString467, kString468, kString469,
-kString470, kString471, kString472, kString473, kString474,
-kString475, kString476, kString477, kString478, kString479,
-kString480, kString481, kString482, kString483, kString484,
-kString485, kString486, kString487, kString488, kString489,
-kString490, kString491, kString492, kString493, kString494,
-kString495, kString496, kString497, kString498, kString499,
-kString500, kString501, kString502, kString503, kString504,
-kString505, kString506, kString507, kString508, kString509,
-kString510, kString511, kString512, kString513, kString514,
+kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kStringElevator1,
+kStringElevator2, kStringElevator3, kStringElevator4, kStringElevator5, kStringElevator6,
+kStringElevator7, kStringElevator8, kStringElevator9, kStringElevator10, kStringElevator11,
+kStringElevator12, kStringElevator13, kStringElevator14, kStringElevator15, kStringElevator16,
+kStringElevator17, kStringElevator18, kStringElevator19, kStringElevator20, kStringElevator21,
+kStringElevator22, kStringElevator23, kStringElevator24, kStringElevator25, kStringElevator26,
+kStringElevator27, kStringElevator28, kStringElevator29, kStringElevator30, kStringElevator31,
+kStringElevator32, kStringElevator33, kStringElevator34, kStringElevator35, kStringElevator36,
+kStringElevator37, kStringElevator38, kStringElevator39, kStringElevator40, kStringElevator41,
+kStringElevator42, kStringElevator43, kStringElevator44, kStringElevator45, kStringElevator46,
+kStringElevator47, kStringElevator48, kStringElevator49, kStringElevator50, kStringElevator51,
+kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStringElevator56,
+kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
 kString515, kString516, kString517, kString518, kString519,
 kString520, kString521, kString522, kString523, kString524,
 kString525, kString526, kString527, kString528, kString529,
@@ -237,8 +237,8 @@ kString535, kString536, kString537, kString538, kString539,
 kString540, kString541, kString542, kString543, kString544,
 kString545, kString546, kStringFascinating, kStringTaxis, kStringTaxisDescription,
 kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
-kStringSign3Description, kStringSign4Description, kString557, kString558, kString559,
-kString560, kString561, kString562, kString563, kString564,
+kStringSign3Description, kStringSign4Description, kStringBell, kStringDisplay, kStringKeypad,
+kStringKeypadDescription, kString561, kString562, kString563, kString564,
 kString565, kString566, kString567, kString568, kString569,
 kString570, kString571, kString572, kString573, kString574,
 kString575, kString576, kString577, kString578, kString579,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 29a272d..7ab833f 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -55,7 +55,8 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{55,     0,      7010},
 	{53,     5010,  30020},
 	{55,     18230,    -1},
-	{55,     17020,    18230}
+	{55,     17020, 18230},
+	{53,     0,     30020}
 };
 
 static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9ce7a54..f9b8056 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1596,12 +1596,23 @@ Elevator::Elevator(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 24;
 	_id = ELEVATOR;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSlot, kStringDefaultDescription, SLOT, COMBINABLE, 0, 0, 0);
+	_objectState[1] = Object(_id, kStringBell, kStringDefaultDescription, BELL, PRESS, 1, 1, 0);
+	_objectState[2] = Object(_id, kStringDisplay, kStringDefaultDescription, DISPLAY, NULLTYPE, 2, 2, 0);
+	_objectState[3] = Object(_id, kStringKeypad, kStringKeypadDescription, KEYPAD, PRESS, 3, 3, 0);
+	_objectState[4] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | CLOSED, 4, 4, 0, APARTMENT, 3);
+	_objectState[5] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED | CLOSED, 4, 4, 0, APARTMENT, 3);
 }
 
 void Elevator::onEntrance() {
+	if (_gm->_state._elevatorE)
+		_objectState[5]._type &= ~OPENED;
+	else
+		_objectState[5]._type |= OPENED;
 	setRoomSeen(true);
 }
 
@@ -1609,9 +1620,206 @@ void Elevator::animation() {
 }
 
 bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
+	static StringId dialLuke1[4] = {
+		kStringElevator2,
+		kStringElevator3,
+		kStringElevator4,
+		kStringElevator5
+	};
+	static byte dialsLuke1[3] = {2,1,1};
+	static StringId dialBoss1[2] = {
+		kStringElevator6,
+		kStringElevator7
+	};
+	char input[3];
+
+	if (verb == ACTION_LOOK && obj1._id == DISPLAY) {
+		Common::String format = _vm->getGameString(kStringElevator1);
+		Common::String display = 
+			Common::String::format(format.c_str(), _gm->_state._elevatorE);
+		_vm->renderMessage(display);
+	} else if (verb == ACTION_PRESS && obj1._id == BELL) {
+		_vm->renderImage(8);
+		_vm->playSound(kAudioElevatorBell);
+		while(_vm->_sound->isPlaying())
+			_gm->wait(1);
+		_vm->renderImage(8 + 128);
+		if (_gm->_state._elevatorNumber == 4 && _gm->_state._elevatorE == 4 && !_gm->_state._toMuseum) {
+			_gm->wait(18);
+			_vm->renderImage(1);
+			_gm->wait(3);
+			_vm->renderImage(2);
+			setSectionVisible(1, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(3);
+			setSectionVisible(2, kShownFalse);
+			_gm->reply(kStringWhatYouWant, 4, 3);
+			switch (_gm->dialog(3, dialsLuke1, dialLuke1, 1)) {
+			case 0:
+				_gm->reply(kStringElevator11, 4, 3);
+				_vm->renderImage(2);
+				setSectionVisible(3, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1);
+				setSectionVisible(2, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1 + 128);
+				_vm->renderMessage(kStringElevator12);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->renderImage(1);
+				_gm->wait(3);
+				_vm->renderImage(2);
+				setSectionVisible(1, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(3);
+				setSectionVisible(2, kShownFalse);
+				_gm->reply(kStringElevator13, 4, 3);
+				setSectionVisible(3, kShownFalse);
+				setSectionVisible(4, kShownFalse);
+				_vm->paletteFadeOut();
+				_vm->_system->fillScreen(kColorBlack);
+				_vm->paletteFadeIn();
+				_vm->renderMessage(kStringElevator14);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->paletteFadeOut();
+				_vm->paletteFadeOut();
+				_vm->setCurrentImage(26);
+				_vm->renderImage(0);
+				_vm->paletteFadeIn();
+				_gm->reply(kStringElevator15, 1, 1 + 128);
+				_gm->say(kStringYes);
+				_gm->reply(kStringElevator16, 1, 1 + 128);
+				_gm->reply(kStringElevator17, 1, 1 + 128);
+				if (_gm->dialog(2, _gm->_dials, dialBoss1, 0)) {
+					_gm->reply(kStringElevator18, 1, 1 + 128);
+					_gm->reply(kStringElevator19, 1, 1 + 128);
+					_gm->say(kStringElevator20);
+				}
+				_gm->reply(kStringElevator21, 1, 1 + 128);
+				_gm->reply(kStringElevator22, 1, 1 + 128);
+				_gm->reply(kStringElevator23, 1, 1 + 128);
+				_gm->reply(kStringElevator24, 1, 1 + 128);
+				_gm->reply(kStringElevator25, 1, 1 + 128);
+				_gm->reply(kStringElevator26, 1, 1 + 128);
+				_gm->reply(kStringElevator27, 1, 1 + 128);
+				_gm->reply(kStringElevator28, 1, 1 + 128);
+				jobDescription();
+				return true;
+			case 1:
+				_gm->reply(kStringElevator59, 4, 3);
+				_vm->renderImage(2);
+				setSectionVisible(3, kShownFalse);
+				setSectionVisible(4, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1);
+				setSectionVisible(2, kShownFalse);
+				_vm->renderImage(1 + 128);
+				break;
+			case 2:
+				_gm->reply(kStringElevator60, 4, 3);
+				_vm->renderImage(2);
+				setSectionVisible(3, kShownFalse);
+				setSectionVisible(4, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1);
+				setSectionVisible(2, kShownFalse);
+				_vm->renderImage(1 + 128);
+				break;
+			}
+			_gm->drawGUI();
+		}
+		else
+			_vm->renderMessage(kStringElevator61);
+	} else
+		return false;
 	return true;
 }
 
+void Elevator::jobDescription() {
+	static StringId dialBoss2[5] = {
+		kStringElevator8,
+		kStringElevator9,
+		kStringElevator10
+	};
+	byte dialsBoss2[4] = {1,1,2,1};
+
+	_gm->reply(kStringElevator29, 1, 1 + 128);
+	_gm->reply(kStringElevator30, 1, 1 + 128);
+	_gm->reply(kStringElevator31, 1, 1 + 128);
+	_gm->reply(kStringElevator32, 1, 1 + 128);
+	_vm->setCurrentImage(30);
+	_vm->renderImage(0);
+	_gm->waitOnInput(72);
+	_gm->reply(kStringElevator33, 0, 0);
+	_gm->reply(kStringElevator34, 0, 0);
+	_gm->reply(kStringElevator35, 0, 0);
+	_gm->reply(kStringElevator36, 0, 0);
+	_gm->reply(kStringElevator37, 0, 0);
+	_gm->reply(kStringElevator38, 0, 0);
+	_gm->reply(kStringElevator39, 0, 0);
+	_gm->reply(kStringElevator40, 0, 0);
+	_gm->reply(kStringElevator41, 0, 0);
+	_gm->reply(kStringElevator42, 0, 0);
+	_gm->reply(kStringElevator43, 0, 0);
+	_gm->reply(kStringElevator44, 0, 0);
+	_gm->reply(kStringElevator45, 0, 0);
+	_gm->reply(kStringElevator46, 0, 0);
+	_gm->reply(kStringElevator47, 0, 0);
+	_gm->reply(kStringElevator48, 0, 0);
+	_vm->setCurrentImage(26);
+	_vm->renderImage(0);
+	_gm->reply(kStringElevator49, 1, 1 + 128);
+	int e;
+	do {
+		addSentence(0, 2);
+		switch (e = _gm->dialog(4, dialsBoss2, dialBoss2, 2)) {
+		case 0:
+			_gm->reply(kStringElevator50, 1, 1 + 128);
+			jobDescription();
+			return;
+		case 1:
+			_gm->reply(kStringElevator51, 1, 1 + 128);
+			break;
+		case 2:
+			_gm->reply(kStringElevator52, 1, 1 + 128);
+			break;
+		}
+		if (e == 1 || e == 2)
+			_gm->reply(kStringElevator53, 1, 1 + 128);
+	} while (e != 3);
+	_gm->reply(kStringElevator54, 1, 1 + 128);
+	_vm->paletteFadeOut();
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->paletteFadeIn();
+	_vm->renderMessage(kStringElevator55);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->paletteFadeOut();
+	_vm->saveGame(kSleepAutosaveSlot, "autosave");
+	_gm->_inventory.clear();
+	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(3));
+	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(5));
+	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(6));
+	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(8));
+	_vm->setCurrentImage(29);
+	_gm->changeRoom(MUSEUM);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_vm->renderMessage(kStringElevator56);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringElevator57);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringElevator58);
+	_gm->drawGUI();
+	_gm->_state._startTime = g_system->getMillis() - 2390000;
+	_gm->_state._tipsy = false;
+	_gm->_state._toMuseum = true;
+}
+
 Apartment::Apartment(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 3e0f75c..4145f80 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -200,6 +200,7 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	void jobDescription();
 };
 
 class Apartment : public Room {
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 7798c7a..e2e693f 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -42,6 +42,7 @@ enum AudioId {
 	kAudioAppearance1,
 	kAudioAppearance2,
 	kAudioAppearance3,
+	kAudioElevatorBell,
 	kAudioNumSamples
 };
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 8f3a3cf..2cc0518 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -37,6 +37,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 
 	// GameState
 	out->writeSint16LE(_state._money);
+	out->writeSint32LE(_state._startTime);
 	out->writeByte(_state._addressKnown);
 	out->writeByte(_state._poleMagnet);
 	out->writeByte(_state._admission);
@@ -44,6 +45,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._dark);
 	out->writeByte(_state._elevatorE);
 	out->writeByte(_state._elevatorNumber);
+	out->writeByte(_state._toMuseum);
 	out->writeUint32LE(_state._eventTime);
 	out->writeSint32LE(_state._eventCallback);
 
@@ -73,6 +75,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 
 	// GameState
 	_state._money = in->readSint16LE();
+	_state._startTime = in->readSint32LE();
 	_state._addressKnown = in->readByte();
 	_state._poleMagnet = in->readByte();
 	_state._admission = in->readByte();
@@ -80,6 +83,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._dark = in->readByte();
 	_state._elevatorE = in->readByte();
 	_state._elevatorNumber = in->readByte();
+	_state._toMuseum = in->readByte();
 	_state._eventTime = in->readUint32LE();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -342,6 +346,7 @@ void GameManager::initState() {
 	_prevImgId = 0;
 
 	_state._money = 20;
+	_state._startTime = 0;
 	_state._addressKnown = false;
 	_state._previousRoom = _currentRoom;
 	_state._poleMagnet = false;
@@ -350,6 +355,7 @@ void GameManager::initState() {
 	_state._dark = false;
 	_state._elevatorE = 0;
 	_state._elevatorNumber = 0;
+	_state._toMuseum = false;
 	_state._eventTime = kMaxTimerValue;
 	_state._eventCallback = kNoFn;
 }
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 927bca3..53deb9f 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -37,6 +37,7 @@ enum EventFunction { kNoFn, kSoberFn};
 
 struct GameState {
 	int16 _money;
+	int32 _startTime;
 	bool _addressKnown;
 	Room *_previousRoom;
 	bool _poleMagnet;
@@ -45,6 +46,7 @@ struct GameState {
 	bool _dark;
 	char _elevatorE;
 	char _elevatorNumber;
+	bool _toMuseum;
 	EventFunction _eventCallback;
 	uint32 _eventTime;
 };


Commit: 9e9602051c82cd0173cfb35c28f3318745a9629e
    https://github.com/scummvm/scummvm/commit/9e9602051c82cd0173cfb35c28f3318745a9629e
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add missing interactions in Cabin room

Changed paths:
    engines/supernova2/graphics.cpp
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/screen.cpp
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp
index 630fa46..592a8e9 100644
--- a/engines/supernova2/graphics.cpp
+++ b/engines/supernova2/graphics.cpp
@@ -221,21 +221,39 @@ bool MS2Image::loadStream(Common::SeekableReadStream &stream) {
 }
 
 bool MS2Image::loadSections() {
-	_pitch = 320;
+	bool isPoster = _filenumber == 38;
+	int imageWidth = isPoster ? 640 : 320;
+	int imageHeight = isPoster ? 480 : 200;
+	_pitch = imageWidth;
 
 	for (int section = 0; section < _numSections; ++section) {
 		Graphics::Surface *surface = new Graphics::Surface;
 		_sectionSurfaces.push_back(surface);
+		if (isPoster) {
+			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
+			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
+				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
+			}
+		} else {
 
-		uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
-		if (offset == kInvalidAddress || _section[section].x2 == 0) {
-			return false;
+			uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
+			if (offset == kInvalidAddress || _section[section].x2 == 0) {
+				return false;
+			}
+			int width = _section[section].x2 - _section[section].x1 + 1;
+			int height = _section[section].y2 - _section[section].y1 + 1;
+			surface->create(width, height, g_system->getScreenFormat());
+			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+			Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels);
 		}
-		int width = _section[section].x2 - _section[section].x1 + 1;
-		int height = _section[section].y2 - _section[section].y1 + 1;
-		surface->create(width, height, g_system->getScreenFormat());
-		byte *surfacePixels = static_cast<byte *>(surface->getPixels());
-		Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels);
 	}
 
 	return true;
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index f3cc21f..b83be46 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -170,7 +170,7 @@ kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, k
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
 kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
 kStringOnlyShop, kStringCabinOccupiedSay, kStringTakeMoney, kStringAlreadyPaid, kStringNoMoney,
-kStringPay10Xa, kStringWillPassOut, kStringRest, kString223, kStringWillTakeIt,
+kStringPay10Xa, kStringWillPassOut, kStringRest, kStringCypher, kStringWillTakeIt,
 kStringTooExpensive, kStringWouldBuy, kStringMeHorstHummel, kStringHaveMusicChip, kStringGreatMask,
 kStringThreeYears, kStringStrongDrink, kStringMusicDevice, kStringArtusToothbrush, kStringSellInBulk,
 kStringRarityBooks, kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words, kStringNotSale,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index f9b8056..43599b7 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -688,7 +688,6 @@ bool Games::interact(Action verb, Object &obj1, Object &obj2) {
 Cabin::Cabin(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
-	_paid = false;
 
 	_fileNumber = 7;
 	_id = CABIN;
@@ -712,7 +711,7 @@ void Cabin::onEntrance() {
 }
 
 void Cabin::animation() {
-	if (_paid) {
+	if (_shown[kMaxSection - 1]) {
 		if (isSectionVisible(1))
 			setSectionVisible(1, kShownFalse);
 		else
@@ -725,30 +724,29 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 	if (verb == ACTION_USE && Object::combine(obj1, obj2, MONEY, SLOT1)) {
 		if (isSectionVisible(2))
 			_vm->renderMessage(kStringTakeMoney);
-		else if (_paid)
+		else if (_shown[kMaxSection - 1])
 			_vm->renderMessage(kStringAlreadyPaid);
 		else if (_gm->_state._money < 10)
 			_vm->renderMessage(kStringNoMoney);
 		else {
 			_vm->renderMessage(kStringPay10Xa);
 			_gm->takeMoney(-10);
-			_paid = true;
+			_shown[kMaxSection - 1] = true;
 		}
-	}
-	else if (verb == ACTION_USE && obj1._id == CHAIR) {
-		if (_paid) {
+	} else if (verb == ACTION_USE && obj1._id == CHAIR) {
+		if (_shown[kMaxSection - 1]) {
 			if (_shown[kMaxSection - 2]) {
 				_vm->paletteFadeOut();
 				_vm->setCurrentImage(31);
 				_vm->renderImage(0);
 				_vm->paletteFadeIn();
-				_paid = true;
+				_shown[kMaxSection - 1] = true;
 				_gm->waitOnInput(100000);
 				_vm->paletteFadeOut();
 				_vm->setCurrentImage(7);
 				_vm->renderImage(0);
 				setSectionVisible(1, kShownFalse);
-				_paid = false;
+				_shown[kMaxSection - 1] = false;
 				_vm->renderRoom(*this);
 				_vm->renderImage(2);
 				_gm->drawMapExits();
@@ -776,8 +774,36 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 			}
 		} else
 			_vm->renderMessage(kStringRest);
-	}
-	else 
+	} else if (verb == ACTION_TAKE && obj1._id == PRIZE) {
+		_vm->renderImage(2 + 128);
+		obj1._click = 255;
+		_gm->takeMoney(400);
+	} else if (verb == ACTION_TAKE && obj1._id == BACK_MONEY) {
+		_vm->renderImage(2 + 128);
+		obj1._click = 255;
+		_gm->takeMoney(10);
+	} else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE1) {
+		_vm->renderMessage(kStringCypher);
+	} else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE2) {
+		_gm->animationOff();
+		_vm->setCurrentImage(28);
+		_vm->renderImage(0);
+		_gm->waitOnInput(100000);
+		_vm->setCurrentImage(7);
+		_vm->renderRoom(*this);
+		_gm->drawGUI();
+		_gm->_state._addressKnown = true;
+		_gm->animationOn();
+	} else if (verb == ACTION_LOOK && obj1._id == SIGN) {
+		_gm->animationOff();
+		_vm->setCurrentImage(38);
+		_vm->renderImage(0);
+		_gm->waitOnInput(100000);
+		_vm->setCurrentImage(7);
+		_vm->renderRoom(*this);
+		_gm->drawGUI();
+		_gm->animationOn();
+	} else 
 		return false;
 	return true;
 }
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 29aa52e..8d5fddf 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -340,10 +340,20 @@ void Screen::renderImageSection(const MS2Image *image, int section, bool invert)
 							 image->_section[section].y1,
 							 image->_section[section].x2 + 1,
 							 image->_section[section].y2 + 1);
-	if (_screenWidth != 320) {
-		_screenWidth = 320;
-		_screenHeight = 200;
-		initGraphics(_screenWidth, _screenHeight);
+	if (image->_filenumber == 38) {
+		sectionRect.setWidth(640);
+		sectionRect.setHeight(480);
+		if (_screenWidth != 640) {
+			_screenWidth = 640;
+			_screenHeight = 480;
+			initGraphics(_screenWidth, _screenHeight);
+		}
+	} else {
+		if (_screenWidth != 320) {
+			_screenWidth = 320;
+			_screenHeight = 200;
+			initGraphics(_screenWidth, _screenHeight);
+		}
 	}
 
 	uint offset = 0;
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 2cc0518..9c59397 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -797,6 +797,14 @@ void GameManager::drawMapExits() {
 	}
 }
 
+void GameManager::animationOff() {
+	_animationEnabled = false;
+}
+
+void GameManager::animationOn() {
+	_animationEnabled = true;
+}
+
 void GameManager::edit(Common::String &input, int x, int y, uint length) {
 	bool isEditing = true;
 	uint cursorIndex = input.size();
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 53deb9f..b356dd9 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -182,6 +182,8 @@ public:
 	void waitOnInput(int ticks);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void showMenu();
+	void animationOff();
+	void animationOn();
 	void edit(Common::String &input, int x, int y, uint length);
 	int invertSection(int section);
 	void drawMapExits();


Commit: c23411bb7397f97810d52dad212a9fd48e5e22be
    https://github.com/scummvm/scummvm/commit/c23411bb7397f97810d52dad212a9fd48e5e22be
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Finish the elevator room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/sound.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index b83be46..c63c4f0 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -229,7 +229,7 @@ kStringElevator42, kStringElevator43, kStringElevator44, kStringElevator45, kStr
 kStringElevator47, kStringElevator48, kStringElevator49, kStringElevator50, kStringElevator51,
 kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStringElevator56,
 kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
-kString515, kString516, kString517, kString518, kString519,
+kStringElevator62, kStringElevator63, kStringElevator64, kStringElevator65, kString519,
 kString520, kString521, kString522, kString523, kString524,
 kString525, kString526, kString527, kString528, kString529,
 kString530, kString531, kString532, kString533, kString534,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 7ab833f..ba3bacf 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -47,7 +47,7 @@ static Common::MemoryReadStream *convertToMod(const char *filename, int version
 static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{55,     18230,    -1},
 	{47,     0,     16010},
-	{47,     16010,    -1},
+	{47,     16010, 17020},
 	{49,     8010,     -1},
 	{49,     0,      8010},
 	{53,     30020,    -1},
@@ -56,7 +56,8 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{53,     5010,  30020},
 	{55,     18230,    -1},
 	{55,     17020, 18230},
-	{53,     0,     30020}
+	{53,     0,     30020},
+	{47,     17020,    -1}
 };
 
 static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 43599b7..d06d38a 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1657,7 +1657,7 @@ bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
 		kStringElevator6,
 		kStringElevator7
 	};
-	char input[3];
+	Common::String input;
 
 	if (verb == ACTION_LOOK && obj1._id == DISPLAY) {
 		Common::String format = _vm->getGameString(kStringElevator1);
@@ -1758,6 +1758,45 @@ bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 		else
 			_vm->renderMessage(kStringElevator61);
+	} else if ((verb == ACTION_USE || verb == ACTION_PRESS) && obj1._id == KEYPAD) {
+		_vm->renderMessage(kStringElevator62);
+		do {
+			_gm->edit(input, 237, 66, 2);
+		} while ((_gm->_key.keycode != Common::KEYCODE_RETURN) && 
+				 (_gm->_key.keycode != Common::KEYCODE_ESCAPE) && !_vm->shouldQuit());
+		_vm->removeMessage();
+		if (_gm->_key.keycode == Common::KEYCODE_RETURN && input[0] != 0) {
+			for (unsigned i = 0; i < input.size(); i++) {
+				if (input[i] < '0' || input[i] > '9') {
+					_vm->renderMessage(kStringElevator63);
+					return true;
+				}
+			}
+			int64 number = input.asUint64();
+			if (number > 60)
+				_vm->renderMessage(kStringElevator63);
+			else if (number != _gm->_state._elevatorE) {
+				if (isSectionVisible(6)) {
+					_vm->renderImage(6 + 128);
+					_objectState[4]._type &= ~OPENED;
+					_vm->playSound(kAudioElevator1);
+				}
+				_vm->renderMessage(kStringElevator64);
+				_gm->_state._elevatorE = number;
+				if (number)
+					_objectState[5]._type &= ~OPENED;
+				else
+					_objectState[5]._type |= OPENED;
+			}
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ID_CARD, SLOT)) {
+		if (_gm->_state._elevatorNumber == 1 && _gm->_state._elevatorE == 32) {
+			_vm->renderImage(6);
+			_objectState[4]._type |= OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+		else
+			_vm->renderMessage(kStringElevator65);
 	} else
 		return false;
 	return true;
@@ -1795,6 +1834,7 @@ void Elevator::jobDescription() {
 	_gm->reply(kStringElevator47, 0, 0);
 	_gm->reply(kStringElevator48, 0, 0);
 	_vm->setCurrentImage(26);
+	_vm->_system->fillScreen(kColorBlack);
 	_vm->renderImage(0);
 	_gm->reply(kStringElevator49, 1, 1 + 128);
 	int e;
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index e2e693f..692e47b 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -43,6 +43,7 @@ enum AudioId {
 	kAudioAppearance2,
 	kAudioAppearance3,
 	kAudioElevatorBell,
+	kAudioElevator1,
 	kAudioNumSamples
 };
 


Commit: e90a82ac7990b70225e9fffc51ee9b8dae63ec90
    https://github.com/scummvm/scummvm/commit/e90a82ac7990b70225e9fffc51ee9b8dae63ec90
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add the apartment room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index c63c4f0..6b37429 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -117,9 +117,9 @@ enum ObjectId {
 	CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
 	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
 	SCRIBBLE1,SCRIBBLE2,BELL,KEYPAD,DOOR_L,DOOR_R,ID_CARD,
-	MAGNET,UNDER_BED,KEY,VALVE,WARDROBE,DISCMAN,
+	MAGNET,UNDER_BED,KEY,HATCH,CABINET,DISCMAN,
 	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
-	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,INVESTMENT,
+	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,MUSIC_SYSTEM,
 	HANDLE,COUNTER,DOOR_SWITCH,SUIT,MANAGEMENT,RMANAGEMENT,
 	MUSCARD,SKOPF, DISPLAY
 };
@@ -229,20 +229,20 @@ kStringElevator42, kStringElevator43, kStringElevator44, kStringElevator45, kStr
 kStringElevator47, kStringElevator48, kStringElevator49, kStringElevator50, kStringElevator51,
 kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStringElevator56,
 kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
-kStringElevator62, kStringElevator63, kStringElevator64, kStringElevator65, kString519,
-kString520, kString521, kString522, kString523, kString524,
-kString525, kString526, kString527, kString528, kString529,
+kStringElevator62, kStringElevator63, kStringElevator64, kStringElevator65, kStringApartment1,
+kStringApartment2, kStringApartment3, kStringApartment4, kStringApartment5, kStringApartment6,
+kStringApartment7, kStringApartment8, kString527, kString528, kString529,
 kString530, kString531, kString532, kString533, kString534,
 kString535, kString536, kString537, kString538, kString539,
 kString540, kString541, kString542, kString543, kString544,
 kString545, kString546, kStringFascinating, kStringTaxis, kStringTaxisDescription,
 kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
 kStringSign3Description, kStringSign4Description, kStringBell, kStringDisplay, kStringKeypad,
-kStringKeypadDescription, kString561, kString562, kString563, kString564,
-kString565, kString566, kString567, kString568, kString569,
-kString570, kString571, kString572, kString573, kString574,
-kString575, kString576, kString577, kString578, kString579,
-kString580, kString581, kString582, kString583, kString584,
+kStringKeypadDescription, kStringChip, kStringChipDescription, kStringHatch, kStringHatchDescription,
+kStringMusicSystem, kStringMusicSystemDescription, kStringSpeakers, kStringSpeakersDescription, kStringPencils,
+kStringPencilsDescription, kStringMetalBlocks, kStringMetalBlocksDescription, kStringImage, kStringImageDescription,
+kStringCabinet, kStringCabinetDescription, kStringElevator, kStringUnderBed, kStringUnderBedDescription,
+kStringKey, kStringKeyDescription, kString582, kString583, kString584,
 kString585, kString586, kString587, kString588, kString589,
 kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
 kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index ba3bacf..4793669 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -56,8 +56,8 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{53,     5010,  30020},
 	{55,     18230,    -1},
 	{55,     17020, 18230},
-	{53,     0,     30020},
-	{47,     17020,    -1}
+	{53,     0,      5210},
+	{47,     17020,    -1},
 };
 
 static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index d06d38a..3a066d6 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1890,9 +1890,26 @@ Apartment::Apartment(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 25;
 	_id = APARTMENT;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownFalse;
+	_shown[2] = kShownFalse;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringChip, kStringChipDescription, CHIP, TAKE | COMBINABLE, 255, 255, 1);
+	_objectState[1] = Object(_id, kStringHatch, kStringHatchDescription, HATCH, OPENABLE | CLOSED | COMBINABLE, 0, 1, 1);
+	_objectState[2] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringMusicSystem, kStringMusicSystemDescription, MUSIC_SYSTEM, COMBINABLE, 4, 4, 0);
+	_objectState[4] = Object(_id, kStringSpeakers, kStringSpeakersDescription, NULLOBJECT, NULLTYPE, 5, 5, 0);
+	_objectState[5] = Object(_id, kStringPencils, kStringPencilsDescription, NULLOBJECT, UNNECESSARY, 6, 6, 0);
+	_objectState[6] = Object(_id, kStringMetalBlocks, kStringMetalBlocksDescription, MAGNET, TAKE | COMBINABLE, 10, 10, 3 + 128);
+	_objectState[7] = Object(_id, kStringImage, kStringImageDescription, NULLOBJECT, UNNECESSARY, 7, 7, 0);
+	_objectState[8] = Object(_id, kStringCabinet, kStringCabinetDescription, CABINET, OPENABLE | CLOSED, 8, 8, 0);
+	_objectState[9] = Object(_id, kStringChair, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
+	_objectState[10] = Object(_id, kStringElevator, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, ELEVATOR, 22);
+	_objectState[11] = Object(_id, kStringUnderBed, kStringUnderBedDescription, UNDER_BED, NULLTYPE, 11, 11, 0);
+	_objectState[12] = Object(_id, kStringKey, kStringKeyDescription, KEY, TAKE | COMBINABLE, 255, 255, 0);
 }
 
 void Apartment::onEntrance() {
@@ -1903,6 +1920,51 @@ void Apartment::animation() {
 }
 
 bool Apartment::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, ROD, UNDER_BED)) {
+		if (_objectState[12]._type & CARRIED)
+			_vm->renderMessage(kStringApartment1);
+		else if (_shown[kMaxSection - 1]) {
+			_vm->renderMessage(kStringApartment2);
+			_gm->takeObject(_objectState[12]);
+			_vm->playSound(kAudioSuccess);
+		} else {
+			_vm->renderMessage(kStringApartment3);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_vm->renderMessage(kStringApartment4);
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, HATCH)) {
+		if (_objectState[1]._type & OPENED)
+			_vm->renderMessage(kStringApartment5);
+		else {
+			_vm->renderImage(1);
+			_vm->playSound(kAudioTaxiOpen);
+			_objectState[1]._type |= OPENED;
+			_objectState[1]._click = 1;
+			if (!(_objectState[0]._type & CARRIED)) {
+				_vm->renderImage(2);
+				_objectState[0]._click = 2;
+			}
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == HATCH && obj1._type & OPENED) {
+		_vm->renderImage(1 + 128);
+		setSectionVisible(2, false);
+		_vm->playSound(kAudioElevator1);
+		obj1._type &= ~OPENED;
+		obj1._click = 0;
+		if (!(_objectState[0]._type & CARRIED))
+			_objectState[0]._click = 255;
+	} else if (verb == ACTION_TAKE && obj1._id == CHIP && !(obj1._type & CARRIED)) {
+		setSectionVisible(2, kShownFalse);
+		return false;
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, CABINET)) {
+		_vm->renderMessage(kStringApartment6);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CHIP, MUSIC_SYSTEM)) {
+		_vm->renderMessage(kStringApartment7);
+	} else if (verb == ACTION_PRESS && obj1._id == MUSIC_SYSTEM) {
+		_vm->renderMessage(kStringApartment8);
+	} else
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 9c59397..019ad19 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -1231,6 +1231,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		o1->_name = kStringPoleMagnet;
 		o1->_description = kStringCunning;
 		_inventory.remove(*o2);
+		_rooms[APARTMENT]->setSectionVisible(kMaxSection - 1, kShownTrue);
 	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CHIP, PLAYER)) {
 		Object *o1, *o2;
 		if (obj2._id == CHIP) {


Commit: 5fe8f6fae9974375174361623984cc481790aa98
    https://github.com/scummvm/scummvm/commit/5fe8f6fae9974375174361623984cc481790aa98
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix doors in elevator.

I added exit door to elevator which was missing.

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 3a066d6..0a440d9 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1631,7 +1631,7 @@ Elevator::Elevator(Supernova2Engine *vm, GameManager *gm) {
 	_objectState[2] = Object(_id, kStringDisplay, kStringDefaultDescription, DISPLAY, NULLTYPE, 2, 2, 0);
 	_objectState[3] = Object(_id, kStringKeypad, kStringKeypadDescription, KEYPAD, PRESS, 3, 3, 0);
 	_objectState[4] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | CLOSED, 4, 4, 0, APARTMENT, 3);
-	_objectState[5] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED | CLOSED, 4, 4, 0, APARTMENT, 3);
+	_objectState[5] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED | CLOSED, 255, 255, 0, CITY1, 22);
 }
 
 void Elevator::onEntrance() {


Commit: 925784f01b6121084b3797df56da4dc72e160fc5
    https://github.com/scummvm/scummvm/commit/925784f01b6121084b3797df56da4dc72e160fc5
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add ship room

Changed paths:
  R engines/supernova2/-
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/- b/engines/supernova2/-
deleted file mode 100644
index beda2e2..0000000
--- a/engines/supernova2/-
+++ /dev/null
@@ -1,221 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA2_STATE_H
-#define SUPERNOVA2_STATE_H
-
-#include "common/events.h"
-#include "common/rect.h"
-#include "common/keyboard.h"
-#include "supernova2/rooms.h"
-#include "supernova2/sound.h"
-
-namespace Supernova2 {
-
-const int32 kMaxTimerValue = 0x7FFFFFFF;
-
-enum EventFunction { kNoFn, kSoberFn};
-
-struct GameState {
-	int16 _money;
-	bool _addressKnown;
-	Room *_previousRoom;
-	bool _poleMagnet;
-	char _admission;
-	bool _tipsy;
-	bool _dark;
-	char _elevatorE;
-	char _elevatorNumber;
-	bool _toMuseum;
-	EventFunction _eventCallback;
-	uint32 _eventTime;
-};
-
-class Inventory {
-public:
-	Inventory(Object *nullObject, int &inventoryScroll)
-		: _numObjects(0)
-		, _nullObject(nullObject)
-	    , _inventoryScroll(inventoryScroll) {
-		for (int i = 0; i < kMaxCarry; ++i)
-			_inventory[i] = nullptr;
-	}
-
-	void add(Object &obj);
-	void remove(Object &obj);
-	void clear();
-	Object *get(int index) const;
-	Object *get(ObjectId id) const;
-	int getSize() const { return _numObjects; }
-
-private:
-	Object *_inventory[kMaxCarry];
-	Object *_nullObject;
-	int &_inventoryScroll;
-	int _numObjects;
-};
-
-class GuiElement : public Common::Rect {
-public:
-	GuiElement();
-
-	void setSize(int x1, int y1, int x2, int y2);
-	void setText(const char *text);
-	void setTextPosition(int x, int y);
-	void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
-	void setHighlight(bool isHighlighted);
-
-	const char *getText() const {
-		return _text;
-	}
-	int getBackgroundColor() const {
-		return _bgColor;
-	}
-	int getTextColor() const {
-		return _textColor;
-	}
-	const Common::Point &getTextPos() const {
-		return _textPosition;
-	}
-	bool isHighlighted() const {
-		return _isHighlighted;
-	}
-
-private:
-	Common::Point _textPosition;
-	char _text[128];
-	int _bgColor;
-	int _textColor;
-	int _bgColorNormal;
-	int _bgColorHighlighted;
-	int _textColorNormal;
-	int _textColorHighlighted;
-	bool _isHighlighted;
-};
-
-class GameManager {
-public:
-	GameManager(Supernova2Engine *vm);
-	~GameManager();
-
-	void updateEvents();
-	void processInput(Common::KeyState &state);
-	void processInput();
-	void executeRoom();
-	bool serialize(Common::WriteStream *out);
-	bool deserialize(Common::ReadStream *in, int version);
-
-	static StringId guiCommands[];
-	static StringId guiStatusCommands[];
-	Supernova2Engine *_vm;
-	Common::KeyState _key;
-	Common::EventType _mouseClickType;
-	bool _mouseClicked;
-	bool _keyPressed;
-	int _mouseX;
-	int _mouseY;
-	int _mouseField;
-	Room *_currentRoom;
-	bool _newRoom;
-	Room *_rooms[NUMROOMS];
-	Inventory _inventory;
-	GameState _state;
-	bool _processInput;
-	bool _guiEnabled;
-	bool _animationEnabled;
-	Action _inputVerb;
-	Object _nullObject;
-	Object *_currentInputObject;
-	Object *_inputObject[2];
-	int32 _oldTime;
-	uint _timePaused;
-	bool _timerPaused;
-	int _restTime;
-	int32 _messageDuration;
-	int32 _animationTimer;
-	int _inventoryScroll;
-	int _exitList[25];
-	GuiElement _guiCommandButton[10];
-	GuiElement _guiInventory[8];
-	GuiElement _guiInventoryArrow[2];
-	// Dialog
-	int _currentSentence;
-	int _sentenceNumber[6];
-	StringId _texts[6];
-	byte _rows[6];
-	byte _rowsStart[6];
-	byte _dials[6];
-	int _taxi_possibility;
-
-	void takeObject(Object &obj);
-	void setObjectNull(Object *&obj);
-	bool isNullObject(Object *obj);
-
-	void initState();
-	void initRooms();
-	void destroyRooms();
-	void initGui();
-	bool genericInteract(Action verb, Object &obj1, Object &obj2);
-	uint16 getKeyInput(bool blockForPrintChar = false);
-	void getInput();
-	void wait(int ticks);
-	void waitOnInput(int ticks);
-	bool waitOnInput(int ticks, Common::KeyCode &keycode);
-	void showMenu();
-	void edit(Common::String &input, int x, int y, uint length);
-	int invertSection(int section);
-	void drawMapExits();
-	void drawStatus();
-	void drawCommandBox();
-	void drawInventory();
-	void changeRoom(RoomId id);
-	void resetInputState();
-	void handleInput();
-	void handleTime();
-	void pauseTimer(bool pause);
-	void setAnimationTimer(int ticks);
-	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
-	void sentence(int number, bool brightness);
-	void say(StringId textId);
-	void say(const char *text);
-	void reply(StringId textId, int aus1, int aus2);
-	void reply(const char *text, int aus1, int aus2);
-	void mousePosDialog(int x, int y);
-	void takeMoney(int amount);
-	void taxi();
-	void leaveTaxi();
-	void taxiUnknownDestination();
-	void taxiPayment(int price, int destination);
-	void playerTakeOut();
-	void sober();
-	void playCD();
-	void drawGUI();
-	bool talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id);
-	bool talkRest(int mod1, int mod2, int rest);
-
-private:
-	int _prevImgId;
-};
-
-}
-
-#endif // SUPERNOVA2_STATE_H
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 6b37429..70f83e8 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -120,7 +120,7 @@ enum ObjectId {
 	MAGNET,UNDER_BED,KEY,HATCH,CABINET,DISCMAN,
 	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
 	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,MUSIC_SYSTEM,
-	HANDLE,COUNTER,DOOR_SWITCH,SUIT,MANAGEMENT,RMANAGEMENT,
+	HANDLE,SWITCH,DOOR_SWITCH,SUIT,CABLE,RCABLE,
 	MUSCARD,SKOPF, DISPLAY
 };
 
@@ -231,19 +231,19 @@ kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStr
 kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
 kStringElevator62, kStringElevator63, kStringElevator64, kStringElevator65, kStringApartment1,
 kStringApartment2, kStringApartment3, kStringApartment4, kStringApartment5, kStringApartment6,
-kStringApartment7, kStringApartment8, kString527, kString528, kString529,
-kString530, kString531, kString532, kString533, kString534,
-kString535, kString536, kString537, kString538, kString539,
-kString540, kString541, kString542, kString543, kString544,
-kString545, kString546, kStringFascinating, kStringTaxis, kStringTaxisDescription,
+kStringApartment7, kStringApartment8, kStringShip0, kStringShip1, kStringShip2,
+kStringShip3, kStringShip4, kStringShip5, kStringShip6, kStringShip7,
+kStringShip8, kStringShip9, kStringShip10, kStringShip11, kStringShip12,
+kStringShip13, kStringShip14, kStringShip15, kStringShip16, kStringShip17,
+kStringShip18, kStringShip19, kStringFascinating, kStringTaxis, kStringTaxisDescription,
 kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
 kStringSign3Description, kStringSign4Description, kStringBell, kStringDisplay, kStringKeypad,
 kStringKeypadDescription, kStringChip, kStringChipDescription, kStringHatch, kStringHatchDescription,
 kStringMusicSystem, kStringMusicSystemDescription, kStringSpeakers, kStringSpeakersDescription, kStringPencils,
 kStringPencilsDescription, kStringMetalBlocks, kStringMetalBlocksDescription, kStringImage, kStringImageDescription,
 kStringCabinet, kStringCabinetDescription, kStringElevator, kStringUnderBed, kStringUnderBedDescription,
-kStringKey, kStringKeyDescription, kString582, kString583, kString584,
-kString585, kString586, kString587, kString588, kString589,
+kStringKey, kStringKeyDescription, kStringSwitch, kStringHandle, kStringHatch2,
+kStringSpaceSuit, kStringSpaceSuitDescription, kStringCable, kStringCableDescription1, kStringCableDescription2,
 kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
 kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
 kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 4793669..7074731 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -58,6 +58,11 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{55,     17020, 18230},
 	{53,     0,      5210},
 	{47,     17020,    -1},
+	{51,     9020,     -1},
+	{51,     0,      6010},
+	{50,     0,        -1},
+	{51,     6010,   9020},
+	{54,     0,        -1}
 };
 
 static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 0a440d9..b858619 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1535,6 +1535,8 @@ void Checkout::appearance() {
 	_vm->removeMessage();
 	_gm->changeRoom(SHIP);
 	_gm->_state._dark = true;
+	_vm->_screen->setViewportBrightness(1);
+	_vm->paletteBrightness();
 	_gm->drawGUI();
 }
 
@@ -1972,9 +1974,25 @@ Ship::Ship(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 45;
 	_id = SHIP;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownFalse;
+	_shown[2] = kShownFalse;
+	_shown[3] = kShownFalse;
+	_shown[4] = kShownFalse;
+	_shown[5] = kShownFalse;
+	_shown[6] = kShownFalse;
+	_shown[7] = kShownFalse;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSwitch, kStringDefaultDescription, SWITCH, PRESS | COMBINABLE, 0, 0, 0);
+	_objectState[1] = Object(_id, kStringHandle, kStringDefaultDescription, HANDLE, NULLTYPE, 255, 255, 0);
+	_objectState[2] = Object(_id, kStringHatch2, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0, SHIP, 19);
+	_objectState[3] = Object(_id, kStringSwitch, kStringDefaultDescription, DOOR_SWITCH, PRESS | COMBINABLE, 255, 255, 0);
+	_objectState[4] = Object(_id, kStringSpaceSuit, kStringSpaceSuitDescription, SUIT, TAKE, 255, 255, 1);
+	_objectState[5] = Object(_id, kStringCable, kStringCableDescription1, RCABLE, COMBINABLE, 255, 255, 0);
+	_objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + 128);
 }
 
 void Ship::onEntrance() {
@@ -1985,9 +2003,160 @@ void Ship::animation() {
 }
 
 bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_PRESS && obj1._id == SWITCH) {
+		if (_gm->_state._dark) {
+			_gm->_state._dark = false;
+			_vm->_screen->setViewportBrightness(255);
+			_objectState[1]._click = 1;
+			_objectState[2]._click = 2;
+			_objectState[3]._click = 3;
+			_objectState[5]._click = 4;
+			_objectState[6]._click = 5;
+			_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+			_gm->drawMapExits();
+		}
+	} else if (verb == ACTION_PRESS && obj1._id == DOOR_SWITCH &&
+			!isSectionVisible(7)) {
+		_vm->renderImage(3);
+		_gm->wait(2);
+		_vm->renderImage(6);
+		_vm->playSound(kAudioShip1);
+		while (_vm->_sound->isPlaying())
+			_gm->wait(1);
+		_vm->renderImage(6 + 128);
+		_vm->renderImage(7);
+		_objectState[3]._description = kStringShip1;
+		_objectState[2]._description = kStringShip2;
+	} else if (verb == ACTION_PULL && obj1._id == HANDLE) {
+		_vm->renderImage(2);
+		_vm->playSound(kAudioTaxiOpen);
+		obj1._click = 255;
+		_objectState[4]._click = 9;
+	} else if (verb == ACTION_TAKE && obj1._id == SUIT && !(obj1._type & CARRIED)) {
+		setSectionVisible(2, kShownFalse);
+		_gm->takeObject(obj1);
+	} else if (verb == ACTION_USE && obj1._id == SUIT) {
+		if (!(obj1._type & CARRIED)) {
+			setSectionVisible(2, kShownFalse);
+			_gm->takeObject(obj1);
+		}
+		if ((_shown[kMaxSection - 1] = !_shown[kMaxSection - 1]))
+			_vm->renderMessage(kStringShip3);
+		else
+			_vm->renderMessage(kStringShip4);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, RCABLE)) {
+		_objectState[6]._description = kStringDefaultDescription;
+		if (_objectState[6]._click == 6)
+			_vm->renderImage(8 + 128);
+		if (_objectState[6]._type & CARRIED)
+			_gm->_inventory.remove(_objectState[6]);
+		if (isSectionVisible(11) || isSectionVisible(10))
+			_vm->renderMessage(kStringShip5);
+		else if (isSectionVisible(9)) {
+			_vm->renderImage(9 + 128);
+			_vm->renderImage(11);
+			if (!_shown[kMaxSection - 1])
+				kill();
+			_objectState[6]._click = 8;
+			_gm->wait(2);
+			_vm->renderImage(4);
+			_vm->playSound(kAudioShip2);
+			_gm->wait(3);
+			_vm->renderImage(5);
+			_objectState[2]._type |= OPENED;
+			_objectState[2]._description = kStringDefaultDescription;
+		} else {
+			_vm->renderImage(10);
+			if (!_shown[kMaxSection - 1])
+				kill();
+			_objectState[6]._click = 7;
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, DOOR_SWITCH) && isSectionVisible(7)) {
+		_objectState[6]._description = kStringDefaultDescription;
+		if (_objectState[6]._click == 5)
+			_vm->renderImage(8 + 128);
+		if (_objectState[6]._type & CARRIED)
+			_gm->_inventory.remove(_objectState[6]);
+		if (isSectionVisible(11) || isSectionVisible(9))
+			_vm->renderMessage(kStringShip5);
+		else if (isSectionVisible(10)) {
+			_vm->renderImage(10 + 128);
+			_vm->renderImage(11);
+			if (!_shown[kMaxSection - 1])
+				kill();
+			_objectState[6]._click = 8;
+			_gm->wait(2);
+			_vm->renderImage(4);
+			_vm->playSound(kAudioShip2);
+			_gm->wait(3);
+			_vm->renderImage(5);
+			_objectState[2]._type |= OPENED;
+			_objectState[2]._description = kStringDefaultDescription;
+		} else {
+			_vm->renderImage(9);
+			_objectState[6]._click = 6;
+		}
+	} else if (verb == ACTION_TAKE && obj1._id == CABLE && obj1._type & CARRIED) {
+		if (isSectionVisible(8)) {
+			obj1._description = kStringDefaultDescription;
+			_gm->takeObject(obj1);
+		} else
+			_vm->renderMessage(kStringShip6);
+	} else if (verb == ACTION_WALK && obj1._type == (EXIT | OPENABLE | CLOSED | OPENED)) {
+		_vm->setCurrentImage(46);
+		_vm->renderImage(0);
+		_gm->wait(16);
+		_vm->renderMessage(kStringShip7, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip8, 1, 1 + 128);
+		_vm->renderMessage(kStringShip9, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip10, 1, 1 + 128);
+		_gm->reply(kStringShip11, 1, 1 + 128);
+		_gm->reply(kStringShip12, 1, 1 + 128);
+		_gm->reply(kStringShip13, 1, 1 + 128);
+		_vm->renderMessage(kStringShip14, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip15, 1, 1 + 128);
+		_vm->renderMessage(kStringShip16, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringAha, 1, 1 + 128);
+		_gm->reply(kStringShip17, 1, 1 + 128);
+		_vm->renderMessage(kStringShip18, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip19, 1, 1 + 128);
+		_gm->wait(16);
+		CursorMan.showMouse(false);
+		_vm->renderImage(2);
+		for (int i = 3; i < 12; i++) {
+			_vm->renderImage(i);
+			if (i == 9)
+				_vm->playSound(kAudioShip3);
+			_gm->wait(2);
+			_vm->renderImage(i + 128);
+		}
+		_vm->renderImage(12);
+		_gm->wait(18);
+		// TODO some palette stuff
+		_vm->renderImage(13);
+		_vm->playSound(kMusicMadMonkeys);
+	} else
+		return false;
 	return true;
 }
 
+void Ship::kill() {
+	_vm->playSound(kAudioShipDeath);
+	while (_vm->_sound->isPlaying())
+		_gm->wait(1);
+	_gm->dead(kStringShip0);
+}
+
 Pyramid::Pyramid(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 4145f80..aed6901 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -221,6 +221,7 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	void kill();
 };
 
 class Pyramid : public Room {
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 692e47b..d54bac9 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -44,6 +44,11 @@ enum AudioId {
 	kAudioAppearance3,
 	kAudioElevatorBell,
 	kAudioElevator1,
+	kAudioShip1,
+	kAudioShip2,
+	kAudioShip3,
+	kAudioShipDeath,
+	kAudioDeath,
 	kAudioNumSamples
 };
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 019ad19..cbd3fdc 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -1171,6 +1171,30 @@ void GameManager::pauseTimer(bool pause) {
 	}
 }
 
+void GameManager::dead(StringId messageId) {
+	_vm->paletteFadeOut();
+	_guiEnabled = false;
+	_vm->setCurrentImage(43);
+	_vm->renderImage(0);
+	_vm->renderMessage(messageId);
+	_vm->_sound->play(kAudioDeath);
+	_vm->paletteFadeIn();
+	getInput();
+	_vm->paletteFadeOut();
+	_vm->removeMessage();
+
+	destroyRooms();
+	initRooms();
+	initState();
+	initGui();
+	_inventory.clear();
+	changeRoom(AIRPORT);
+	g_system->fillScreen(kColorBlack);
+	_vm->paletteFadeIn();
+
+	_guiEnabled = true;
+}
+
 int GameManager::invertSection(int section) {
 	if (section < 128)
 		section += 128;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index b356dd9..2834851 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -196,6 +196,7 @@ public:
 	void handleTime();
 	void pauseTimer(bool pause);
 	void setAnimationTimer(int ticks);
+	void dead(StringId messageId);
 	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
 	void sentence(int number, bool brightness);
 	void say(StringId textId);


Commit: 8c6515182fce38efc7a051317919eb7024b57bf3
    https://github.com/scummvm/scummvm/commit/8c6515182fce38efc7a051317919eb7024b57bf3
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add part of Pyramid room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 70f83e8..4afbd75 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -147,14 +147,14 @@ kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kString93, kString94,
 kStringEntrance, kStringDoor, kString97, kString98, kString99,
 kString100, kString101, kString102, kStringDinosaurHead, kString104,
-kString105, kStringSuctionCup, kString107, kString108, kString109,
-kString110, kString111, kString112, kString113, kString114,
-kString115, kString116, kString117, kString118, kString119,
+kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
+kString110, kString111, kString112, kStringPyramid1, kStringPyramid2,
+kStringPyramid3, kString116, kString117, kString118, kString119,
 kString120, kString121, kString122, kString123, kString124,
 kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kString132, kString133, kString134,
-kString135, kString136, kStringSign, kString138, kString139,
-kString140, kString141, kString142, kString143, kString144,
+kString135, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
+kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kString144,
 kString145, kString146, kString147, kString148, kString149,
 kString150, kString151, kString152, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index b858619..7bbd537 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2164,6 +2164,37 @@ Pyramid::Pyramid(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 6;
 	_id = PYRAMID;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + 128);
+	_objectState[1] = Object(_id, kStringSign, kStringSignDescription, SIGN, COMBINABLE, 25, 25, 0);
+	_objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 19);
+	_objectState[3] = Object(_id, kStringPyramid, kStringPyramidDescription, NULLOBJECT, NULLTYPE, 26, 26, 0);
+	_objectState[4] = Object(_id, kStringSun, kStringSunDescription, SUN, NULLTYPE, 28, 28, 0);
+	_objectState[5] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE1, COMBINABLE, 0, 0, 0);
+	_objectState[6] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE2, COMBINABLE, 1, 0, 0);
+	_objectState[7] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE3, COMBINABLE, 2, 0, 0);
+	_objectState[8] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE4, COMBINABLE, 3, 0, 0);
+	_objectState[9] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE5, COMBINABLE, 4, 0, 0);
+	_objectState[10] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE6, COMBINABLE, 5, 0, 0);
+	_objectState[11] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE7, COMBINABLE, 6, 0, 0);
+	_objectState[12] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE8, COMBINABLE, 7, 0, 0);
+	_objectState[13] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE9, COMBINABLE, 8, 0, 0);
+	_objectState[14] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE10, COMBINABLE, 9, 0, 0);
+	_objectState[15] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE11, COMBINABLE, 10, 0, 0);
+	_objectState[16] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE12, COMBINABLE, 11, 0, 0);
+	_objectState[17] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE13, COMBINABLE, 12, 0, 0);
+	_objectState[18] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE14, COMBINABLE, 13, 0, 0);
+	_objectState[19] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE15, COMBINABLE, 14, 0, 0);
+	_objectState[20] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE16, COMBINABLE, 15, 0, 0);
+	_objectState[21] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE17, COMBINABLE, 16, 0, 0);
+	_objectState[22] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE18, COMBINABLE, 17, 0, 0);
+	_objectState[23] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE19, COMBINABLE, 18, 0, 0);
+	_objectState[24] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE20, COMBINABLE, 19, 0, 0);
+	_objectState[25] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE21, COMBINABLE, 20, 0, 0);
+	_objectState[26] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE22, COMBINABLE, 21, 0, 0);
+	_objectState[27] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE23, COMBINABLE, 22, 0, 0);
+	_objectState[28] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE24, COMBINABLE, 23, 0, 0);
+	_objectState[29] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE25, COMBINABLE, 24, 0, 0);
 }
 
 void Pyramid::onEntrance() {
@@ -2174,6 +2205,75 @@ void Pyramid::animation() {
 }
 
 bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
+	Object *rope, *hole;
+	rope = hole = nullptr;
+
+	if (obj1._id == ROPE)
+		rope = &obj1;
+	if (obj2._id == ROPE)
+		rope = &obj2;
+	if (obj1._id >= HOLE1 && obj1._id <= HOLE25)
+		hole = &obj1;
+	if (obj2._id >= HOLE1 && obj2._id <= HOLE25)
+		hole = &obj2;
+
+	if (verb == ACTION_WALK && obj1._id == PYRA_ENTRANCE) {
+		_gm->_state._eventCallback = kPyramidEndFn;
+		_gm->_state._eventTime = g_system->getMillis() + 3600000; //hour
+		_gm->_state._pyraS = 4;
+		_gm->_state._pyraZ = 10;
+		_gm->_state._pyraDirection = 0;
+		_gm->passageConstruction();
+		return false;
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, SIGN)) {
+		if (rope->_type & CARRIED) {
+			_vm->renderImage(1);
+			_gm->_inventory.remove(*rope);
+			_objectState[0]._click = 29;
+		}
+		else
+			_vm->renderMessage(kStringPyramid1);
+	} else if (verb == ACTION_USE && hole != nullptr && rope != nullptr) {
+		if (rope->_type & CARRIED)
+			_vm->renderMessage(kStringPyramid2);
+		else {
+			int number = hole->_id - HOLE1;
+			int start = number / 5 * 5 + 2;
+			for (int i = 1; i <= 26; i++)
+				_vm->renderImage(i + 128);
+			for (int i = start; i <= start + number % 5; i++)
+				_vm->renderImage(i);
+			_objectState[0]._click = 30;
+			if (number == 18) {
+				_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownTrue);
+				_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 5;
+				_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = EXIT;
+			} else {
+				_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+				_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+				_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+			}
+		}
+	} else if (verb == ACTION_PULL && rope != nullptr && !(rope->_type & CARRIED) &&
+			!isSectionVisible(1)) {
+		for (int i = 2; i <= 26; i++)
+			_vm->renderImage(i + 128);
+		_vm->renderImage(1);
+		_objectState[0]._click = 29;
+		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+	} else if (verb == ACTION_TAKE && rope != nullptr && !(rope->_type & CARRIED)) {
+		for (int i = 2; i <= 26; i++)
+			_vm->renderImage(i + 128);
+		_gm->takeObject(*rope);
+		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+	} else if (verb == ACTION_WALK && obj1._type == SUN) {
+		_vm->renderMessage(kStringPyramid3);
+	} else
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index cbd3fdc..d5decde 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -46,6 +46,10 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._elevatorE);
 	out->writeByte(_state._elevatorNumber);
 	out->writeByte(_state._toMuseum);
+	out->writeByte(_state._pyraE);
+	out->writeByte(_state._pyraS);
+	out->writeByte(_state._pyraZ);
+	out->writeByte(_state._pyraDirection);
 	out->writeUint32LE(_state._eventTime);
 	out->writeSint32LE(_state._eventCallback);
 
@@ -84,6 +88,10 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._elevatorE = in->readByte();
 	_state._elevatorNumber = in->readByte();
 	_state._toMuseum = in->readByte();
+	_state._pyraE = in->readByte();
+	_state._pyraS = in->readByte();
+	_state._pyraZ = in->readByte();
+	_state._pyraDirection = in->readByte();
 	_state._eventTime = in->readUint32LE();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -356,6 +364,10 @@ void GameManager::initState() {
 	_state._elevatorE = 0;
 	_state._elevatorNumber = 0;
 	_state._toMuseum = false;
+	_state._pyraE = 0;
+	_state._pyraS = 4;
+	_state._pyraZ = 10;
+	_state._pyraDirection = 0;
 	_state._eventTime = kMaxTimerValue;
 	_state._eventCallback = kNoFn;
 }
@@ -493,6 +505,9 @@ void GameManager::updateEvents() {
 		case kSoberFn:
 			sober();
 			break;
+		case kPyramidEndFn:
+			pyramidEnd();
+			break;
 		}
 		_vm->_allowLoadGame = true;
 		_vm->_allowSaveGame = true;
@@ -1722,5 +1737,11 @@ bool GameManager::talkRest(int mod1, int mod2, int rest) {
 	return true;
 }
 
+void GameManager::pyramidEnd() {
+}
+
+void GameManager::passageConstruction() {
+}
+
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 2834851..4ea4907 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -33,7 +33,7 @@ namespace Supernova2 {
 
 const int32 kMaxTimerValue = 0x7FFFFFFF;
 
-enum EventFunction { kNoFn, kSoberFn};
+enum EventFunction { kNoFn, kSoberFn, kPyramidEndFn};
 
 struct GameState {
 	int16 _money;
@@ -49,6 +49,10 @@ struct GameState {
 	bool _toMuseum;
 	EventFunction _eventCallback;
 	uint32 _eventTime;
+	char _pyraE;
+	char _pyraS;
+	char _pyraZ;
+	char _pyraDirection;
 };
 
 class Inventory {
@@ -215,6 +219,8 @@ public:
 	void drawGUI();
 	bool talk(int mod1, int mod2, int rest, MessagePosition pos, StringId id);
 	bool talkRest(int mod1, int mod2, int rest);
+	void pyramidEnd();
+	void passageConstruction();
 
 private:
 	int _prevImgId;


Commit: 29f83a0887eaeb53f08f874e5767c8699991cd1f
    https://github.com/scummvm/scummvm/commit/29f83a0887eaeb53f08f874e5767c8699991cd1f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Finish Pyramid, add PyrEntrance rooms

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 4afbd75..3006c5e 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -88,7 +88,7 @@ enum RoomId {
 	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
 	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO_F,TOMATO_N,
 	MONSTER_F,MONSTER1_N,MONSTER2_N,UPSTAIRS3,DOWNSTAIRS3,
-	LGANG1,LGANG2,HOLE_ROOM,IN_HOLE,BODENTUER,BODENTUER_U,
+	LGANG1,LGANG2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
 	BST_DOOR,HALL,COFFIN_ROOM,MASK,
 
 	MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
@@ -101,7 +101,7 @@ enum ObjectId {
 	INVALIDOBJECT = -1,
 	NULLOBJECT = 0,
 	TAXI=1,WALLET,TRANSMITTER,KNIFE,ROD,OCCUPIED_CABIN,MONEY,
-	SLOT1,CHAIR,GANG,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON,
+	SLOT1,CHAIR,CORRIDOR,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON,
 	PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7,
 	PART8,PART9,PART10,PART11,PART12,PART13,PART14,PART15,
 	TKNIFE,ROPE,NOTE,MOUTH,
@@ -146,16 +146,16 @@ kString80, kString81, kString82, kString83, kString84,
 kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kString93, kString94,
 kStringEntrance, kStringDoor, kString97, kString98, kString99,
-kString100, kString101, kString102, kStringDinosaurHead, kString104,
+kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
-kString110, kString111, kString112, kStringPyramid1, kStringPyramid2,
-kStringPyramid3, kString116, kString117, kString118, kString119,
+kString110, kString111, kStringPyramid0, kStringPyramid1, kStringPyramid2,
+kStringPyramid3, kStringPyramid4, kString117, kString118, kString119,
 kString120, kString121, kString122, kString123, kString124,
 kString125, kString126, kString127, kString128, kString129,
-kString130, kString131, kString132, kString133, kString134,
-kString135, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
-kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kString144,
-kString145, kString146, kString147, kString148, kString149,
+kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
+kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
+kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
+kStringRight, kStringLeft, kString147, kString148, kString149,
 kString150, kString151, kString152, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
 kString160, kString161, kString162, kStringSlot, kString164,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 7074731..b4fdb48 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -62,7 +62,8 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{51,     0,      6010},
 	{50,     0,        -1},
 	{51,     6010,   9020},
-	{54,     0,        -1}
+	{54,     0,        -1},
+	{50,     0,        -1}
 };
 
 static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 7bbd537..87b2cea 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2161,13 +2161,13 @@ Pyramid::Pyramid(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 8;
 	_id = PYRAMID;
 	_shown[0] = kShownTrue;
 
 	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + 128);
 	_objectState[1] = Object(_id, kStringSign, kStringSignDescription, SIGN, COMBINABLE, 25, 25, 0);
-	_objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 19);
+	_objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 7);
 	_objectState[3] = Object(_id, kStringPyramid, kStringPyramidDescription, NULLOBJECT, NULLTYPE, 26, 26, 0);
 	_objectState[4] = Object(_id, kStringSun, kStringSunDescription, SUN, NULLTYPE, 28, 28, 0);
 	_objectState[5] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE1, COMBINABLE, 0, 0, 0);
@@ -2270,7 +2270,7 @@ bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
 		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
 		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
-	} else if (verb == ACTION_WALK && obj1._type == SUN) {
+	} else if (verb == ACTION_WALK && obj1._id == SUN) {
 		_vm->renderMessage(kStringPyramid3);
 	} else
 		return false;
@@ -2281,19 +2281,117 @@ PyrEntrance::PyrEntrance(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 9;
 	_id = PYR_ENTRANCE;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownFalse;
+	_shown[2] = kShownFalse;
+	_shown[3] = kShownFalse;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownFalse;
+	_shown[6] = kShownFalse;
+	_shown[7] = kShownFalse;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSign, kStringSign5Description, SIGN, NULLTYPE, 255, 255, 0);
+	_objectState[1] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[2] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[3] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void PyrEntrance::onEntrance() {
-	setRoomSeen(true);
+	if (_gm->_state._pyraS != 8 || _gm->_state._pyraZ != 5)
+		_waitTime = 0;
 }
 
 void PyrEntrance::animation() {
+	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
+		if (_waitTime == 700) { // around 1 minute
+			_vm->renderMessage(kStringPyramid4);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_gm->_state._pyraZ++;
+			_gm->_state._pyraDirection = 0;
+			_gm->changeRoom(FLOORDOOR);
+			_vm->setCurrentImage(14);
+			_vm->renderRoom(*_gm->_rooms[FLOORDOOR]);
+			_gm->drawMapExits();
+			_gm->wait(3);
+			_vm->renderImage(5);
+			_gm->wait(3);
+			_vm->renderImage(6);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(5, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(7);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(6, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(8);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(7, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(9);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(8, kShownFalse);
+			_vm->playSound(kAudioPyramid1);
+			_gm->screenShake();
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(kMaxSection - 1, kShownTrue);
+		}
+		else {
+			_waitTime++;
+			_gm->setAnimationTimer(1);
+		}
+	}
+	else
+		_gm->setAnimationTimer(kMaxTimerValue);
 }
 
 bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+	static RoomEntry roomTab[29] = {
+		{2, 8, 6, 0, FLOORDOOR},
+		{0, 8, 4, 2, FLOORDOOR_U},
+		{0, 4, 11, 2, PYRAMID},
+		{0, 0, 2, 1, UPSTAIRS1},
+		{1, 1, 2, 3, DOWNSTAIRS1},
+		{0, 5, 8, 3, BOTTOM_RIGHT_DOOR},
+		{0, 4, 8, 1, BOTTOM_LEFT_DOOR},
+		{1, 5, 8, 3, UPPER_DOOR},
+		{1, 4, 8, 1, UPPER_DOOR},
+		{0, 4, 8, 0, UPSTAIRS2},
+		{1, 4, 7, 2, DOWNSTAIRS2},
+		{1, 6, 6, 2, PUZZLE_FRONT},
+		{1, 6, 7, 0, PUZZLE_BEHIND},
+		{0, 3, 6, 0, FORMULA1_N},
+		{0, 3, 7, 0, FORMULA1_F},
+		{0, 4, 6, 0, FORMULA2_N},
+		{0, 4, 7, 0, FORMULA2_F},
+		{0, 8, 9, 2, TOMATO_N},
+		{0, 8, 8, 2, TOMATO_F},
+		{1, 4, 2, 0, MONSTER_F},
+		{1, 10, 8, 0, MONSTER_F},
+		{1, 4, 1, 0, MONSTER1_N},
+		{1, 10, 7, 0, MONSTER2_N},
+		{0, 2, 4, 2, DOWNSTAIRS3},
+		{1, 2, 5, 0, UPSTAIRS3},
+		{1, 2, 5, 3, LGANG1},
+		{1, 1, 5, 1, LGANG2},
+		{1, 1, 5, 3, HOLE_ROOM},
+		{0, 7, 4, 0, BST_DOOR}
+	};
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (_gm->_rooms[FLOORDOOR]->isSectionVisible(kMaxSection - 1))
+		roomTab[0]._e = 1;
+	else
+		roomTab[0]._e = 2;
+	for (int i = 0; i < 29; i++) {
+		if (_gm->_state._pyraE == roomTab[i]._e &&
+			_gm->_state._pyraS == roomTab[i]._s &&
+			_gm->_state._pyraZ == roomTab[i]._z &&
+			_gm->_state._pyraDirection == roomTab[i]._r) {
+			_gm->changeRoom(roomTab[i]._exitRoom);
+			return true;
+		}
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 
@@ -2777,43 +2875,44 @@ bool InHole::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-Bodentuer::Bodentuer(Supernova2Engine *vm, GameManager *gm) {
+Floordoor::Floordoor(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
 	_fileNumber = 6;
-	_id = BODENTUER;
+	_id = FLOORDOOR;
 	_shown[0] = kShownTrue;
+	_shown[14] = kShownTrue;
 }
 
-void Bodentuer::onEntrance() {
+void Floordoor::onEntrance() {
 	setRoomSeen(true);
 }
 
-void Bodentuer::animation() {
+void Floordoor::animation() {
 }
 
-bool Bodentuer::interact(Action verb, Object &obj1, Object &obj2) {
+bool Floordoor::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-BodentuerU::BodentuerU(Supernova2Engine *vm, GameManager *gm) {
+FloordoorU::FloordoorU(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
 	_fileNumber = 6;
-	_id = BODENTUER_U;
+	_id = FLOORDOOR_U;
 	_shown[0] = kShownTrue;
 }
 
-void BodentuerU::onEntrance() {
+void FloordoorU::onEntrance() {
 	setRoomSeen(true);
 }
 
-void BodentuerU::animation() {
+void FloordoorU::animation() {
 }
 
-bool BodentuerU::interact(Action verb, Object &obj1, Object &obj2) {
+bool FloordoorU::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index aed6901..1f3faac 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -37,6 +37,14 @@ namespace Supernova2 {
 class GameManager;
 class Supernova2Engine;
 
+struct RoomEntry {
+	int _e;
+	int _s;
+	int _z;
+	int _r;
+	RoomId _exitRoom;
+};
+
 class Room {
 public:
 	Room();
@@ -242,6 +250,7 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	int _waitTime;
 };
 
 class Upstairs1 : public Room {
@@ -484,9 +493,9 @@ public:
 private:
 };
 
-class Bodentuer : public Room {
+class Floordoor : public Room {
 public:
-	Bodentuer(Supernova2Engine *vm, GameManager *gm);
+	Floordoor(Supernova2Engine *vm, GameManager *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -494,9 +503,9 @@ public:
 private:
 };
 
-class BodentuerU : public Room {
+class FloordoorU : public Room {
 public:
-	BodentuerU(Supernova2Engine *vm, GameManager *gm);
+	FloordoorU(Supernova2Engine *vm, GameManager *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index d54bac9..2da2ac2 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -49,6 +49,7 @@ enum AudioId {
 	kAudioShip3,
 	kAudioShipDeath,
 	kAudioDeath,
+	kAudioPyramid1,
 	kAudioNumSamples
 };
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index d5decde..ffd10be 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -46,10 +46,10 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._elevatorE);
 	out->writeByte(_state._elevatorNumber);
 	out->writeByte(_state._toMuseum);
-	out->writeByte(_state._pyraE);
+	out->writeSint16LE(_state._pyraE);
 	out->writeByte(_state._pyraS);
 	out->writeByte(_state._pyraZ);
-	out->writeByte(_state._pyraDirection);
+	out->writeSint16LE(_state._pyraDirection);
 	out->writeUint32LE(_state._eventTime);
 	out->writeSint32LE(_state._eventCallback);
 
@@ -88,10 +88,10 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._elevatorE = in->readByte();
 	_state._elevatorNumber = in->readByte();
 	_state._toMuseum = in->readByte();
-	_state._pyraE = in->readByte();
+	_state._pyraE = in->readSint16LE();
 	_state._pyraS = in->readByte();
 	_state._pyraZ = in->readByte();
-	_state._pyraDirection = in->readByte();
+	_state._pyraDirection = in->readSint16LE();
 	_state._eventTime = in->readUint32LE();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -287,8 +287,8 @@ void GameManager::destroyRooms() {
 	delete _rooms[LGANG2];
 	delete _rooms[HOLE_ROOM];
 	delete _rooms[IN_HOLE];
-	delete _rooms[BODENTUER];
-	delete _rooms[BODENTUER_U];
+	delete _rooms[FLOORDOOR];
+	delete _rooms[FLOORDOOR_U];
 	delete _rooms[BST_DOOR];
 	delete _rooms[HALL];
 	delete _rooms[COFFIN_ROOM];
@@ -413,8 +413,8 @@ void GameManager::initRooms() {
 	_rooms[LGANG2] = new LGang2(_vm, this);
 	_rooms[HOLE_ROOM] = new HoleRoom(_vm, this);
 	_rooms[IN_HOLE] = new InHole(_vm, this);
-	_rooms[BODENTUER] = new Bodentuer(_vm, this);
-	_rooms[BODENTUER_U] = new BodentuerU(_vm, this);
+	_rooms[FLOORDOOR] = new Floordoor(_vm, this);
+	_rooms[FLOORDOOR_U] = new FloordoorU(_vm, this);
 	_rooms[BST_DOOR] = new BstDoor(_vm, this);
 	_rooms[HALL] = new Hall(_vm, this);
 	_rooms[COFFIN_ROOM] = new CoffinRoom(_vm, this);
@@ -787,6 +787,15 @@ bool GameManager::isNullObject(Object *obj) {
 	return obj == &_nullObject;
 }
 
+void GameManager::screenShake() {
+	for (int i = 0; i < 12; ++i) {
+		_vm->_system->setShakePos(8);
+		wait(1);
+		_vm->_system->setShakePos(0);
+		wait(1);
+	}
+}
+
 void GameManager::showMenu() {
 	_vm->renderBox(0, 138, 320, 62, 0);
 	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
@@ -799,15 +808,20 @@ void GameManager::drawMapExits() {
 // TODO: Preload _exitList on room entry instead on every call
 	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
 
-	for (int i = 0; i < 25; i++)
-		_exitList[i] = -1;
-	for (int i = 0; i < kMaxObject; i++) {
-		if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
-			byte r = _currentRoom->getObject(i)->_direction;
-			_exitList[r] = i;
-			int x = 284 + 7 * (r % 5);
-			int y = 164 + 7 * (r / 5);
-			_vm->renderBox(x, y, 5, 5, kColorDarkRed);
+	if ((_currentRoom >= _rooms[PYR_ENTRANCE] && _currentRoom <= _rooms[HOLE_ROOM]) ||
+		(_currentRoom >= _rooms[FLOORDOOR] && _currentRoom <= _rooms[BST_DOOR]))
+		compass();
+	else {
+		for (int i = 0; i < 25; i++)
+			_exitList[i] = -1;
+		for (int i = 0; i < kMaxObject; i++) {
+			if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
+				byte r = _currentRoom->getObject(i)->_direction;
+				_exitList[r] = i;
+				int x = 284 + 7 * (r % 5);
+				int y = 164 + 7 * (r / 5);
+				_vm->renderBox(x, y, 5, 5, kColorDarkRed);
+			}
 		}
 	}
 }
@@ -1738,9 +1752,247 @@ bool GameManager::talkRest(int mod1, int mod2, int rest) {
 }
 
 void GameManager::pyramidEnd() {
+	_vm->renderMessage(kStringPyramid0);
+	waitOnInput(_messageDuration);
+	_vm->removeMessage();
+	_vm->paletteFadeOut();
+	_vm->loadGame(kSleepAutosaveSlot);
+	changeRoom(CABIN);
+	drawGUI();
+	_rooms[CABIN]->setSectionVisible(kMaxSection - 1, kShownFalse);
+	_rooms[CABIN]->setSectionVisible(kMaxSection - 2, kShownTrue);
+	_rooms[CABIN]->setSectionVisible(1, kShownFalse);
 }
 
 void GameManager::passageConstruction() {
+	static ConstructionEntry constructionTab[9] = {
+		{0, 4, 10, 2, 13},
+		{0, 4, 9,  2, 14},
+		{0, 4, 8,  3,  2},
+		{1, 4, 7,  3,  1},
+		{1, 5, 7,  3,  3},
+		{1, 6, 7,  3,  5},
+		{1, 4, 7,  1,  2},
+		{1, 2, 5,  1,  1},
+		{0, 4, 9,  2, 20}
+	};
+
+	changeRoom(PYR_ENTRANCE);
+	_rooms[PYR_ENTRANCE]->setSectionVisible(1, 
+			!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 0, -1));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(2, 
+			!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 0,  1));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(7, 
+			wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 1,  0));
+
+	if (!_rooms[PYR_ENTRANCE]->isSectionVisible(7)) {
+		_rooms[PYR_ENTRANCE]->getObject(3)->_type = EXIT;
+		_rooms[PYR_ENTRANCE]->getObject(3)->_click = 0;
+		_rooms[PYR_ENTRANCE]->setSectionVisible(3, 
+				!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 1, -1));
+		_rooms[PYR_ENTRANCE]->setSectionVisible(4, 
+				!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 1,  1));
+		_rooms[PYR_ENTRANCE]->setSectionVisible(8, 
+				wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2,  0));
+		if (!_rooms[PYR_ENTRANCE]->isSectionVisible(8)) {
+			_rooms[PYR_ENTRANCE]->setSectionVisible(5, 
+				   !wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2, -1));
+			_rooms[PYR_ENTRANCE]->setSectionVisible(6, 
+				   !wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2,  1));
+		}
+		else {
+			_rooms[PYR_ENTRANCE]->setSectionVisible(5, kShownFalse);
+			_rooms[PYR_ENTRANCE]->setSectionVisible(6, kShownFalse);
+		}
+	} else {
+		_rooms[PYR_ENTRANCE]->getObject(3)->_type = NULLTYPE;
+		_rooms[PYR_ENTRANCE]->getObject(3)->_click = 255;
+		_rooms[PYR_ENTRANCE]->setSectionVisible(3, kShownFalse);
+		_rooms[PYR_ENTRANCE]->setSectionVisible(4, kShownFalse);
+		_rooms[PYR_ENTRANCE]->setSectionVisible(8, kShownFalse);
+	}
+	for (int i = 0; i < 9; i++) {
+		bool b = (_state._pyraE == constructionTab[i]._e &&
+			 _state._pyraS == constructionTab[i]._s &&
+			 _state._pyraZ == constructionTab[i]._z &&
+			 _state._pyraDirection == constructionTab[i]._r);
+		if (constructionTab[i]._a > 12)
+			_rooms[PYR_ENTRANCE]->setSectionVisible(constructionTab[i]._a, b);
+		else if (b)
+			_rooms[PYR_ENTRANCE]->setSectionVisible(constructionTab[i]._a, kShownTrue);
+	}
+
+	_rooms[PYR_ENTRANCE]->setSectionVisible(18, kShownFalse);
+	_rooms[PYR_ENTRANCE]->setSectionVisible(19, kShownFalse);
+	_rooms[PYR_ENTRANCE]->setSectionVisible(21, kShownFalse);
+	_rooms[PYR_ENTRANCE]->getObject(0)->_click = 255;
+
+	if (_state._pyraE == 0 && _state._pyraS == 4 && _state._pyraZ == 10) {
+		switch (_state._pyraDirection) {
+		case 0:
+			_rooms[PYR_ENTRANCE]->setSectionVisible(19, kShownTrue);
+			_rooms[PYR_ENTRANCE]->getObject(0)->_click = 8;
+			break;
+		case 2:
+			_rooms[PYR_ENTRANCE]->setSectionVisible(18, kShownTrue);
+			_rooms[PYR_ENTRANCE]->getObject(0)->_click = 7;
+			break;
+		case 1:
+			_rooms[PYR_ENTRANCE]->setSectionVisible(21, kShownTrue);
+			_rooms[PYR_ENTRANCE]->getObject(0)->_click = 9;
+			break;
+		}
+	}
+	_rooms[PYR_ENTRANCE]->setSectionVisible(9, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(1));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(10, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(2));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(11, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(3));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(12, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(4));
+}
+
+byte GameManager::wall(int s, int z, int direction, int stepsForward, int stepsRight) {
+	static char vertical[2][12][11] = {
+		{
+			{0,0,0,0,0,0,0,0,0,0,0},
+			{0,1,0,0,0,0,0,0,0,0,0},
+			{1,0,1,0,0,0,0,0,0,0,0},
+			{1,0,1,0,1,0,0,0,0,0,0},
+			{0,1,0,0,1,0,0,1,0,0,0},
+			{0,0,1,0,0,0,1,0,1,0,0},
+			{0,0,0,1,1,0,1,0,0,0,0},
+			{0,0,0,1,1,0,0,1,0,0,0},
+			{0,0,0,0,0,1,0,1,0,0,0},
+			{0,0,0,0,0,1,1,0,1,0,0},
+			{0,0,0,0,1,0,0,0,1,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0}
+		},
+		{
+			{0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0},
+			{0,1,0,1,0,0,0,0,0,0,0},
+			{0,1,0,1,1,0,0,0,0,0,0},
+			{1,0,0,0,1,0,0,0,0,0,0},
+			{0,0,0,0,0,1,0,0,1,0,0},
+			{0,0,0,0,0,0,1,1,0,0,1},
+			{0,0,0,0,0,1,0,1,0,0,1},
+			{0,0,0,0,1,0,1,0,1,1,0},
+			{0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0}
+		}
+	};
+
+	static char horizontal[2][11][12] = {
+		{
+			{0,1,1,0,0,0,0,0,0,0,0,0},
+			{0,0,1,0,0,0,0,0,0,0,0,0},
+			{0,1,0,1,1,0,0,0,0,0,0,0},
+			{0,1,1,0,0,0,0,0,0,0,0,0},
+			{0,0,1,0,0,1,1,0,1,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,0,0,0,1,0,0,0,0},
+			{0,0,0,0,1,1,0,0,0,0,0,0},
+			{0,0,0,0,0,1,0,1,1,0,0,0},
+			{0,0,0,0,0,1,1,0,0,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0}
+		},
+		{
+			{0,0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0},
+			{0,1,0,0,1,0,0,0,0,0,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0,0},
+			{0,0,1,1,0,0,0,0,0,0,0,0},
+			{0,1,1,0,0,1,0,0,0,0,0,0},
+			{0,0,0,0,0,0,1,0,1,0,0,0},
+			{0,0,0,0,0,1,1,0,0,0,0,0},
+			{0,0,0,0,0,1,0,1,1,0,1,0},
+			{0,0,0,0,0,1,1,0,0,1,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0}
+		}
+	};
+	int newR;
+	if (stepsRight) {
+		if (stepsRight > 0)
+			newR = (direction + 1) & 3;
+		else {
+			newR = (direction - 1) & 3;
+			stepsRight = -stepsRight;
+		}
+		switch (direction) {
+		case 0:
+			return wall(s, z - stepsForward, newR, stepsRight, 0);
+		case 2:
+			return wall(s, z + stepsForward, newR, stepsRight, 0);
+		case 1:
+			return wall(s + stepsForward, z, newR, stepsRight, 0);
+		case 3:
+			return wall(s - stepsForward, z, newR, stepsRight, 0);
+		}
+	}
+	switch (direction) {
+	case 0:
+		return vertical  [_state._pyraE][z + 1 - stepsForward][s] == 0;
+	case 2:
+		return vertical  [_state._pyraE][z     + stepsForward][s] == 0;
+	case 1:
+		return horizontal[_state._pyraE][z][s     + stepsForward] == 0;
+	case 3:
+		return horizontal[_state._pyraE][z][s + 1 - stepsForward] == 0;
+	}
+	return 0;
+}
+
+bool GameManager::move(Action verb, Object &obj) {
+	if (verb == ACTION_WALK && obj._id == CORRIDOR) {
+		switch (_state._pyraDirection) {
+			case 0:
+				_state._pyraZ--;
+				break;
+			case 1:
+				_state._pyraS++;
+				break;
+			case 2:
+				_state._pyraZ++;
+				break;
+			case 3:
+				_state._pyraS--;
+				break;
+		}
+	} else if (verb == ACTION_WALK && obj._id == G_RIGHT) {
+		_state._pyraDirection++;
+		_state._pyraDirection &= 3;
+	} else if (verb == ACTION_WALK && obj._id == G_LEFT) {
+		_state._pyraDirection--;
+		_state._pyraDirection &= 3;
+	} else
+		return false;
+	return true;
+}
+
+void GameManager::compass() {
+	static StringId dirs[7] = {
+		kStringDirection1,
+		kStringDirection2,
+		kStringDirection3,
+		kStringDirection4,
+		kStringDirection1,
+		kStringDirection2,
+		kStringDirection3
+	};
+	_vm->renderBox(281, 161, 39, 39, kColorWhite63);
+	_vm->renderBox(295, 180, 13,  3, kColorDarkBlue);
+	_vm->renderBox(300, 175,  3, 13, kColorDarkBlue);
+	_vm->renderText(dirs[_state._pyraDirection    ], 299, 163, kColorBlack);
+	_vm->renderText(dirs[_state._pyraDirection + 1], 312, 179, kColorBlack);
+	_vm->renderText(dirs[_state._pyraDirection + 2], 299, 191, kColorBlack);
+	_vm->renderText(dirs[_state._pyraDirection + 3], 283, 179, kColorBlack);
 }
 
 }
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 4ea4907..2be9826 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -31,6 +31,14 @@
 
 namespace Supernova2 {
 
+struct ConstructionEntry {
+	int _e;
+	int _s;
+	int _z;
+	int _r;
+	int _a;
+};
+
 const int32 kMaxTimerValue = 0x7FFFFFFF;
 
 enum EventFunction { kNoFn, kSoberFn, kPyramidEndFn};
@@ -49,10 +57,10 @@ struct GameState {
 	bool _toMuseum;
 	EventFunction _eventCallback;
 	uint32 _eventTime;
-	char _pyraE;
+	int16 _pyraE;
 	char _pyraS;
 	char _pyraZ;
-	char _pyraDirection;
+	int16 _pyraDirection;
 };
 
 class Inventory {
@@ -171,6 +179,7 @@ public:
 	byte _dials[6];
 	int _taxi_possibility;
 
+
 	void takeObject(Object &obj);
 	void setObjectNull(Object *&obj);
 	bool isNullObject(Object *obj);
@@ -185,6 +194,7 @@ public:
 	void wait(int ticks);
 	void waitOnInput(int ticks);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
+	void screenShake();
 	void showMenu();
 	void animationOff();
 	void animationOn();
@@ -221,6 +231,9 @@ public:
 	bool talkRest(int mod1, int mod2, int rest);
 	void pyramidEnd();
 	void passageConstruction();
+	byte wall(int s, int z, int direction, int stepsForward, int stepsRight);
+	bool move(Action verb, Object &obj);
+	void compass();
 
 private:
 	int _prevImgId;


Commit: aa7b4a2c97ed319aa01bbff0bfa496ad50b327c8
    https://github.com/scummvm/scummvm/commit/aa7b4a2c97ed319aa01bbff0bfa496ad50b327c8
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Upstairs1 room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 87b2cea..9f387a1 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2399,9 +2399,15 @@ Upstairs1::Upstairs1(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 10;
 	_id = UPSTAIRS1;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void Upstairs1::onEntrance() {
@@ -2412,6 +2418,16 @@ void Upstairs1::animation() {
 }
 
 bool Upstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: 9a4d7eca38dabd28db1643f31db670735f1e737f
    https://github.com/scummvm/scummvm/commit/9a4d7eca38dabd28db1643f31db670735f1e737f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Downstairs1 room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9f387a1..d190bb5 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2438,6 +2438,12 @@ Downstairs1::Downstairs1(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 6;
 	_id = DOWNSTAIRS1;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
 }
 
 void Downstairs1::onEntrance() {
@@ -2448,6 +2454,16 @@ void Downstairs1::animation() {
 }
 
 bool Downstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: aaffee83c0e0bdbd79f8ea629d5971ef1c8bc9ab
    https://github.com/scummvm/scummvm/commit/aaffee83c0e0bdbd79f8ea629d5971ef1c8bc9ab
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add BottomRightDoor room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 3006c5e..d46dbe0 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -148,14 +148,14 @@ kString90, kString91, kString92, kString93, kString94,
 kStringEntrance, kStringDoor, kString97, kString98, kString99,
 kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
-kString110, kString111, kStringPyramid0, kStringPyramid1, kStringPyramid2,
+kStringMassive, kString111, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kString117, kString118, kString119,
 kString120, kString121, kString122, kString123, kString124,
 kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
-kStringRight, kStringLeft, kString147, kString148, kString149,
+kStringRight, kStringLeft, kStringButton, kString148, kString149,
 kString150, kString151, kString152, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
 kString160, kString161, kString162, kStringSlot, kString164,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index d190bb5..9de8946 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2471,9 +2471,18 @@ BottomRightDoor::BottomRightDoor(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 12;
 	_id = BOTTOM_RIGHT_DOOR;
 	_shown[0] = kShownTrue;
+	_shown[19] = kShownTrue;
+	_shown[23] = kShownTrue;
+	_shown[29] = kShownTrue;
+	_shown[30] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
+	_objectState[3] = Object(_id, kStringButton, kStringDefaultDescription, BUTTON, PRESS, 19, 19, 0);
 }
 
 void BottomRightDoor::onEntrance() {
@@ -2484,6 +2493,73 @@ void BottomRightDoor::animation() {
 }
 
 bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	}
+	else if (verb == ACTION_PRESS && obj1._id == BUTTON) {
+		if (isSectionVisible(22)) {
+			_vm->renderImage(21);
+			setSectionVisible(22, kShownFalse);
+			_gm->wait(2);
+			_vm->renderImage(20);
+			setSectionVisible(21, kShownFalse);
+			_gm->wait(2);
+			_vm->renderImage(19);
+			setSectionVisible(20, kShownFalse);
+			_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+			_objectState[2]._id = DOOR;
+			_objectState[2]._description = kStringMassive;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = DOOR;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringMassive;
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_id = CORRIDOR;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringDefaultDescription;
+		} else {
+			_vm->renderImage(20);
+			setSectionVisible(19, kShownFalse);
+			_gm->wait(2);
+			_vm->renderImage(21);
+			_gm->wait(2);
+			_vm->renderImage(22);
+			_objectState[2]._type = EXIT;
+			_objectState[2]._id = CORRIDOR;
+			_objectState[2]._description = kStringDefaultDescription;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = CORRIDOR;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringDefaultDescription;
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_id = DOOR;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringMassive;
+		}
+		_vm->playSound(kAudioPyramid1);
+		_gm->screenShake();
+	}
+	else
+		return false;
 	return true;
 }
 


Commit: f4a2441a7cd5813007c3b4e4eb2d4aa3d0f53769
    https://github.com/scummvm/scummvm/commit/f4a2441a7cd5813007c3b4e4eb2d4aa3d0f53769
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add BotomLeftDoor room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9de8946..b6fa63f 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2570,6 +2570,12 @@ BottomLeftDoor::BottomLeftDoor(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 6;
 	_id = BOTTOM_LEFT_DOOR;
 	_shown[0] = kShownTrue;
+	_shown[19] = kShownTrue;
+	_shown[29] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void BottomLeftDoor::onEntrance() {
@@ -2580,6 +2586,15 @@ void BottomLeftDoor::animation() {
 }
 
 bool BottomLeftDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		if (verb == ACTION_WALK && obj1._id == G_LEFT)
+			_gm->changeRoom(UPSTAIRS2);
+		else
+			_gm->passageConstruction();
+		_gm->_newRoom = true;
+	}
+	else
+		return false;
 	return true;
 }
 


Commit: 277b4eeac70caf59af64c792d2dbb06f88313f4d
    https://github.com/scummvm/scummvm/commit/277b4eeac70caf59af64c792d2dbb06f88313f4d
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Upstairs2 room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index b6fa63f..4a9a2a2 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2602,9 +2602,14 @@ Upstairs2::Upstairs2(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 10;
 	_id = UPSTAIRS2;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void Upstairs2::onEntrance() {
@@ -2615,6 +2620,19 @@ void Upstairs2::animation() {
 }
 
 bool Upstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	if (obj1._id == G_RIGHT)
+		_gm->changeRoom(BOTTOM_LEFT_DOOR);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: c8b900bd4a9d4f230e18a4db94c888a211690ae1
    https://github.com/scummvm/scummvm/commit/c8b900bd4a9d4f230e18a4db94c888a211690ae1
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add UpperDoor room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 4a9a2a2..eff6a4d 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2640,9 +2640,15 @@ Downstairs2::Downstairs2(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 10;
 	_id = DOWNSTAIRS2;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
 }
 
 void Downstairs2::onEntrance() {
@@ -2653,6 +2659,17 @@ void Downstairs2::animation() {
 }
 
 bool Downstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
 	return true;
 }
 
@@ -2660,9 +2677,16 @@ UpperDoor::UpperDoor(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 12;
 	_id = UPPER_DOOR;
 	_shown[0] = kShownTrue;
+	_shown[26] = kShownTrue;
+	_shown[27] = kShownTrue;
+	_shown[30] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void UpperDoor::onEntrance() {
@@ -2673,6 +2697,10 @@ void UpperDoor::animation() {
 }
 
 bool UpperDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: d40d52cb2fd9c520044794606c3349157a94a381
    https://github.com/scummvm/scummvm/commit/d40d52cb2fd9c520044794606c3349157a94a381
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add pyramid puzzle

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index d46dbe0..56635b3 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -149,7 +149,7 @@ kStringEntrance, kStringDoor, kString97, kString98, kString99,
 kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
 kStringMassive, kString111, kStringPyramid0, kStringPyramid1, kStringPyramid2,
-kStringPyramid3, kStringPyramid4, kString117, kString118, kString119,
+kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kString119,
 kString120, kString121, kString122, kString123, kString124,
 kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index b4fdb48..7074731 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -62,8 +62,7 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{51,     0,      6010},
 	{50,     0,        -1},
 	{51,     6010,   9020},
-	{54,     0,        -1},
-	{50,     0,        -1}
+	{54,     0,        -1}
 };
 
 static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index eff6a4d..1c2311b 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2330,7 +2330,7 @@ void PyrEntrance::animation() {
 			_gm->wait(3);
 			_vm->renderImage(9);
 			_gm->_rooms[FLOORDOOR]->setSectionVisible(8, kShownFalse);
-			_vm->playSound(kAudioPyramid1);
+			_vm->playSound(kAudioShip3);
 			_gm->screenShake();
 			_gm->_rooms[FLOORDOOR]->setSectionVisible(kMaxSection - 1, kShownTrue);
 		}
@@ -2555,7 +2555,7 @@ bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->_rooms[UPPER_DOOR]->getObject(2)->_id = DOOR;
 			_gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringMassive;
 		}
-		_vm->playSound(kAudioPyramid1);
+		_vm->playSound(kAudioShip3);
 		_gm->screenShake();
 	}
 	else
@@ -2708,9 +2708,45 @@ PuzzleFront::PuzzleFront(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 12;
 	_id = PUZZLE_FRONT;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[9] = kShownTrue;
+	_shown[10] = kShownTrue;
+	_shown[11] = kShownTrue;
+	_shown[12] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[15] = kShownTrue;
+	_shown[30] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 255, 255, 0, PYR_ENTRANCE, 2);
+	_objectState[3] = Object(_id, kStringPiece, kStringDefaultDescription, PART0, PRESS, 3, 3, 0);
+	_objectState[4] = Object(_id, kStringPiece, kStringDefaultDescription, PART1, PRESS, 4, 4, 0);
+	_objectState[5] = Object(_id, kStringPiece, kStringDefaultDescription, PART2, PRESS, 5, 5, 0);
+	_objectState[6] = Object(_id, kStringPiece, kStringDefaultDescription, PART3, PRESS, 6, 6, 0);
+	_objectState[7] = Object(_id, kStringPiece, kStringDefaultDescription, PART4, PRESS, 7, 7, 0);
+	_objectState[8] = Object(_id, kStringPiece, kStringDefaultDescription, PART5, PRESS, 8, 8, 0);
+	_objectState[9] = Object(_id, kStringPiece, kStringDefaultDescription, PART6, PRESS, 9, 9, 0);
+	_objectState[10] = Object(_id, kStringPiece, kStringDefaultDescription, PART7, PRESS, 10, 10, 0);
+	_objectState[11] = Object(_id, kStringPiece, kStringDefaultDescription, PART8, PRESS, 11, 11, 0);
+	_objectState[12] = Object(_id, kStringPiece, kStringDefaultDescription, PART9, PRESS, 12, 12, 0);
+	_objectState[13] = Object(_id, kStringPiece, kStringDefaultDescription, PART10, PRESS, 13, 13, 0);
+	_objectState[14] = Object(_id, kStringPiece, kStringDefaultDescription, PART11, PRESS, 14, 14, 0);
+	_objectState[15] = Object(_id, kStringPiece, kStringDefaultDescription, PART12, PRESS, 15, 15, 0);
+	_objectState[16] = Object(_id, kStringPiece, kStringDefaultDescription, PART13, PRESS, 16, 16, 0);
+	_objectState[17] = Object(_id, kStringPiece, kStringDefaultDescription, PART14, PRESS, 17, 17, 0);
+	_objectState[18] = Object(_id, kStringPiece, kStringDefaultDescription, PART15, PRESS, 18, 18, 0);
 }
 
 void PuzzleFront::onEntrance() {
@@ -2721,6 +2757,67 @@ void PuzzleFront::animation() {
 }
 
 bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
+	MS2Image *image = _vm->_screen->getCurrentImage();
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_PRESS && obj1._id >= PART0 && obj1._id <= PART15) {
+		int pos = obj1._id - PART0;
+		int newPos = 0;
+		if (pos > 3  && _gm->_puzzleField[pos - 4] == 255)
+			newPos = pos - 4;
+		else if (pos < 12 && _gm->_puzzleField[pos + 4] == 255)
+			newPos = pos + 4;
+		else if ((pos % 4) > 0 && _gm->_puzzleField[pos - 1] == 255)
+			newPos = pos - 1;
+		else if ((pos % 4) < 3 && _gm->_puzzleField[pos + 1] == 255)
+			newPos = pos + 1;
+		else {
+			_vm->renderMessage(kStringPyramid5);
+			return true;
+		}
+		int a = _gm->_puzzleField[pos] + 1;
+		_vm->renderImage(a + 128);
+		image->_section[a].x1 = 95 + (newPos % 4) * 33;
+		image->_section[a].x2 = image->_section[a].x1 + 31;
+		image->_section[a].y1 = 24 + (newPos / 4) * 25;
+		image->_section[a].y2 = image->_section[a].y1 + 23;
+		_vm->renderImage(a);
+		_vm->playSound(kAudioTaxiOpen);
+		_gm->_state._puzzleTab[a - 1] = newPos;
+		_gm->_puzzleField[pos] = 255;
+		_gm->_puzzleField[newPos] = a - 1;
+		_objectState[pos + 3]._click = 255;
+		_objectState[newPos + 3]._click = newPos + 3;
+		for (int i = 0; i < 15; i++)
+			if (_gm->_state._puzzleTab[i] != i)
+				return true;
+		
+		_gm->wait(2);
+		_vm->renderImage(16);
+		for (int i = 1; i < 16; i++)
+			setSectionVisible(i, kShownFalse);
+		_gm->wait(2);
+		_vm->renderImage(17);
+		_gm->wait(2);
+		_vm->renderImage(18);
+		_objectState[2]._type = EXIT;
+		_objectState[2]._id = CORRIDOR;
+		_objectState[2]._description = kStringDefaultDescription;
+		_objectState[2]._click = 0;
+		
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(31, kShownFalse);
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(26, kShownTrue);
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(27, kShownTrue);
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(29, kShownTrue);
+		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_type = EXIT;
+		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_id = CORRIDOR;
+		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_description = kStringDefaultDescription;
+		_vm->playSound(kAudioShip3);
+		_gm->screenShake();
+	}
+	else
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 2da2ac2..d54bac9 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -49,7 +49,6 @@ enum AudioId {
 	kAudioShip3,
 	kAudioShipDeath,
 	kAudioDeath,
-	kAudioPyramid1,
 	kAudioNumSamples
 };
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index ffd10be..d0e918f 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -52,6 +52,9 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeSint16LE(_state._pyraDirection);
 	out->writeUint32LE(_state._eventTime);
 	out->writeSint32LE(_state._eventCallback);
+	for (int i = 0; i < 15; i++) {
+		out->writeSint16LE(_state._puzzleTab[i]);
+	}
 
 	// Inventory
 	out->writeSint32LE(_inventory.getSize());
@@ -94,6 +97,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._pyraDirection = in->readSint16LE();
 	_state._eventTime = in->readUint32LE();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
+	for (int i = 0; i < 15; i++)
+		_state._puzzleTab[i] = in->readSint16LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
 
 	_oldTime = g_system->getMillis();
@@ -370,6 +375,9 @@ void GameManager::initState() {
 	_state._pyraDirection = 0;
 	_state._eventTime = kMaxTimerValue;
 	_state._eventCallback = kNoFn;
+	int16 startPuzzleTab[15] = {12, 3, 14, 1, 11, 0, 2, 13, 9, 5, 4, 10, 7, 6, 8};
+	for (int i = 0; i < 15; i++)
+		_state._puzzleTab[i] = startPuzzleTab[i];
 }
 
 void GameManager::initRooms() {
@@ -1490,6 +1498,8 @@ void GameManager::handleInput() {
 }
 
 void GameManager::executeRoom() {
+	if (_currentRoom == _rooms[PUZZLE_FRONT])
+		puzzleConstruction();
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
 		handleInput();
 		if (_mouseClicked) {
@@ -1995,5 +2005,21 @@ void GameManager::compass() {
 	_vm->renderText(dirs[_state._pyraDirection + 3], 283, 179, kColorBlack);
 }
 
+void GameManager::puzzleConstruction() {
+	_vm->setCurrentImage(12);
+	MS2Image *image = _vm->_screen->getCurrentImage();
+	for (int i = 0; i < 16; i ++) {
+		_puzzleField[i] = 255;
+	}
+	for (int i = 0; i < 15; i++) {
+		image->_section[i + 1].x1 = 95 + (_state._puzzleTab[i] % 4) * 33;
+		image->_section[i + 1].x2 = image->_section[i + 1].x1 + 31;
+		image->_section[i + 1].y1 = 24 + (_state._puzzleTab[i] / 4) * 25;
+		image->_section[i + 1].y2 = image->_section[i + 1].y1 + 23;
+
+		_puzzleField[_state._puzzleTab[i]] = i;
+	}
+}
+
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 2be9826..8bd1a02 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -61,6 +61,7 @@ struct GameState {
 	char _pyraS;
 	char _pyraZ;
 	int16 _pyraDirection;
+	int16 _puzzleTab[15];
 };
 
 class Inventory {
@@ -178,6 +179,7 @@ public:
 	byte _rowsStart[6];
 	byte _dials[6];
 	int _taxi_possibility;
+	unsigned char _puzzleField[16];
 
 
 	void takeObject(Object &obj);
@@ -234,6 +236,7 @@ public:
 	byte wall(int s, int z, int direction, int stepsForward, int stepsRight);
 	bool move(Action verb, Object &obj);
 	void compass();
+	void puzzleConstruction();
 
 private:
 	int _prevImgId;


Commit: 3524c4fc1f822e241d52c92c6e54a7e652bdfd85
    https://github.com/scummvm/scummvm/commit/3524c4fc1f822e241d52c92c6e54a7e652bdfd85
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add BehindPuzzle and Formula1F rooms

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 56635b3..6e0fc98 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -148,14 +148,14 @@ kString90, kString91, kString92, kString93, kString94,
 kStringEntrance, kStringDoor, kString97, kString98, kString99,
 kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
-kStringMassive, kString111, kStringPyramid0, kStringPyramid1, kStringPyramid2,
+kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kString119,
 kString120, kString121, kString122, kString123, kString124,
 kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
-kStringRight, kStringLeft, kStringButton, kString148, kString149,
+kStringRight, kStringLeft, kStringButton, kStringInscription, kString149,
 kString150, kString151, kString152, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
 kString160, kString161, kString162, kStringSlot, kString164,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 1c2311b..57ec3b8 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2825,9 +2825,15 @@ PuzzleBehind::PuzzleBehind(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 12;
 	_id = PUZZLE_BEHIND;
 	_shown[0] = kShownTrue;
+	_shown[29] = kShownTrue;
+	_shown[31] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void PuzzleBehind::onEntrance() {
@@ -2838,6 +2844,10 @@ void PuzzleBehind::animation() {
 }
 
 bool PuzzleBehind::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 
@@ -2845,9 +2855,15 @@ Formula1F::Formula1F(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 14;
 	_id = FORMULA1_F;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, DOOR, EXIT, 1, 1, 0, PYR_ENTRANCE, 2);
 }
 
 void Formula1F::onEntrance() {
@@ -2858,6 +2874,12 @@ void Formula1F::animation() {
 }
 
 bool Formula1F::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR)
+		_gm->changeRoom(FORMULA1_N);
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: d7d6ef785d0bb4a6fbac34c82f2e0614f8692f34
    https://github.com/scummvm/scummvm/commit/d7d6ef785d0bb4a6fbac34c82f2e0614f8692f34
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Formula1N room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 57ec3b8..52c0887 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2878,7 +2878,6 @@ bool Formula1F::interact(Action verb, Object &obj1, Object &obj2) {
 		return false;
 	if (obj1._id == CORRIDOR)
 		_gm->changeRoom(FORMULA1_N);
-	_gm->passageConstruction();
 	_gm->_newRoom = true;
 	return true;
 }
@@ -2887,9 +2886,14 @@ Formula1N::Formula1N(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 13;
 	_id = FORMULA1_N;
 	_shown[0] = kShownTrue;
+	_shown[5] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
 }
 
 void Formula1N::onEntrance() {
@@ -2900,6 +2904,10 @@ void Formula1N::animation() {
 }
 
 bool Formula1N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: 933233d7bfcb3bb04bda5f02deeb4423d3cb7e07
    https://github.com/scummvm/scummvm/commit/933233d7bfcb3bb04bda5f02deeb4423d3cb7e07
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Formula2F room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 52c0887..dc68553 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2915,9 +2915,16 @@ Formula2F::Formula2F(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 14;
 	_id = FORMULA2_F;
 	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, DOOR, EXIT, 2, 2, 0, PYR_ENTRANCE, 2);
 }
 
 void Formula2F::onEntrance() {
@@ -2928,6 +2935,11 @@ void Formula2F::animation() {
 }
 
 bool Formula2F::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR)
+		_gm->changeRoom(FORMULA2_N);
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: 2d4b37233d3aa0bb8ca170f8f8c0358c2e78c405
    https://github.com/scummvm/scummvm/commit/2d4b37233d3aa0bb8ca170f8f8c0358c2e78c405
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Formula2N room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index dc68553..bd4c59c 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2947,9 +2947,14 @@ Formula2N::Formula2N(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 13;
 	_id = FORMULA2_N;
 	_shown[0] = kShownTrue;
+	_shown[6] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
 }
 
 void Formula2N::onEntrance() {
@@ -2960,6 +2965,10 @@ void Formula2N::animation() {
 }
 
 bool Formula2N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: 559f6b4e2886d7a292cd81e1c61621f3394c9369
    https://github.com/scummvm/scummvm/commit/559f6b4e2886d7a292cd81e1c61621f3394c9369
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add TomatoF room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index bd4c59c..ef0150e 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2976,9 +2976,15 @@ TomatoF::TomatoF(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 14;
 	_id = TOMATO_F;
 	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringTomato, kStringFunny, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
 }
 
 void TomatoF::onEntrance() {
@@ -2989,6 +2995,11 @@ void TomatoF::animation() {
 }
 
 bool TomatoF::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR)
+		_gm->changeRoom(TOMATO_N);
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: 499f0b47dc36bee2660243448c37aa3593d16e51
    https://github.com/scummvm/scummvm/commit/499f0b47dc36bee2660243448c37aa3593d16e51
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add TomatoN room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 6e0fc98..46747a9 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -155,8 +155,8 @@ kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
-kStringRight, kStringLeft, kStringButton, kStringInscription, kString149,
-kString150, kString151, kString152, kString153, kString154,
+kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
+kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kString153, kString154,
 kString155, kString156, kString157, kString158, kString159,
 kString160, kString161, kString162, kStringSlot, kString164,
 kString165, kString166, kString167, kString168, kStringExit,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index ef0150e..d7a0042 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2984,7 +2984,7 @@ TomatoF::TomatoF(Supernova2Engine *vm, GameManager *gm) {
 
 	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
 	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringTomato, kStringFunny, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+	_objectState[2] = Object(_id, kStringTomato, kStringFunnyDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
 }
 
 void TomatoF::onEntrance() {
@@ -3007,9 +3007,16 @@ TomatoN::TomatoN(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 13;
 	_id = TOMATO_N;
 	_shown[0] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringKnife1, kStringKnife1Description, TKNIFE, TAKE | COMBINABLE, 5, 5, 7);
+	_objectState[3] = Object(_id, kStringTomato, kStringFunnyDescription, NULLOBJECT, UNNECESSARY, 4, 4, 0);
 }
 
 void TomatoN::onEntrance() {
@@ -3020,6 +3027,14 @@ void TomatoN::animation() {
 }
 
 bool TomatoN::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_TAKE && obj1._id == TKNIFE) {
+		_gm->takeObject(obj1);
+		setSectionVisible(8, kShownFalse);
+	} else
+		return false;
 	return true;
 }
 


Commit: 103bd737a52db092a1b5295a10a281a7aaec46e6
    https://github.com/scummvm/scummvm/commit/103bd737a52db092a1b5295a10a281a7aaec46e6
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add missing string to translatin tool

Changed paths:
    devtools/create_supernova2/gametext.h
    devtools/create_supernova2/strings-en.po


diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index 89d46d3..69fa05f 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -773,6 +773,7 @@ const char *gameText[] = {
 "W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.",    //While the other passengers|are disembarking, you are trying|to handle the shock.
 "\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
 "\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"",
+"Sieht gef\204hrlich aus!", //Looks dangerous
 	//"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
 "|", //Dialog separator
 NULL
diff --git a/devtools/create_supernova2/strings-en.po b/devtools/create_supernova2/strings-en.po
index 17646ce..21c95dc 100644
--- a/devtools/create_supernova2/strings-en.po
+++ b/devtools/create_supernova2/strings-en.po
@@ -2778,3 +2778,9 @@ msgid ""
 "werden!\""
 msgstr ""
 "\"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!\""
+
+#: ../../ms2/ms2_pyra.c:1260
+msgid ""
+"Sieht gef„hrlich aus!"
+msgstr ""
+"Looks dangerous!"


Commit: f022350257ed6b286ab6e208e5469fc36c271837
    https://github.com/scummvm/scummvm/commit/f022350257ed6b286ab6e208e5469fc36c271837
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Monster1N room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 46747a9..4146a11 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -149,15 +149,15 @@ kStringEntrance, kStringDoor, kString97, kString98, kString99,
 kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
-kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kString119,
+kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
 kString120, kString121, kString122, kString123, kString124,
 kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
 kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
-kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kString153, kString154,
-kString155, kString156, kString157, kString158, kString159,
+kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
+kStringEyes, kStringMouth, kStringMonster1Description, kString158, kString159,
 kString160, kString161, kString162, kStringSlot, kString164,
 kString165, kString166, kString167, kString168, kStringExit,
 kString170, kStringToothbrush, kString172, kString173, kString174,
@@ -248,8 +248,8 @@ kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
 kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
 kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
 kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
-kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14,
-kStringDialogSeparator
+kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14, 
+kStringMonsterDescription, kStringDialogSeparator
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index d7a0042..a20a96d 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3042,9 +3042,15 @@ MonsterF::MonsterF(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 14;
 	_id = MONSTER_F;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[14] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringMonster, kStringMonsterDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void MonsterF::onEntrance() {
@@ -3055,6 +3061,15 @@ void MonsterF::animation() {
 }
 
 bool MonsterF::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraS == 4)
+			_gm->changeRoom(MONSTER1_N);
+		else
+			_gm->changeRoom(MONSTER2_N);
+	}
+	_gm->_newRoom = true;
 	return true;
 }
 
@@ -3062,9 +3077,17 @@ Monster1N::Monster1N(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 13;
 	_id = MONSTER1_N;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringRope, kStringRopeDescription, ROPE, TAKE | COMBINABLE, 255, 255, 2);
+	_objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
+	_objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
+	_objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
 }
 
 void Monster1N::onEntrance() {
@@ -3075,6 +3098,40 @@ void Monster1N::animation() {
 }
 
 bool Monster1N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
+		if (obj1._type & OPENED)
+			_vm->renderMessage(kStringGenericInteract8);
+		else {
+			obj1._type |= OPENED;
+			if (isSectionVisible(kMaxSection - 1))
+				_vm->renderImage(2);
+			else {
+				_objectState[2]._click = 1;
+				_vm->renderImage(4);
+				setSectionVisible(2, kShownFalse);
+			}
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
+		if (obj1._type & OPENED) {
+			_vm->renderImage(1);
+			setSectionVisible(2, kShownFalse);
+			obj1._type &= ~OPENED;
+			_vm->playSound(kAudioElevator1);
+		} else
+			_vm->renderMessage(kStringGenericInteract11);
+	} else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
+		_gm->takeObject(obj1);
+		setSectionVisible(3, kShownFalse);
+		setSectionVisible(4, kShownFalse);
+		setSectionVisible(kMaxSection - 1, kShownTrue);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
+		_vm->renderMessage(kStringPyramid6);
+	} else
+		return false;
 	return true;
 }
 


Commit: d4f2b81b075f6f1c5d807584c420949a9c03bec2
    https://github.com/scummvm/scummvm/commit/d4f2b81b075f6f1c5d807584c420949a9c03bec2
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Monster2N room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 4146a11..20f2036 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -157,7 +157,7 @@ kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntr
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
 kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
 kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
-kStringEyes, kStringMouth, kStringMonster1Description, kString158, kString159,
+kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
 kString160, kString161, kString162, kStringSlot, kString164,
 kString165, kString166, kString167, kString168, kStringExit,
 kString170, kStringToothbrush, kString172, kString173, kString174,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a20a96d..1d2b357 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3139,9 +3139,17 @@ Monster2N::Monster2N(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 13;
 	_id = MONSTER2_N;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringNote, kStringNoteDescription, NOTE, TAKE | COMBINABLE, 255, 255, 2);
+	_objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
+	_objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
+	_objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
 }
 
 void Monster2N::onEntrance() {
@@ -3152,6 +3160,40 @@ void Monster2N::animation() {
 }
 
 bool Monster2N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
+		if (obj1._type & OPENED)
+			_vm->renderMessage(kStringGenericInteract8);
+		else {
+			obj1._type |= OPENED;
+			if (isSectionVisible(kMaxSection - 1))
+				_vm->renderImage(2);
+			else {
+				_objectState[2]._click = 1;
+				_vm->renderImage(3);
+				setSectionVisible(2, kShownFalse);
+			}
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
+		if (obj1._type & OPENED) {
+			_vm->renderImage(1);
+			setSectionVisible(2, kShownFalse);
+			obj1._type &= ~OPENED;
+			_vm->playSound(kAudioElevator1);
+		} else
+			_vm->renderMessage(kStringGenericInteract11);
+	} else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
+		_gm->takeObject(obj1);
+		setSectionVisible(3, kShownFalse);
+		setSectionVisible(4, kShownFalse);
+		setSectionVisible(kMaxSection - 1, kShownTrue);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
+		_vm->renderMessage(kStringPyramid6);
+	} else
+		return false;
 	return true;
 }
 


Commit: bebaf084a72f0c9f80990ca4c0159d5eff31a5fe
    https://github.com/scummvm/scummvm/commit/bebaf084a72f0c9f80990ca4c0159d5eff31a5fe
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Upstairs3 room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 1d2b357..a23319a 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3201,9 +3201,14 @@ Upstairs3::Upstairs3(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 10;
 	_id = UPSTAIRS3;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void Upstairs3::onEntrance() {
@@ -3214,6 +3219,19 @@ void Upstairs3::animation() {
 }
 
 bool Upstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	if (obj1._id == G_LEFT)
+		_gm->changeRoom(LGANG1);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: be27f9aa3e178b2a94ce76c9c84d897a2749bcd0
    https://github.com/scummvm/scummvm/commit/be27f9aa3e178b2a94ce76c9c84d897a2749bcd0
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Downstairs3 room

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a23319a..e9fdae9 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3239,9 +3239,15 @@ Downstairs3::Downstairs3(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 10;
 	_id = DOWNSTAIRS3;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
 }
 
 void Downstairs3::onEntrance() {
@@ -3252,6 +3258,16 @@ void Downstairs3::animation() {
 }
 
 bool Downstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 


Commit: 14aeaf9c92354c58a54f15fc0d6cb4072433111f
    https://github.com/scummvm/scummvm/commit/14aeaf9c92354c58a54f15fc0d6cb4072433111f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add LCorridor1 room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 20f2036..1485013 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -88,7 +88,7 @@ enum RoomId {
 	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
 	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO_F,TOMATO_N,
 	MONSTER_F,MONSTER1_N,MONSTER2_N,UPSTAIRS3,DOWNSTAIRS3,
-	LGANG1,LGANG2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
+	LCORRIDOR1,LGANG2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
 	BST_DOOR,HALL,COFFIN_ROOM,MASK,
 
 	MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index e9fdae9..46c391b 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2370,7 +2370,7 @@ bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 		{1, 10, 7, 0, MONSTER2_N},
 		{0, 2, 4, 2, DOWNSTAIRS3},
 		{1, 2, 5, 0, UPSTAIRS3},
-		{1, 2, 5, 3, LGANG1},
+		{1, 2, 5, 3, LCORRIDOR1},
 		{1, 1, 5, 1, LGANG2},
 		{1, 1, 5, 3, HOLE_ROOM},
 		{0, 7, 4, 0, BST_DOOR}
@@ -2878,6 +2878,8 @@ bool Formula1F::interact(Action verb, Object &obj1, Object &obj2) {
 		return false;
 	if (obj1._id == CORRIDOR)
 		_gm->changeRoom(FORMULA1_N);
+	else
+		_gm->passageConstruction();
 	_gm->_newRoom = true;
 	return true;
 }
@@ -2939,6 +2941,8 @@ bool Formula2F::interact(Action verb, Object &obj1, Object &obj2) {
 		return false;
 	if (obj1._id == CORRIDOR)
 		_gm->changeRoom(FORMULA2_N);
+	else
+		_gm->passageConstruction();
 	_gm->_newRoom = true;
 	return true;
 }
@@ -2999,6 +3003,8 @@ bool TomatoF::interact(Action verb, Object &obj1, Object &obj2) {
 		return false;
 	if (obj1._id == CORRIDOR)
 		_gm->changeRoom(TOMATO_N);
+	else
+		_gm->passageConstruction();
 	_gm->_newRoom = true;
 	return true;
 }
@@ -3068,7 +3074,8 @@ bool MonsterF::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->changeRoom(MONSTER1_N);
 		else
 			_gm->changeRoom(MONSTER2_N);
-	}
+	} else
+		_gm->passageConstruction();
 	_gm->_newRoom = true;
 	return true;
 }
@@ -3228,7 +3235,7 @@ bool Upstairs3::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->_state._pyraE = 1;
 	}
 	if (obj1._id == G_LEFT)
-		_gm->changeRoom(LGANG1);
+		_gm->changeRoom(LCORRIDOR1);
 	else
 		_gm->passageConstruction();
 	_gm->_newRoom = true;
@@ -3247,7 +3254,7 @@ Downstairs3::Downstairs3(Supernova2Engine *vm, GameManager *gm) {
 
 	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
 	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
 }
 
 void Downstairs3::onEntrance() {
@@ -3271,23 +3278,38 @@ bool Downstairs3::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-LGang1::LGang1(Supernova2Engine *vm, GameManager *gm) {
+LCorridor1::LCorridor1(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
-	_id = LGANG1;
+	_fileNumber = 9;
+	_id = LCORRIDOR1;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
 }
 
-void LGang1::onEntrance() {
+void LCorridor1::onEntrance() {
 	setRoomSeen(true);
 }
 
-void LGang1::animation() {
+void LCorridor1::animation() {
 }
 
-bool LGang1::interact(Action verb, Object &obj1, Object &obj2) {
+bool LCorridor1::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == G_RIGHT)
+		_gm->changeRoom(UPSTAIRS3);
+	else if (obj1._id == CORRIDOR)
+		_gm->changeRoom(HOLE_ROOM);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 1f3faac..8bb95aa 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -453,9 +453,9 @@ public:
 private:
 };
 
-class LGang1 : public Room {
+class LCorridor1 : public Room {
 public:
-	LGang1(Supernova2Engine *vm, GameManager *gm);
+	LCorridor1(Supernova2Engine *vm, GameManager *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index d0e918f..bc34140 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -288,7 +288,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[MONSTER2_N];
 	delete _rooms[UPSTAIRS3];
 	delete _rooms[DOWNSTAIRS3];
-	delete _rooms[LGANG1];
+	delete _rooms[LCORRIDOR1];
 	delete _rooms[LGANG2];
 	delete _rooms[HOLE_ROOM];
 	delete _rooms[IN_HOLE];
@@ -417,7 +417,7 @@ void GameManager::initRooms() {
 	_rooms[MONSTER2_N] = new Monster2N(_vm, this);
 	_rooms[UPSTAIRS3] = new Upstairs3(_vm, this);
 	_rooms[DOWNSTAIRS3] = new Downstairs3(_vm, this);
-	_rooms[LGANG1] = new LGang1(_vm, this);
+	_rooms[LCORRIDOR1] = new LCorridor1(_vm, this);
 	_rooms[LGANG2] = new LGang2(_vm, this);
 	_rooms[HOLE_ROOM] = new HoleRoom(_vm, this);
 	_rooms[IN_HOLE] = new InHole(_vm, this);


Commit: df792b74d91429cd08381e495df9186e89a6de1d
    https://github.com/scummvm/scummvm/commit/df792b74d91429cd08381e495df9186e89a6de1d
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add LCorridor2 room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 1485013..fc1a745 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -88,7 +88,7 @@ enum RoomId {
 	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
 	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO_F,TOMATO_N,
 	MONSTER_F,MONSTER1_N,MONSTER2_N,UPSTAIRS3,DOWNSTAIRS3,
-	LCORRIDOR1,LGANG2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
+	LCORRIDOR1,LCORRIDOR2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
 	BST_DOOR,HALL,COFFIN_ROOM,MASK,
 
 	MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 46c391b..ea1c1c3 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2371,7 +2371,7 @@ bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 		{0, 2, 4, 2, DOWNSTAIRS3},
 		{1, 2, 5, 0, UPSTAIRS3},
 		{1, 2, 5, 3, LCORRIDOR1},
-		{1, 1, 5, 1, LGANG2},
+		{1, 1, 5, 1, LCORRIDOR2},
 		{1, 1, 5, 3, HOLE_ROOM},
 		{0, 7, 4, 0, BST_DOOR}
 	};
@@ -3313,23 +3313,32 @@ bool LCorridor1::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-LGang2::LGang2(Supernova2Engine *vm, GameManager *gm) {
+LCorridor2::LCorridor2(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
-	_id = LGANG2;
+	_fileNumber = 9;
+	_id = LCORRIDOR2;
 	_shown[0] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
 }
 
-void LGang2::onEntrance() {
+void LCorridor2::onEntrance() {
 	setRoomSeen(true);
 }
 
-void LGang2::animation() {
+void LCorridor2::animation() {
 }
 
-bool LGang2::interact(Action verb, Object &obj1, Object &obj2) {
+bool LCorridor2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
 	return true;
 }
 
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 8bb95aa..29f00d3 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -463,9 +463,9 @@ public:
 private:
 };
 
-class LGang2 : public Room {
+class LCorridor2 : public Room {
 public:
-	LGang2(Supernova2Engine *vm, GameManager *gm);
+	LCorridor2(Supernova2Engine *vm, GameManager *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index bc34140..fa66258 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -289,7 +289,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[UPSTAIRS3];
 	delete _rooms[DOWNSTAIRS3];
 	delete _rooms[LCORRIDOR1];
-	delete _rooms[LGANG2];
+	delete _rooms[LCORRIDOR2];
 	delete _rooms[HOLE_ROOM];
 	delete _rooms[IN_HOLE];
 	delete _rooms[FLOORDOOR];
@@ -418,7 +418,7 @@ void GameManager::initRooms() {
 	_rooms[UPSTAIRS3] = new Upstairs3(_vm, this);
 	_rooms[DOWNSTAIRS3] = new Downstairs3(_vm, this);
 	_rooms[LCORRIDOR1] = new LCorridor1(_vm, this);
-	_rooms[LGANG2] = new LGang2(_vm, this);
+	_rooms[LCORRIDOR2] = new LCorridor2(_vm, this);
 	_rooms[HOLE_ROOM] = new HoleRoom(_vm, this);
 	_rooms[IN_HOLE] = new InHole(_vm, this);
 	_rooms[FLOORDOOR] = new Floordoor(_vm, this);


Commit: 48c84280cbe6e38a3023eede383cac5a6853e131
    https://github.com/scummvm/scummvm/commit/48c84280cbe6e38a3023eede383cac5a6853e131
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add HoleRoom room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index fc1a745..3d2f801 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -150,7 +150,7 @@ kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
-kString120, kString121, kString122, kString123, kString124,
+kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kString124,
 kString125, kString126, kString127, kString128, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
@@ -158,7 +158,7 @@ kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kS
 kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
 kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
 kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
-kString160, kString161, kString162, kStringSlot, kString164,
+kStringOpeningDescription1, kStringOpeningDescription2, kString162, kStringSlot, kString164,
 kString165, kString166, kString167, kString168, kStringExit,
 kString170, kStringToothbrush, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index ea1c1c3..f604068 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3346,9 +3346,17 @@ HoleRoom::HoleRoom(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 9;
 	_id = HOLE_ROOM;
 	_shown[0] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringOpening, kStringOpeningDescription1, HOLE, EXIT, 3, 3, 0, IN_HOLE, 12);
+	_objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription2, NULLOBJECT, NULLTYPE, 4, 4, 0);
 }
 
 void HoleRoom::onEntrance() {
@@ -3359,6 +3367,26 @@ void HoleRoom::animation() {
 }
 
 bool HoleRoom::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, ROPE, G_RIGHT) || 
+				Object::combine(obj1, obj2, ROPE, G_LEFT))) {
+		_vm->renderMessage(kStringPyramid7);
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) || 
+				Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
+		_vm->renderMessage(kStringPyramid8);
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
+		_vm->renderMessage(kStringPyramid9);
+	} else if (verb == ACTION_WALK && obj1._id == HOLE && !isSectionVisible(16)) {
+		_vm->renderMessage(kStringPyramid10);
+	} else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(16)) {
+		_gm->changeRoom(IN_HOLE);
+		_gm->_newRoom = true;
+	} else
+		return false;
 	return true;
 }
 


Commit: 9c1eba6bd6a785709ceb7d980ef239ba803e0f04
    https://github.com/scummvm/scummvm/commit/9c1eba6bd6a785709ceb7d980ef239ba803e0f04
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: add InHole and Floordoor rooms

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 3d2f801..f74e284 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -150,16 +150,16 @@ kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
-kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kString124,
-kString125, kString126, kString127, kString128, kString129,
+kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
+kStringPyramid12, kString126, kString127, kString128, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
 kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
 kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
 kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
-kStringOpeningDescription1, kStringOpeningDescription2, kString162, kStringSlot, kString164,
-kString165, kString166, kString167, kString168, kStringExit,
+kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
+kStringOpeningDescription3, kStringStones, kString167, kString168, kStringExit,
 kString170, kStringToothbrush, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index f604068..e095ab7 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3397,6 +3397,10 @@ InHole::InHole(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 6;
 	_id = IN_HOLE;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, EXIT, 0, 0, 0, HOLE_ROOM, 2);
+	_objectState[1] = Object(_id, kStringNote, kStringNoteDescription1, NULLOBJECT, TAKE, 255, 255, 1 + 128);
+	_objectState[2] = Object(_id, kStringSlot, kStringSlotDescription3, SLOT, COMBINABLE, 1, 1, 0);
 }
 
 void InHole::onEntrance() {
@@ -3407,6 +3411,21 @@ void InHole::animation() {
 }
 
 bool InHole::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, SLOT)) {
+		if (isSectionVisible(kMaxSection - 1))
+			_vm->renderMessage(kStringPyramid11);
+		else {
+			_vm->renderImage(1);
+			_objectState[1]._click = 2;
+			setSectionVisible(kMaxSection - 1, kShownTrue);
+		}
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE) {
+		_vm->renderMessage(kStringPyramid9);
+	} else if (verb == ACTION_USE && obj1._id == ROPE) {
+		_gm->changeRoom(HOLE_ROOM);
+		_gm->_newRoom = true;
+	} else
+		return false;
 	return true;
 }
 
@@ -3414,10 +3433,17 @@ Floordoor::Floordoor(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 14;
 	_id = FLOORDOOR;
 	_shown[0] = kShownTrue;
 	_shown[14] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringKnife1, kStringDefaultDescription, TKNIFE, TAKE | COMBINABLE, 255, 255, 9);
+	_objectState[3] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE, 255, 255, 11+128);
+	_objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription3, HOLE, EXIT, 4, 4, 0, FLOORDOOR_U, 12);
+	_objectState[5] = Object(_id, kStringStones, kStringDefaultDescription, STONES, COMBINABLE, 5, 5, 0);
 }
 
 void Floordoor::onEntrance() {
@@ -3428,6 +3454,61 @@ void Floordoor::animation() {
 }
 
 bool Floordoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_WALK && obj1._id == HOLE) {
+		if (isSectionVisible(11)) {
+			_gm->_state._pyraZ = 4;
+			_gm->_state._pyraDirection = 2;
+			_gm->_state._pyraE = 0;
+			return false;
+		} else
+			_vm->renderMessage(kStringPyramid12);
+	} else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(11)) {
+		_gm->_state._pyraZ = 4;
+		_gm->_state._pyraDirection = 2;
+		_gm->_state._pyraE = 0 ;
+		_gm->changeRoom(FLOORDOOR_U);
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, STONES)) {
+		_vm->renderImage(10);
+		if (obj1._id == TKNIFE)
+			_gm->_inventory.remove(obj1);
+		else
+			_gm->_inventory.remove(obj2);
+		_objectState[2]._click = 6;
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) ||
+				Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
+		_vm->renderMessage(kStringPyramid8);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, TKNIFE) &&
+					isSectionVisible(10)) {
+		_vm->renderImage(11);
+		setSectionVisible(10, kShownFalse);
+		if (obj1._id == ROPE)
+			_gm->_inventory.remove(obj1);
+		else
+			_gm->_inventory.remove(obj2);
+		_objectState[2]._click = 255;
+		_objectState[3]._click = 7;
+		_objectState[3]._type &= ~COMBINABLE;
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, ROPE, G_RIGHT) ||
+				Object::combine(obj1, obj2, ROPE, G_LEFT)  ||
+				Object::combine(obj1, obj2, ROPE, STONES))) {
+		_vm->renderMessage(kStringPyramid7);
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
+		_gm->takeObject(obj1);
+		obj1._type |= COMBINABLE;
+		_vm->renderImage(9);
+		_vm->renderImage(10);
+		_objectState[2]._click = 6;
+	} else if (verb == ACTION_TAKE && obj1._id == TKNIFE && !(obj1._type & CARRIED)) {
+		_gm->takeObject(obj1);
+		setSectionVisible(10, kShownFalse);
+	} else
+		return false;
 	return true;
 }
 


Commit: 6744c0b4b172b2b61ff31959f61edb06476e0465
    https://github.com/scummvm/scummvm/commit/6744c0b4b172b2b61ff31959f61edb06476e0465
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add FloordoorU room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index f74e284..280770b 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -159,7 +159,7 @@ kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
 kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
 kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
 kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
-kStringOpeningDescription3, kStringStones, kString167, kString168, kStringExit,
+kStringOpeningDescription3, kStringStones, kStringPlate, kString168, kStringExit,
 kString170, kStringToothbrush, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index e095ab7..c991474 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3516,9 +3516,18 @@ FloordoorU::FloordoorU(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 14;
 	_id = FLOORDOOR_U;
 	_shown[0] = kShownTrue;
+	_shown[12] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 10, 10, 0, FLOORDOOR, 2);
+	_objectState[3] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE, EXIT, 8, 8, 0, FLOORDOOR, 2);
+	_objectState[4] = Object(_id, kStringPlate, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
 }
 
 void FloordoorU::onEntrance() {
@@ -3529,6 +3538,24 @@ void FloordoorU::animation() {
 }
 
 bool FloordoorU::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_WALK && obj1._id == HOLE) {
+		_gm->_state._pyraZ = 6;
+		_gm->_state._pyraDirection = 0;
+		_gm->_state._pyraE = 1;
+		return false;
+	} else if (verb == ACTION_USE && obj1._id == ROPE) {
+		_gm->_state._pyraZ = 6;
+		_gm->_state._pyraDirection = 0;
+		_gm->_state._pyraE = 1;
+		_gm->changeRoom(FLOORDOOR);
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE) {
+		_vm->renderMessage(kStringPyramid9);
+	} else
+		return false;
 	return true;
 }
 


Commit: fe48f0b6991bca7f40f8d072649099160d905aef
    https://github.com/scummvm/scummvm/commit/fe48f0b6991bca7f40f8d072649099160d905aef
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add BstDoor room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 280770b..a16b50e 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -147,7 +147,7 @@ kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kString93, kString94,
 kStringEntrance, kStringDoor, kString97, kString98, kString99,
 kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
-kString105, kStringSuctionCup, kString107, kStringOpening, kString109,
+kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
 kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index c991474..0d1a93d 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3563,9 +3563,29 @@ BstDoor::BstDoor(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 15;
 	_id = BST_DOOR;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 18, 18, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 17, 17, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringLetter, kStringDefaultDescription, BST1, PRESS, 0, 0, 0);
+	_objectState[3] = Object(_id, kStringLetter, kStringDefaultDescription, BST2, PRESS, 1, 0, 0);
+	_objectState[4] = Object(_id, kStringLetter, kStringDefaultDescription, BST3, PRESS, 2, 0, 0);
+	_objectState[5] = Object(_id, kStringLetter, kStringDefaultDescription, BST4, PRESS, 3, 0, 0);
+	_objectState[6] = Object(_id, kStringLetter, kStringDefaultDescription, BST5, PRESS, 4, 0, 0);
+	_objectState[7] = Object(_id, kStringLetter, kStringDefaultDescription, BST6, PRESS, 5, 0, 0);
+	_objectState[8] = Object(_id, kStringLetter, kStringDefaultDescription, BST7, PRESS, 6, 0, 0);
+	_objectState[9] = Object(_id, kStringLetter, kStringDefaultDescription, BST8, PRESS, 7, 0, 0);
+	_objectState[10] = Object(_id, kStringLetter, kStringDefaultDescription, BST9, PRESS, 8, 0, 0);
+	_objectState[11] = Object(_id, kStringLetter, kStringDefaultDescription, BST10, PRESS, 9, 0, 0);
+	_objectState[12] = Object(_id, kStringLetter, kStringDefaultDescription, BST11, PRESS, 10, 0, 0);
+	_objectState[13] = Object(_id, kStringLetter, kStringDefaultDescription, BST12, PRESS, 11, 0, 0);
+	_objectState[14] = Object(_id, kStringLetter, kStringDefaultDescription, BST13, PRESS, 12, 0, 0);
+	_objectState[15] = Object(_id, kStringLetter, kStringDefaultDescription, BST14, PRESS, 13, 0, 0);
+	_objectState[16] = Object(_id, kStringLetter, kStringDefaultDescription, BST15, PRESS, 14, 0, 0);
+	_objectState[17] = Object(_id, kStringLetter, kStringDefaultDescription, BST16, PRESS, 15, 0, 0);
+	_objectState[18] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 16, 16, 0, HALL, 2);
 }
 
 void BstDoor::onEntrance() {
@@ -3576,6 +3596,37 @@ void BstDoor::animation() {
 }
 
 bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	static char password[16] = {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0};
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_PRESS && obj1._id >= BST1 && obj1._id <= BST16) {
+		int number = obj1._id - (BST1 - 1);
+		if (isSectionVisible(number))
+			_vm->renderImage(number + 128);
+		else
+			_vm->renderImage(number);
+		_vm->playSound(kAudioTaxiOpen);
+		for (number = 1; number <= 16; number++) {
+			if (isSectionVisible(number) != password[number - 1])
+				return true;
+		}
+		_gm->wait(2);
+		_vm->renderImage(17);
+		for (number = 1; number <= 16; number++) {
+			setSectionVisible(number, kShownFalse);
+			_objectState[number + 1]._click = 255;
+		}
+		_gm->wait(2);
+		_vm->renderImage(18);
+		_gm->wait(2);
+		_vm->renderImage(19);
+		_objectState[18]._type = EXIT;
+		_objectState[18]._description = kStringDefaultDescription;
+		_vm->playSound(kAudioShip3);
+		_gm->screenShake();
+	} else
+		return false;
 	return true;
 }
 


Commit: f5afd19df763c8380855d1175c53408ad085286e
    https://github.com/scummvm/scummvm/commit/f5afd19df763c8380855d1175c53408ad085286e
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add hall room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index a16b50e..0a60205 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -159,7 +159,7 @@ kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
 kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
 kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
 kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
-kStringOpeningDescription3, kStringStones, kStringPlate, kString168, kStringExit,
+kStringOpeningDescription3, kStringStones, kStringPlate, kStringCoffin, kStringExit,
 kString170, kStringToothbrush, kString172, kString173, kString174,
 kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 0d1a93d..6d4e0e5 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3634,9 +3634,12 @@ Hall::Hall(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 16;
 	_id = HALL;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringCoffin, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, COFFIN_ROOM, 2);
+	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, CORRIDOR, EXIT, 255, 255, 0, PYR_ENTRANCE, 22);
 }
 
 void Hall::onEntrance() {
@@ -3647,7 +3650,11 @@ void Hall::animation() {
 }
 
 bool Hall::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	if (verb == ACTION_WALK && obj1._id == CORRIDOR) {
+		_gm->_state._pyraDirection = 2;
+		_gm->passageConstruction();
+	}
+	return false;
 }
 
 CoffinRoom::CoffinRoom(Supernova2Engine *vm, GameManager *gm) {


Commit: 13c6b96305e83d2961a1486a8741f15994758956
    https://github.com/scummvm/scummvm/commit/13c6b96305e83d2961a1486a8741f15994758956
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add CoffinRoom room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 0a60205..e829859 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -151,7 +151,7 @@ kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
 kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
-kStringPyramid12, kString126, kString127, kString128, kString129,
+kStringPyramid12, kStringPyramid13, kStringPyramid14, kStringPyramid15, kString129,
 kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
@@ -160,8 +160,8 @@ kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster
 kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
 kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
 kStringOpeningDescription3, kStringStones, kStringPlate, kStringCoffin, kStringExit,
-kString170, kStringToothbrush, kString172, kString173, kString174,
-kString175, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
+kStringCreepy, kStringToothbrush, kStringToothbrushDescription1, kStringToothpaste, kStringBall,
+kStringBallDescription, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
 kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
 kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 6d4e0e5..60d96d6 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3661,9 +3661,16 @@ CoffinRoom::CoffinRoom(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 17;
 	_id = COFFIN_ROOM;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
+	_objectState[1] = Object(_id, kStringCoffin, kStringCreepy, COFFIN, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringToothbrush, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 1, 1, 0);
+	_objectState[3] = Object(_id, kStringToothpaste, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[4] = Object(_id, kStringBall, kStringBallDescription, L_BALL, NULLTYPE, 3, 3, 0);
+	_objectState[5] = Object(_id, kStringBall, kStringBallDescription, R_BALL, NULLTYPE, 3, 3, 0);
 }
 
 void CoffinRoom::onEntrance() {
@@ -3674,6 +3681,47 @@ void CoffinRoom::animation() {
 }
 
 bool CoffinRoom::interact(Action verb, Object &obj1, Object &obj2) {
+	char change;
+	if (verb == ACTION_OPEN && obj1._id == COFFIN && !isSectionVisible(1)) {
+		_vm->renderMessage(kStringPyramid13);
+	} else if (verb == ACTION_PRESS && (obj1._id == L_BALL || obj1._id == R_BALL)) {
+		if (obj1._id == L_BALL) {
+			if ((change = !isSectionVisible(2))) {
+				_vm->renderImage(2);
+				_vm->playSound(kAudioTaxiOpen);
+			} else
+				_vm->renderMessage(kStringPyramid14);
+		} else {
+			if ((change = !isSectionVisible(3))) {
+				_vm->renderImage(3);
+				_vm->playSound(kAudioTaxiOpen);
+			} else
+				_vm->renderMessage(kStringPyramid14);
+		} if (change) {
+			if (isSectionVisible(2) && isSectionVisible(3)) {
+				_vm->playSound(kAudioShip2);
+				_vm->renderImage(4);
+				_gm->wait(4);
+				_vm->renderImage(5);
+				_gm->wait(4);
+				_vm->renderImage(5);
+				_gm->wait(4);
+				_vm->renderImage(5);
+				_gm->wait(4);
+				_vm->renderImage(1);
+				setSectionVisible(4, kShownFalse);
+				setSectionVisible(5, kShownFalse);
+				setSectionVisible(6, kShownFalse);
+				setSectionVisible(7, kShownFalse);
+			}
+			else
+				_vm->renderMessage(kStringPyramid15);
+		}
+	} else if (verb == ACTION_LOOK && obj1._id == COFFIN && isSectionVisible(1)) {
+		_gm->changeRoom(MASK);
+		_gm->_newRoom = true;
+	} else
+		return false;
 	return true;
 }
 


Commit: 801c684218b91bbb10be27e95e3abfa87ff8de21
    https://github.com/scummvm/scummvm/commit/801c684218b91bbb10be27e95e3abfa87ff8de21
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add missing string to translation tool

Changed paths:
    devtools/create_supernova2/gametext.h
    devtools/create_supernova2/strings-en.po


diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index 69fa05f..e708dcb 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -772,9 +772,9 @@ const char *gameText[] = {
 "\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das Raumschiff! Auf Wiedersehen!\"",    //"I hope you had a nice flight.|Please leave the spaceship! Goodbye!"
 "W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.",    //While the other passengers|are disembarking, you are trying|to handle the shock.
 "\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
-"\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"",
+"\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"", //"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
 "Sieht gef\204hrlich aus!", //Looks dangerous
-	//"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
+"Das Auge ist schon offen.", //This Eye is already opened
 "|", //Dialog separator
 NULL
 };
diff --git a/devtools/create_supernova2/strings-en.po b/devtools/create_supernova2/strings-en.po
index 21c95dc..4a9b588 100644
--- a/devtools/create_supernova2/strings-en.po
+++ b/devtools/create_supernova2/strings-en.po
@@ -2784,3 +2784,9 @@ msgid ""
 "Sieht gef„hrlich aus!"
 msgstr ""
 "Looks dangerous!"
+
+#: ../../ms2/ms2_pyra.c:1017
+msgid ""
+"Das Auge ist schon offen."
+msgstr ""
+"This Eye is already opened."


Commit: 4500cd0bfb8a8d7b3cc313a2b89ee1ddb1fdb324
    https://github.com/scummvm/scummvm/commit/4500cd0bfb8a8d7b3cc313a2b89ee1ddb1fdb324
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Mask room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index e829859..c457bf7 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -151,8 +151,8 @@ kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
 kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
-kStringPyramid12, kStringPyramid13, kStringPyramid14, kStringPyramid15, kString129,
-kString130, kString131, kStringDirection1, kStringDirection2, kStringDirection3,
+kStringPyramid12, kStringPyramid13, kStringPyramid14, kStringPyramid15, kStringPyramid17,
+kStringPyramid18, kStringPyramid19, kStringDirection1, kStringDirection2, kStringDirection3,
 kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
 kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
 kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
@@ -161,7 +161,7 @@ kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteD
 kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
 kStringOpeningDescription3, kStringStones, kStringPlate, kStringCoffin, kStringExit,
 kStringCreepy, kStringToothbrush, kStringToothbrushDescription1, kStringToothpaste, kStringBall,
-kStringBallDescription, kString176, kString177, kStringDefaultDescription, kStringLooksMetal,
+kStringBallDescription, kStringEye, kStringEyeDescription, kStringDefaultDescription, kStringLooksMetal,
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
 kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
 kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD,
@@ -249,7 +249,7 @@ kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntro
 kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
 kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
 kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14, 
-kStringMonsterDescription, kStringDialogSeparator
+kStringMonsterDescription, kStringPyramid16, kStringDialogSeparator
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 7074731..05ad7bd 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -56,7 +56,7 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{53,     5010,  30020},
 	{55,     18230,    -1},
 	{55,     17020, 18230},
-	{53,     0,      5210},
+	{53,     0,      5010},
 	{47,     17020,    -1},
 	{51,     9020,     -1},
 	{51,     0,      6010},
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 60d96d6..7486070 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3729,9 +3729,14 @@ Mask::Mask(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 18;
 	_id = MASK;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, COFFIN_ROOM, 22);
+	_objectState[1] = Object(_id, kStringEye, kStringEyeDescription, EYE1, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringEye, kStringEyeDescription, EYE2, NULLTYPE, 1, 1, 0);
+	_objectState[3] = Object(_id, kStringMouth, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
 }
 
 void Mask::onEntrance() {
@@ -3742,7 +3747,33 @@ void Mask::animation() {
 }
 
 bool Mask::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	if (verb == ACTION_OPEN && (obj1._id == EYE1 || obj1._id == EYE2)) {
+		if (obj1._type & OPENED)
+			_vm->renderMessage(kStringPyramid16);
+		else
+			_vm->renderImage(obj1._id - EYE1 + 1);
+		if (isSectionVisible(1) && isSectionVisible(2)) {
+			_gm->reply(kStringPyramid17, 3, 3 + 128);
+			_gm->reply(kStringPyramid18, 3, 3 + 128);
+			_gm->reply(kStringPyramid19, 3, 3 + 128);
+			_vm->playSound(kAudioAppearance1);
+			while(_vm->_sound->isPlaying())
+				_gm->wait(1);
+			_vm->paletteFadeOut();
+			_vm->loadGame(kSleepAutosaveSlot);
+			_gm->changeRoom(CABIN);
+			_gm->_newRoom = true;
+			_gm->drawGUI();
+			_gm->_rooms[CABIN]->setSectionVisible(2, kShownTrue);
+			_gm->_rooms[CABIN]->setSectionVisible(kMaxSection - 1, kShownFalse);
+			_gm->_rooms[CABIN]->setSectionVisible(kMaxSection - 2, kShownTrue);
+			_gm->_rooms[CABIN]->setSectionVisible(1, kShownFalse);
+			_gm->_rooms[CABIN]->getObject(2)->_click = 8;
+			_gm->_state._eventTime = kMaxTimerValue;
+		}
+		return true;
+	}
+	return false;
 }
 
 Museum::Museum(Supernova2Engine *vm, GameManager *gm) {


Commit: 002134f3e148a19c5ba1fd8ca58a65d0ccbd4e9f
    https://github.com/scummvm/scummvm/commit/002134f3e148a19c5ba1fd8ca58a65d0ccbd4e9f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix missing image numbers in few rooms

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 7486070..1c12155 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2435,7 +2435,7 @@ Downstairs1::Downstairs1(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 10;
 	_id = DOWNSTAIRS1;
 	_shown[0] = kShownTrue;
 	_shown[1] = kShownTrue;
@@ -2567,7 +2567,7 @@ BottomLeftDoor::BottomLeftDoor(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 12;
 	_id = BOTTOM_LEFT_DOOR;
 	_shown[0] = kShownTrue;
 	_shown[19] = kShownTrue;
@@ -3394,7 +3394,7 @@ InHole::InHole(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 11;
 	_id = IN_HOLE;
 	_shown[0] = kShownTrue;
 


Commit: 2810974533bb5c5ab90e29770716a87cff30871f
    https://github.com/scummvm/scummvm/commit/2810974533bb5c5ab90e29770716a87cff30871f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix a few bugs in pyramid

This fixes a few minor bugs (a few lines each):
1. Going close to equation rendered empty wall instead
2. Door in the Floordoor room newer showed up
3. Balls in CoffinRoom were inside each other,
     so one of them couldn't be clicked.

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 1c12155..9f72170 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2300,13 +2300,15 @@ PyrEntrance::PyrEntrance(Supernova2Engine *vm, GameManager *gm) {
 }
 
 void PyrEntrance::onEntrance() {
-	if (_gm->_state._pyraS != 8 || _gm->_state._pyraZ != 5)
-		_waitTime = 0;
+	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
+		_gm->setAnimationTimer(1);
+		_waitTime = g_system->getMillis() + 60000;
+	}
 }
 
 void PyrEntrance::animation() {
 	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
-		if (_waitTime == 700) { // around 1 minute
+		if (g_system->getMillis() >= _waitTime) { // around 1 minute
 			_vm->renderMessage(kStringPyramid4);
 			_gm->waitOnInput(_gm->_messageDuration);
 			_vm->removeMessage();
@@ -2335,7 +2337,6 @@ void PyrEntrance::animation() {
 			_gm->_rooms[FLOORDOOR]->setSectionVisible(kMaxSection - 1, kShownTrue);
 		}
 		else {
-			_waitTime++;
 			_gm->setAnimationTimer(1);
 		}
 	}
@@ -2387,6 +2388,7 @@ bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->_state._pyraZ == roomTab[i]._z &&
 			_gm->_state._pyraDirection == roomTab[i]._r) {
 			_gm->changeRoom(roomTab[i]._exitRoom);
+			_gm->_newRoom = true;
 			return true;
 		}
 	}
@@ -2863,7 +2865,7 @@ Formula1F::Formula1F(Supernova2Engine *vm, GameManager *gm) {
 
 	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
 	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, DOOR, EXIT, 1, 1, 0, PYR_ENTRANCE, 2);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 1, 1, 0, PYR_ENTRANCE, 2);
 }
 
 void Formula1F::onEntrance() {
@@ -2926,7 +2928,7 @@ Formula2F::Formula2F(Supernova2Engine *vm, GameManager *gm) {
 
 	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
 	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, DOOR, EXIT, 2, 2, 0, PYR_ENTRANCE, 2);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 2, 2, 0, PYR_ENTRANCE, 2);
 }
 
 void Formula2F::onEntrance() {
@@ -3670,7 +3672,7 @@ CoffinRoom::CoffinRoom(Supernova2Engine *vm, GameManager *gm) {
 	_objectState[2] = Object(_id, kStringToothbrush, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 1, 1, 0);
 	_objectState[3] = Object(_id, kStringToothpaste, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 2, 2, 0);
 	_objectState[4] = Object(_id, kStringBall, kStringBallDescription, L_BALL, NULLTYPE, 3, 3, 0);
-	_objectState[5] = Object(_id, kStringBall, kStringBallDescription, R_BALL, NULLTYPE, 3, 3, 0);
+	_objectState[5] = Object(_id, kStringBall, kStringBallDescription, R_BALL, NULLTYPE, 4, 4, 0);
 }
 
 void CoffinRoom::onEntrance() {
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 29f00d3..8194b02 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -250,7 +250,7 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	int _waitTime;
+	uint32 _waitTime;
 };
 
 class Upstairs1 : public Room {


Commit: a77d56219fd21060c8e521de9c5539aaf8afaa0b
    https://github.com/scummvm/scummvm/commit/a77d56219fd21060c8e521de9c5539aaf8afaa0b
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Update translations

Changed paths:
    devtools/create_supernova2/strings-en.po


diff --git a/devtools/create_supernova2/strings-en.po b/devtools/create_supernova2/strings-en.po
index 4a9b588..cce2afb 100644
--- a/devtools/create_supernova2/strings-en.po
+++ b/devtools/create_supernova2/strings-en.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Mission Supernova Part 2 1.0\n"
 "Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
-"POT-Creation-Date: 2017-07-22 19:37+0100\n"
-"PO-Revision-Date: 2018-04-15 05:41+0000\n"
-"Last-Translator: Adrian Frhwirth <bonki at scummvm.org>\n"
+"POT-Creation-Date: 2019-06-10 22:58+0100\n"
+"PO-Revision-Date: 2019-06-10 22:13+0000\n"
+"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
 "Language-Team: none\n"
 "Language: en\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.9\n"
+"X-Generator: Weblate 3.3\n"
 
 #: ../../ms2/ms2.c:1641
 msgid "Gehe"
@@ -515,7 +515,8 @@ msgstr "Sunstroke, or what?"
 
 #: ../../ms2/ms2_pyra.c:385
 msgid "Du merkst, daá der Boden|unter dir nachgibt, und|springst zur Seite."
-msgstr "You notice that the ground|is giving way under you,|and you leap aside."
+msgstr ""
+"You notice that the ground|is giving way under you,|and you leap aside."
 
 #: ../../ms2/ms2_pyra.c:537
 msgid "Puzzleteil"
@@ -567,6 +568,10 @@ msgstr "You have already|pushed the ball."
 msgid "Die Kugel bewegt sich ein Stck."
 msgstr "The ball moves a bit."
 
+#: ../../ms2/ms2_pyra.c:961
+msgid "Das Auge ist schon offen."
+msgstr "This Eye is already open."
+
 #: ../../ms2/ms2_pyra.c:965
 msgid "Herzlichen Glckwunsch!"
 msgstr "Congratulations!"
@@ -710,6 +715,10 @@ msgstr "It is a relatively sturdy knife."
 msgid "Monster"
 msgstr "Monster"
 
+#: ../../ms2/ms2_pyra.c:1192
+msgid "Sieht gef„hrlich aus!"
+msgstr "Looks dangerous!"
+
 #: ../../ms2/ms2_pyra.c:1200
 msgid "Es ist dick und|ungef„hr 15 Meter lang."
 msgstr "It is thick and|about 15 meters long."
@@ -1832,7 +1841,8 @@ msgstr "Oh come on! Your disguise isn't that perfect."
 msgid ""
 "Ich werde Ihnen beweisen, daá ich Horst Hummel bin,|indem ich diesen "
 "Wettbewerb hier gewinne."
-msgstr "I will prove to you that I am Horst Hummel|by winning this competition."
+msgstr ""
+"I will prove to you that I am Horst Hummel|by winning this competition."
 
 #: ../../ms2/ms2_r2.c:422
 msgid "Dann kann ich in dieser verdammten Fernsehshow|auftreten."
@@ -2141,7 +2151,8 @@ msgstr "You enter the building through|the side entrance."
 msgid ""
 "Dort schaltest du die Alarmanlage aus,|durch die das Sodo-Skelett gesichert "
 "wird."
-msgstr "There you switch off the alarm system,|which secures the Sodo skeleton."
+msgstr ""
+"There you switch off the alarm system,|which secures the Sodo skeleton."
 
 #: ../../ms2/ms2_r2.c:769
 msgid "Wir betreten einen anderen Geb„udeteil|und holen uns das Gerippe."
@@ -2720,7 +2731,7 @@ msgid ""
 "Aha, mich interessiert auáerdem,|ob es hier auf Axacuss etwas gibt,|das Sie "
 "besonders m”gen."
 msgstr ""
-"I see. I'm also interested in|whether there's anything here on Axacuss |that "
+"I see. I'm also interested in|whether there's anything here on Axacuss that "
 "you particularly like."
 
 #: ../../ms2/ms2_s.c:152
@@ -2778,15 +2789,3 @@ msgid ""
 "werden!\""
 msgstr ""
 "\"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!\""
-
-#: ../../ms2/ms2_pyra.c:1260
-msgid ""
-"Sieht gef„hrlich aus!"
-msgstr ""
-"Looks dangerous!"
-
-#: ../../ms2/ms2_pyra.c:1017
-msgid ""
-"Das Auge ist schon offen."
-msgstr ""
-"This Eye is already opened."


Commit: b0eeb8cc2214ecaa6210216e72bf1d8576ffa5ce
    https://github.com/scummvm/scummvm/commit/b0eeb8cc2214ecaa6210216e72bf1d8576ffa5ce
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Initialize price = 0 to avoid warnings

As suggested by criezy on github.

Changed paths:
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9f72170..e95c56e 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -909,7 +909,7 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 
 	if (verb == ACTION_TAKE && !(obj1._type & CARRIED) &&
 		obj1._id >= BOTTLE && obj1._id <= TOOTHBRUSH) {
-		int price;
+		int price = 0;
 		switch (obj1._id) {
 		case BOTTLE:
 			price = 30;


Commit: 57ebb3fd1d273a3cc6471d1e07caa3028f1053ea
    https://github.com/scummvm/scummvm/commit/57ebb3fd1d273a3cc6471d1e07caa3028f1053ea
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add missing fade ins

Fade in was missing after riding taxi and at the start of pyramid.
It is enough to just fade out, because the engine fades in
automaticaly at the start of a new room.

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index e95c56e..f036b22 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -764,6 +764,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderMessage(text);
 				_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
 				_vm->removeMessage();
+				_vm->paletteFadeOut();
 				_vm->saveGame(kSleepAutosaveSlot, "autosave");
 				_gm->_inventory.clear();
 				_gm->changeRoom(PYRAMID);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index fa66258..69eadc5 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -1593,6 +1593,7 @@ void GameManager::taxiPayment(int price, int destination) {
 			wait(1);
 		waitOnInput((t2.size() + 20) * _vm->_textSpeed / 10);
 		_vm->removeMessage();
+		_vm->paletteFadeOut();
 
 		switch (destination) {
 		case 0:


Commit: 231121a1206789511072df55950e2f4e990f1a34
    https://github.com/scummvm/scummvm/commit/231121a1206789511072df55950e2f4e990f1a34
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add siren sound

I had a problem with a "tick" sound every when the tones changed,
for now I resolved it by uping the audio rate to 80000. This is
really high for what kind of sound this is, I will think
of a better solution for this.

Changed paths:
    engines/supernova2/resman.cpp
    engines/supernova2/resman.h
    engines/supernova2/sound.cpp
    engines/supernova2/sound.h


diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 05ad7bd..42f6f62 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -28,6 +28,7 @@
 #include "common/system.h"
 #include "graphics/cursorman.h"
 #include "graphics/palette.h"
+#include "common/sinetables.h"
 
 #include "supernova2/graphics.h"
 #include "supernova2/resman.h"
@@ -128,6 +129,7 @@ void ResourceManager::initSoundFiles() {
 		_soundSamples[i].reset(Audio::makeRawStream(buffer, length, _audioRate,
 													streamFlag, DisposeAfterUse::YES));
 	}
+	initSiren();
 
 	_musicIntroBuffer.reset(convertToMod("ms2_data.052"));
 	_musicMadMonkeysBuffer.reset(convertToMod("ms2_data.056"));
@@ -191,6 +193,10 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	}
 }
 
+Audio::AudioStream *ResourceManager::getSirenStream() {
+	return _sirenStream.get();
+}
+
 MS2Image *ResourceManager::getImage(int filenumber) {
 	if (filenumber < 47)
 		return &_images[filenumber];
@@ -198,6 +204,10 @@ MS2Image *ResourceManager::getImage(int filenumber) {
 		return nullptr;
 }
 
+int ResourceManager::getAudioRate() {
+	return _audioRate;
+}
+
 const byte *ResourceManager::getCursor(CursorId id) const {
 	switch (id) {
 	case kCursorNormal:
@@ -209,6 +219,56 @@ const byte *ResourceManager::getCursor(CursorId id) const {
 	}
 }
 
+// Generate a tone which minimal length is the length and ends at the end
+// of sine period
+byte *ResourceManager::generateTone(byte *buffer, int frequency, int length, int audioRate) {
+	Common::SineTable table = Common::SineTable(40000);
+	int numberOfSamplesPerT = audioRate / frequency;
+	int i = 0;
+
+	// Generate minimal length of the tone
+	for(; i < length; i++) {
+		buffer[i] = (byte)
+			((table.at((i * (40000 / numberOfSamplesPerT)) % 40000) * 127) + 127);
+	}
+
+	// Generate the tone until the end of a sine period and try to make
+	// the transition to the next tone a little bit smoother
+	for(; buffer[i - 1] > 127; i++)
+		buffer[i] = (byte)
+			((table.at((i * (40000 / numberOfSamplesPerT)) % 40000) * 127) + 127);
+	for(; buffer[i - 1] < 127; i++)
+		buffer[i] = (byte)
+			((table.at((i * (40000 / numberOfSamplesPerT)) % 40000) * 127) + 127);
+	if (buffer[i - 1] == 127)
+		i++;
+	buffer[i - 2] = (1.2 * 127 + 0.8 * buffer[i - 3]) / 2;
+	return buffer + i - 1;
+}
+
+// Tones with frequencies between 1500 Hz and 1800 Hz, frequencies go up and down
+// with a step of 10 Hz.
+void ResourceManager::initSiren() {
+	int audioRate = 80000;
+	int length = audioRate / 90; // minimal length of each tone
+
+	// * 60 for the minimal length, another 20 * length as a spare, for longer tones
+	byte *buffer = new byte[length * 80]; 
+	byte *pBuffer = buffer;
+
+	for (int i = 0; i < 30; i++)
+		pBuffer = generateTone(pBuffer, 1770 - i * 10, length, audioRate);
+
+	for (int i = 0; i < 30; i++)
+		pBuffer = generateTone(pBuffer, 1530 + i * 10, length, audioRate);
+
+	byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
+
+	_sirenStream.reset(Audio::makeLoopingAudioStream(
+			Audio::makeRawStream(buffer, pBuffer - buffer, audioRate,
+									streamFlag, DisposeAfterUse::YES), 0));
+}
+
 static Common::MemoryReadStream *convertToMod(const char *filename, int version) {
 	// MS2 format
 	struct {
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
index edcd294..8d06c60 100644
--- a/engines/supernova2/resman.h
+++ b/engines/supernova2/resman.h
@@ -51,14 +51,18 @@ public:
 
 	Audio::SeekableAudioStream *getSoundStream(AudioId index);
 	Audio::AudioStream *getSoundStream(MusicId index);
+	Audio::AudioStream *getSirenStream();
 	MS2Image *getImage(int filenumber);
 	const byte *getCursor(CursorId id) const;
+	int getAudioRate();
 
 private:
 	void initSoundFiles();
 	void initGraphics();
 	void initCursorGraphics();
 	void initImages();
+	void initSiren();
+	byte *generateTone(byte *buffer, int frequency, int length, int audioRate);
 
 private:
 	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
@@ -66,6 +70,7 @@ private:
 	Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
 	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
+	Common::ScopedPtr<Audio::AudioStream> _sirenStream;
 	Common::ScopedPtr<Audio::AudioStream> _musicMadMonkeys;
 	Common::ScopedPtr<Audio::AudioStream> _musicOutro;
 	int _audioRate;
diff --git a/engines/supernova2/sound.cpp b/engines/supernova2/sound.cpp
index f08158a..c0688ac 100644
--- a/engines/supernova2/sound.cpp
+++ b/engines/supernova2/sound.cpp
@@ -53,6 +53,14 @@ void Sound::play(MusicId index) {
 					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
 }
 
+void Sound::playSiren() {
+	Audio::AudioStream *stream = _resMan->getSirenStream();
+
+	stop();
+	_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, stream,
+					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
+}
+
 bool Sound::isPlaying() {
 	return _mixer->isSoundHandleActive(_soundHandle);
 }
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index d54bac9..ac65b19 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -66,6 +66,7 @@ public:
 
 	void play(AudioId index);
 	void play(MusicId index);
+	void playSiren();
 	void stop();
 	bool isPlaying();
 private:


Commit: f00c19604e412e26004a22fd7ac14ae0a308d9f0
    https://github.com/scummvm/scummvm/commit/f00c19604e412e26004a22fd7ac14ae0a308d9f0
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add missing string to translatino tool

Changed paths:
    devtools/create_supernova2/gametext.h
    devtools/create_supernova2/strings-en.po


diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index e708dcb..8fd05a76 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -775,6 +775,7 @@ const char *gameText[] = {
 "\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"", //"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
 "Sieht gef\204hrlich aus!", //Looks dangerous
 "Das Auge ist schon offen.", //This Eye is already opened
+"Es gelingt dir, zu fliehen.", //You manage to escape
 "|", //Dialog separator
 NULL
 };
diff --git a/devtools/create_supernova2/strings-en.po b/devtools/create_supernova2/strings-en.po
index cce2afb..d4e58c6 100644
--- a/devtools/create_supernova2/strings-en.po
+++ b/devtools/create_supernova2/strings-en.po
@@ -2789,3 +2789,9 @@ msgid ""
 "werden!\""
 msgstr ""
 "\"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!\""
+
+#: ../../ms2_mus.c:319
+msgid ""
+"Es gelingt dir, zu fliehen."
+msgstr ""
+"You manage to escape."


Commit: 006880ea7cfc906a8ca0f4bfb5f7fcf9955f6e39
    https://github.com/scummvm/scummvm/commit/006880ea7cfc906a8ca0f4bfb5f7fcf9955f6e39
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add Museum room.

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/rooms.cpp
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index c457bf7..7ab8d9d 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -140,12 +140,12 @@ kString50, kString51, kString52, kString53, kString54,
 kString55, kString56, kString57, kString58, kString59,
 kString60, kString61, kString62, kString63, kString64,
 kString65, kString66, kString67, kString68, kString69,
-kString70, kString71, kString72, kString73, kString74,
-kString75, kString76, kString77, kString78, kString79,
-kString80, kString81, kString82, kString83, kString84,
+kStringMuseum8, kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15,
+kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14,
+kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
 kString85, kString86, kString87, kString88, kString89,
-kString90, kString91, kString92, kString93, kString94,
-kStringEntrance, kStringDoor, kString97, kString98, kString99,
+kString90, kString91, kString92, kStringDinosaur, kStringDinosaurDescription,
+kStringEntrance, kStringDoor, kStringRoad, kString98, kString99,
 kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
@@ -249,7 +249,7 @@ kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntro
 kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
 kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
 kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14, 
-kStringMonsterDescription, kStringPyramid16, kStringDialogSeparator
+kStringMonsterDescription, kStringPyramid16, kStringMuseum11, kStringDialogSeparator
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 42f6f62..3e1cb7d 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -63,7 +63,8 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{51,     0,      6010},
 	{50,     0,        -1},
 	{51,     6010,   9020},
-	{54,     0,        -1}
+	{54,     0,        -1},
+	{48,     0,        -1}
 };
 
 static const byte mouseNormal[64] = {
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index f036b22..de92a92 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -677,7 +677,7 @@ bool Games::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderMessage(kStringCabinOccupiedSay);
 	}
 	else if (verb == ACTION_LOOK && obj1._id == POSTER) {
-		_gm->_taxi_possibility &= ~4; // add culture palace
+		_gm->_state._taxiPossibility &= ~4; // add culture palace
 		return false;
 	}
 	else 
@@ -1884,7 +1884,7 @@ void Elevator::jobDescription() {
 	_vm->removeMessage();
 	_vm->renderMessage(kStringElevator58);
 	_gm->drawGUI();
-	_gm->_state._startTime = g_system->getMillis() - 2390000;
+	_gm->_state._startTime = g_system->getMillis() - 150000000;
 	_gm->_state._tipsy = false;
 	_gm->_state._toMuseum = true;
 }
@@ -3783,19 +3783,114 @@ Museum::Museum(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 29;
 	_id = MUSEUM;
 	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDinosaur, kStringDinosaurDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[1] = Object(_id, kStringEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 1, 1, 0, NULLROOM, 0);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_EING, 9);
+	_objectState[3] = Object(_id, kStringRoad, kStringDefaultDescription, MUS_STREET, EXIT, 3, 3, 0);
 }
 
 void Museum::onEntrance() {
+	_gm->setAnimationTimer(1);
+	if (_gm->_state._alarmCracked && !_gm->_state._alarmOn) {
+		_gm->_state._eventTime = kMaxTimerValue;
+		_gm->_state._alarmOn = false;
+		_gm->_state._haste = false;
+		_vm->renderMessage(kStringMuseum1);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->_state._sirenOn = false;
+		_vm->stopSound();
+		_vm->paletteFadeOut();
+		_vm->_system->fillScreen(kColorBlack);
+		_vm->_screen->setViewportBrightness(255);
+		_vm->renderMessage(kStringMuseum2);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_vm->_screen->setViewportBrightness(0);
+		_vm->setCurrentImage(26);
+		_vm->loadGame(kSleepAutosaveSlot);
+		_vm->renderImage(0);
+		_vm->paletteFadeIn();
+		if (_gm->_rooms[MUS_RUND]->getObject(4)->_type & CARRIED) {
+			_gm->reply(kStringMuseum3, 1, 1 + 128);
+			_gm->reply(kStringMuseum4, 1, 1 + 128);
+			_gm->takeMoney(30000);
+			_vm->playSound(kAudioAppearance1);
+		} else {
+			_gm->reply(kStringMuseum5, 1, 1 + 128);
+			_gm->say(kStringMuseum6);
+			_gm->reply(kStringMuseum7, 1, 1 + 128);
+		}
+		_vm->paletteFadeOut();
+		_gm->changeRoom(CITY2);
+		_gm->_newRoom = true;
+		_gm->drawGUI();
+	}
 	setRoomSeen(true);
 }
 
 void Museum::animation() {
+	_gm->drawClock();
+	_gm->setAnimationTimer(11);
 }
 
 bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_WALK && obj1._id == MUS_STREET) {
+		if (!_gm->_state._alarmOn && 
+				!(_gm->_rooms[MUS_RUND]->getObject(4)->_type & CARRIED)) {
+			_vm->renderMessage(kStringMuseum10);
+		} else {
+			_gm->_state._eventTime = kMaxTimerValue;
+			if (!_gm->_state._alarmOn) {
+				_vm->renderMessage(kStringMuseum11);
+				if (_gm->_state._sirenOn) {
+					_vm->stopSound();
+					_gm->_state._sirenOn = false;
+				}
+			} else 
+				_vm->renderMessage(kStringMuseum12);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_vm->paletteFadeOut();
+			_vm->_system->fillScreen(kColorBlack);
+			_vm->_screen->setViewportBrightness(255);
+			_vm->renderMessage(kStringMuseum13);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_vm->_screen->setViewportBrightness(0);
+			_vm->loadGame(kSleepAutosaveSlot);
+			if (_gm->_state._money >= 8)
+				_gm->takeMoney(-8);
+			if (_gm->_rooms[MUS_RUND]->getObject(4)->_type & CARRIED)
+				_gm->takeObject(*_gm->_rooms[INTRO]->getObject(7));
+			_gm->changeRoom(CULTURE_PALACE);
+			_gm->_newRoom = true;
+			_gm->_state._alarmOn = false;
+			_gm->_state._haste = false;
+			_gm->drawGUI();
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, DOOR) &&
+			!(_objectState[2]._type & OPENED)) {
+		if (_gm->crackDoor(20)) {
+			_vm->renderImage(1);
+			_objectState[2]._type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR && (obj1._type & OPENED)) {
+		_vm->renderImage(1 + 128);
+		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_USE &&
+					Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
+		_vm->renderMessage(kStringMuseum14);
+	} else if (verb == ACTION_WALK && obj1._id == DOOR) {
+		_gm->_state._haste = true;
+		return false;
+	} else
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index ac65b19..17555c4 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -49,6 +49,7 @@ enum AudioId {
 	kAudioShip3,
 	kAudioShipDeath,
 	kAudioDeath,
+	kAudioCaught,
 	kAudioNumSamples
 };
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 69eadc5..3cb268a 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -49,9 +49,14 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeSint16LE(_state._pyraE);
 	out->writeByte(_state._pyraS);
 	out->writeByte(_state._pyraZ);
+	out->writeByte(_state._alarmOn);
+	out->writeByte(_state._alarmCracked);
+	out->writeByte(_state._haste);
+	out->writeByte(_state._sirenOn);
 	out->writeSint16LE(_state._pyraDirection);
 	out->writeUint32LE(_state._eventTime);
 	out->writeSint32LE(_state._eventCallback);
+	out->writeByte(_state._taxiPossibility);
 	for (int i = 0; i < 15; i++) {
 		out->writeSint16LE(_state._puzzleTab[i]);
 	}
@@ -94,9 +99,14 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._pyraE = in->readSint16LE();
 	_state._pyraS = in->readByte();
 	_state._pyraZ = in->readByte();
+	_state._alarmOn = in->readByte();
+	_state._alarmCracked = in->readByte();
+	_state._haste = in->readByte();
+	_state._sirenOn = in->readByte();
 	_state._pyraDirection = in->readSint16LE();
 	_state._eventTime = in->readUint32LE();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
+	_state._taxiPossibility = in->readByte();
 	for (int i = 0; i < 15; i++)
 		_state._puzzleTab[i] = in->readSint16LE();
 	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
@@ -345,7 +355,13 @@ void GameManager::initState() {
 	_timePaused = false;
 	_messageDuration = 0;
 	_animationTimer = 0;
-	_taxi_possibility = 4;
+	_mapOn = false;
+	_steps = false;
+	_cracking = false;
+	_alarmBefore = false;
+	RoomId startSecurityTab[10] = {MUS6, MUS7, MUS11, MUS10, MUS3, MUS2, MUS1, MUS8, MUS9, MUS5};
+	for (int i = 0; i < 10; i++)
+		_securityTab[i] = startSecurityTab[i];
 
 	_currentSentence = -1;
 	for (int i = 0 ; i < 6 ; ++i) {
@@ -372,9 +388,14 @@ void GameManager::initState() {
 	_state._pyraE = 0;
 	_state._pyraS = 4;
 	_state._pyraZ = 10;
+	_state._alarmOn = false;
+	_state._alarmCracked = false;
+	_state._haste = false;
+	_state._sirenOn = false;
 	_state._pyraDirection = 0;
 	_state._eventTime = kMaxTimerValue;
 	_state._eventCallback = kNoFn;
+	_state._taxiPossibility = 4;
 	int16 startPuzzleTab[15] = {12, 3, 14, 1, 11, 0, 2, 13, 9, 5, 4, 10, 7, 6, 8};
 	for (int i = 0; i < 15; i++)
 		_state._puzzleTab[i] = startPuzzleTab[i];
@@ -516,6 +537,9 @@ void GameManager::updateEvents() {
 		case kPyramidEndFn:
 			pyramidEnd();
 			break;
+		case kCaughtFn:
+			caught();
+			break;
 		}
 		_vm->_allowLoadGame = true;
 		_vm->_allowSaveGame = true;
@@ -1500,6 +1524,8 @@ void GameManager::handleInput() {
 void GameManager::executeRoom() {
 	if (_currentRoom == _rooms[PUZZLE_FRONT])
 		puzzleConstruction();
+	if (_state._sirenOn && !_vm->_sound->isPlaying())
+		_vm->_sound->playSiren();
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
 		handleInput();
 		if (_mouseClicked) {
@@ -1520,7 +1546,10 @@ void GameManager::executeRoom() {
 			g_system->fillScreen(kColorBlack);
 			_vm->renderRoom(*_currentRoom);
 		}
-		drawMapExits();
+		if (_currentRoom->getId() < MUSEUM)
+			drawMapExits();
+		else
+			drawClock();
 		drawInventory();
 		drawStatus();
 		drawCommandBox();
@@ -1626,7 +1655,7 @@ void GameManager::taxi() {
 		kStringLeaveTaxi
 	};
 	Common::String input;
-	int possibility = _taxi_possibility;
+	int possibility = _state._taxiPossibility;
 
 	_state._previousRoom = _currentRoom;
 	_currentRoom = _rooms[INTRO];
@@ -1643,7 +1672,7 @@ void GameManager::taxi() {
 		_currentRoom->removeSentenceByMask(possibility, 1);
 		switch (answer = dialog(6, _dials, dest, 1)) {
 		case 3:
-			_taxi_possibility += 8;
+			_state._taxiPossibility += 8;
 			possibility += 8;
 			taxiUnknownDestination();
 			break;
@@ -2022,5 +2051,134 @@ void GameManager::puzzleConstruction() {
 	}
 }
 
+void GameManager::alarm() {
+	_vm->_sound->playSiren();
+	_state._sirenOn = true;
+	if (_vm->_screen->isMessageShown())
+		_vm->removeMessage();
+	_vm->renderMessage(kStringMuseum7);
+	_state._eventTime = g_system->getMillis() + 270;
+	_state._eventCallback = kCaughtFn;
+	_state._alarmOn = true;
+}
+
+void GameManager::caught() {
+	if (_vm->_screen->isMessageShown())
+		_vm->removeMessage();
+	if        (_currentRoom <  _rooms[MUS1]) {
+	} else if (_currentRoom <= _rooms[MUS2]) {
+		_vm->renderImage( 8); 
+		_vm->renderImage(18);
+	} else if (_currentRoom == _rooms[MUS3]) {
+		_vm->renderImage(12); 
+		_vm->renderImage(30);
+	} else if (_currentRoom == _rooms[MUS4]) {
+		_vm->renderImage( 8); 
+		_vm->renderImage(18);
+	} else if (_currentRoom == _rooms[MUS5]) {
+		_vm->renderImage( 9); 
+		_vm->renderImage(29);
+	} else if (_currentRoom <= _rooms[MUS7]) {
+		_vm->renderImage( 7); 
+		_vm->renderImage(17);
+	} else if (_currentRoom <= _rooms[MUS9]) {
+		_vm->renderImage( 1); 
+		_vm->renderImage( 7);
+	} else if (_currentRoom <= _rooms[MUS11]) {
+		_vm->renderImage( 2); 
+		_vm->renderImage( 8);
+	}
+	caught2();
+}
+
+void GameManager::caught2() {
+	_vm->renderMessage(kStringMuseum8);
+	_vm->playSound(kAudioCaught);
+	waitOnInput(_messageDuration);
+	_vm->removeMessage();
+	_state._sirenOn = false;
+	_mapOn = false;
+	_state._haste = false;
+	dead(kStringMuseum9);
+}
+
+void GameManager::drawClock() {
+	int time = (g_system->getMillis() - _state._startTime) / 700;
+	int second = time % 100;
+	Room *r;
+	if (!_mapOn) {
+		_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+		char s[9] = "00";
+		s[1] = time % 10 + 48;
+		time /= 10;
+		s[0] = time % 10 + 48;
+		time /= 10;
+		_vm->renderText(s, 293, 180, kColorWhite99);
+		strcpy(s, " 0:00");
+		s[4] = time % 10 + 48;
+		time /= 10;
+		s[3] = time % 10 + 48;
+		time /= 10;
+		s[1] = time % 10 + 48;
+		time /= 10;
+		if (time)
+			s[0] = time % 10 + 48;
+		_vm->renderText(s, 285, 170, kColorWhite99);
+	}
+	if ((r = _rooms[_securityTab[second / 10]]) == _currentRoom) {
+		//arrow();
+		_state._alarmCracked = false;
+		caught();
+	}
+	for (int i = 0; i < 3; i++) {
+		Object *o = r->getObject(i);
+		if ((o->_id == DOOR || o->_id == ENCRYPTED_DOOR || o->_id == SMALL_DOOR) && 
+				(o->_type & OPENED) && ! _state._alarmOn)
+			alarm();
+	}
+	if (!_state._alarmOn && _currentRoom == _rooms[MUS4] && 
+			second >= 21 && second <= 40)
+		alarm();
+	if (_currentRoom == _rooms[MUS_EING] && second >= 22 && second <= 29) {
+		if (!_steps && !_state._alarmCracked) {
+			_steps = true;
+			_vm->renderMessage(kStringMuseum6);
+		}
+	}
+	else _steps = false;
+}
+
+void GameManager::crack(int time) {
+	_alarmBefore = _state._alarmOn;
+	_cracking = true;
+	//hourglass
+	int t = 0;
+	int z;
+	int zv = 0;
+	do {
+		do {
+			wait(1);
+		} while ((z = (g_system->getMillis() - _state._startTime) / 700) == zv);
+		zv = z;
+		drawClock();
+		t++;
+	} while (t < time && _state._alarmOn == _alarmBefore) ;
+	_cracking = false;
+	//arrow
+	if (_state._alarmOn == _alarmBefore)
+		_vm->removeMessage();
+}
+
+bool GameManager::crackDoor(int time) {
+	_vm->renderMessage(kStringMuseum15);
+	crack(time);
+	if (_state._alarmOn != _alarmBefore) {
+		waitOnInput(_messageDuration);
+		_vm->removeMessage();
+		_vm->renderMessage(kStringMuseum16);
+	}
+	return !_state._alarmOn;
+}
+
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 8bd1a02..25b0cd9 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -41,7 +41,7 @@ struct ConstructionEntry {
 
 const int32 kMaxTimerValue = 0x7FFFFFFF;
 
-enum EventFunction { kNoFn, kSoberFn, kPyramidEndFn};
+enum EventFunction { kNoFn, kSoberFn, kPyramidEndFn, kCaughtFn};
 
 struct GameState {
 	int16 _money;
@@ -62,6 +62,11 @@ struct GameState {
 	char _pyraZ;
 	int16 _pyraDirection;
 	int16 _puzzleTab[15];
+	bool _alarmCracked;
+	bool _alarmOn;
+	bool _haste;
+	bool _sirenOn;
+	byte _taxiPossibility;
 };
 
 class Inventory {
@@ -178,9 +183,12 @@ public:
 	byte _rows[6];
 	byte _rowsStart[6];
 	byte _dials[6];
-	int _taxi_possibility;
 	unsigned char _puzzleField[16];
-
+	bool _mapOn;
+	bool _steps;
+	bool _cracking;
+	bool _alarmBefore;
+	RoomId _securityTab[10];
 
 	void takeObject(Object &obj);
 	void setObjectNull(Object *&obj);
@@ -237,6 +245,12 @@ public:
 	bool move(Action verb, Object &obj);
 	void compass();
 	void puzzleConstruction();
+	void drawClock();
+	void caught();
+	void caught2();
+	void alarm();
+	void crack(int time);
+	bool crackDoor(int time);
 
 private:
 	int _prevImgId;


Commit: 46fe10db87933ce8325f33b64503f713b6f7f998
    https://github.com/scummvm/scummvm/commit/46fe10db87933ce8325f33b64503f713b6f7f998
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add MuseumEntrance and Mus1 rooms.

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 7ab8d9d..7143b6f 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -91,7 +91,7 @@ enum RoomId {
 	LCORRIDOR1,LCORRIDOR2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
 	BST_DOOR,HALL,COFFIN_ROOM,MASK,
 
-	MUSEUM,MUS_EING,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
+	MUSEUM,MUS_ENTRANCE,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
 	MUS9,MUS10,MUS11,MUS_RUND,
 	MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,
 	NUMROOMS,NULLROOM
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index de92a92..a414aa0 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3789,7 +3789,7 @@ Museum::Museum(Supernova2Engine *vm, GameManager *gm) {
 
 	_objectState[0] = Object(_id, kStringDinosaur, kStringDinosaurDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
 	_objectState[1] = Object(_id, kStringEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 1, 1, 0, NULLROOM, 0);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_EING, 9);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_ENTRANCE, 9);
 	_objectState[3] = Object(_id, kStringRoad, kStringDefaultDescription, MUS_STREET, EXIT, 3, 3, 0);
 }
 
@@ -3833,8 +3833,6 @@ void Museum::onEntrance() {
 }
 
 void Museum::animation() {
-	_gm->drawClock();
-	_gm->setAnimationTimer(11);
 }
 
 bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
@@ -3894,36 +3892,72 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-MusEing::MusEing(Supernova2Engine *vm, GameManager *gm) {
+MusEntrance::MusEntrance(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
-	_id = MUS_EING;
+	_fileNumber = 32;
+	_id = MUS_ENTRANCE;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED, 1, 1, 2, MUSEUM, 23);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS11, 2);
 }
 
-void MusEing::onEntrance() {
+void MusEntrance::onEntrance() {
 	setRoomSeen(true);
 }
 
-void MusEing::animation() {
+void MusEntrance::animation() {
 }
 
-bool MusEing::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+bool MusEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_OPEN && obj1._id == DOOR)
+		_gm->_rooms[MUS11]->getObject(2)->_type |= OPENED;
+	else if (verb == ACTION_CLOSE && obj1._id == DOOR)
+		_gm->_rooms[MUS11]->getObject(2)->_type &= ~OPENED;
+	else if (verb == ACTION_USE && 
+				Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+				!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(20)) {
+			_vm->renderImage(2);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+		return true;
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+			(obj1._type & OPENED)) {
+		_vm->renderImage(2 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+		return true;
+	}
+	return false;
 }
 
 Mus1::Mus1(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 35;
 	_id = MUS1;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[15] = kShownTrue;
+	_shown[26] = kShownTrue;
+	_shown[27] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS2, 22);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 4, 4, 11, MUS8, 9);
 }
 
 void Mus1::onEntrance() {
+	_gm->securityEntrance();
 	setRoomSeen(true);
 }
 
@@ -3931,7 +3965,8 @@ void Mus1::animation() {
 }
 
 bool Mus1::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
 }
 
 Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) {
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 8194b02..c71a4c6 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -563,9 +563,9 @@ public:
 private:
 };
 
-class MusEing : public Room {
+class MusEntrance : public Room {
 public:
-	MusEing(Supernova2Engine *vm, GameManager *gm);
+	MusEntrance(Supernova2Engine *vm, GameManager *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 3cb268a..36dc72c 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -72,6 +72,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	}
 
 	// Rooms
+	out->writeByte(_lastRoom->getId());
 	out->writeByte(_currentRoom->getId());
 	for (int i = 0; i < NUMROOMS; ++i) {
 		_rooms[i]->serialize(out);
@@ -124,10 +125,12 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	}
 
 	// Rooms
+	RoomId lastRoomId = static_cast<RoomId>(in->readByte());
 	RoomId curRoomId = static_cast<RoomId>(in->readByte());
 	for (int i = 0; i < NUMROOMS; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
+	_lastRoom = _rooms[lastRoomId];
 	changeRoom(curRoomId);
 
 	// Some additional variables
@@ -309,7 +312,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[COFFIN_ROOM];
 	delete _rooms[MASK];
 	delete _rooms[MUSEUM];
-	delete _rooms[MUS_EING];
+	delete _rooms[MUS_ENTRANCE];
 	delete _rooms[MUS1];
 	delete _rooms[MUS2];
 	delete _rooms[MUS3];
@@ -449,7 +452,7 @@ void GameManager::initRooms() {
 	_rooms[COFFIN_ROOM] = new CoffinRoom(_vm, this);
 	_rooms[MASK] = new Mask(_vm, this);
 	_rooms[MUSEUM] = new Museum(_vm, this);
-	_rooms[MUS_EING] = new MusEing(_vm, this);
+	_rooms[MUS_ENTRANCE] = new MusEntrance(_vm, this);
 	_rooms[MUS1] = new Mus1(_vm, this);
 	_rooms[MUS2] = new Mus2(_vm, this);
 	_rooms[MUS3] = new Mus3(_vm, this);
@@ -1448,8 +1451,10 @@ void GameManager::handleInput() {
 			} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
 				// This is closed
 				_vm->renderMessage(kStringGenericInteract3);
-			} else
+			} else {
+				_lastRoom = _currentRoom;
 				changeRoom(_inputObject[0]->_exitRoom);
+			}
 
 			break;
 
@@ -2139,7 +2144,7 @@ void GameManager::drawClock() {
 	if (!_state._alarmOn && _currentRoom == _rooms[MUS4] && 
 			second >= 21 && second <= 40)
 		alarm();
-	if (_currentRoom == _rooms[MUS_EING] && second >= 22 && second <= 29) {
+	if (_currentRoom == _rooms[MUS_ENTRANCE] && second >= 22 && second <= 29) {
 		if (!_steps && !_state._alarmCracked) {
 			_steps = true;
 			_vm->renderMessage(kStringMuseum6);
@@ -2180,5 +2185,92 @@ bool GameManager::crackDoor(int time) {
 	return !_state._alarmOn;
 }
 
+void GameManager::museumDoorInteract(Action verb, Object &obj1, Object &obj2) {
+	static struct {
+		int _r1;
+		int _o1;
+		int _r2;
+		int _o2;
+	} doorTab[11] = {
+		{MUS1, 0, MUS2, 0},
+		{MUS2, 1, MUS3, 0},
+		{MUS3, 1, MUS10, 0},
+		{MUS10, 1, MUS11, 0},
+		{MUS11, 1, MUS7, 1},
+		{MUS7, 0, MUS6, 1},
+		{MUS6, 0, MUS5, 1},
+		{MUS5, 0, MUS4, 0},
+		{MUS5, 2, MUS9, 1},
+		{MUS9, 0, MUS8, 1},
+		{MUS8, 0, MUS1, 1}
+	};
+	Room *r;
+	if (verb == ACTION_OPEN && obj1._id == DOOR) {
+		for (int i = 0; i < 11; i++) {
+			if ((_currentRoom == _rooms[doorTab[i]._r1]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o1)) {
+				r = _rooms[doorTab[i]._r2];
+				r->getObject(doorTab[i]._o2)->_type |= OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownTrue);
+			} else if ((_currentRoom == _rooms[doorTab[i]._r2]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o2)) {
+				r = _rooms[doorTab[i]._r1];
+				r->getObject(doorTab[i]._o1)->_type |= OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownTrue);
+			}
+		}
+	} else if (verb == ACTION_OPEN && obj1._id == DOOR) {
+		for (int i = 0; i < 11; i++) {
+			if ((_currentRoom == _rooms[doorTab[i]._r1]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o1)) {
+				r = _rooms[doorTab[i]._r2];
+				r->getObject(doorTab[i]._o2)->_type &= ~OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownFalse);
+			} else if ((_currentRoom == _rooms[doorTab[i]._r2]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o2)) {
+				r = _rooms[doorTab[i]._r1];
+				r->getObject(doorTab[i]._o1)->_type &= ~OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownFalse);
+			}
+		}
+	}
+}
+
+void GameManager::securityEntrance() {
+	static struct {
+		RoomId _r;
+		int _a1;
+		int _a2;
+	} securityList[11] = {
+		{MUS1 ,11,31},
+		{MUS2 , 7,17},
+		{MUS3 , 7,17},
+		{MUS10, 1, 7},
+		{MUS11, 1, 7},
+		{MUS7 ,10,32},
+		{MUS6 , 8,18},
+		{MUS5 , 8,18},
+		{MUS9 , 2, 8},
+		{MUS8 , 2, 8},
+		{MUS1 , 0, 0}
+	};
+
+	int time = (g_system->getMillis() - _state._startTime) / 700;
+	int second = time % 100;
+
+	if (_rooms[_securityTab[second / 10]] == _currentRoom) {
+		int i;
+		for (i = 0; _currentRoom != _rooms[securityList[i]._r]; i++)
+		{}
+		if (_lastRoom == _rooms[securityList[i + 1]._r]) {
+			_vm->renderImage(securityList[i]._a1);
+			_vm->renderImage(securityList[i]._a2);
+			caught2();
+		}
+		else
+			caught();
+	}
+}
+
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 25b0cd9..e6a3199 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -154,6 +154,7 @@ public:
 	int _mouseY;
 	int _mouseField;
 	Room *_currentRoom;
+	Room *_lastRoom;
 	bool _newRoom;
 	Room *_rooms[NUMROOMS];
 	Inventory _inventory;
@@ -251,6 +252,8 @@ public:
 	void alarm();
 	void crack(int time);
 	bool crackDoor(int time);
+	void museumDoorInteract(Action verb, Object &obj1, Object &obj2);
+	void securityEntrance();
 
 private:
 	int _prevImgId;


Commit: d93656c10a048d3de2ee209c59533dad1f2d7759
    https://github.com/scummvm/scummvm/commit/d93656c10a048d3de2ee209c59533dad1f2d7759
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add rooms Mus2 to Mus7

The rooms aren't tested yet, because the first room after
MusEntrance is Mus11, which isn't implemented yet.

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp
    engines/supernova2/state.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 7143b6f..1ec7360 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -145,7 +145,7 @@ kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseu
 kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
 kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kStringDinosaur, kStringDinosaurDescription,
-kStringEntrance, kStringDoor, kStringRoad, kString98, kString99,
+kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
 kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index a414aa0..eb8d510 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3973,12 +3973,23 @@ Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 35;
 	_id = MUS2;
 	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[22] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS1, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS3, 22);
 }
 
 void Mus2::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
@@ -3986,36 +3997,62 @@ void Mus2::animation() {
 }
 
 bool Mus2::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
 }
 
 Mus3::Mus3(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 35;
 	_id = MUS3;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[23] = kShownTrue;
+	_shown[28] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS2, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 5, 5, 12, MUS10, 19);
 }
 
 void Mus3::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus3::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus3::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
 }
 
 Mus4::Mus4(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 35;
 	_id = MUS4;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[20] = kShownTrue;
+	_shown[21] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
+	_objectState[1] = Object(_id, kStringCamera, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
+
 }
 
 void Mus4::onEntrance() {
@@ -4026,19 +4063,31 @@ void Mus4::animation() {
 }
 
 bool Mus4::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
 }
 
 Mus5::Mus5(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 35;
 	_id = MUS5;
 	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[24] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 8, MUS6, 22);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 2, 2, 9, MUS9, 5);
+
 }
 
 void Mus5::onEntrance() {
+	_gm->securityEntrance();
 	setRoomSeen(true);
 }
 
@@ -4046,6 +4095,26 @@ void Mus5::animation() {
 }
 
 bool Mus5::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[1]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(8);
+			_objectState[1]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS6]->setSectionVisible(7, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(8 + 128);
+		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS6]->setSectionVisible(7, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
 	return true;
 }
 
@@ -4053,12 +4122,23 @@ Mus6::Mus6(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 35;
 	_id = MUS6;
 	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[19] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 7, MUS5, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS7, 22);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 6, 6, 0);
 }
 
 void Mus6::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
@@ -4066,6 +4146,29 @@ void Mus6::animation() {
 }
 
 bool Mus6::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(7);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS5]->setSectionVisible(8, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(7 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS5]->setSectionVisible(8, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR))
+		_vm->renderMessage(kStringMuseum14);
+	else
+		return false;
 	return true;
 }
 
@@ -4073,19 +4176,33 @@ Mus7::Mus7(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 35;
 	_id = MUS7;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[16] = kShownTrue;
+	_shown[25] = kShownTrue;
+	_shown[28] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS6, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 3, 3, 10, MUS11, 15);
 }
 
 void Mus7::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus7::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus7::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
 	return true;
 }
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 36dc72c..7e4d0b7 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -52,6 +52,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._alarmOn);
 	out->writeByte(_state._alarmCracked);
 	out->writeByte(_state._haste);
+	out->writeByte(_state._pressureCounter);
 	out->writeByte(_state._sirenOn);
 	out->writeSint16LE(_state._pyraDirection);
 	out->writeUint32LE(_state._eventTime);
@@ -103,6 +104,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._alarmOn = in->readByte();
 	_state._alarmCracked = in->readByte();
 	_state._haste = in->readByte();
+	_state._pressureCounter = in->readByte();
 	_state._sirenOn = in->readByte();
 	_state._pyraDirection = in->readSint16LE();
 	_state._eventTime = in->readUint32LE();
@@ -394,6 +396,7 @@ void GameManager::initState() {
 	_state._alarmOn = false;
 	_state._alarmCracked = false;
 	_state._haste = false;
+	_state._pressureCounter = 0;
 	_state._sirenOn = false;
 	_state._pyraDirection = 0;
 	_state._eventTime = kMaxTimerValue;
@@ -2272,5 +2275,21 @@ void GameManager::securityEntrance() {
 	}
 }
 
+void GameManager::pressureAlarmEntrance() {
+	_state._pressureCounter = 0;
+	securityEntrance();
+}
+
+void GameManager::pressureAlarmCount() {
+	if (!(_state._alarmOn ||
+			(_currentRoom == _rooms[MUS22] && _currentRoom->isSectionVisible(6)))) {
+		_state._pressureCounter++;
+		if ((_currentRoom >= _rooms[MUS12] && _state._pressureCounter > 8) || 
+				_state._pressureCounter > 16)
+			alarm();
+	}
+	setAnimationTimer(11);
+}
+
 }
 
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index e6a3199..640a5f6 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -65,6 +65,7 @@ struct GameState {
 	bool _alarmCracked;
 	bool _alarmOn;
 	bool _haste;
+	byte _pressureCounter;
 	bool _sirenOn;
 	byte _taxiPossibility;
 };
@@ -254,6 +255,8 @@ public:
 	bool crackDoor(int time);
 	void museumDoorInteract(Action verb, Object &obj1, Object &obj2);
 	void securityEntrance();
+	void pressureAlarmCount();
+	void pressureAlarmEntrance();
 
 private:
 	int _prevImgId;


Commit: e7dbd78995aadd2e816a7c80ad2f792233bb76f5
    https://github.com/scummvm/scummvm/commit/e7dbd78995aadd2e816a7c80ad2f792233bb76f5
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Update code formating.

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index eb8d510..925a936 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -499,10 +499,6 @@ TaxiStand::TaxiStand(Supernova2Engine *vm, GameManager *gm) {
 	_shown[0] = kShownTrue;
 	_shown[1] = kShownTrue;
 	_shown[2] = kShownTrue;
-	_shown[3] = kShownFalse;
-	_shown[4] = kShownFalse;
-	_shown[5] = kShownFalse;
-	_shown[6] = kShownFalse;
 	_shown[7] = kShownTrue;
 
 	_objectState[0] = Object(_id, kStringVehicle, kStringVehicleDescription, TAXI, NULLTYPE, 2, 2, 0, NULLROOM, 11);
@@ -640,15 +636,13 @@ bool Street::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->takeObject(*getObject(3));
 			_vm->playSound(kAudioSuccess);
 		}
-	}
-	else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
+	} else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
 		Common::String text = _vm->getGameString(kStringOnlyShop);
 		_vm->renderMessage(text);
 		_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
 		_vm->removeMessage();
 		return false;
-	}
-	else 
+	} else 
 		return false;
 	return true;
 }
@@ -675,12 +669,10 @@ void Games::onEntrance() {
 bool Games::interact(Action verb, Object &obj1, Object &obj2) {
 	if (verb == ACTION_WALK && obj1._id == OCCUPIED_CABIN) {
 		_vm->renderMessage(kStringCabinOccupiedSay);
-	}
-	else if (verb == ACTION_LOOK && obj1._id == POSTER) {
+	} else if (verb == ACTION_LOOK && obj1._id == POSTER) {
 		_gm->_state._taxiPossibility &= ~4; // add culture palace
 		return false;
-	}
-	else 
+	} else 
 		return false;
 	return true;
 }
@@ -816,7 +808,6 @@ Kiosk::Kiosk(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 19;
 	_id = KIOSK;
 	_shown[0] = kShownTrue;
-	_shown[1] = kShownFalse;
 	_shown[2] = kShownTrue;
 	_shown[3] = kShownTrue;
 	_shown[4] = kShownTrue;
@@ -939,13 +930,11 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->drawInventory();
 		_gm->drawMapExits();
 		_gm->drawCommandBox();
-	}
-	else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
+	} else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
 		for(int i = 0; i < 3; i++) {
 			_gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + 128);
 		}
-	}
-	else if (verb == ACTION_TALK && obj1._id >= SELLER) {
+	} else if (verb == ACTION_TALK && obj1._id >= SELLER) {
 		int i = 2;
 		if (getObject(9)->_type & CARRIED)
 			i++;
@@ -964,8 +953,7 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->drawInventory();
 		_gm->drawMapExits();
 		_gm->drawCommandBox();
-	}
-	else 
+	} else 
 		return false;
 	return true;
 }
@@ -1119,12 +1107,10 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 					_gm->drawMapExits();
 					_gm->drawCommandBox();
 				}
-			}
-			else 
+			} else 
 				notEnoughMoney();
 		}
-	}
-	else 
+	} else 
 		return false;
 	return true;
 }
@@ -1198,7 +1184,6 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderImage(2 + 128);
 		} else if (_shown[kMaxSection - 2] == 0) {
 			_vm->renderImage(2);
-			//_gm->reply("atnuhh", 0, 0);
 			_gm->reply(kStringCheckout15, 0, 0);
 			_vm->renderImage(2 + 128);
 			if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
@@ -1758,8 +1743,7 @@ bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
 				break;
 			}
 			_gm->drawGUI();
-		}
-		else
+		} else
 			_vm->renderMessage(kStringElevator61);
 	} else if ((verb == ACTION_USE || verb == ACTION_PRESS) && obj1._id == KEYPAD) {
 		_vm->renderMessage(kStringElevator62);
@@ -1797,8 +1781,7 @@ bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderImage(6);
 			_objectState[4]._type |= OPENED;
 			_vm->playSound(kAudioTaxiOpen);
-		}
-		else
+		} else
 			_vm->renderMessage(kStringElevator65);
 	} else
 		return false;
@@ -1896,8 +1879,6 @@ Apartment::Apartment(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 25;
 	_id = APARTMENT;
 	_shown[0] = kShownTrue;
-	_shown[1] = kShownFalse;
-	_shown[2] = kShownFalse;
 	_shown[3] = kShownTrue;
 
 	_objectState[0] = Object(_id, kStringChip, kStringChipDescription, CHIP, TAKE | COMBINABLE, 255, 255, 1);
@@ -1978,13 +1959,6 @@ Ship::Ship(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 45;
 	_id = SHIP;
 	_shown[0] = kShownTrue;
-	_shown[1] = kShownFalse;
-	_shown[2] = kShownFalse;
-	_shown[3] = kShownFalse;
-	_shown[4] = kShownFalse;
-	_shown[5] = kShownFalse;
-	_shown[6] = kShownFalse;
-	_shown[7] = kShownFalse;
 	_shown[8] = kShownTrue;
 
 	_objectState[0] = Object(_id, kStringSwitch, kStringDefaultDescription, SWITCH, PRESS | COMBINABLE, 0, 0, 0);
@@ -2231,8 +2205,7 @@ bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderImage(1);
 			_gm->_inventory.remove(*rope);
 			_objectState[0]._click = 29;
-		}
-		else
+		} else
 			_vm->renderMessage(kStringPyramid1);
 	} else if (verb == ACTION_USE && hole != nullptr && rope != nullptr) {
 		if (rope->_type & CARRIED)
@@ -2285,13 +2258,7 @@ PyrEntrance::PyrEntrance(Supernova2Engine *vm, GameManager *gm) {
 	_fileNumber = 9;
 	_id = PYR_ENTRANCE;
 	_shown[0] = kShownTrue;
-	_shown[1] = kShownFalse;
-	_shown[2] = kShownFalse;
-	_shown[3] = kShownFalse;
 	_shown[4] = kShownTrue;
-	_shown[5] = kShownFalse;
-	_shown[6] = kShownFalse;
-	_shown[7] = kShownFalse;
 	_shown[8] = kShownTrue;
 
 	_objectState[0] = Object(_id, kStringSign, kStringSign5Description, SIGN, NULLTYPE, 255, 255, 0);
@@ -2336,12 +2303,10 @@ void PyrEntrance::animation() {
 			_vm->playSound(kAudioShip3);
 			_gm->screenShake();
 			_gm->_rooms[FLOORDOOR]->setSectionVisible(kMaxSection - 1, kShownTrue);
-		}
-		else {
+		} else {
 			_gm->setAnimationTimer(1);
 		}
-	}
-	else
+	} else
 		_gm->setAnimationTimer(kMaxTimerValue);
 }
 
@@ -2499,8 +2464,7 @@ bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
 	if (_gm->move(verb, obj1)) {
 		_gm->passageConstruction();
 		_gm->_newRoom = true;
-	}
-	else if (verb == ACTION_PRESS && obj1._id == BUTTON) {
+	} else if (verb == ACTION_PRESS && obj1._id == BUTTON) {
 		if (isSectionVisible(22)) {
 			_vm->renderImage(21);
 			setSectionVisible(22, kShownFalse);
@@ -2560,8 +2524,7 @@ bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 		_vm->playSound(kAudioShip3);
 		_gm->screenShake();
-	}
-	else
+	} else
 		return false;
 	return true;
 }
@@ -2595,8 +2558,7 @@ bool BottomLeftDoor::interact(Action verb, Object &obj1, Object &obj2) {
 		else
 			_gm->passageConstruction();
 		_gm->_newRoom = true;
-	}
-	else
+	} else
 		return false;
 	return true;
 }
@@ -2818,8 +2780,7 @@ bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_description = kStringDefaultDescription;
 		_vm->playSound(kAudioShip3);
 		_gm->screenShake();
-	}
-	else
+	} else
 		return false;
 	return true;
 }
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 7e4d0b7..6309dab 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -1340,8 +1340,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderImage(1);
 				_vm->renderImage(2 + 128);
 				_currentRoom->getObject(0)->_click = 255;
-			}
-			else
+			} else
 				_inventory.remove(*o1);
 
 			_vm->renderMessage(kStringInsertChip);
@@ -1416,22 +1415,22 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 }
 
 void GameManager::drawGUI() {
-		drawMapExits();
-		drawInventory();
-		drawStatus();
-		drawCommandBox();
+	drawMapExits();
+	drawInventory();
+	drawStatus();
+	drawCommandBox();
 }
 
 void GameManager::playCD() {
-		CursorMan.showMouse(false);
-		_vm->playSound(kMusicMadMonkeys);
-		Common::KeyCode k = Common::KEYCODE_INVALID;
-		while(_vm->_sound->isPlaying())
-			if (waitOnInput(1, k))
-				break;
-		_vm->_sound->stop();
-		_vm->removeMessage();
-		CursorMan.showMouse(true);
+	CursorMan.showMouse(false);
+	_vm->playSound(kMusicMadMonkeys);
+	Common::KeyCode k = Common::KEYCODE_INVALID;
+	while(_vm->_sound->isPlaying())
+		if (waitOnInput(1, k))
+			break;
+	_vm->_sound->stop();
+	_vm->removeMessage();
+	CursorMan.showMouse(true);
 }
 
 void GameManager::handleInput() {
@@ -1847,8 +1846,7 @@ void GameManager::passageConstruction() {
 				   !wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2, -1));
 			_rooms[PYR_ENTRANCE]->setSectionVisible(6, 
 				   !wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2,  1));
-		}
-		else {
+		} else {
 			_rooms[PYR_ENTRANCE]->setSectionVisible(5, kShownFalse);
 			_rooms[PYR_ENTRANCE]->setSectionVisible(6, kShownFalse);
 		}
@@ -2152,8 +2150,7 @@ void GameManager::drawClock() {
 			_steps = true;
 			_vm->renderMessage(kStringMuseum6);
 		}
-	}
-	else _steps = false;
+	} else _steps = false;
 }
 
 void GameManager::crack(int time) {
@@ -2263,14 +2260,12 @@ void GameManager::securityEntrance() {
 
 	if (_rooms[_securityTab[second / 10]] == _currentRoom) {
 		int i;
-		for (i = 0; _currentRoom != _rooms[securityList[i]._r]; i++)
-		{}
+		for (i = 0; _currentRoom != _rooms[securityList[i]._r]; i++) {}
 		if (_lastRoom == _rooms[securityList[i + 1]._r]) {
 			_vm->renderImage(securityList[i]._a1);
 			_vm->renderImage(securityList[i]._a2);
 			caught2();
-		}
-		else
+		} else
 			caught();
 	}
 }


Commit: a8ca6b9f5272a19956c722042ff6800d4b6985eb
    https://github.com/scummvm/scummvm/commit/a8ca6b9f5272a19956c722042ff6800d4b6985eb
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Simplify code for generating siren.

The code is now simpler, and generates better sound even
with lower audio rate thanks to Criezy.

Changed paths:
    engines/supernova2/resman.cpp
    engines/supernova2/resman.h


diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index 3e1cb7d..f753277 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -28,7 +28,6 @@
 #include "common/system.h"
 #include "graphics/cursorman.h"
 #include "graphics/palette.h"
-#include "common/sinetables.h"
 
 #include "supernova2/graphics.h"
 #include "supernova2/resman.h"
@@ -222,48 +221,39 @@ const byte *ResourceManager::getCursor(CursorId id) const {
 
 // Generate a tone which minimal length is the length and ends at the end
 // of sine period
-byte *ResourceManager::generateTone(byte *buffer, int frequency, int length, int audioRate) {
-	Common::SineTable table = Common::SineTable(40000);
-	int numberOfSamplesPerT = audioRate / frequency;
+// NOTE: Size of the SineTable has to be the same as audioRate and a multiple of 4
+byte *ResourceManager::generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table) {
 	int i = 0;
 
-	// Generate minimal length of the tone
+	// Make sure length is a multiple of audioRate / frequency to end on a full sine wave and not in the middle.
+	// Also the length we have is a minimum length, so only increase it.
+	int r = 1 + (length - 1) * frequency / audioRate;
+	length = (1 + 2 * r * audioRate / frequency) / 2;
 	for(; i < length; i++) {
 		buffer[i] = (byte)
-			((table.at((i * (40000 / numberOfSamplesPerT)) % 40000) * 127) + 127);
+			((table.at((i * frequency) % audioRate) * 127) + 127);
 	}
-
-	// Generate the tone until the end of a sine period and try to make
-	// the transition to the next tone a little bit smoother
-	for(; buffer[i - 1] > 127; i++)
-		buffer[i] = (byte)
-			((table.at((i * (40000 / numberOfSamplesPerT)) % 40000) * 127) + 127);
-	for(; buffer[i - 1] < 127; i++)
-		buffer[i] = (byte)
-			((table.at((i * (40000 / numberOfSamplesPerT)) % 40000) * 127) + 127);
-	if (buffer[i - 1] == 127)
-		i++;
-	buffer[i - 2] = (1.2 * 127 + 0.8 * buffer[i - 3]) / 2;
-	return buffer + i - 1;
+	return buffer + length;
 }
 
 // Tones with frequencies between 1500 Hz and 1800 Hz, frequencies go up and down
 // with a step of 10 Hz.
 void ResourceManager::initSiren() {
-	int audioRate = 80000;
+	int audioRate = 44000;
 	int length = audioRate / 90; // minimal length of each tone
 
 	// * 60 for the minimal length, another 20 * length as a spare, for longer tones
 	byte *buffer = new byte[length * 80]; 
 	byte *pBuffer = buffer;
+	Common::SineTable table(audioRate);
 
 	for (int i = 0; i < 30; i++)
-		pBuffer = generateTone(pBuffer, 1770 - i * 10, length, audioRate);
+		pBuffer = generateTone(pBuffer, 1800 - i * 10, length, audioRate, table);
 
 	for (int i = 0; i < 30; i++)
-		pBuffer = generateTone(pBuffer, 1530 + i * 10, length, audioRate);
+		pBuffer = generateTone(pBuffer, 1500 + i * 10, length, audioRate, table);
 
-	byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
+	byte streamFlag = Audio::FLAG_UNSIGNED;
 
 	_sirenStream.reset(Audio::makeLoopingAudioStream(
 			Audio::makeRawStream(buffer, pBuffer - buffer, audioRate,
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
index 8d06c60..6716bf5 100644
--- a/engines/supernova2/resman.h
+++ b/engines/supernova2/resman.h
@@ -25,6 +25,7 @@
 
 #include "audio/audiostream.h"
 #include "common/ptr.h"
+#include "common/sinetables.h"
 
 #include "supernova2/graphics.h"
 #include "supernova2/sound.h"
@@ -32,6 +33,7 @@
 
 namespace Common {
 class MemoryReadStream;
+class SineTable;
 }
 
 namespace Supernova2 {
@@ -62,7 +64,7 @@ private:
 	void initCursorGraphics();
 	void initImages();
 	void initSiren();
-	byte *generateTone(byte *buffer, int frequency, int length, int audioRate);
+	byte *generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table);
 
 private:
 	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];


Commit: 01a3f82886c3acf4778fede58b3d93859620c971
    https://github.com/scummvm/scummvm/commit/01a3f82886c3acf4778fede58b3d93859620c971
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add rooms Mus8 to Mus11

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 1ec7360..092d4b1 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -146,7 +146,7 @@ kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
 kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kStringDinosaur, kStringDinosaurDescription,
 kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
-kString100, kStringCorridor, kString102, kStringDinosaurHead, kString104,
+kStringMainEntrance, kStringCorridor, kString102, kStringDinosaurHead, kString104,
 kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 925a936..d788ad4 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -4171,12 +4171,17 @@ Mus8::Mus8(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 34;
 	_id = MUS8;
 	_shown[0] = kShownTrue;
+	_shown[12] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS1, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 2, MUS9, 14);
 }
 
 void Mus8::onEntrance() {
+	_gm->securityEntrance();
 	setRoomSeen(true);
 }
 
@@ -4184,6 +4189,26 @@ void Mus8::animation() {
 }
 
 bool Mus8::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[1]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(2);
+			_objectState[1]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS9]->setSectionVisible(1, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(2 + 128);
+		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS9]->setSectionVisible(1, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
 	return true;
 }
 
@@ -4191,12 +4216,19 @@ Mus9::Mus9(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 34;
 	_id = MUS9;
 	_shown[0] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[10] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 1, MUS8, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS5, 14);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, MUS_RUND, 21);
 }
 
 void Mus9::onEntrance() {
+	_gm->securityEntrance();
 	setRoomSeen(true);
 }
 
@@ -4204,6 +4236,43 @@ void Mus9::animation() {
 }
 
 bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(1);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS8]->setSectionVisible(2, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(1 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS8]->setSectionVisible(2, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, SMALL_DOOR) &&
+			!(_objectState[2]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(6);
+			setSectionVisible(5, kShownFalse);
+			_objectState[2]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS_RUND]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(5);
+		setSectionVisible(6, kShownFalse);
+		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS_RUND]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
 	return true;
 }
 
@@ -4211,12 +4280,19 @@ Mus10::Mus10(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 34;
 	_id = MUS10;
 	_shown[0] = kShownTrue;
+	_shown[11] = kShownTrue;
+	_shown[13] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS3, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS11, 14);
+	_objectState[2] = Object(_id, kStringMainEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 4, 4, 0);
 }
 
 void Mus10::onEntrance() {
+	_gm->securityEntrance();
 	setRoomSeen(true);
 }
 
@@ -4224,26 +4300,53 @@ void Mus10::animation() {
 }
 
 bool Mus10::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
+		_vm->renderMessage(kStringMuseum14);
+		return true;
+	}
+	return false;
 }
 
 Mus11::Mus11(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 34;
 	_id = MUS11;
 	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[9] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS10, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS7, 14);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE, 2, 2, 0, MUS_ENTRANCE, 21);
 }
 
 void Mus11::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus11::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus11::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_OPEN && obj1._id == SMALL_DOOR && !(obj1._type & OPENED)) {
+		obj1._type |= OPENED;
+		_vm->renderImage(4);
+		setSectionVisible(3, kShownFalse);
+		_vm->playSound(kAudioTaxiOpen);
+	} else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR &&
+			(obj1._type & OPENED)) {
+		obj1._type &= ~OPENED;
+		_vm->renderImage(3);
+		setSectionVisible(4, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 6309dab..a222af1 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -1531,6 +1531,7 @@ void GameManager::handleInput() {
 void GameManager::executeRoom() {
 	if (_currentRoom == _rooms[PUZZLE_FRONT])
 		puzzleConstruction();
+	debug("Siren: %d    Sound: %d", _state._sirenOn, _vm->_sound->isPlaying());
 	if (_state._sirenOn && !_vm->_sound->isPlaying())
 		_vm->_sound->playSiren();
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
@@ -2063,7 +2064,7 @@ void GameManager::alarm() {
 	if (_vm->_screen->isMessageShown())
 		_vm->removeMessage();
 	_vm->renderMessage(kStringMuseum7);
-	_state._eventTime = g_system->getMillis() + 270;
+	_state._eventTime = g_system->getMillis() + 18900;
 	_state._eventCallback = kCaughtFn;
 	_state._alarmOn = true;
 }


Commit: d76868053424d957b8f4f6b798aa501b2a8ccc41
    https://github.com/scummvm/scummvm/commit/d76868053424d957b8f4f6b798aa501b2a8ccc41
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add MusRound room

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 092d4b1..acca6f2 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -92,7 +92,7 @@ enum RoomId {
 	BST_DOOR,HALL,COFFIN_ROOM,MASK,
 
 	MUSEUM,MUS_ENTRANCE,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
-	MUS9,MUS10,MUS11,MUS_RUND,
+	MUS9,MUS10,MUS11,MUS_ROUND,
 	MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,
 	NUMROOMS,NULLROOM
 };
@@ -121,7 +121,7 @@ enum ObjectId {
 	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
 	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,MUSIC_SYSTEM,
 	HANDLE,SWITCH,DOOR_SWITCH,SUIT,CABLE,RCABLE,
-	MUSCARD,SKOPF, DISPLAY
+	MUSCARD,HEAD, DISPLAY
 };
 
 enum StringId {
@@ -146,7 +146,7 @@ kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
 kString85, kString86, kString87, kString88, kString89,
 kString90, kString91, kString92, kStringDinosaur, kStringDinosaurDescription,
 kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
-kStringMainEntrance, kStringCorridor, kString102, kStringDinosaurHead, kString104,
+kStringMainEntrance, kStringCorridor, kStringDinosaurDescription2, kStringDinosaurHead, kStringDinosaurHeadDescription,
 kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index d788ad4..1402c8e 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3775,7 +3775,7 @@ void Museum::onEntrance() {
 		_vm->loadGame(kSleepAutosaveSlot);
 		_vm->renderImage(0);
 		_vm->paletteFadeIn();
-		if (_gm->_rooms[MUS_RUND]->getObject(4)->_type & CARRIED) {
+		if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED) {
 			_gm->reply(kStringMuseum3, 1, 1 + 128);
 			_gm->reply(kStringMuseum4, 1, 1 + 128);
 			_gm->takeMoney(30000);
@@ -3799,7 +3799,7 @@ void Museum::animation() {
 bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 	if (verb == ACTION_WALK && obj1._id == MUS_STREET) {
 		if (!_gm->_state._alarmOn && 
-				!(_gm->_rooms[MUS_RUND]->getObject(4)->_type & CARRIED)) {
+				!(_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)) {
 			_vm->renderMessage(kStringMuseum10);
 		} else {
 			_gm->_state._eventTime = kMaxTimerValue;
@@ -3823,7 +3823,7 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->loadGame(kSleepAutosaveSlot);
 			if (_gm->_state._money >= 8)
 				_gm->takeMoney(-8);
-			if (_gm->_rooms[MUS_RUND]->getObject(4)->_type & CARRIED)
+			if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
 				_gm->takeObject(*_gm->_rooms[INTRO]->getObject(7));
 			_gm->changeRoom(CULTURE_PALACE);
 			_gm->_newRoom = true;
@@ -4224,7 +4224,7 @@ Mus9::Mus9(Supernova2Engine *vm, GameManager *gm) {
 
 	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 1, MUS8, 10);
 	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS5, 14);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, MUS_RUND, 21);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, MUS_ROUND, 21);
 }
 
 void Mus9::onEntrance() {
@@ -4261,7 +4261,7 @@ bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderImage(6);
 			setSectionVisible(5, kShownFalse);
 			_objectState[2]._type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS_RUND]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
 			_vm->playSound(kAudioTaxiOpen);
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR && 
@@ -4269,7 +4269,7 @@ bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderImage(5);
 		setSectionVisible(6, kShownFalse);
 		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS_RUND]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
 		_vm->playSound(kAudioElevator1);
 	} else
 		return false;
@@ -4350,23 +4350,50 @@ bool Mus11::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-MusRund::MusRund(Supernova2Engine *vm, GameManager *gm) {
+MusRound::MusRound(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
-	_id = MUS_RUND;
+	_fileNumber = 33;
+	_id = MUS_ROUND;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED | COMBINABLE, 0, 0, 1, MUS9, 2);
+	_objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, MUS13, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 2, 2, 0, MUS12, 14);
+	_objectState[3] = Object(_id, kStringDinosaur, kStringDinosaurDescription2, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[3] = Object(_id, kStringDinosaurHead, kStringDinosaurHeadDescription, HEAD, TAKE, 4, 4, 2);
 }
 
-void MusRund::onEntrance() {
+void MusRound::onEntrance() {
 	setRoomSeen(true);
 }
 
-void MusRund::animation() {
+void MusRound::animation() {
 }
 
-bool MusRund::interact(Action verb, Object &obj1, Object &obj2) {
+bool MusRound::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(1);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(1 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_TAKE && obj1._id == HEAD && !(obj1._type & CARRIED)) {
+		_gm->takeObject(obj1);
+		_vm->playSound(kAudioSuccess);
+	} else
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index c71a4c6..3d23811 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -683,9 +683,9 @@ public:
 private:
 };
 
-class MusRund : public Room {
+class MusRound : public Room {
 public:
-	MusRund(Supernova2Engine *vm, GameManager *gm);
+	MusRound(Supernova2Engine *vm, GameManager *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index a222af1..c61d345 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -326,7 +326,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[MUS9];
 	delete _rooms[MUS10];
 	delete _rooms[MUS11];
-	delete _rooms[MUS_RUND];
+	delete _rooms[MUS_ROUND];
 	delete _rooms[MUS12];
 	delete _rooms[MUS13];
 	delete _rooms[MUS14];
@@ -467,7 +467,7 @@ void GameManager::initRooms() {
 	_rooms[MUS9] = new Mus9(_vm, this);
 	_rooms[MUS10] = new Mus10(_vm, this);
 	_rooms[MUS11] = new Mus11(_vm, this);
-	_rooms[MUS_RUND] = new MusRund(_vm, this);
+	_rooms[MUS_ROUND] = new MusRound(_vm, this);
 	_rooms[MUS12] = new Mus12(_vm, this);
 	_rooms[MUS13] = new Mus13(_vm, this);
 	_rooms[MUS14] = new Mus14(_vm, this);


Commit: 44c20ab45e7113a556f596fdf425b5e5faaf703e
    https://github.com/scummvm/scummvm/commit/44c20ab45e7113a556f596fdf425b5e5faaf703e
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add rest of rooms (MUS12 to MUS22)

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index acca6f2..d3b94c5 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -119,7 +119,7 @@ enum ObjectId {
 	SCRIBBLE1,SCRIBBLE2,BELL,KEYPAD,DOOR_L,DOOR_R,ID_CARD,
 	MAGNET,UNDER_BED,KEY,HATCH,CABINET,DISCMAN,
 	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
-	ENCRYPTED_DOOR,ALARM_ANLAGE,MUS_STREET,BIG_DOOR,MUSIC_SYSTEM,
+	ENCRYPTED_DOOR,ALARM_SYSTEM,MUS_STREET,BIG_DOOR,MUSIC_SYSTEM,
 	HANDLE,SWITCH,DOOR_SWITCH,SUIT,CABLE,RCABLE,
 	MUSCARD,HEAD, DISPLAY
 };
@@ -143,11 +143,11 @@ kString65, kString66, kString67, kString68, kString69,
 kStringMuseum8, kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15,
 kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14,
 kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
-kString85, kString86, kString87, kString88, kString89,
-kString90, kString91, kString92, kStringDinosaur, kStringDinosaurDescription,
+kString85, kString86, kStringMuseum17, kStringMuseum18, kStringMuseum19,
+kStringMuseum20, kStringMuseum21, kStringMuseum22, kStringDinosaur, kStringDinosaurDescription,
 kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
 kStringMainEntrance, kStringCorridor, kStringDinosaurDescription2, kStringDinosaurHead, kStringDinosaurHeadDescription,
-kString105, kStringSuctionCup, kString107, kStringOpening, kStringLetter,
+kStringAlarmSystem, kStringSuctionCup, kStringWall, kStringOpening, kStringLetter,
 kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
 kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
 kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 1402c8e..412f3c8 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -4401,16 +4401,27 @@ Mus12::Mus12(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 37;
 	_id = MUS12;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, MUS_ROUND, 10);
 }
 
 void Mus12::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus12::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus12::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4421,16 +4432,26 @@ Mus13::Mus13(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 37;
 	_id = MUS13;
 	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[16] = kShownTrue;
+	_objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 7, 7, 0, MUS_ROUND, 14);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 0, 0, 7, MUS14, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS15, 16);
 }
 
 void Mus13::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus13::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus13::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4441,16 +4462,27 @@ Mus14::Mus14(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 37;
 	_id = MUS14;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 8, MUS13, 14);
 }
 
 void Mus14::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus14::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus14::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4461,16 +4493,23 @@ Mus15::Mus15(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 36;
 	_id = MUS15;
 	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS13, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS16, 22);
 }
 
 void Mus15::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus15::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus15::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4481,16 +4520,23 @@ Mus16::Mus16(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 36;
 	_id = MUS16;
 	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[10] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS15, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS17, 22);
 }
 
 void Mus16::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus16::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus16::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4501,16 +4547,27 @@ Mus17::Mus17(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 37;
 	_id = MUS17;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[9] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 2, 2, 9, MUS16, 6);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 8, MUS21, 14);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS18, 16);
+	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 4, 4, 11, MUS20, 8);
 }
 
 void Mus17::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus17::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus17::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4521,16 +4578,23 @@ Mus18::Mus18(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 36;
 	_id = MUS18;
 	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[11] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS17, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS19, 22);
 }
 
 void Mus18::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus18::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus18::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4541,16 +4605,27 @@ Mus19::Mus19(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 37;
 	_id = MUS19;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[11] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 4, 4, 11, MUS18, 8);
 }
 
 void Mus19::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus19::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus19::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4561,16 +4636,22 @@ Mus20::Mus20(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 36;
 	_id = MUS20;
 	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 4, MUS17, 22);
 }
 
 void Mus20::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus20::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus20::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4581,16 +4662,27 @@ Mus21::Mus21(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 37;
 	_id = MUS21;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[18] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 7, MUS17, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS22, 16);
 }
 
 void Mus21::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus21::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus21::interact(Action verb, Object &obj1, Object &obj2) {
@@ -4601,19 +4693,63 @@ Mus22::Mus22(Supernova2Engine *vm, GameManager *gm) {
 	_vm = vm;
 	_gm = gm;
 
-	_fileNumber = 6;
+	_fileNumber = 36;
 	_id = MUS22;
 	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[9] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS21, 2);
+	_objectState[1] = Object(_id, kStringAlarmSystem, kStringDefaultDescription, ALARM_SYSTEM, COMBINABLE, 2, 2, 0);
+	_objectState[2] = Object(_id, kStringSuctionCup, kStringDefaultDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringWall, kStringDefaultDescription, WALL, COMBINABLE, 4, 4, 0);
 }
 
 void Mus22::onEntrance() {
+	_gm->pressureAlarmEntrance();
 	setRoomSeen(true);
 }
 
 void Mus22::animation() {
+	_gm->pressureAlarmCount();
 }
 
 bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, SUCTION_CUP, WALL)) {
+		if (isSectionVisible(6))
+			_vm->renderMessage(kStringMuseum17);
+		else {
+			_vm->renderImage(6);
+			_vm->renderMessage(kStringMuseum18);
+			_objectState[2]._click = 3;
+			if (obj1._id == SUCTION_CUP)
+				_gm->_inventory.remove(obj1);
+			else
+				_gm->_inventory.remove(obj2);
+		}
+	} else if (verb == ACTION_TAKE && obj1._id == SUCTION_CUP &&
+			!(obj1._type & CARRIED)) {
+		_vm->renderImage(2);
+		setSectionVisible(6, kShownFalse);
+		_vm->renderImage(5);
+		_gm->takeObject(obj1);
+		_vm->renderMessage(kStringMuseum19);
+	} else if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, ALARM_CRACKER, ALARM_SYSTEM)) {
+		if (_gm->_state._alarmCracked)
+			_vm->renderMessage(kStringMuseum20);
+		else {
+			_vm->renderMessage(kStringMuseum21);
+			_gm->crackDoor(20);
+			if (!_gm->_state._alarmOn) {
+				_vm->renderMessage(kStringMuseum22);
+				_vm->playSound(kAudioSuccess);
+				_gm->_state._alarmCracked = true;
+			}
+		}
+	}
 	return true;
 }
 


Commit: d0c9a676d5b032a5c5892937d257614597b8241b
    https://github.com/scummvm/scummvm/commit/d0c9a676d5b032a5c5892937d257614597b8241b
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add missing strings

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index d3b94c5..4a12420 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -143,7 +143,7 @@ kString65, kString66, kString67, kString68, kString69,
 kStringMuseum8, kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15,
 kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14,
 kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
-kString85, kString86, kStringMuseum17, kStringMuseum18, kStringMuseum19,
+kStringMuseum23, kStringMuseum24, kStringMuseum17, kStringMuseum18, kStringMuseum19,
 kStringMuseum20, kStringMuseum21, kStringMuseum22, kStringDinosaur, kStringDinosaurDescription,
 kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
 kStringMainEntrance, kStringCorridor, kStringDinosaurDescription2, kStringDinosaurHead, kStringDinosaurHeadDescription,
@@ -165,7 +165,7 @@ kStringBallDescription, kStringEye, kStringEyeDescription, kStringDefaultDescrip
 kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
 kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
 kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD,
-kStringChipEmpty, kStringListeningToCD, kStringNoChip, kStringTipsy, kString199,
+kStringChipEmpty, kStringListeningToCD, kStringNoChip, kStringTipsy, kStringXa,
 kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
 kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
 kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
@@ -210,7 +210,7 @@ kStringCheckout34, kStringCheckout35, kStringCheckout36, kStringCheckout37, kStr
 kStringCheckout39, kStringCheckout40, kStringCheckout41, kStringCheckout42, kStringCheckout43,
 kStringCheckout44, kStringCheckout45, kStringCheckout46, kStringCheckout47, kStringCheckout48,
 kStringCheckout49, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon,
-kStringIWillProof, kStringIWillPerform, kString422, kStringAppearance1, kStringAppearance2,
+kStringIWillProof, kStringIWillPerform, kStringAppearance32, kStringAppearance1, kStringAppearance2,
 kStringAppearance3, kStringAppearance4, kStringAppearance5, kStringAppearance6, kStringAppearance7,
 kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11, kStringAppearance12,
 kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 412f3c8..b718735 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -3782,8 +3782,8 @@ void Museum::onEntrance() {
 			_vm->playSound(kAudioAppearance1);
 		} else {
 			_gm->reply(kStringMuseum5, 1, 1 + 128);
-			_gm->say(kStringMuseum6);
-			_gm->reply(kStringMuseum7, 1, 1 + 128);
+			_gm->say(kStringMuseum23);
+			_gm->reply(kStringMuseum24, 1, 1 + 128);
 		}
 		_vm->paletteFadeOut();
 		_gm->changeRoom(CITY2);


Commit: 1fb6437cdc650bbe9df4189de2f05c713498e882
    https://github.com/scummvm/scummvm/commit/1fb6437cdc650bbe9df4189de2f05c713498e882
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix bugs in museum

1. Clock and time in museum now behaves similarly to the original.
2. Leaving the museum after completing the robery now works.

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp
    engines/supernova2/supernova2.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index b718735..4153560 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1867,7 +1867,9 @@ void Elevator::jobDescription() {
 	_vm->removeMessage();
 	_vm->renderMessage(kStringElevator58);
 	_gm->drawGUI();
-	_gm->_state._startTime = g_system->getMillis() - 150000000;
+
+	// 21:72:72
+	_gm->_state._startTime = g_system->getMillis() - 130363200;
 	_gm->_state._tipsy = false;
 	_gm->_state._toMuseum = true;
 }
@@ -3772,10 +3774,13 @@ void Museum::onEntrance() {
 		_vm->removeMessage();
 		_vm->_screen->setViewportBrightness(0);
 		_vm->setCurrentImage(26);
+		bool hasDinosaurHead = false;
+		if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
+			hasDinosaurHead = true;
 		_vm->loadGame(kSleepAutosaveSlot);
 		_vm->renderImage(0);
 		_vm->paletteFadeIn();
-		if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED) {
+		if (hasDinosaurHead) {
 			_gm->reply(kStringMuseum3, 1, 1 + 128);
 			_gm->reply(kStringMuseum4, 1, 1 + 128);
 			_gm->takeMoney(30000);
@@ -3790,7 +3795,6 @@ void Museum::onEntrance() {
 		_gm->_newRoom = true;
 		_gm->drawGUI();
 	}
-	setRoomSeen(true);
 }
 
 void Museum::animation() {
@@ -3803,7 +3807,7 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderMessage(kStringMuseum10);
 		} else {
 			_gm->_state._eventTime = kMaxTimerValue;
-			if (!_gm->_state._alarmOn) {
+			if (_gm->_state._alarmOn) {
 				_vm->renderMessage(kStringMuseum11);
 				if (_gm->_state._sirenOn) {
 					_vm->stopSound();
@@ -3820,10 +3824,13 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->waitOnInput(_gm->_messageDuration);
 			_vm->removeMessage();
 			_vm->_screen->setViewportBrightness(0);
+			bool hasDinosaurHead = false;
+			if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
+				hasDinosaurHead = true;
 			_vm->loadGame(kSleepAutosaveSlot);
 			if (_gm->_state._money >= 8)
 				_gm->takeMoney(-8);
-			if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
+			if (hasDinosaurHead)
 				_gm->takeObject(*_gm->_rooms[INTRO]->getObject(7));
 			_gm->changeRoom(CULTURE_PALACE);
 			_gm->_newRoom = true;
@@ -3951,7 +3958,6 @@ Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus2::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus2::animation() {
@@ -3983,7 +3989,6 @@ Mus3::Mus3(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus3::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus3::animation() {
@@ -4011,7 +4016,7 @@ Mus4::Mus4(Supernova2Engine *vm, GameManager *gm) {
 	_shown[20] = kShownTrue;
 	_shown[21] = kShownTrue;
 
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS5, 22);
 	_objectState[1] = Object(_id, kStringCamera, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
 
 }
@@ -4100,7 +4105,6 @@ Mus6::Mus6(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus6::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus6::animation() {
@@ -4155,7 +4159,6 @@ Mus7::Mus7(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus7::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus7::animation() {
@@ -4164,7 +4167,7 @@ void Mus7::animation() {
 
 bool Mus7::interact(Action verb, Object &obj1, Object &obj2) {
 	_gm->museumDoorInteract(verb, obj1, obj2);
-	return true;
+	return false;
 }
 
 Mus8::Mus8(Supernova2Engine *vm, GameManager *gm) {
@@ -4325,7 +4328,6 @@ Mus11::Mus11(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus11::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus11::animation() {
@@ -4363,7 +4365,7 @@ MusRound::MusRound(Supernova2Engine *vm, GameManager *gm) {
 	_objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, MUS13, 10);
 	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 2, 2, 0, MUS12, 14);
 	_objectState[3] = Object(_id, kStringDinosaur, kStringDinosaurDescription2, NULLOBJECT, NULLTYPE, 3, 3, 0);
-	_objectState[3] = Object(_id, kStringDinosaurHead, kStringDinosaurHeadDescription, HEAD, TAKE, 4, 4, 2);
+	_objectState[4] = Object(_id, kStringDinosaurHead, kStringDinosaurHeadDescription, HEAD, TAKE, 4, 4, 2);
 }
 
 void MusRound::onEntrance() {
@@ -4417,7 +4419,6 @@ Mus12::Mus12(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus12::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus12::animation() {
@@ -4425,7 +4426,7 @@ void Mus12::animation() {
 }
 
 bool Mus12::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus13::Mus13(Supernova2Engine *vm, GameManager *gm) {
@@ -4447,7 +4448,6 @@ Mus13::Mus13(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus13::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus13::animation() {
@@ -4455,7 +4455,7 @@ void Mus13::animation() {
 }
 
 bool Mus13::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus14::Mus14(Supernova2Engine *vm, GameManager *gm) {
@@ -4478,7 +4478,6 @@ Mus14::Mus14(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus14::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus14::animation() {
@@ -4486,7 +4485,7 @@ void Mus14::animation() {
 }
 
 bool Mus14::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus15::Mus15(Supernova2Engine *vm, GameManager *gm) {
@@ -4505,7 +4504,6 @@ Mus15::Mus15(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus15::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus15::animation() {
@@ -4513,7 +4511,7 @@ void Mus15::animation() {
 }
 
 bool Mus15::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus16::Mus16(Supernova2Engine *vm, GameManager *gm) {
@@ -4532,7 +4530,6 @@ Mus16::Mus16(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus16::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus16::animation() {
@@ -4540,7 +4537,7 @@ void Mus16::animation() {
 }
 
 bool Mus16::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus17::Mus17(Supernova2Engine *vm, GameManager *gm) {
@@ -4563,7 +4560,6 @@ Mus17::Mus17(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus17::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus17::animation() {
@@ -4571,7 +4567,7 @@ void Mus17::animation() {
 }
 
 bool Mus17::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus18::Mus18(Supernova2Engine *vm, GameManager *gm) {
@@ -4590,7 +4586,6 @@ Mus18::Mus18(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus18::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus18::animation() {
@@ -4598,7 +4593,7 @@ void Mus18::animation() {
 }
 
 bool Mus18::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus19::Mus19(Supernova2Engine *vm, GameManager *gm) {
@@ -4621,7 +4616,6 @@ Mus19::Mus19(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus19::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus19::animation() {
@@ -4629,7 +4623,7 @@ void Mus19::animation() {
 }
 
 bool Mus19::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus20::Mus20(Supernova2Engine *vm, GameManager *gm) {
@@ -4647,7 +4641,6 @@ Mus20::Mus20(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus20::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus20::animation() {
@@ -4655,7 +4648,7 @@ void Mus20::animation() {
 }
 
 bool Mus20::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus21::Mus21(Supernova2Engine *vm, GameManager *gm) {
@@ -4678,7 +4671,6 @@ Mus21::Mus21(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus21::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus21::animation() {
@@ -4686,7 +4678,7 @@ void Mus21::animation() {
 }
 
 bool Mus21::interact(Action verb, Object &obj1, Object &obj2) {
-	return true;
+	return false;
 }
 
 Mus22::Mus22(Supernova2Engine *vm, GameManager *gm) {
@@ -4709,7 +4701,6 @@ Mus22::Mus22(Supernova2Engine *vm, GameManager *gm) {
 
 void Mus22::onEntrance() {
 	_gm->pressureAlarmEntrance();
-	setRoomSeen(true);
 }
 
 void Mus22::animation() {
@@ -4749,7 +4740,8 @@ bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
 				_gm->_state._alarmCracked = true;
 			}
 		}
-	}
+	} else
+		return false;
 	return true;
 }
 
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index c61d345..57e1e8a 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -1253,9 +1253,9 @@ void GameManager::dead(StringId messageId) {
 	destroyRooms();
 	initRooms();
 	initState();
+	changeRoom(AIRPORT);
 	initGui();
 	_inventory.clear();
-	changeRoom(AIRPORT);
 	g_system->fillScreen(kColorBlack);
 	_vm->paletteFadeIn();
 
@@ -2064,7 +2064,7 @@ void GameManager::alarm() {
 	if (_vm->_screen->isMessageShown())
 		_vm->removeMessage();
 	_vm->renderMessage(kStringMuseum7);
-	_state._eventTime = g_system->getMillis() + 18900;
+	_state._eventTime = g_system->getMillis() + 16200;
 	_state._eventCallback = kCaughtFn;
 	_state._alarmOn = true;
 }
@@ -2110,7 +2110,7 @@ void GameManager::caught2() {
 }
 
 void GameManager::drawClock() {
-	int time = (g_system->getMillis() - _state._startTime) / 700;
+	int time = (g_system->getMillis() - _state._startTime) / 600;
 	int second = time % 100;
 	Room *r;
 	if (!_mapOn) {
@@ -2164,11 +2164,11 @@ void GameManager::crack(int time) {
 	do {
 		do {
 			wait(1);
-		} while ((z = (g_system->getMillis() - _state._startTime) / 700) == zv);
+		} while ((z = (g_system->getMillis() - _state._startTime) / 600) == zv);
 		zv = z;
 		drawClock();
 		t++;
-	} while (t < time && _state._alarmOn == _alarmBefore) ;
+	} while (t < time && _state._alarmOn == _alarmBefore);
 	_cracking = false;
 	//arrow
 	if (_state._alarmOn == _alarmBefore)
@@ -2220,7 +2220,7 @@ void GameManager::museumDoorInteract(Action verb, Object &obj1, Object &obj2) {
 				r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownTrue);
 			}
 		}
-	} else if (verb == ACTION_OPEN && obj1._id == DOOR) {
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR) {
 		for (int i = 0; i < 11; i++) {
 			if ((_currentRoom == _rooms[doorTab[i]._r1]) &&
 				 &obj1 == _currentRoom->getObject(doorTab[i]._o1)) {
@@ -2256,7 +2256,7 @@ void GameManager::securityEntrance() {
 		{MUS1 , 0, 0}
 	};
 
-	int time = (g_system->getMillis() - _state._startTime) / 700;
+	int time = (g_system->getMillis() - _state._startTime) / 600;
 	int second = time % 100;
 
 	if (_rooms[_securityTab[second / 10]] == _currentRoom) {
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 0427172..6bd5da4 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -513,6 +513,7 @@ bool Supernova2Engine::deserialize(Common::ReadStream *in, int version) {
 }
 
 bool Supernova2Engine::loadGame(int slot) {
+	stopSound();
 	if (slot < 0)
 		return false;
 


Commit: 800621cb8ee04b6c6148cdde1de182e2df7c7b49
    https://github.com/scummvm/scummvm/commit/800621cb8ee04b6c6148cdde1de182e2df7c7b49
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix some noticable bugs

1. Remove string from dialog with boss, that shouldn't be there
2. Make some of Fade ins and Fade outs faster.
3. Hide cable in ship after using it
4. Disable option to save inside museum
5. Fix animation inside cabin
6. Change cursor to hourglass when cracking in museum
7. Remove message when cracking alarm in museum that shouldn't
   be there
8. Make quitting the game instanteous even inside animatins
9. Add shouts to the public while performing on music competiton

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 4a12420..b36ae7f 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -137,9 +137,9 @@ kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStri
 kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
 kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
 kString50, kString51, kString52, kString53, kString54,
-kString55, kString56, kString57, kString58, kString59,
-kString60, kString61, kString62, kString63, kString64,
-kString65, kString66, kString67, kString68, kString69,
+kStringShout1, kStringShout2, kStringShout3, kStringShout4, kStringShout5,
+kStringShout6, kStringShout7, kStringShout8, kStringShout9, kStringShout10,
+kStringShout11, kStringShout12, kStringShout13, kStringShout14, kStringShout15,
 kStringMuseum8, kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15,
 kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14,
 kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 4153560..9213f0d 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -705,9 +705,9 @@ void Cabin::onEntrance() {
 void Cabin::animation() {
 	if (_shown[kMaxSection - 1]) {
 		if (isSectionVisible(1))
-			setSectionVisible(1, kShownFalse);
+			_vm->renderImage(1 + 128);
 		else
-			setSectionVisible(1, kShownTrue);
+			_vm->renderImage(1);
 	}
 	_gm->setAnimationTimer(4);
 }
@@ -733,7 +733,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderImage(0);
 				_vm->paletteFadeIn();
 				_shown[kMaxSection - 1] = true;
-				_gm->waitOnInput(100000);
+				_gm->getInput();
 				_vm->paletteFadeOut();
 				_vm->setCurrentImage(7);
 				_vm->renderImage(0);
@@ -741,17 +741,14 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 				_shown[kMaxSection - 1] = false;
 				_vm->renderRoom(*this);
 				_vm->renderImage(2);
-				_gm->drawMapExits();
-				_gm->drawInventory();
-				_gm->drawStatus();
-				_gm->drawCommandBox();
+				_gm->drawGUI();
 				_vm->paletteFadeIn();
 				getObject(3)->_click = 8;
 			} else {
 				_gm->_state._tipsy = false;
 				_vm->paletteFadeOut();
 				_vm->_system->fillScreen(kColorBlack);
-				_vm->paletteFadeIn();
+				_vm->_screen->setViewportBrightness(255);
 				Common::String text = _vm->getGameString(kStringWillPassOut);
 				_vm->renderMessage(text);
 				_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
@@ -760,10 +757,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->saveGame(kSleepAutosaveSlot, "autosave");
 				_gm->_inventory.clear();
 				_gm->changeRoom(PYRAMID);
-				_gm->drawStatus();
-				_gm->drawInventory();
-				_gm->drawMapExits();
-				_gm->drawCommandBox();
+				_gm->drawGUI();
 			}
 		} else
 			_vm->renderMessage(kStringRest);
@@ -781,7 +775,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->animationOff();
 		_vm->setCurrentImage(28);
 		_vm->renderImage(0);
-		_gm->waitOnInput(100000);
+		_gm->getInput();
 		_vm->setCurrentImage(7);
 		_vm->renderRoom(*this);
 		_gm->drawGUI();
@@ -791,7 +785,7 @@ bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->animationOff();
 		_vm->setCurrentImage(38);
 		_vm->renderImage(0);
-		_gm->waitOnInput(100000);
+		_gm->getInput();
 		_vm->setCurrentImage(7);
 		_vm->renderRoom(*this);
 		_gm->drawGUI();
@@ -859,10 +853,7 @@ void Kiosk::onEntrance() {
 		_gm->reply(kStringYouAreCrazy, 1, 1 +128);
 		_gm->say(kStringYouIdiot);
 		_gm->reply(kStringShutUp, 1, 1 +128);
-		_gm->drawStatus();
-		_gm->drawInventory();
-		_gm->drawMapExits();
-		_gm->drawCommandBox();
+		_gm->drawGUI();
 		setRoomSeen(true);
 	}
 }
@@ -926,10 +917,7 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->takeObject(obj1);
 			_gm->takeMoney(-price);
 		}
-		_gm->drawStatus();
-		_gm->drawInventory();
-		_gm->drawMapExits();
-		_gm->drawCommandBox();
+		_gm->drawGUI();
 	} else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
 		for(int i = 0; i < 3; i++) {
 			_gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + 128);
@@ -949,10 +937,7 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->reply(kStringImSorry, 1, 1 + 128);
 			break;
 		}
-		_gm->drawStatus();
-		_gm->drawInventory();
-		_gm->drawMapExits();
-		_gm->drawCommandBox();
+		_gm->drawGUI();
 	} else 
 		return false;
 	return true;
@@ -1070,10 +1055,7 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 		_vm->renderImage(1 + 128);
 		setSectionVisible(2, kShownFalse);
-		_gm->drawStatus();
-		_gm->drawInventory();
-		_gm->drawMapExits();
-		_gm->drawCommandBox();
+		_gm->drawGUI();
 	}
 	else if (verb == ACTION_GIVE && obj2._id == AXACUSSER && _shown[kMaxSection - 2]) {
 		_vm->renderImage(1);
@@ -1096,16 +1078,10 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 					_shown[kMaxSection - 2] = false;
 					_shown[kMaxSection - 3] = true;
 					_gm->_rooms[CHECKOUT]->addSentence(1,1);
-					_gm->drawStatus();
-					_gm->drawInventory();
-					_gm->drawMapExits();
-					_gm->drawCommandBox();
+					_gm->drawGUI();
 				} else {
 					notEnoughMoney();
-					_gm->drawStatus();
-					_gm->drawInventory();
-					_gm->drawMapExits();
-					_gm->drawCommandBox();
+					_gm->drawGUI();
 				}
 			} else 
 				notEnoughMoney();
@@ -1138,10 +1114,7 @@ void Checkout::onEntrance() {
 		_gm->reply(kStringCommon, 1, 1 + 128);
 		_gm->say(kStringIWillProof);
 		_gm->say(kStringIWillPerform);
-		_gm->drawStatus();
-		_gm->drawInventory();
-		_gm->drawMapExits();
-		_gm->drawCommandBox();
+		_gm->drawGUI();
 	}
 	setRoomSeen(true);
 }
@@ -1335,12 +1308,107 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
+void Checkout::shouting() {
+	static int i = 0;
+	switch(i)
+	{
+	case  50:
+		_vm->renderMessage(kStringShout1, 100, 60);
+		break;
+	case 130:
+		_vm->renderMessage(kStringShout2, 50, 90);
+		break;
+	case 200:
+		_vm->renderMessage(kStringShout3, 200, 80);
+		break;
+	case 300:
+		_vm->renderMessage(kStringShout4, 70, 30);
+		break;
+	case 400:
+		_vm->renderMessage(kStringShout5, 190, 90);
+		break;
+	case 450:
+		_vm->renderMessage(kStringShout6, 160, 60);
+		break;
+	case 500:
+		_vm->renderMessage(kStringShout7, 180, 70);
+		break;
+	case 530:
+		_vm->renderMessage(kStringShout8, 50, 20);
+		break;
+	case 610:
+		_vm->renderMessage(kStringShout9, 230, 50);
+		break;
+	case 650:
+		_vm->renderMessage(kStringShout10, 100, 90);
+		break;
+	case 720:
+		_vm->renderMessage(kStringShout11, 176, 65);
+		break;
+	case 800:
+		_vm->renderMessage(kStringShout12, 60, 20);
+		break;
+	case 850:
+		_vm->renderMessage(kStringShout13, 160, 40);
+		break;
+	case 930:
+		_vm->renderMessage(kStringShout14, 60, 95);
+		break;
+	case 1000:
+		_vm->renderMessage(kStringShout15, 100, 65);
+		break;
+	case  70:
+			  // fall through
+	case 150:
+			  // fall through
+	case 220:
+			  // fall through
+	case 320:
+			  // fall through
+	case 420:
+			  // fall through
+	case 470:
+			  // fall through
+	case 520:
+			  // fall through
+	case 550:
+			  // fall through
+	case 630:
+			  // fall through
+	case 680:
+			  // fall through
+	case 740:
+			  // fall through
+	case 820:
+			  // fall through
+	case 870:
+			  // fall through
+	case 950:
+			  // fall through
+	case 1020:
+		_vm->removeMessage();
+		break;
+	default: {} //do nothing
+	}
+	i++;
+}
+
 void Checkout::appearance() {
 	int xp = 0;
-	_gm->playCD();
+	CursorMan.showMouse(false);
+	_vm->playSound(kMusicMadMonkeys);
+	Common::KeyCode k = Common::KEYCODE_INVALID;
+	while(_vm->_sound->isPlaying()) {
+		if (_gm->waitOnInput(1, k))
+			break;
+		shouting();
+	}
+	_vm->_sound->stop();
+	_vm->removeMessage();
+	CursorMan.showMouse(true);
 	_vm->removeMessage();
 	_vm->playSound(kAudioAppearance1);
-	while (_vm->_sound->isPlaying())
+	while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
 		_gm->wait(1);
 	_vm->paletteFadeOut();
 
@@ -1464,7 +1532,9 @@ void Checkout::appearance() {
 	_vm->paletteFadeOut();
 
 	_vm->_system->fillScreen(kColorBlack);
-	_vm->paletteFadeIn();
+	_vm->_screen->setViewportBrightness(255);
+	_vm->_screen->setGuiBrightness(255);
+	_vm->paletteBrightness();
 	_vm->renderMessage(kStringAppearance22);
 	_gm->waitOnInput(_gm->_messageDuration);
 	_vm->removeMessage();
@@ -1483,6 +1553,9 @@ void Checkout::appearance() {
 	_vm->renderMessage(kStringAppearance27);
 	_gm->waitOnInput(_gm->_messageDuration);
 	_vm->removeMessage();
+	_vm->_screen->setViewportBrightness(0);
+	_vm->_screen->setGuiBrightness(0);
+	_vm->paletteBrightness();
 	_vm->setCurrentImage(44);
 	_vm->renderImage(0);
 	_vm->paletteFadeIn();
@@ -1506,7 +1579,9 @@ void Checkout::appearance() {
 	} while (image->_section[1].y1 < 200);
 	_vm->paletteFadeOut();
 	_vm->_system->fillScreen(kColorBlack);
-	_vm->paletteFadeIn();
+	_vm->_screen->setViewportBrightness(255);
+	_vm->_screen->setGuiBrightness(255);
+	_vm->paletteBrightness();
 	_vm->renderMessage(kStringAppearance28);
 	_gm->waitOnInput(_gm->_messageDuration);
 	_vm->removeMessage();
@@ -1693,12 +1768,11 @@ bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
 				setSectionVisible(4, kShownFalse);
 				_vm->paletteFadeOut();
 				_vm->_system->fillScreen(kColorBlack);
-				_vm->paletteFadeIn();
+				_vm->_screen->setViewportBrightness(255);
 				_vm->renderMessage(kStringElevator14);
 				_gm->waitOnInput(_gm->_messageDuration);
 				_vm->removeMessage();
-				_vm->paletteFadeOut();
-				_vm->paletteFadeOut();
+				_vm->_screen->setViewportBrightness(0);
 				_vm->setCurrentImage(26);
 				_vm->renderImage(0);
 				_vm->paletteFadeIn();
@@ -1789,12 +1863,12 @@ bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
 }
 
 void Elevator::jobDescription() {
-	static StringId dialBoss2[5] = {
+	static StringId dialBoss2[3] = {
 		kStringElevator8,
 		kStringElevator9,
 		kStringElevator10
 	};
-	byte dialsBoss2[4] = {1,1,2,1};
+	byte dialsBoss2[4] = {1,1,1,1};
 
 	_gm->reply(kStringElevator29, 1, 1 + 128);
 	_gm->reply(kStringElevator30, 1, 1 + 128);
@@ -1844,11 +1918,13 @@ void Elevator::jobDescription() {
 	_gm->reply(kStringElevator54, 1, 1 + 128);
 	_vm->paletteFadeOut();
 	_vm->_system->fillScreen(kColorBlack);
-	_vm->paletteFadeIn();
+	_vm->_screen->setViewportBrightness(255);
 	_vm->renderMessage(kStringElevator55);
 	_gm->waitOnInput(_gm->_messageDuration);
 	_vm->removeMessage();
-	_vm->paletteFadeOut();
+	_vm->_screen->setViewportBrightness(0);
+	_gm->_state._tipsy = false;
+	_gm->_state._toMuseum = true;
 	_vm->saveGame(kSleepAutosaveSlot, "autosave");
 	_gm->_inventory.clear();
 	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(3));
@@ -1870,8 +1946,6 @@ void Elevator::jobDescription() {
 
 	// 21:72:72
 	_gm->_state._startTime = g_system->getMillis() - 130363200;
-	_gm->_state._tipsy = false;
-	_gm->_state._toMuseum = true;
 }
 
 Apartment::Apartment(Supernova2Engine *vm, GameManager *gm) {
@@ -1998,7 +2072,7 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->wait(2);
 		_vm->renderImage(6);
 		_vm->playSound(kAudioShip1);
-		while (_vm->_sound->isPlaying())
+		while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
 			_gm->wait(1);
 		_vm->renderImage(6 + 128);
 		_vm->renderImage(7);
@@ -2023,7 +2097,7 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderMessage(kStringShip4);
 	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, RCABLE)) {
 		_objectState[6]._description = kStringDefaultDescription;
-		if (_objectState[6]._click == 6)
+		if (_objectState[6]._click == 5)
 			_vm->renderImage(8 + 128);
 		if (_objectState[6]._type & CARRIED)
 			_gm->_inventory.remove(_objectState[6]);
@@ -2129,7 +2203,7 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 
 void Ship::kill() {
 	_vm->playSound(kAudioShipDeath);
-	while (_vm->_sound->isPlaying())
+	while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
 		_gm->wait(1);
 	_gm->dead(kStringShip0);
 }
@@ -3728,6 +3802,7 @@ bool Mask::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->paletteFadeOut();
 			_vm->loadGame(kSleepAutosaveSlot);
 			_gm->changeRoom(CABIN);
+			_gm->setAnimationTimer(1);
 			_gm->_newRoom = true;
 			_gm->drawGUI();
 			_gm->_rooms[CABIN]->setSectionVisible(2, kShownTrue);
@@ -4733,7 +4808,7 @@ bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderMessage(kStringMuseum20);
 		else {
 			_vm->renderMessage(kStringMuseum21);
-			_gm->crackDoor(20);
+			_gm->crack(20);
 			if (!_gm->_state._alarmOn) {
 				_vm->renderMessage(kStringMuseum22);
 				_vm->playSound(kAudioSuccess);
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 3d23811..3d1d066 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -178,6 +178,7 @@ public:
 
 private:
 	void appearance();
+	void shouting();
 };
 
 class City1 : public Room {
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 8d5fddf..91ec405 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -28,7 +28,6 @@
 #include "graphics/surface.h"
 
 #include "supernova2/imageid.h"
-#include "supernova2/resman.h"
 #include "supernova2/state.h"
 #include "supernova2/screen.h"
 #include "supernova2/supernova2.h"
@@ -181,7 +180,11 @@ Screen::Screen(Supernova2Engine *vm, ResourceManager *resMan)
 	, _textCursorY(0)
 	, _messageShown(false) {
 
-	CursorMan.replaceCursor(_resMan->getCursor(ResourceManager::kCursorNormal),
+	changeCursor(ResourceManager::kCursorNormal);
+}
+
+void Screen::changeCursor(ResourceManager::CursorId id) {
+	CursorMan.replaceCursor(_resMan->getCursor(id),
 							16, 16, 0, 0, kColorCursorTransparent);
 	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
 	CursorMan.showMouse(true);
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index 7b9c964..584ff9b 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -29,6 +29,7 @@
 
 #include "supernova2/imageid.h"
 #include "supernova2/ms2_def.h"
+#include "supernova2/resman.h"
 
 namespace Supernova2 {
 
@@ -135,6 +136,7 @@ public:
 public:
 	Screen(Supernova2Engine *vm, ResourceManager *resMan);
 
+	void changeCursor(ResourceManager::CursorId);
 	int getViewportBrightness() const;
 	void setViewportBrightness(int brightness);
 	int getGuiBrightness() const;
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 57e1e8a..1652170 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -650,7 +650,7 @@ void GameManager::processInput() {
 		mouseLocation = onNone;
 
 	if (_mouseClickType == Common::EVENT_LBUTTONUP) {
-		if (_vm->_screen->isMessageShown()) {
+		if (_vm->_screen->isMessageShown() && !_cracking) {
 			// Hide the message and consume the event
 			_vm->removeMessage();
 			if (mouseLocation != onCmdButton)
@@ -1174,6 +1174,8 @@ void GameManager::changeRoom(RoomId id) {
 }
 
 void GameManager::wait(int ticks) {
+	if (_vm->shouldQuit())
+		return;
 	uint32 end = g_system->getMillis() + ticksToMsec(ticks);
 	do {
 		g_system->delayMillis(_vm->_delay);
@@ -1183,6 +1185,8 @@ void GameManager::wait(int ticks) {
 }
 
 void GameManager::waitOnInput(int ticks) {
+	if (_vm->shouldQuit())
+		return;
 	uint32 end = g_system->getMillis() + ticksToMsec(ticks);
 	do {
 		g_system->delayMillis(_vm->_delay);
@@ -1192,6 +1196,8 @@ void GameManager::waitOnInput(int ticks) {
 }
 
 bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
+	if (_vm->shouldQuit())
+		return false;
 	keycode = Common::KEYCODE_INVALID;
 	uint32 end = g_system->getMillis() + ticksToMsec(ticks);
 	do {
@@ -1257,7 +1263,9 @@ void GameManager::dead(StringId messageId) {
 	initGui();
 	_inventory.clear();
 	g_system->fillScreen(kColorBlack);
-	_vm->paletteFadeIn();
+	_vm->_screen->setViewportBrightness(255);
+	_vm->_screen->setGuiBrightness(255);
+	_vm->paletteBrightness();
 
 	_guiEnabled = true;
 }
@@ -1405,10 +1413,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		//karte_an = false
 		_vm->removeMessage();
 		_vm->renderRoom(*_currentRoom);
-		drawMapExits();
-		drawInventory();
-		drawStatus();
-		drawCommandBox();
+		drawGUI();
 	} else
 		return false;
 	return true;
@@ -1531,7 +1536,6 @@ void GameManager::handleInput() {
 void GameManager::executeRoom() {
 	if (_currentRoom == _rooms[PUZZLE_FRONT])
 		puzzleConstruction();
-	debug("Siren: %d    Sound: %d", _state._sirenOn, _vm->_sound->isPlaying());
 	if (_state._sirenOn && !_vm->_sound->isPlaying())
 		_vm->_sound->playSiren();
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
@@ -1621,7 +1625,9 @@ void GameManager::taxiPayment(int price, int destination) {
 
 		_vm->paletteFadeOut();
 		_vm->_system->fillScreen(kColorBlack);
-		_vm->paletteFadeIn();
+		_vm->_screen->setViewportBrightness(255);
+		_vm->_screen->setGuiBrightness(255);
+		_vm->paletteBrightness();
 
 		Common::String t2 = _vm->getGameString(kString5MinutesLater);
 		_vm->renderMessage(t2);
@@ -2034,8 +2040,8 @@ void GameManager::compass() {
 		kStringDirection3
 	};
 	_vm->renderBox(281, 161, 39, 39, kColorWhite63);
-	_vm->renderBox(295, 180, 13,  3, kColorDarkBlue);
-	_vm->renderBox(300, 175,  3, 13, kColorDarkBlue);
+	_vm->renderBox(295, 180, 13,  3, kColorWhite44);
+	_vm->renderBox(300, 175,  3, 13, kColorWhite44);
 	_vm->renderText(dirs[_state._pyraDirection    ], 299, 163, kColorBlack);
 	_vm->renderText(dirs[_state._pyraDirection + 1], 312, 179, kColorBlack);
 	_vm->renderText(dirs[_state._pyraDirection + 2], 299, 191, kColorBlack);
@@ -2106,7 +2112,7 @@ void GameManager::caught2() {
 	_state._sirenOn = false;
 	_mapOn = false;
 	_state._haste = false;
-	dead(kStringMuseum9);
+	//dead(kStringMuseum9);
 }
 
 void GameManager::drawClock() {
@@ -2157,7 +2163,7 @@ void GameManager::drawClock() {
 void GameManager::crack(int time) {
 	_alarmBefore = _state._alarmOn;
 	_cracking = true;
-	//hourglass
+	_vm->_screen->changeCursor(ResourceManager::kCursorWait);
 	int t = 0;
 	int z;
 	int zv = 0;
@@ -2170,7 +2176,7 @@ void GameManager::crack(int time) {
 		t++;
 	} while (t < time && _state._alarmOn == _alarmBefore);
 	_cracking = false;
-	//arrow
+	_vm->_screen->changeCursor(ResourceManager::kCursorNormal);
 	if (_state._alarmOn == _alarmBefore)
 		_vm->removeMessage();
 }
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 640a5f6..941cdef 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -28,6 +28,7 @@
 #include "common/keyboard.h"
 #include "supernova2/rooms.h"
 #include "supernova2/sound.h"
+#include "supernova2/resman.h"
 
 namespace Supernova2 {
 
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 6bd5da4..532488f 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -236,11 +236,13 @@ void Supernova2Engine::setGameString(int idx, const Common::String &string) {
 }
 
 void Supernova2Engine::playSound(AudioId sample) {
-	_sound->play(sample);
+	if (!shouldQuit())
+		_sound->play(sample);
 }
 
 void Supernova2Engine::playSound(MusicId index) {
-	_sound->play(index);
+	if (!shouldQuit())
+		_sound->play(index);
 }
 
 void Supernova2Engine::renderImage(int section) {
@@ -349,11 +351,13 @@ void Supernova2Engine::paletteBrightness() {
 }
 
 void Supernova2Engine::paletteFadeOut() {
-	_screen->paletteFadeOut();
+	if (!shouldQuit())
+		_screen->paletteFadeOut();
 }
 
 void Supernova2Engine::paletteFadeIn() {
-	_screen->paletteFadeIn(255);
+	if (!shouldQuit())
+		_screen->paletteFadeIn(255);
 }
 
 void Supernova2Engine::setColor63(byte value) {
@@ -483,8 +487,9 @@ Common::Error Supernova2Engine::loadGameState(int slot) {
 }
 
 bool Supernova2Engine::canSaveGameStateCurrently() {
-	// Do not allow saving when either _allowSaveGame, _animationEnabled or _guiEnabled is false
-	return _allowSaveGame && _gm->_animationEnabled && _gm->_guiEnabled;
+	// Do not allow saving when either _allowSaveGame, _animationEnabled or _guiEnabled is false or if _haste is true
+	return _allowSaveGame && _gm->_animationEnabled && _gm->_guiEnabled &&
+		!_gm->_state._haste;
 }
 
 Common::Error Supernova2Engine::saveGameState(int slot, const Common::String &desc) {


Commit: 76142e2e7dddcc41906bdddc1138d452b15de3bc
    https://github.com/scummvm/scummvm/commit/76142e2e7dddcc41906bdddc1138d452b15de3bc
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add outro

Changed paths:
    engines/supernova2/ms2_def.h
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/sound.cpp
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/supernova2.cpp
    engines/supernova2/supernova2.h


diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index b36ae7f..84f5cdd 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -136,7 +136,7 @@ kString30, kString31, kStringGenericInteract1, kStringGenericInteract2, kStringG
 kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8,
 kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
 kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
-kString50, kString51, kString52, kString53, kString54,
+kStringOutro1, kStringOutro2, kStringOutro3, kStringOutro4, kStringOutro5,
 kStringShout1, kStringShout2, kStringShout3, kStringShout4, kStringShout5,
 kStringShout6, kStringShout7, kStringShout8, kStringShout9, kStringShout10,
 kStringShout11, kStringShout12, kStringShout13, kStringShout14, kStringShout15,
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 9213f0d..2e59428 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -2044,6 +2044,30 @@ Ship::Ship(Supernova2Engine *vm, GameManager *gm) {
 	_objectState[4] = Object(_id, kStringSpaceSuit, kStringSpaceSuitDescription, SUIT, TAKE, 255, 255, 1);
 	_objectState[5] = Object(_id, kStringCable, kStringCableDescription1, RCABLE, COMBINABLE, 255, 255, 0);
 	_objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + 128);
+
+	_outroText = 
+		_vm->getGameString(kStringIntro1) + '\0' + 
+		_vm->getGameString(kStringIntro2) + '\0' + 
+		_vm->getGameString(kStringIntro3) + '\0' + 
+		_vm->getGameString(kStringIntro4) + '\0' + 
+		_vm->getGameString(kStringIntro5) + '\0' + 
+		"^Matthias Neef#" + '\0' +
+		"^Sascha Otterbach#" + '\0' +
+		"^Thomas Mazzoni#" + '\0' +
+		"^Matthias Klein#" + '\0' +
+		"^Gerrit Rothmaier#" + '\0' +
+		"^Thomas Hassler#" + '\0' +
+		"^Rene Kach#" + '\0' +
+		'\233' + '\0';
+	Common::String waitString = "##################";
+	_outroText2 = 
+		waitString + '\0' +
+		_vm->getGameString(kStringOutro1) + '\0' + 
+		_vm->getGameString(kStringOutro2) + '\0' + 
+		_vm->getGameString(kStringOutro3) + '\0' + 
+		_vm->getGameString(kStringOutro4) + '\0' + 
+		_vm->getGameString(kStringOutro5) + '\0' + 
+		'\233' + '\0';
 }
 
 void Ship::onEntrance() {
@@ -2194,13 +2218,64 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderImage(12);
 		_gm->wait(18);
 		// TODO some palette stuff
-		_vm->renderImage(13);
-		_vm->playSound(kMusicMadMonkeys);
+		outro();
 	} else
 		return false;
 	return true;
 }
 
+void Ship::outro() {
+	_vm->_screen->paletteFadeOut(100);
+	_vm->renderImage(13);
+	// Because the screen is partialy faded out, the original values (63, 20, 20)
+	// should be multiplied by 2.55, but are multiplied by 3.5, because the color
+	// looks closer to the original
+	byte palette[768];
+	_vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
+	palette[282] = 220;
+	palette[283] = 70;
+	palette[284] = 70;
+	// Restore marquee colors
+	for (int i = 0; i < 3; i++) {
+		palette[kColorPurple * 3 + i] *= 2.5;
+		palette[kColorLightYellow * 3 + i] *= 2.5;
+	}
+	_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
+	_vm->playSound(kMusicMadMonkeys);
+	_vm->renderBox(0, 190, 320, 10, kColorBlack);
+	Marquee marquee(_vm->_screen, Marquee::kMarqueeOutro, _outroText.c_str());
+	for(int i = 0; i < 2; i++) {
+		while (!_vm->shouldQuit()) {
+			_gm->updateEvents();
+			
+			if (!marquee.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
+				break;
+			g_system->updateScreen();
+			g_system->delayMillis(_vm->_delay);
+		}
+		marquee.reset();
+	}
+	Marquee marquee2(_vm->_screen, Marquee::kMarqueeOutro, _outroText2.c_str());
+	while (!_vm->shouldQuit()) {
+		_gm->updateEvents();
+		
+		if (!marquee2.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
+			break;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+	// TODO: End with some end of music
+	int volume;
+	do {
+		volume = _vm->_sound->getVolume() - 10;
+		_vm->_sound->setVolume(volume);
+		_gm->waitOnInput(1);
+	} while (volume > 10 && !_vm->shouldQuit());
+	Common::Event event;
+	event.type = Common::EVENT_RTL;
+	_vm->getEventManager()->pushEvent(event);
+}
+
 void Ship::kill() {
 	_vm->playSound(kAudioShipDeath);
 	while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index 3d1d066..aee2764 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -228,9 +228,12 @@ public:
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+	Common::String _outroText;
+	Common::String _outroText2;
 
 private:
 	void kill();
+	void outro();
 };
 
 class Pyramid : public Room {
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 91ec405..82e38af 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -111,7 +111,7 @@ Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
 		_y = 191;
 		_loop = true;
 	} else if (id == kMarqueeOutro) {
-		_y = 1;
+		_y = 191;
 	}
 
 	_textWidth = Screen::textWidth(_text);
@@ -125,10 +125,18 @@ void Marquee::clearText() {
 	_screen->renderBox(_x, _y - 1, _textWidth + 1, 9, kColorBlack);
 }
 
-void Marquee::renderCharacter() {
+void Marquee::reset() {
+	_text = _textBegin;
+	clearText();
+	_textWidth = Screen::textWidth(_text);
+	_x = kScreenWidth / 2 - _textWidth / 2;
+	_screen->_textCursorX = _x;
+}
+
+bool Marquee::renderCharacter() {
 	if (_delay != 0) {
 		_delay--;
-		return;
+		return true;
 	}
 
 	switch (*_text) {
@@ -141,6 +149,8 @@ void Marquee::renderCharacter() {
 			_x = kScreenWidth / 2 - _textWidth / 2;
 			_screen->_textCursorX = _x;
 		}
+		else
+			return false;
 		break;
 	case '\0':
 		clearText();
@@ -165,6 +175,7 @@ void Marquee::renderCharacter() {
 		_delay = 1;
 		break;
 	}
+	return true;
 }
 
 Screen::Screen(Supernova2Engine *vm, ResourceManager *resMan)
@@ -591,8 +602,8 @@ void Screen::paletteBrightness() {
 	_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
 }
 
-void Screen::paletteFadeOut() {
-	while (_guiBrightness > 10) {
+void Screen::paletteFadeOut(int minBrightness) {
+	while (_guiBrightness > minBrightness + 10) {
 		_guiBrightness -= 10;
 		if (_viewportBrightness > _guiBrightness)
 			_viewportBrightness = _guiBrightness;
@@ -600,8 +611,8 @@ void Screen::paletteFadeOut() {
 		_vm->_system->updateScreen();
 		_vm->_system->delayMillis(_vm->_delay);
 	}
-	_guiBrightness = 0;
-	_viewportBrightness = 0;
+	_guiBrightness = minBrightness;
+	_viewportBrightness = minBrightness;
 	paletteBrightness();
 	_vm->_system->updateScreen();
 }
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index 584ff9b..b5c3388 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -102,7 +102,8 @@ public:
 
 	Marquee(Screen *screen, MarqueeId id, const char *text);
 
-	void renderCharacter();
+	bool renderCharacter();
+	void reset();
 
 private:
 	void clearText();
@@ -145,7 +146,7 @@ public:
 	const ImageInfo *getImageInfo(ImageId id) const;
 	bool isMessageShown() const;
 	void paletteFadeIn(int maxViewportBrightness);
-	void paletteFadeOut();
+	void paletteFadeOut(int minBrightness);
 	void paletteBrightness();
 	void renderImage(ImageId id, bool removeImage = false);
 	void renderImage(int section);
diff --git a/engines/supernova2/sound.cpp b/engines/supernova2/sound.cpp
index c0688ac..d16873d 100644
--- a/engines/supernova2/sound.cpp
+++ b/engines/supernova2/sound.cpp
@@ -70,4 +70,12 @@ void Sound::stop() {
 		_mixer->stopHandle(_soundHandle);
 }
 
+int Sound::getVolume() {
+	return _mixer->getChannelVolume(_soundHandle);
+}
+
+void Sound::setVolume(int volume) {
+	_mixer->setChannelVolume(_soundHandle, volume);
+}
+
 }
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 17555c4..4b8f1b9 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -68,6 +68,8 @@ public:
 	void play(AudioId index);
 	void play(MusicId index);
 	void playSiren();
+	void setVolume(int volume);
+	int getVolume();
 	void stop();
 	bool isPlaying();
 private:
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 1652170..ab4c4b8 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -132,6 +132,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	for (int i = 0; i < NUMROOMS; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
+	delete _rooms[SHIP];
+	_rooms[SHIP] = new Ship(_vm, this);
 	_lastRoom = _rooms[lastRoomId];
 	changeRoom(curRoomId);
 
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 532488f..e59f07d 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -350,9 +350,9 @@ void Supernova2Engine::paletteBrightness() {
 	_screen->paletteBrightness();
 }
 
-void Supernova2Engine::paletteFadeOut() {
+void Supernova2Engine::paletteFadeOut(int minBrightness) {
 	if (!shouldQuit())
-		_screen->paletteFadeOut();
+		_screen->paletteFadeOut(minBrightness);
 }
 
 void Supernova2Engine::paletteFadeIn() {
diff --git a/engines/supernova2/supernova2.h b/engines/supernova2/supernova2.h
index 748eef3..071955f 100644
--- a/engines/supernova2/supernova2.h
+++ b/engines/supernova2/supernova2.h
@@ -100,7 +100,7 @@ public:
 	void playSound(AudioId sample);
 	void playSound(MusicId index);
 	void paletteFadeIn();
-	void paletteFadeOut();
+	void paletteFadeOut(int minBrightness = 0);
 	void paletteBrightness();
 	void renderImage(int section);
 	void renderImage(ImageId id, bool removeImage = false);


Commit: 83e05ea13f61fdd5d582115c8c2bbd246f70983c
    https://github.com/scummvm/scummvm/commit/83e05ea13f61fdd5d582115c8c2bbd246f70983c
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Add english translated image

This adds translated image of cyphered text inside Cabin room
I don't think I can get any closer to the original looks with
.pbm format.

Changed paths:
  A devtools/create_supernova2/img1-en-original.jpg
  A devtools/create_supernova2/img1-en.pbm
  A devtools/create_supernova2/img1-en.xcf
    devtools/create_supernova2/create_supernova2.cpp
    engines/supernova2/graphics.cpp
    engines/supernova2/screen.cpp
    engines/supernova2/state.cpp


diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp
index 5c9e22f..cca2a73 100644
--- a/devtools/create_supernova2/create_supernova2.cpp
+++ b/devtools/create_supernova2/create_supernova2.cpp
@@ -87,9 +87,9 @@ void writeImage(File& outputFile, const char *name, const char* language) {
 				else {
 					// We have finished reading the header.
 					// Check the size is as expected.
-					if (w != 640 || h != 480) {
+					if ((w != 640 || h != 480) && (w != 320 || h != 200)) {
 						imgFile.close();
-						printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480, read: %dx%d). This image will be skipped.\n", fileName, w, h);
+						printf("Binary pbm file '%s' doesn't have the expected size (expected: 640x480 or 320x200, read: %dx%d). This image will be skipped.\n", fileName, w, h);
 						return;
 					}
 					// And break out of the loop.
@@ -121,13 +121,13 @@ void writeImage(File& outputFile, const char *name, const char* language) {
 			outputFile.writeByte(0);
 	}
 
-	// Write block size (640*480 / 8)
-	outputFile.writeLong(38400);
+	// Write block size
+	outputFile.writeLong(w * h / 8);
 
-	// Write all the bytes. We should have 38400 bytes (640 * 480 / 8)
+	// Write all the bytes. We should have w * h / 8 bytes
 	// However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
 	// but pbm uses 0 for white and 1 for black.
-	for (i = 0 ; i < 38400 ; ++i) {
+	for (i = 0 ; i < w * h / 8 ; ++i) {
 		byte b = imgFile.readByte();
 		outputFile.writeByte(~b);
 	}
@@ -222,7 +222,7 @@ int main(int argc, char *argv[]) {
 	// 3 bytes: 'MS2'
 	// 1 byte:  version
 	// -- data blocks
-	// 4 bytes: header  'IMG1' and 'IMG2' for newspaper images (for file 1 and file 2 respectively),
+	// 4 bytes: header  'IMG1' cyphered text image
 	//                  'TEXT' for strings
 	// 4 bytes: language code ('en\0', 'de\0'- see common/language.cpp)
 	// 4 bytes: block size n (uint32)
@@ -240,7 +240,7 @@ int main(int argc, char *argv[]) {
 	// Other languages
 	const char **l = &lang[0];
 	while(*l) {
-	//	writeImage(outputFile, "img1", *l);
+		writeImage(outputFile, "img1", *l);
 	//	writeImage(outputFile, "img2", *l);
 		writeStrings(outputFile, *l);
 		++l;
diff --git a/devtools/create_supernova2/img1-en-original.jpg b/devtools/create_supernova2/img1-en-original.jpg
new file mode 100644
index 0000000..6eb4fa7
Binary files /dev/null and b/devtools/create_supernova2/img1-en-original.jpg differ
diff --git a/devtools/create_supernova2/img1-en.pbm b/devtools/create_supernova2/img1-en.pbm
new file mode 100644
index 0000000..bc09a53
Binary files /dev/null and b/devtools/create_supernova2/img1-en.pbm differ
diff --git a/devtools/create_supernova2/img1-en.xcf b/devtools/create_supernova2/img1-en.xcf
new file mode 100644
index 0000000..e621ada
Binary files /dev/null and b/devtools/create_supernova2/img1-en.xcf differ
diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp
index 592a8e9..b629041 100644
--- a/engines/supernova2/graphics.cpp
+++ b/engines/supernova2/graphics.cpp
@@ -81,12 +81,9 @@ bool MS2Image::init(int filenumber) {
 }
 
 bool MS2Image::loadFromEngineDataFile() {
-	//TODO
-	/*Common::String name;
-	if (_filenumber == 1)
+	Common::String name;
+	if (_filenumber == 28)
 		name = "IMG1";
-	else if (_filenumber == 2)
-		name = "IMG2";
 	else
 		return false;
 
@@ -96,16 +93,16 @@ bool MS2Image::loadFromEngineDataFile() {
 	// or the format is not as expected. We will get those warning when reading the
 	// strings anyway (actually the engine will even refuse to start).
 	Common::File f;
-	if (!f.open(SUPERNOVA_DAT))
+	if (!f.open(SUPERNOVA2_DAT))
 		return false;
 
 	char id[5], lang[5];
 	id[4] = lang[4] = '\0';
 	f.read(id, 3);
-	if (strncmp(id, "MSN", 3) != 0)
+	if (strncmp(id, "MS2", 3) != 0)
 		return false;
 	int version = f.readByte();
-	if (version != SUPERNOVA_DAT_VERSION)
+	if (version != SUPERNOVA2_DAT_VERSION)
 		return false;
 
 	while (!f.eos()) {
@@ -118,7 +115,7 @@ bool MS2Image::loadFromEngineDataFile() {
 			return f.read(_encodedImage, size) == size;
 		} else
 			f.skip(size);
-	}*/
+	}
 
 	return false;
 }
@@ -222,8 +219,9 @@ bool MS2Image::loadStream(Common::SeekableReadStream &stream) {
 
 bool MS2Image::loadSections() {
 	bool isPoster = _filenumber == 38;
-	int imageWidth = isPoster ? 640 : 320;
-	int imageHeight = isPoster ? 480 : 200;
+	bool isCypheredText = _filenumber == 28 && ConfMan.get("language") == "en";
+	int imageWidth = isPoster || isCypheredText ? 640 : 320;
+	int imageHeight = isPoster || isCypheredText ? 480 : 200;
 	_pitch = imageWidth;
 
 	for (int section = 0; section < _numSections; ++section) {
@@ -242,6 +240,19 @@ bool MS2Image::loadSections() {
 				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
 				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
 			}
+		} else if (isCypheredText) {
+			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
+			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
+				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite44 : kColorBlack;
+			}
 		} else {
 
 			uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 82e38af..60c2179 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -22,6 +22,7 @@
 
 #include "common/str.h"
 #include "common/system.h"
+#include "common/config-manager.h"
 #include "engines/util.h"
 #include "graphics/cursorman.h"
 #include "graphics/palette.h"
@@ -354,7 +355,8 @@ void Screen::renderImageSection(const MS2Image *image, int section, bool invert)
 							 image->_section[section].y1,
 							 image->_section[section].x2 + 1,
 							 image->_section[section].y2 + 1);
-	if (image->_filenumber == 38) {
+	if (image->_filenumber == 38 ||
+			(image->_filenumber == 28 && ConfMan.get("language") == "en")) {
 		sectionRect.setWidth(640);
 		sectionRect.setHeight(480);
 		if (_screenWidth != 640) {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index ab4c4b8..1652170 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -132,8 +132,6 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	for (int i = 0; i < NUMROOMS; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
-	delete _rooms[SHIP];
-	_rooms[SHIP] = new Ship(_vm, this);
 	_lastRoom = _rooms[lastRoomId];
 	changeRoom(curRoomId);
 


Commit: d09b286054d60e5e26d8339467e721662d381f53
    https://github.com/scummvm/scummvm/commit/d09b286054d60e5e26d8339467e721662d381f53
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix more bugs

1. Saving and loading correct time when saving in front of museum
2. Saving and loading correct time left for the pyramid (1 hour)
3. Add sound when entering a correct address inside taxi
4. Show message when leaving museum via taxi in the middle of
    the haist
5. Reset elevator possition to floor 0, so it can be exited
    if the player enters it again after completing the museum.
6. Ignore clicking during editing
7. Add open and close sounds to doors
8. Add "death" when getting arested by the museum guard
9. Don't allow saving / loading during the appearance animation

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index 2e59428..e9ede99 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -1394,6 +1394,8 @@ void Checkout::shouting() {
 }
 
 void Checkout::appearance() {
+	_vm->_allowSaveGame = false;
+	_vm->_allowLoadGame = false;
 	int xp = 0;
 	CursorMan.showMouse(false);
 	_vm->playSound(kMusicMadMonkeys);
@@ -1599,6 +1601,8 @@ void Checkout::appearance() {
 	_vm->_screen->setViewportBrightness(1);
 	_vm->paletteBrightness();
 	_gm->drawGUI();
+	_vm->_allowSaveGame = true;
+	_vm->_allowLoadGame = true;
 }
 
 City1::City1(Supernova2Engine *vm, GameManager *gm) {
@@ -1702,7 +1706,6 @@ void Elevator::onEntrance() {
 		_objectState[5]._type &= ~OPENED;
 	else
 		_objectState[5]._type |= OPENED;
-	setRoomSeen(true);
 }
 
 void Elevator::animation() {
@@ -3970,10 +3973,14 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->paletteFadeOut();
 			_vm->_system->fillScreen(kColorBlack);
 			_vm->_screen->setViewportBrightness(255);
+			_vm->_screen->setGuiBrightness(255);
+			_vm->_screen->paletteBrightness();
 			_vm->renderMessage(kStringMuseum13);
 			_gm->waitOnInput(_gm->_messageDuration);
 			_vm->removeMessage();
 			_vm->_screen->setViewportBrightness(0);
+			_vm->_screen->setGuiBrightness(0);
+			_vm->_screen->paletteBrightness();
 			bool hasDinosaurHead = false;
 			if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
 				hasDinosaurHead = true;
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 1652170..9f25e15 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -37,7 +37,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 
 	// GameState
 	out->writeSint16LE(_state._money);
-	out->writeSint32LE(_state._startTime);
+	out->writeSint32LE(_state._startTime - g_system->getMillis());
 	out->writeByte(_state._addressKnown);
 	out->writeByte(_state._poleMagnet);
 	out->writeByte(_state._admission);
@@ -55,7 +55,7 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	out->writeByte(_state._pressureCounter);
 	out->writeByte(_state._sirenOn);
 	out->writeSint16LE(_state._pyraDirection);
-	out->writeUint32LE(_state._eventTime);
+	out->writeUint32LE(_state._eventTime - g_system->getMillis());
 	out->writeSint32LE(_state._eventCallback);
 	out->writeByte(_state._taxiPossibility);
 	for (int i = 0; i < 15; i++) {
@@ -89,7 +89,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 
 	// GameState
 	_state._money = in->readSint16LE();
-	_state._startTime = in->readSint32LE();
+	_state._startTime = in->readSint32LE() + g_system->getMillis();
 	_state._addressKnown = in->readByte();
 	_state._poleMagnet = in->readByte();
 	_state._admission = in->readByte();
@@ -107,7 +107,7 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	_state._pressureCounter = in->readByte();
 	_state._sirenOn = in->readByte();
 	_state._pyraDirection = in->readSint16LE();
-	_state._eventTime = in->readUint32LE();
+	_state._eventTime = in->readUint32LE() + g_system->getMillis();
 	_state._eventCallback = (EventFunction)in->readSint32LE();
 	_state._taxiPossibility = in->readByte();
 	for (int i = 0; i < 15; i++)
@@ -524,6 +524,8 @@ void GameManager::initGui() {
 }
 
 void GameManager::updateEvents() {
+	if (_currentRoom == _rooms[ELEVATOR])
+		debug("%d %d", _state._elevatorE, _state._elevatorNumber);
 	handleTime();
 	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
 		_currentRoom->animation();
@@ -879,6 +881,7 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 	int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
 						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
 
+	_guiEnabled = false;
 	while (isEditing) {
 		_vm->_screen->setTextCursorPos(x, y);
 		_vm->_screen->setTextCursorColor(kColorWhite99);
@@ -938,6 +941,7 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 			break;
 		}
 	}
+	_guiEnabled = true;
 }
 
 void GameManager::takeMoney(int amount) {
@@ -1496,7 +1500,7 @@ void GameManager::handleInput() {
 				byte i = _inputObject[0]->_click;
 				_inputObject[0]->_click  = _inputObject[0]->_click2;
 				_inputObject[0]->_click2 = i;
-				//_sound->play(kAudioDoorOpen);
+				_vm->_sound->play(kAudioTaxiOpen);
 			}
 			break;
 
@@ -1515,7 +1519,7 @@ void GameManager::handleInput() {
 				byte i = _inputObject[0]->_click;
 				_inputObject[0]->_click  = _inputObject[0]->_click2;
 				_inputObject[0]->_click2 = i;
-				//_sound->play(kAudioDoorClose);
+				_vm->_sound->play(kAudioElevator1);
 			}
 			break;
 
@@ -1729,6 +1733,7 @@ void GameManager::taxi() {
 			_vm->renderImage(0);
 			_vm->renderImage(1);
 			_vm->renderImage(6);
+			_vm->playSound(kAudioSuccess);
 			taxiPayment(14, answer);
 			break;
 		default:
@@ -2112,7 +2117,7 @@ void GameManager::caught2() {
 	_state._sirenOn = false;
 	_mapOn = false;
 	_state._haste = false;
-	//dead(kStringMuseum9);
+	dead(kStringMuseum9);
 }
 
 void GameManager::drawClock() {


Commit: de4dac5693f53360e2a6c34d721ee2676028839b
    https://github.com/scummvm/scummvm/commit/de4dac5693f53360e2a6c34d721ee2676028839b
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Fix bug, add pyramid door translation

Combining rod and magnet didn't work if the magnet was clicked
before the rod.
Add subtitle to the pyramid door and an English translated
password (FAST)

Changed paths:
    engines/supernova2/rooms.cpp
    engines/supernova2/rooms.h
    engines/supernova2/state.cpp


diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
index e9ede99..1bec610 100644
--- a/engines/supernova2/rooms.cpp
+++ b/engines/supernova2/rooms.cpp
@@ -21,6 +21,7 @@
  */
 
 #include "common/system.h"
+#include "common/config-manager.h"
 #include "graphics/palette.h"
 #include "graphics/cursorman.h"
 
@@ -3704,17 +3705,26 @@ BstDoor::BstDoor(Supernova2Engine *vm, GameManager *gm) {
 	_objectState[16] = Object(_id, kStringLetter, kStringDefaultDescription, BST15, PRESS, 14, 0, 0);
 	_objectState[17] = Object(_id, kStringLetter, kStringDefaultDescription, BST16, PRESS, 15, 0, 0);
 	_objectState[18] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 16, 16, 0, HALL, 2);
+
+	char germanPassword[16] =  {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0};
+	char englishPassword[16] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
+	if (ConfMan.get("language") == "en")
+		for (int i = 0; i < 16; i++)
+			_password[i] = englishPassword[i];
+	else
+		for (int i = 0; i < 16; i++)
+			_password[i] = germanPassword[i];
 }
 
 void BstDoor::onEntrance() {
-	setRoomSeen(true);
+	if (ConfMan.get("language") == "en")
+		_vm->_screen->renderMessage("You are almost there", kMessageNormal, 105, 130);
 }
 
 void BstDoor::animation() {
 }
 
 bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
-	static char password[16] = {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0};
 	if (_gm->move(verb, obj1)) {
 		_gm->passageConstruction();
 		_gm->_newRoom = true;
@@ -3726,7 +3736,7 @@ bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderImage(number);
 		_vm->playSound(kAudioTaxiOpen);
 		for (number = 1; number <= 16; number++) {
-			if (isSectionVisible(number) != password[number - 1])
+			if (isSectionVisible(number) != _password[number - 1])
 				return true;
 		}
 		_gm->wait(2);
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
index aee2764..46a86ed 100644
--- a/engines/supernova2/rooms.h
+++ b/engines/supernova2/rooms.h
@@ -525,6 +525,7 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
+	char _password[16];
 };
 
 class Hall : public Room {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 9f25e15..41c092e 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -132,6 +132,8 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	for (int i = 0; i < NUMROOMS; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
+	delete _rooms[BST_DOOR];
+	_rooms[BST_DOOR] = new BstDoor(_vm, this);
 	_lastRoom = _rooms[lastRoomId];
 	changeRoom(curRoomId);
 
@@ -524,8 +526,6 @@ void GameManager::initGui() {
 }
 
 void GameManager::updateEvents() {
-	if (_currentRoom == _rooms[ELEVATOR])
-		debug("%d %d", _state._elevatorE, _state._elevatorNumber);
 	handleTime();
 	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
 		_currentRoom->animation();
@@ -1317,7 +1317,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 			_vm->renderMessage(kStringNothingHappens);
 	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROD, MAGNET)) {
 		Object *o1, *o2;
-		if (obj2._type == ROD) {
+		if (obj2._id == ROD) {
 			o1 = &obj2;
 			o2 = &obj1;
 		} else {


Commit: ee5b907f6279d8b28b799922ca11e2bbaaa72c46
    https://github.com/scummvm/scummvm/commit/ee5b907f6279d8b28b799922ca11e2bbaaa72c46
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Rearange supernova and supernova2 files

Rearange files so that similar code is in the same order in
both engines.

Changed paths:
    engines/supernova/screen.h
    engines/supernova/supernova.cpp
    engines/supernova2/graphics.cpp
    engines/supernova2/ms2_def.h
    engines/supernova2/resman.cpp
    engines/supernova2/resman.h
    engines/supernova2/screen.cpp
    engines/supernova2/screen.h
    engines/supernova2/sound.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp


diff --git a/engines/supernova/screen.h b/engines/supernova/screen.h
index bd135d8..3e90e21 100644
--- a/engines/supernova/screen.h
+++ b/engines/supernova/screen.h
@@ -29,6 +29,7 @@
 
 #include "supernova/imageid.h"
 #include "supernova/msn_def.h"
+#include "supernova2/resman.h"
 
 namespace Supernova {
 
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c64755e..ba309e8 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -236,11 +236,13 @@ void SupernovaEngine::setGameString(int idx, const Common::String &string) {
 }
 
 void SupernovaEngine::playSound(AudioId sample) {
-	_sound->play(sample);
+	if (!shouldQuit())
+		_sound->play(sample);
 }
 
 void SupernovaEngine::playSound(MusicId index) {
-	_sound->play(index);
+	if (!shouldQuit())
+		_sound->play(index);
 }
 
 void SupernovaEngine::renderImage(int section) {
@@ -264,6 +266,7 @@ bool SupernovaEngine::setCurrentImage(int filenumber) {
 void SupernovaEngine::saveScreen(int x, int y, int width, int height) {
 	_screen->saveScreen(x, y, width, height);
 }
+
 void SupernovaEngine::saveScreen(const GuiElement &guiElement) {
 	_screen->saveScreen(guiElement);
 }
@@ -344,12 +347,15 @@ void SupernovaEngine::paletteBrightness() {
 }
 
 void SupernovaEngine::paletteFadeOut() {
-	_screen->paletteFadeOut();
+	if (!shouldQuit())
+		_screen->paletteFadeOut();
 }
 
 void SupernovaEngine::paletteFadeIn() {
-	_gm->roomBrightness();
-	_screen->paletteFadeIn(_gm->_roomBrightness);
+	if (!shouldQuit()) {
+		_gm->roomBrightness();
+		_screen->paletteFadeIn(_gm->_roomBrightness);
+	}
 }
 
 void SupernovaEngine::setColor63(byte value) {
@@ -531,7 +537,6 @@ bool SupernovaEngine::quitGameDialog() {
 	guiQuitNo.setTextPosition(173, 112);
 
 	_gm->animationOff();
-	_gm->saveTime();
 	saveScreen(guiQuitBox);
 
 	renderBox(guiQuitBox);
@@ -565,7 +570,6 @@ bool SupernovaEngine::quitGameDialog() {
 
 	_gm->resetInputState();
 	restoreScreen();
-	_gm->loadTime();
 	_gm->animationOn();
 
 	return quit;
diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp
index b629041..0021534 100644
--- a/engines/supernova2/graphics.cpp
+++ b/engines/supernova2/graphics.cpp
@@ -74,7 +74,6 @@ bool MS2Image::init(int filenumber) {
 	}
 
 	_filenumber = filenumber;
-
 	loadStream(file);
 
 	return true;
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
index 84f5cdd..c51d72d 100644
--- a/engines/supernova2/ms2_def.h
+++ b/engines/supernova2/ms2_def.h
@@ -131,7 +131,7 @@ kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk,
 kStringConversationEnd, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
 kStringStatusCommandClose, kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk,
 kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kString23, kString24,
-kString25, kString26, kString27, kStringTextSpeed, kString29,
+kString25, kString26, kString27, kStringTextSpeed, kStringLeaveGame,
 kString30, kString31, kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3,
 kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8,
 kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
index f753277..0cde229 100644
--- a/engines/supernova2/resman.cpp
+++ b/engines/supernova2/resman.cpp
@@ -133,7 +133,6 @@ void ResourceManager::initSoundFiles() {
 
 	_musicIntroBuffer.reset(convertToMod("ms2_data.052"));
 	_musicMadMonkeysBuffer.reset(convertToMod("ms2_data.056"));
-	_musicOutroBuffer.reset(convertToMod("ms2_data.049"));
 }
 
 void ResourceManager::initGraphics() {
@@ -185,9 +184,6 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	case kMusicMadMonkeys:
 		_musicMadMonkeys.reset(Audio::makeProtrackerStream(_musicMadMonkeysBuffer.get()));
 		return _musicMadMonkeys.get();
-	case kMusicOutro:
-		_musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get()));
-		return _musicOutro.get();
 	default:
 		error("Invalid music constant in playAudio()");
 	}
@@ -204,21 +200,6 @@ MS2Image *ResourceManager::getImage(int filenumber) {
 		return nullptr;
 }
 
-int ResourceManager::getAudioRate() {
-	return _audioRate;
-}
-
-const byte *ResourceManager::getCursor(CursorId id) const {
-	switch (id) {
-	case kCursorNormal:
-		return _cursorNormal;
-	case kCursorWait:
-		return _cursorWait;
-	default:
-		return nullptr;
-	}
-}
-
 // Generate a tone which minimal length is the length and ends at the end
 // of sine period
 // NOTE: Size of the SineTable has to be the same as audioRate and a multiple of 4
@@ -446,5 +427,20 @@ static Common::MemoryReadStream *convertToMod(const char *filename, int version)
 	return new Common::MemoryReadStream(buffer.getData(), buffer.size(), DisposeAfterUse::YES);
 }
 
+int ResourceManager::getAudioRate() {
+	return _audioRate;
+}
+
+const byte *ResourceManager::getCursor(CursorId id) const {
+	switch (id) {
+	case kCursorNormal:
+		return _cursorNormal;
+	case kCursorWait:
+		return _cursorWait;
+	default:
+		return nullptr;
+	}
+}
+
 
 }
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
index 6716bf5..d3fa460 100644
--- a/engines/supernova2/resman.h
+++ b/engines/supernova2/resman.h
@@ -70,11 +70,9 @@ private:
 	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
 	Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer;
-	Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
 	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
 	Common::ScopedPtr<Audio::AudioStream> _sirenStream;
 	Common::ScopedPtr<Audio::AudioStream> _musicMadMonkeys;
-	Common::ScopedPtr<Audio::AudioStream> _musicOutro;
 	int _audioRate;
 	MS2Image _images[kNumImageFiles];
 	byte _cursorNormal[256];
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
index 60c2179..fd2eabe 100644
--- a/engines/supernova2/screen.cpp
+++ b/engines/supernova2/screen.cpp
@@ -195,13 +195,6 @@ Screen::Screen(Supernova2Engine *vm, ResourceManager *resMan)
 	changeCursor(ResourceManager::kCursorNormal);
 }
 
-void Screen::changeCursor(ResourceManager::CursorId id) {
-	CursorMan.replaceCursor(_resMan->getCursor(id),
-							16, 16, 0, 0, kColorCursorTransparent);
-	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
-	CursorMan.showMouse(true);
-}
-
 int Screen::getGuiBrightness() const {
 	return _guiBrightness;
 }
@@ -639,4 +632,11 @@ void Screen::setColor63(byte value) {
 	_vm->_system->getPaletteManager()->setPalette(color, 63, 1);
 }
 
+void Screen::changeCursor(ResourceManager::CursorId id) {
+	CursorMan.replaceCursor(_resMan->getCursor(id),
+							16, 16, 0, 0, kColorCursorTransparent);
+	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
+	CursorMan.showMouse(true);
+}
+
 }
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
index b5c3388..21d5cf6 100644
--- a/engines/supernova2/screen.h
+++ b/engines/supernova2/screen.h
@@ -137,7 +137,6 @@ public:
 public:
 	Screen(Supernova2Engine *vm, ResourceManager *resMan);
 
-	void changeCursor(ResourceManager::CursorId);
 	int getViewportBrightness() const;
 	void setViewportBrightness(int brightness);
 	int getGuiBrightness() const;
@@ -177,6 +176,7 @@ public:
 	byte getTextCursorColor();
 	void setTextCursorColor(byte color);
 	void update();
+	void changeCursor(ResourceManager::CursorId);
 
 private:
 	void renderImageSection(const MS2Image *image, int section, bool invert);
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
index 4b8f1b9..13ea4dd 100644
--- a/engines/supernova2/sound.h
+++ b/engines/supernova2/sound.h
@@ -55,8 +55,7 @@ enum AudioId {
 
 enum MusicId {
 	kMusicIntro = 52,
-	kMusicMadMonkeys = 56,
-	kMusicOutro = 55
+	kMusicMadMonkeys = 56
 };
 
 class Sound {
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 41c092e..0a35090 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -145,16 +145,6 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	return !in->err();
 }
 
-StringId GameManager::guiCommands[] = {
-	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
-	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
-};
-
-StringId GameManager::guiStatusCommands[] = {
-	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
-	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
-};
-
 void Inventory::add(Object &obj) {
 	if (_numObjects < kMaxCarry) {
 		_inventory[_numObjects++] = &obj;
@@ -206,6 +196,7 @@ Object *Inventory::get(ObjectId id) const {
 	return _nullObject;
 }
 
+
 GuiElement::GuiElement()
 	: _isHighlighted(false)
 	, _bgColorNormal(kColorWhite25)
@@ -254,9 +245,20 @@ void GuiElement::setHighlight(bool isHighlighted_) {
 	}
 }
 
-GameManager::GameManager(Supernova2Engine *vm)
+StringId GameManager::guiCommands[] = {
+	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
+};
+
+StringId GameManager::guiStatusCommands[] = {
+	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
+	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
+};
+
+GameManager::GameManager(Supernova2Engine *vm, Sound *sound)
 	: _inventory(&_nullObject, _inventoryScroll)
 	, _vm(vm)
+    , _sound(sound)
     , _mouseClickType(Common::EVENT_INVALID) {
 	initRooms();
 	changeRoom(INTRO);
@@ -594,14 +596,14 @@ void GameManager::processInput(Common::KeyState &state) {
 		// show game info
 		break;
 	case Common::KEYCODE_F4:
-		//_vm->setTextSpeed();
+		_vm->setTextSpeed();
 		break;
 	case Common::KEYCODE_F5:
 		// load/save
 		break;
 	case Common::KEYCODE_x:
 		if (state.flags & Common::KBD_ALT) {
-			//if (_vm->quitGameDialog())
+			if (_vm->quitGameDialog())
 				_vm->quitGame();
 		}
 		break;
@@ -827,146 +829,6 @@ bool GameManager::isNullObject(Object *obj) {
 	return obj == &_nullObject;
 }
 
-void GameManager::screenShake() {
-	for (int i = 0; i < 12; ++i) {
-		_vm->_system->setShakePos(8);
-		wait(1);
-		_vm->_system->setShakePos(0);
-		wait(1);
-	}
-}
-
-void GameManager::showMenu() {
-	_vm->renderBox(0, 138, 320, 62, 0);
-	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
-	drawCommandBox();
-	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
-	drawInventory();
-}
-
-void GameManager::drawMapExits() {
-// TODO: Preload _exitList on room entry instead on every call
-	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
-
-	if ((_currentRoom >= _rooms[PYR_ENTRANCE] && _currentRoom <= _rooms[HOLE_ROOM]) ||
-		(_currentRoom >= _rooms[FLOORDOOR] && _currentRoom <= _rooms[BST_DOOR]))
-		compass();
-	else {
-		for (int i = 0; i < 25; i++)
-			_exitList[i] = -1;
-		for (int i = 0; i < kMaxObject; i++) {
-			if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
-				byte r = _currentRoom->getObject(i)->_direction;
-				_exitList[r] = i;
-				int x = 284 + 7 * (r % 5);
-				int y = 164 + 7 * (r / 5);
-				_vm->renderBox(x, y, 5, 5, kColorDarkRed);
-			}
-		}
-	}
-}
-
-void GameManager::animationOff() {
-	_animationEnabled = false;
-}
-
-void GameManager::animationOn() {
-	_animationEnabled = true;
-}
-
-void GameManager::edit(Common::String &input, int x, int y, uint length) {
-	bool isEditing = true;
-	uint cursorIndex = input.size();
-	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
-	int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
-						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
-
-	_guiEnabled = false;
-	while (isEditing) {
-		_vm->_screen->setTextCursorPos(x, y);
-		_vm->_screen->setTextCursorColor(kColorWhite99);
-		_vm->renderBox(x, y - 1, overdrawWidth, 9, kColorWhite35);
-		for (uint i = 0; i < input.size(); ++i) {
-			// Draw char highlight depending on cursor position
-			if (i == cursorIndex) {
-				_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1,
-							   Screen::textWidth(input[i]), 9, kColorWhite99);
-				_vm->_screen->setTextCursorColor(kColorWhite35);
-				_vm->renderText(input[i]);
-				_vm->_screen->setTextCursorColor(kColorWhite99);
-			} else
-				_vm->renderText(input[i]);
-		}
-
-		if (cursorIndex == input.size()) {
-			_vm->renderBox(_vm->_screen->getTextCursorPos().x + 1, y - 1, 6, 9, kColorWhite35);
-			_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1, 1, 9, kColorWhite99);
-		}
-
-		getKeyInput(true);
-		if (_vm->shouldQuit())
-			break;
-		switch (_key.keycode) {
-		case Common::KEYCODE_RETURN:
-		case Common::KEYCODE_ESCAPE:
-			isEditing = false;
-			break;
-		case Common::KEYCODE_UP:
-		case Common::KEYCODE_DOWN:
-			cursorIndex = input.size();
-			break;
-		case Common::KEYCODE_LEFT:
-			if (cursorIndex != 0)
-				--cursorIndex;
-			break;
-		case Common::KEYCODE_RIGHT:
-			if (cursorIndex != input.size())
-				++cursorIndex;
-			break;
-		case Common::KEYCODE_DELETE:
-			if (cursorIndex != input.size())
-				input.deleteChar(cursorIndex);
-			break;
-		case Common::KEYCODE_BACKSPACE:
-			if (cursorIndex != 0) {
-				--cursorIndex;
-				input.deleteChar(cursorIndex);
-			}
-			break;
-		default:
-			if (Common::isPrint(_key.ascii) && input.size() < length) {
-				input.insertChar(_key.ascii, cursorIndex);
-				++cursorIndex;
-			}
-			break;
-		}
-	}
-	_guiEnabled = true;
-}
-
-void GameManager::takeMoney(int amount) {
-	_state._money += amount;
-	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
-}
-
-void GameManager::drawStatus() {
-	int index = static_cast<int>(_inputVerb);
-	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
-	_vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
-
-	if (isNullObject(_inputObject[0]))
-		_vm->renderText(_currentInputObject->_name);
-	else {
-		_vm->renderText(_inputObject[0]->_name);
-		if (_inputVerb == ACTION_GIVE)
-			_vm->renderText(kPhrasalVerbParticleGiveTo);
-		else if (_inputVerb == ACTION_USE)
-			_vm->renderText(kPhrasalVerbParticleUseWith);
-
-		_vm->renderText(_currentInputObject->_name);
-	}
-}
-
 void GameManager::sentence(int number, bool brightness) {
 	if (number < 0)
 		return;
@@ -1248,6 +1110,146 @@ void GameManager::pauseTimer(bool pause) {
 	}
 }
 
+void GameManager::screenShake() {
+	for (int i = 0; i < 12; ++i) {
+		_vm->_system->setShakePos(8);
+		wait(1);
+		_vm->_system->setShakePos(0);
+		wait(1);
+	}
+}
+
+void GameManager::showMenu() {
+	_vm->renderBox(0, 138, 320, 62, 0);
+	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
+	drawCommandBox();
+	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+	drawInventory();
+}
+
+void GameManager::drawMapExits() {
+// TODO: Preload _exitList on room entry instead on every call
+	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+
+	if ((_currentRoom >= _rooms[PYR_ENTRANCE] && _currentRoom <= _rooms[HOLE_ROOM]) ||
+		(_currentRoom >= _rooms[FLOORDOOR] && _currentRoom <= _rooms[BST_DOOR]))
+		compass();
+	else {
+		for (int i = 0; i < 25; i++)
+			_exitList[i] = -1;
+		for (int i = 0; i < kMaxObject; i++) {
+			if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
+				byte r = _currentRoom->getObject(i)->_direction;
+				_exitList[r] = i;
+				int x = 284 + 7 * (r % 5);
+				int y = 164 + 7 * (r / 5);
+				_vm->renderBox(x, y, 5, 5, kColorDarkRed);
+			}
+		}
+	}
+}
+
+void GameManager::animationOff() {
+	_animationEnabled = false;
+}
+
+void GameManager::animationOn() {
+	_animationEnabled = true;
+}
+
+void GameManager::edit(Common::String &input, int x, int y, uint length) {
+	bool isEditing = true;
+	uint cursorIndex = input.size();
+	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
+	int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
+						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
+
+	_guiEnabled = false;
+	while (isEditing) {
+		_vm->_screen->setTextCursorPos(x, y);
+		_vm->_screen->setTextCursorColor(kColorWhite99);
+		_vm->renderBox(x, y - 1, overdrawWidth, 9, kColorWhite35);
+		for (uint i = 0; i < input.size(); ++i) {
+			// Draw char highlight depending on cursor position
+			if (i == cursorIndex) {
+				_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1,
+							   Screen::textWidth(input[i]), 9, kColorWhite99);
+				_vm->_screen->setTextCursorColor(kColorWhite35);
+				_vm->renderText(input[i]);
+				_vm->_screen->setTextCursorColor(kColorWhite99);
+			} else
+				_vm->renderText(input[i]);
+		}
+
+		if (cursorIndex == input.size()) {
+			_vm->renderBox(_vm->_screen->getTextCursorPos().x + 1, y - 1, 6, 9, kColorWhite35);
+			_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1, 1, 9, kColorWhite99);
+		}
+
+		getKeyInput(true);
+		if (_vm->shouldQuit())
+			break;
+		switch (_key.keycode) {
+		case Common::KEYCODE_RETURN:
+		case Common::KEYCODE_ESCAPE:
+			isEditing = false;
+			break;
+		case Common::KEYCODE_UP:
+		case Common::KEYCODE_DOWN:
+			cursorIndex = input.size();
+			break;
+		case Common::KEYCODE_LEFT:
+			if (cursorIndex != 0)
+				--cursorIndex;
+			break;
+		case Common::KEYCODE_RIGHT:
+			if (cursorIndex != input.size())
+				++cursorIndex;
+			break;
+		case Common::KEYCODE_DELETE:
+			if (cursorIndex != input.size())
+				input.deleteChar(cursorIndex);
+			break;
+		case Common::KEYCODE_BACKSPACE:
+			if (cursorIndex != 0) {
+				--cursorIndex;
+				input.deleteChar(cursorIndex);
+			}
+			break;
+		default:
+			if (Common::isPrint(_key.ascii) && input.size() < length) {
+				input.insertChar(_key.ascii, cursorIndex);
+				++cursorIndex;
+			}
+			break;
+		}
+	}
+	_guiEnabled = true;
+}
+
+void GameManager::takeMoney(int amount) {
+	_state._money += amount;
+	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
+}
+
+void GameManager::drawStatus() {
+	int index = static_cast<int>(_inputVerb);
+	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
+	_vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
+
+	if (isNullObject(_inputObject[0]))
+		_vm->renderText(_currentInputObject->_name);
+	else {
+		_vm->renderText(_inputObject[0]->_name);
+		if (_inputVerb == ACTION_GIVE)
+			_vm->renderText(kPhrasalVerbParticleGiveTo);
+		else if (_inputVerb == ACTION_USE)
+			_vm->renderText(kPhrasalVerbParticleUseWith);
+
+		_vm->renderText(_currentInputObject->_name);
+	}
+}
+
 void GameManager::dead(StringId messageId) {
 	_vm->paletteFadeOut();
 	_guiEnabled = false;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 941cdef..1851da5 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -135,7 +135,7 @@ private:
 
 class GameManager {
 public:
-	GameManager(Supernova2Engine *vm);
+	GameManager(Supernova2Engine *vm, Sound *sound);
 	~GameManager();
 
 	void updateEvents();
@@ -148,6 +148,7 @@ public:
 	static StringId guiCommands[];
 	static StringId guiStatusCommands[];
 	Supernova2Engine *_vm;
+	Sound *_sound;
 	Common::KeyState _key;
 	Common::EventType _mouseClickType;
 	bool _mouseClicked;
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index e59f07d..938cfe6 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -42,12 +42,11 @@
 #include "gui/saveload.h"
 
 #include "supernova2/resman.h"
-#include "supernova2/sound.h"
 #include "supernova2/screen.h"
+#include "supernova2/sound.h"
 #include "supernova2/supernova2.h"
 #include "supernova2/state.h"
 
-
 namespace Supernova2 {
 
 ObjectType operator|(ObjectType a, ObjectType b) {
@@ -90,7 +89,7 @@ Supernova2Engine::Supernova2Engine(OSystem *syst)
 	if (ConfMan.hasKey("textspeed"))
 		_textSpeed = ConfMan.getInt("textspeed");
 
-	DebugMan.addDebugChannel(1 , "general", "Supernova 2 general debug channel");
+	DebugMan.addDebugChannel(kDebugGeneral , "general", "Supernova 2 general debug channel");
 }
 
 Supernova2Engine::~Supernova2Engine() {
@@ -118,6 +117,8 @@ Common::Error Supernova2Engine::run() {
 			_system->delayMillis(end);
 	}
 
+	_mixer->stopAll();
+
 	return Common::kNoError;
 }
 
@@ -134,7 +135,7 @@ void Supernova2Engine::init() {
 
 	_resMan = new ResourceManager();
 	_sound = new Sound(_mixer, _resMan);
-	_gm = new GameManager(this);
+	_gm = new GameManager(this, _sound);
 	_screen = new Screen(this, _resMan);
 	_console = new Console(this, _gm);
 
@@ -165,7 +166,6 @@ void Supernova2Engine::pauseEngineIntern(bool pause) {
 	_gm->pauseTimer(pause);
 }
 
-
 Common::Error Supernova2Engine::loadGameStrings() {
 	Common::String cur_lang = ConfMan.get("language");
 	Common::String string_id("TEXT");
@@ -364,7 +364,7 @@ void Supernova2Engine::setColor63(byte value) {
 	_screen->setColor63(value);
 }
 
-/*void Supernova2Engine::setTextSpeed() {
+void Supernova2Engine::setTextSpeed() {
 	const Common::String &textSpeedString = getGameString(kStringTextSpeed);
 	int stringWidth = Screen::textWidth(textSpeedString);
 	int textX = (kScreenWidth - stringWidth) / 2;
@@ -376,7 +376,6 @@ void Supernova2Engine::setColor63(byte value) {
 	int boxHeight = 27;
 
 	_gm->animationOff();
-	_gm->saveTime();
 	saveScreen(boxX, boxY, boxWidth, boxHeight);
 
 	renderBox(boxX, boxY, boxWidth, boxHeight, kColorBlue);
@@ -414,11 +413,10 @@ void Supernova2Engine::setColor63(byte value) {
 	_gm->resetInputState();
 
 	restoreScreen();
-	_gm->loadTime();
 	_gm->animationOn();
-}*/
+}
 
-/*bool Supernova2Engine::quitGameDialog() {
+bool Supernova2Engine::quitGameDialog() {
 	bool quit = false;
 
 	GuiElement guiQuitBox;
@@ -438,7 +436,6 @@ void Supernova2Engine::setColor63(byte value) {
 	guiQuitNo.setTextPosition(173, 112);
 
 	_gm->animationOff();
-	_gm->saveTime();
 	saveScreen(guiQuitBox);
 
 	renderBox(guiQuitBox);
@@ -472,11 +469,10 @@ void Supernova2Engine::setColor63(byte value) {
 
 	_gm->resetInputState();
 	restoreScreen();
-	_gm->loadTime();
 	_gm->animationOn();
 
 	return quit;
-}*/
+}
 
 bool Supernova2Engine::canLoadGameStateCurrently() {
 	return _allowLoadGame;


Commit: 5f355734fd8648d03d4e691c7c3bc70cfaeaf0a6
    https://github.com/scummvm/scummvm/commit/5f355734fd8648d03d4e691c7c3bc70cfaeaf0a6
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Partial merge of the engine

I am merging the second engine to the first one. Both should be
fully functional as before right now

Current merge file status:
console: should be done
graphics: should be done
detection: 0% merged
imageid: appears to not be used anywhere, so it may be removed
resman: partialy merged
rooms: totaly different, 0% merged
screen: should be done
screenstatic: done
sound: partialy done
state: a lot different, just started to merge
supernova: mostly done

Changed paths:
    engines/supernova/graphics.cpp
    engines/supernova/graphics.h
    engines/supernova/module.mk
    engines/supernova/resman.cpp
    engines/supernova/resman.h
    engines/supernova/screen.cpp
    engines/supernova/screen.h
    engines/supernova/screenstatic.cpp
    engines/supernova/sound.cpp
    engines/supernova/sound.h
    engines/supernova/state.cpp
    engines/supernova/state.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/supernova2/state.cpp
    engines/supernova2/state.h
    engines/supernova2/supernova2.cpp


diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index ff385f9..a317672 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -35,7 +35,8 @@
 
 namespace Supernova {
 
-MSNImage::MSNImage() {
+MSNImage::MSNImage(int MSPart)
+	: _MSPart(MSPart) {
 	_palette = nullptr;
 	_encodedImage = nullptr;
 	_filenumber = -1;
@@ -68,9 +69,17 @@ MSNImage::~MSNImage() {
 
 bool MSNImage::init(int filenumber) {
 	Common::File file;
-	if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
-		warning("Image data file msn_data.%03d could not be read!", filenumber);
-		return false;
+	if (_MSPart == 1) {
+		if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
+			warning("Image data file msn_data.%03d could not be read!", filenumber);
+			return false;
+		}
+	}
+	else if (_MSPart == 2) {
+		if (!file.open(Common::String::format("ms2_data.%03d", filenumber))) {
+			warning("Image data file ms2_data.%03d could not be read!", filenumber);
+			return false;
+		}
 	}
 
 	_filenumber = filenumber;
@@ -81,30 +90,49 @@ bool MSNImage::init(int filenumber) {
 
 bool MSNImage::loadFromEngineDataFile() {
 	Common::String name;
-	if (_filenumber == 1)
-		name = "IMG1";
-	else if (_filenumber == 2)
-		name = "IMG2";
-	else
-		return false;
+	Common::File f;
+	char id[5], lang[5];
+	id[4] = lang[4] = '\0';
+	if (_MSPart == 1) {
+		if (_filenumber == 1)
+			name = "IMG1";
+		else if (_filenumber == 2)
+			name = "IMG2";
+		else
+
+			return false;
+		if (!f.open(SUPERNOVA_DAT))
+			return false;
+		
+		f.read(id, 3);
+		if (strncmp(id, "MSN", 3) != 0)
+			return false;
+		int version = f.readByte();
+		if (version != SUPERNOVA_DAT_VERSION)
+			return false;
+	} else if (_MSPart == 2) {
+		if (_filenumber == 28)
+			name = "IMG1";
+		else
+			return false;
+
+		if (!f.open(SUPERNOVA2_DAT))
+			return false;
+
+		f.read(id, 3);
+		if (strncmp(id, "MS2", 3) != 0)
+			return false;
+		int version = f.readByte();
+		if (version != SUPERNOVA2_DAT_VERSION)
+			return false;
+	}
 
 	Common::String cur_lang = ConfMan.get("language");
 
 	// Note: we don't print any warning or errors here if we cannot find the file
 	// or the format is not as expected. We will get those warning when reading the
 	// strings anyway (actually the engine will even refuse to start).
-	Common::File f;
-	if (!f.open(SUPERNOVA_DAT))
-		return false;
 
-	char id[5], lang[5];
-	id[4] = lang[4] = '\0';
-	f.read(id, 3);
-	if (strncmp(id, "MSN", 3) != 0)
-		return false;
-	int version = f.readByte();
-	if (version != SUPERNOVA_DAT_VERSION)
-		return false;
 
 	while (!f.eos()) {
 		f.read(id, 4);
@@ -219,9 +247,11 @@ bool MSNImage::loadStream(Common::SeekableReadStream &stream) {
 }
 
 bool MSNImage::loadSections() {
-	bool isNewspaper = _filenumber == 1 || _filenumber == 2;
-	int imageWidth = isNewspaper ? 640 : 320;
-	int imageHeight = isNewspaper ? 480 : 200;
+	bool isNewspaper = (_MSPart == 1 && (_filenumber == 1 || _filenumber == 2)) ||
+					   (_MSPart == 2 && _filenumber == 38);
+	bool isCypheredText = _MSPart == 2 && _filenumber == 28 && ConfMan.get("language") == "en";
+	int imageWidth = isNewspaper || isCypheredText ? 640 : 320;
+	int imageHeight = isNewspaper || isCypheredText ? 480 : 200;
 	_pitch = imageWidth;
 
 	for (int section = 0; section < _numSections; ++section) {
@@ -241,6 +271,19 @@ bool MSNImage::loadSections() {
 				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
 				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
 			}
+		} else if (isCypheredText) {
+			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
+			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
+			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
+				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite44 : kColorBlack;
+			}
 		} else {
 			uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
 			if (offset == kInvalidAddress || _section[section].x2 == 0) {
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 058da45..5a790ec 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -38,7 +38,7 @@ namespace Supernova {
 
 class MSNImage : public Image::ImageDecoder {
 public:
-	MSNImage();
+	MSNImage(int MSPart);
 	virtual ~MSNImage();
 
 	virtual void destroy();
@@ -79,6 +79,7 @@ public:
 	} _clickField[kMaxClickFields];
 
 private:
+	int _MSPart;
 	bool loadFromEngineDataFile();
 	bool loadSections();
 };
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index 722a230..c9bc1ca 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -1,14 +1,14 @@
 MODULE := engines/supernova
 
 MODULE_OBJS := \
-	console.o \
 	detection.o \
+	state.o \
 	graphics.o \
 	resman.o \
 	rooms.o \
 	screen.o \
+	console.o \
 	sound.o \
-	state.o \
 	supernova.o
 
 MODULE_DIRS += \
diff --git a/engines/supernova/resman.cpp b/engines/supernova/resman.cpp
index d7ea0b3..f2b9f31 100644
--- a/engines/supernova/resman.cpp
+++ b/engines/supernova/resman.cpp
@@ -92,12 +92,18 @@ static const byte mouseWait[64] = {
 };
 
 
-ResourceManager::ResourceManager()
-	: _audioRate(11931) {
+ResourceManager::ResourceManager(int MSPart)
+	: _audioRate(11931)
+	, _MSPart(MSPart) {
 	initSoundFiles();
 	initGraphics();
 }
 
+ResourceManager::~ResourceManager() {
+	for (int i = 0; i < kNumImageFiles; i++)
+		delete _images[i];
+}
+
 void ResourceManager::initSoundFiles() {
 	// Sound
 	// Note:
@@ -164,10 +170,12 @@ void ResourceManager::initCursorGraphics() {
 
 void ResourceManager::initImages() {
 	for (int i = 0; i < 44; ++i) {
-		if (!_images[i].init(i))
+		_images[i] = new MSNImage(_MSPart);
+		if (!_images[i]->init(i))
 			error("Failed reading image file msn_data.%03d", i);
 	}
-	if (!_images[44].init(55))
+	_images[44] = new MSNImage(_MSPart);
+	if (!_images[44]->init(55))
 			error("Failed reading image file msn_data.055");
 }
 
@@ -183,6 +191,9 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	case kMusicIntro:
 		_musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get()));
 		return _musicIntro.get();
+	case kMusicMadMonkeys:
+		_musicMadMonkeys.reset(Audio::makeProtrackerStream(_musicMadMonkeysBuffer.get()));
+		return _musicMadMonkeys.get();
 	case kMusicOutro:
 		_musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get()));
 		return _musicOutro.get();
@@ -191,11 +202,15 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	}
 }
 
-const MSNImage *ResourceManager::getImage(int filenumber) const {
+Audio::AudioStream *ResourceManager::getSirenStream() {
+	return _sirenStream.get();
+}
+
+MSNImage *ResourceManager::getImage(int filenumber) {
 	if (filenumber < 44)
-		return &_images[filenumber];
+		return _images[filenumber];
 	else if (filenumber == 55)
-		return &_images[44];
+		return _images[44];
 	else
 		return nullptr;
 }
@@ -211,6 +226,47 @@ const byte *ResourceManager::getImage(CursorId id) const {
 	}
 }
 
+// Generate a tone which minimal length is the length and ends at the end
+// of sine period
+// NOTE: Size of the SineTable has to be the same as audioRate and a multiple of 4
+byte *ResourceManager::generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table) {
+	int i = 0;
+
+	// Make sure length is a multiple of audioRate / frequency to end on a full sine wave and not in the middle.
+	// Also the length we have is a minimum length, so only increase it.
+	int r = 1 + (length - 1) * frequency / audioRate;
+	length = (1 + 2 * r * audioRate / frequency) / 2;
+	for(; i < length; i++) {
+		buffer[i] = (byte)
+			((table.at((i * frequency) % audioRate) * 127) + 127);
+	}
+	return buffer + length;
+}
+
+// Tones with frequencies between 1500 Hz and 1800 Hz, frequencies go up and down
+// with a step of 10 Hz.
+void ResourceManager::initSiren() {
+	int audioRate = 44000;
+	int length = audioRate / 90; // minimal length of each tone
+
+	// * 60 for the minimal length, another 20 * length as a spare, for longer tones
+	byte *buffer = new byte[length * 80]; 
+	byte *pBuffer = buffer;
+	Common::SineTable table(audioRate);
+
+	for (int i = 0; i < 30; i++)
+		pBuffer = generateTone(pBuffer, 1800 - i * 10, length, audioRate, table);
+
+	for (int i = 0; i < 30; i++)
+		pBuffer = generateTone(pBuffer, 1500 + i * 10, length, audioRate, table);
+
+	byte streamFlag = Audio::FLAG_UNSIGNED;
+
+	_sirenStream.reset(Audio::makeLoopingAudioStream(
+			Audio::makeRawStream(buffer, pBuffer - buffer, audioRate,
+									streamFlag, DisposeAfterUse::YES), 0));
+}
+
 static Common::MemoryReadStream *convertToMod(const char *filename, int version) {
 	// MSN format
 	struct {
@@ -397,4 +453,20 @@ static Common::MemoryReadStream *convertToMod(const char *filename, int version)
 	return new Common::MemoryReadStream(buffer.getData(), buffer.size(), DisposeAfterUse::YES);
 }
 
+int ResourceManager::getAudioRate() {
+	return _audioRate;
+}
+
+//TODO: leave only one function for getting Cursor image
+const byte *ResourceManager::getCursor(CursorId id) const {
+	switch (id) {
+	case kCursorNormal:
+		return _cursorNormal;
+	case kCursorWait:
+		return _cursorWait;
+	default:
+		return nullptr;
+	}
+}
+
 }
diff --git a/engines/supernova/resman.h b/engines/supernova/resman.h
index 080497e..194b798 100644
--- a/engines/supernova/resman.h
+++ b/engines/supernova/resman.h
@@ -25,6 +25,7 @@
 
 #include "audio/audiostream.h"
 #include "common/ptr.h"
+#include "common/sinetables.h"
 
 #include "supernova/graphics.h"
 #include "supernova/sound.h"
@@ -47,27 +48,37 @@ public:
 	static const int kNumImageFiles = 45;
 
 public:
-	ResourceManager();
+	ResourceManager(int MSPart);
+	~ResourceManager();
 
 	Audio::SeekableAudioStream *getSoundStream(AudioId index);
 	Audio::AudioStream *getSoundStream(MusicId index);
-	const MSNImage *getImage(int filenumber) const;
+	Audio::AudioStream *getSirenStream();
+	MSNImage *getImage(int filenumber);
 	const byte *getImage(CursorId id) const;
+	const byte *getCursor(CursorId id) const;
+	int getAudioRate();
 
 private:
 	void initSoundFiles();
 	void initGraphics();
 	void initCursorGraphics();
 	void initImages();
+	void initSiren();
+	byte *generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table);
 
 private:
 	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
 	Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
+	Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer;
 	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
 	Common::ScopedPtr<Audio::AudioStream> _musicOutro;
+	Common::ScopedPtr<Audio::AudioStream> _sirenStream;
+	Common::ScopedPtr<Audio::AudioStream> _musicMadMonkeys;
+	int _MSPart;
 	int _audioRate;
-	MSNImage _images[kNumImageFiles];
+	MSNImage *_images[kNumImageFiles];
 	byte _cursorNormal[256];
 	byte _cursorWait[256];
 };
diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index f28af28..0240a76 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -26,6 +26,7 @@
 #include "graphics/cursorman.h"
 #include "graphics/palette.h"
 #include "graphics/surface.h"
+#include "common/config-manager.h"
 
 #include "supernova/imageid.h"
 #include "supernova/resman.h"
@@ -105,14 +106,24 @@ Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
 	: _text(text)
 	, _textBegin(text)
 	, _delay(0)
-	, _color(kColorLightBlue)
 	, _loop(false)
 	, _screen(screen) {
-	if (id == kMarqueeIntro) {
-		_y = 191;
-		_loop = true;
-	} else if (id == kMarqueeOutro) {
-		_y = 1;
+	if (_screen->_vm->_MSPart == 1) {
+		_color = kColorLightBlue;
+		if (id == kMarqueeIntro) {
+			_y = 191;
+			_loop = true;
+		} else if (id == kMarqueeOutro) {
+			_y = 1;
+		}
+	} else if (_screen->_vm->_MSPart == 2) {
+		_color = kColorPurple;
+		if (id == kMarqueeIntro) {
+			_y = 191;
+			_loop = true;
+		} else if (id == kMarqueeOutro) {
+			_y = 191;
+		}
 	}
 
 	_textWidth = Screen::textWidth(_text);
@@ -126,10 +137,18 @@ void Marquee::clearText() {
 	_screen->renderBox(_x, _y - 1, _textWidth + 1, 9, kColorBlack);
 }
 
-void Marquee::renderCharacter() {
+void Marquee::reset() {
+	_text = _textBegin;
+	clearText();
+	_textWidth = Screen::textWidth(_text);
+	_x = kScreenWidth / 2 - _textWidth / 2;
+	_screen->_textCursorX = _x;
+}
+
+bool Marquee::renderCharacter() {
 	if (_delay != 0) {
 		_delay--;
-		return;
+		return true;
 	}
 
 	switch (*_text) {
@@ -141,7 +160,8 @@ void Marquee::renderCharacter() {
 			_textWidth = Screen::textWidth(_text);
 			_x = kScreenWidth / 2 - _textWidth / 2;
 			_screen->_textCursorX = _x;
-		}
+		} else
+			return false;
 		break;
 	case '\0':
 		clearText();
@@ -149,8 +169,13 @@ void Marquee::renderCharacter() {
 		_textWidth = Screen::textWidth(_text);
 		_x = kScreenWidth / 2 - _textWidth / 2;
 		_screen->_textCursorX = _x;
-		_color = kColorLightBlue;
-		_screen->_textColor = _color;
+		if (_screen->_vm->_MSPart == 1) {
+			_color = kColorLightBlue;
+			_screen->_textColor = _color;
+		} else if (_screen->_vm->_MSPart == 2) {
+			_color = kColorPurple;
+			_screen->_textColor = _color;
+		}
 		break;
 	case '^':
 		_color = kColorLightYellow;
@@ -166,6 +191,7 @@ void Marquee::renderCharacter() {
 		_delay = 1;
 		break;
 	}
+	return true;
 }
 
 Screen::Screen(SupernovaEngine *vm, ResourceManager *resMan)
@@ -181,10 +207,7 @@ Screen::Screen(SupernovaEngine *vm, ResourceManager *resMan)
 	, _textCursorY(0)
 	, _messageShown(false) {
 
-	CursorMan.replaceCursor(_resMan->getImage(ResourceManager::kCursorNormal),
-							16, 16, 0, 0, kColorCursorTransparent);
-	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
-	CursorMan.showMouse(true);
+	changeCursor(ResourceManager::kCursorNormal);
 }
 
 int Screen::getScreenWidth() const {
@@ -211,7 +234,7 @@ void Screen::setGuiBrightness(int brightness) {
 	_guiBrightness = brightness;
 }
 
-const MSNImage *Screen::getCurrentImage() const {
+MSNImage *Screen::getCurrentImage() {
 	return _currentImage;
 }
 
@@ -348,7 +371,13 @@ void Screen::renderImageSection(const MSNImage *image, int section, bool invert)
 							 image->_section[section].y1,
 							 image->_section[section].x2 + 1,
 							 image->_section[section].y2 + 1);
-	if (image->_filenumber == 1 || image->_filenumber == 2) {
+	bool bigImage = false;
+	if (_vm->_MSPart == 1)
+		bigImage = image->_filenumber == 1 || image->_filenumber == 2;
+	else if (_vm->_MSPart == 2)
+		bigImage = image->_filenumber == 38 ||
+						(image->_filenumber == 28 && ConfMan.get("language") == "en");
+	if (bigImage) {
 		sectionRect.setWidth(640);
 		sectionRect.setHeight(480);
 		if (_screenWidth != 640) {
@@ -478,7 +507,7 @@ int Screen::textWidth(const Common::String &text) {
 	return Screen::textWidth(text.c_str());
 }
 
-void Screen::renderMessage(const char *text, MessagePosition position) {
+void Screen::renderMessage(const char *text, MessagePosition position, int positionX, int positionY) {
 	Common::String t(text);
 	char *row[20];
 	Common::String::iterator p = t.begin();
@@ -536,6 +565,11 @@ void Screen::renderMessage(const char *text, MessagePosition position) {
 		y = 142;
 	}
 
+	if (positionX != -1 && positionY != -1) {
+		x = positionX;
+		y = positionY;
+	}
+
 	int message_columns = x - 3;
 	int message_rows = y - 3;
 	int message_width = rowWidthMax + 6;
@@ -591,8 +625,8 @@ void Screen::paletteBrightness() {
 	_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
 }
 
-void Screen::paletteFadeOut() {
-	while (_guiBrightness > 10) {
+void Screen::paletteFadeOut(int minBrightness) {
+	while (_guiBrightness > minBrightness + 10) {
 		_guiBrightness -= 10;
 		if (_viewportBrightness > _guiBrightness)
 			_viewportBrightness = _guiBrightness;
@@ -600,8 +634,8 @@ void Screen::paletteFadeOut() {
 		_vm->_system->updateScreen();
 		_vm->_system->delayMillis(_vm->_delay);
 	}
-	_guiBrightness = 0;
-	_viewportBrightness = 0;
+	_guiBrightness = minBrightness;
+	_viewportBrightness = minBrightness;
 	paletteBrightness();
 	_vm->_system->updateScreen();
 }
@@ -626,4 +660,12 @@ void Screen::setColor63(byte value) {
 	_vm->_system->getPaletteManager()->setPalette(color, 63, 1);
 }
 
+void Screen::changeCursor(ResourceManager::CursorId id) {
+	CursorMan.replaceCursor(_resMan->getCursor(id),
+							16, 16, 0, 0, kColorCursorTransparent);
+	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
+	CursorMan.showMouse(true);
+}
+
+
 }
diff --git a/engines/supernova/screen.h b/engines/supernova/screen.h
index 3e90e21..dc5aa4d 100644
--- a/engines/supernova/screen.h
+++ b/engines/supernova/screen.h
@@ -29,7 +29,7 @@
 
 #include "supernova/imageid.h"
 #include "supernova/msn_def.h"
-#include "supernova2/resman.h"
+#include "supernova/resman.h"
 
 namespace Supernova {
 
@@ -63,6 +63,7 @@ enum Color {
 	kColorLightGreen  = 13,
 	kColorLightYellow = 14,
 	kColorLightRed    = 15,
+	kColorPurple      = 35,
 	kColorCursorTransparent = kColorWhite25
 };
 
@@ -101,7 +102,8 @@ public:
 
 	Marquee(Screen *screen, MarqueeId id, const char *text);
 
-	void renderCharacter();
+	bool renderCharacter();
+	void reset();
 
 private:
 	void clearText();
@@ -141,11 +143,11 @@ public:
 	void setViewportBrightness(int brightness);
 	int getGuiBrightness() const;
 	void setGuiBrightness(int brightness);
-	const MSNImage *getCurrentImage() const;
+	MSNImage *getCurrentImage();
 	const ImageInfo *getImageInfo(ImageId id) const;
 	bool isMessageShown() const;
 	void paletteFadeIn(int maxViewportBrightness);
-	void paletteFadeOut();
+	void paletteFadeOut(int minBrightness);
 	void paletteBrightness();
 	void renderImage(ImageId id, bool removeImage = false);
 	void renderImage(int section);
@@ -154,7 +156,7 @@ public:
 	void saveScreen(const GuiElement &guiElement);
 	void restoreScreen();
 	void renderRoom(Room &room);
-	void renderMessage(const char *text, MessagePosition position = kMessageNormal);
+	void renderMessage(const char *text, MessagePosition position = kMessageNormal, int positionX = -1, int positionY = -1);
 	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
 	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
 					   Common::String var1 = "", Common::String var2 = "");
@@ -176,6 +178,7 @@ public:
 	byte getTextCursorColor();
 	void setTextCursorColor(byte color);
 	void update();
+	void changeCursor(ResourceManager::CursorId);
 
 private:
 	void renderImageSection(const MSNImage *image, int section, bool invert);
@@ -183,7 +186,7 @@ private:
 private:
 	SupernovaEngine *_vm;
 	ResourceManager *_resMan;
-	const MSNImage *_currentImage;
+	MSNImage *_currentImage;
 	ScreenBufferStack _screenBuffer;
 	int _screenWidth;
 	int _screenHeight;
diff --git a/engines/supernova/screenstatic.cpp b/engines/supernova/screenstatic.cpp
index 796c148..20c7262 100644
--- a/engines/supernova/screenstatic.cpp
+++ b/engines/supernova/screenstatic.cpp
@@ -145,49 +145,262 @@ static const Screen::ImageInfo imageInfo[] = {
 
 // Default palette
 static const byte initVGAPalette[768] = {
-	0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x58, 0x58, 0x58, 0x70, 0x70, 0x70, 0xfc, 0xfc, 0xfc, 0x00, 0xd0, 0x00,
-	0x00, 0xfc, 0x00, 0xd8, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xb0, 0xa0, 0xa0, 0xa0,
-	0x50, 0xc8, 0xfc, 0x28, 0xfc, 0x28, 0xf0, 0xf0, 0x00, 0xfc, 0x28, 0x28, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
-	0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
-	0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
-	0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
-	0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
-	0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
-	0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
-	0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
-	0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
-	0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
-	0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
-	0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
-	0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
-	0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
-	0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
-	0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
-	0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
-	0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
-	0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
-	0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
-	0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
-	0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
-	0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
-	0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
-	0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
-	0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
-	0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
-	0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
-	0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
-	0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
-	0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
-	0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
-	0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
-	0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
-	0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
-	0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
-	0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
-	0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
-	0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
-	0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+	0x00, 0x00, 0x00,
+	0x40, 0x40, 0x40,
+	0x58, 0x58, 0x58,
+	0x70, 0x70, 0x70,
+	0xfc, 0xfc, 0xfc,
+	0x00, 0xd0, 0x00,
+	0x00, 0xfc, 0x00,
+	0xd8, 0x00, 0x00,
+	0xfc, 0x00, 0x00,
+	0x00, 0x00, 0x78,
+	0x00, 0x00, 0xb0,
+	0xa0, 0xa0, 0xa0,
+	0x50, 0xc8, 0xfc,
+	0x28, 0xfc, 0x28,
+	0xf0, 0xf0, 0x00,
+	0xfc, 0x28, 0x28,
+	0x00, 0x00, 0x00,
+	0x14, 0x14, 0x14,
+	0x20, 0x20, 0x20,
+	0x2c, 0x2c, 0x2c,
+	0x38, 0x38, 0x38,
+	0x44, 0x44, 0x44,
+	0x50, 0x50, 0x50,
+	0x60, 0x60, 0x60,
+	0x70, 0x70, 0x70,
+	0x80, 0x80, 0x80,
+	0x90, 0x90, 0x90,
+	0xa0, 0xa0, 0xa0,
+	0xb4, 0xb4, 0xb4,
+	0xc8, 0xc8, 0xc8,
+	0xe0, 0xe0, 0xe0,
+	0xfc, 0xfc, 0xfc,
+	0x00, 0x00, 0xfc,
+	0x40, 0x00, 0xfc,
+	0x7c, 0x00, 0xfc,
+	0xbc, 0x00, 0xfc,
+	0xfc, 0x00, 0xfc,
+	0xfc, 0x00, 0xbc,
+	0xfc, 0x00, 0x7c,
+	0xfc, 0x00, 0x40,
+	0xfc, 0x00, 0x00,
+	0xfc, 0x40, 0x00,
+	0xfc, 0x7c, 0x00,
+	0xfc, 0xbc, 0x00,
+	0xfc, 0xfc, 0x00,
+	0xbc, 0xfc, 0x00,
+	0x7c, 0xfc, 0x00,
+	0x40, 0xfc, 0x00,
+	0x00, 0xfc, 0x00,
+	0x00, 0xfc, 0x40,
+	0x00, 0xfc, 0x7c,
+	0x00, 0xfc, 0xbc,
+	0x00, 0xfc, 0xfc,
+	0x00, 0xbc, 0xfc,
+	0x00, 0x7c, 0xfc,
+	0x00, 0x40, 0xfc,
+	0x7c, 0x7c, 0xfc,
+	0x9c, 0x7c, 0xfc,
+	0xbc, 0x7c, 0xfc,
+	0xdc, 0x7c, 0xfc,
+	0xfc, 0x7c, 0xfc,
+	0xfc, 0x7c, 0xdc,
+	0xfc, 0x7c, 0xbc,
+	0xfc, 0x7c, 0x9c,
+	0xfc, 0x7c, 0x7c,
+	0xfc, 0x9c, 0x7c,
+	0xfc, 0xbc, 0x7c,
+	0xfc, 0xdc, 0x7c,
+	0xfc, 0xfc, 0x7c,
+	0xdc, 0xfc, 0x7c,
+	0xbc, 0xfc, 0x7c,
+	0x9c, 0xfc, 0x7c,
+	0x7c, 0xfc, 0x7c,
+	0x7c, 0xfc, 0x9c,
+	0x7c, 0xfc, 0xbc,
+	0x7c, 0xfc, 0xdc,
+	0x7c, 0xfc, 0xfc,
+	0x7c, 0xdc, 0xfc,
+	0x7c, 0xbc, 0xfc,
+	0x7c, 0x9c, 0xfc,
+	0xb4, 0xb4, 0xfc,
+	0xc4, 0xb4, 0xfc,
+	0xd8, 0xb4, 0xfc,
+	0xe8, 0xb4, 0xfc,
+	0xfc, 0xb4, 0xfc,
+	0xfc, 0xb4, 0xe8,
+	0xfc, 0xb4, 0xd8,
+	0xfc, 0xb4, 0xc4,
+	0xfc, 0xb4, 0xb4,
+	0xfc, 0xc4, 0xb4,
+	0xfc, 0xd8, 0xb4,
+	0xfc, 0xe8, 0xb4,
+	0xfc, 0xfc, 0xb4,
+	0xe8, 0xfc, 0xb4,
+	0xd8, 0xfc, 0xb4,
+	0xc4, 0xfc, 0xb4,
+	0xb4, 0xfc, 0xb4,
+	0xb4, 0xfc, 0xc4,
+	0xb4, 0xfc, 0xd8,
+	0xb4, 0xfc, 0xe8,
+	0xb4, 0xfc, 0xfc,
+	0xb4, 0xe8, 0xfc,
+	0xb4, 0xd8, 0xfc,
+	0xb4, 0xc4, 0xfc,
+	0x00, 0x00, 0x70,
+	0x1c, 0x00, 0x70,
+	0x38, 0x00, 0x70,
+	0x54, 0x00, 0x70,
+	0x70, 0x00, 0x70,
+	0x70, 0x00, 0x54,
+	0x70, 0x00, 0x38,
+	0x70, 0x00, 0x1c,
+	0x70, 0x00, 0x00,
+	0x70, 0x1c, 0x00,
+	0x70, 0x38, 0x00,
+	0x70, 0x54, 0x00,
+	0x70, 0x70, 0x00,
+	0x54, 0x70, 0x00,
+	0x38, 0x70, 0x00,
+	0x1c, 0x70, 0x00,
+	0x00, 0x70, 0x00,
+	0x00, 0x70, 0x1c,
+	0x00, 0x70, 0x38,
+	0x00, 0x70, 0x54,
+	0x00, 0x70, 0x70,
+	0x00, 0x54, 0x70,
+	0x00, 0x38, 0x70,
+	0x00, 0x1c, 0x70,
+	0x38, 0x38, 0x70,
+	0x44, 0x38, 0x70,
+	0x54, 0x38, 0x70,
+	0x60, 0x38, 0x70,
+	0x70, 0x38, 0x70,
+	0x70, 0x38, 0x60,
+	0x70, 0x38, 0x54,
+	0x70, 0x38, 0x44,
+	0x70, 0x38, 0x38,
+	0x70, 0x44, 0x38,
+	0x70, 0x54, 0x38,
+	0x70, 0x60, 0x38,
+	0x70, 0x70, 0x38,
+	0x60, 0x70, 0x38,
+	0x54, 0x70, 0x38,
+	0x44, 0x70, 0x38,
+	0x38, 0x70, 0x38,
+	0x38, 0x70, 0x44,
+	0x38, 0x70, 0x54,
+	0x38, 0x70, 0x60,
+	0x38, 0x70, 0x70,
+	0x38, 0x60, 0x70,
+	0x38, 0x54, 0x70,
+	0x38, 0x44, 0x70,
+	0x50, 0x50, 0x70,
+	0x58, 0x50, 0x70,
+	0x60, 0x50, 0x70,
+	0x68, 0x50, 0x70,
+	0x70, 0x50, 0x70,
+	0x70, 0x50, 0x68,
+	0x70, 0x50, 0x60,
+	0x70, 0x50, 0x58,
+	0x70, 0x50, 0x50,
+	0x70, 0x58, 0x50,
+	0x70, 0x60, 0x50,
+	0x70, 0x68, 0x50,
+	0x70, 0x70, 0x50,
+	0x68, 0x70, 0x50,
+	0x60, 0x70, 0x50,
+	0x58, 0x70, 0x50,
+	0x50, 0x70, 0x50,
+	0x50, 0x70, 0x58,
+	0x50, 0x70, 0x60,
+	0x50, 0x70, 0x68,
+	0x50, 0x70, 0x70,
+	0x50, 0x68, 0x70,
+	0x50, 0x60, 0x70,
+	0x50, 0x58, 0x70,
+	0x00, 0x00, 0x40,
+	0x10, 0x00, 0x40,
+	0x20, 0x00, 0x40,
+	0x30, 0x00, 0x40,
+	0x40, 0x00, 0x40,
+	0x40, 0x00, 0x30,
+	0x40, 0x00, 0x20,
+	0x40, 0x00, 0x10,
+	0x40, 0x00, 0x00,
+	0x40, 0x10, 0x00,
+	0x40, 0x20, 0x00,
+	0x40, 0x30, 0x00,
+	0x40, 0x40, 0x00,
+	0x30, 0x40, 0x00,
+	0x20, 0x40, 0x00,
+	0x10, 0x40, 0x00,
+	0x00, 0x40, 0x00,
+	0x00, 0x40, 0x10,
+	0x00, 0x40, 0x20,
+	0x00, 0x40, 0x30,
+	0x00, 0x40, 0x40,
+	0x00, 0x30, 0x40,
+	0x00, 0x20, 0x40,
+	0x00, 0x10, 0x40,
+	0x20, 0x20, 0x40,
+	0x28, 0x20, 0x40,
+	0x30, 0x20, 0x40,
+	0x38, 0x20, 0x40,
+	0x40, 0x20, 0x40,
+	0x40, 0x20, 0x38,
+	0x40, 0x20, 0x30,
+	0x40, 0x20, 0x28,
+	0x40, 0x20, 0x20,
+	0x40, 0x28, 0x20,
+	0x40, 0x30, 0x20,
+	0x40, 0x38, 0x20,
+	0x40, 0x40, 0x20,
+	0x38, 0x40, 0x20,
+	0x30, 0x40, 0x20,
+	0x28, 0x40, 0x20,
+	0x20, 0x40, 0x20,
+	0x20, 0x40, 0x28,
+	0x20, 0x40, 0x30,
+	0x20, 0x40, 0x38,
+	0x20, 0x40, 0x40,
+	0x20, 0x38, 0x40,
+	0x20, 0x30, 0x40,
+	0x20, 0x28, 0x40,
+	0x2c, 0x2c, 0x40,
+	0x30, 0x2c, 0x40,
+	0x34, 0x2c, 0x40,
+	0x3c, 0x2c, 0x40,
+	0x40, 0x2c, 0x40,
+	0x40, 0x2c, 0x3c,
+	0x40, 0x2c, 0x34,
+	0x40, 0x2c, 0x30,
+	0x40, 0x2c, 0x2c,
+	0x40, 0x30, 0x2c,
+	0x40, 0x34, 0x2c,
+	0x40, 0x3c, 0x2c,
+	0x40, 0x40, 0x2c,
+	0x3c, 0x40, 0x2c,
+	0x34, 0x40, 0x2c,
+	0x30, 0x40, 0x2c,
+	0x2c, 0x40, 0x2c,
+	0x2c, 0x40, 0x30,
+	0x2c, 0x40, 0x34,
+	0x2c, 0x40, 0x3c,
+	0x2c, 0x40, 0x40,
+	0x2c, 0x3c, 0x40,
+	0x2c, 0x34, 0x40,
+	0x2c, 0x30, 0x40,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00
 };
 
 static const byte font[][5] = {
diff --git a/engines/supernova/sound.cpp b/engines/supernova/sound.cpp
index e7f3ce8..dc1c7c3 100644
--- a/engines/supernova/sound.cpp
+++ b/engines/supernova/sound.cpp
@@ -53,6 +53,14 @@ void Sound::play(MusicId index) {
 					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
 }
 
+void Sound::playSiren() {
+	Audio::AudioStream *stream = _resMan->getSirenStream();
+
+	stop();
+	_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, stream,
+					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
+}
+
 bool Sound::isPlaying() {
 	return _mixer->isSoundHandleActive(_soundHandle);
 }
@@ -62,4 +70,12 @@ void Sound::stop() {
 		_mixer->stopHandle(_soundHandle);
 }
 
+int Sound::getVolume() {
+	return _mixer->getChannelVolume(_soundHandle);
+}
+
+void Sound::setVolume(int volume) {
+	_mixer->setChannelVolume(_soundHandle, volume);
+}
+
 }
diff --git a/engines/supernova/sound.h b/engines/supernova/sound.h
index 100c9a3..bfea019 100644
--- a/engines/supernova/sound.h
+++ b/engines/supernova/sound.h
@@ -56,7 +56,8 @@ enum AudioId {
 
 enum MusicId {
 	kMusicIntro = 49,
-	kMusicOutro = 52
+	kMusicOutro = 52,
+	kMusicMadMonkeys = 51
 };
 
 class Sound {
@@ -67,6 +68,9 @@ public:
 
 	void play(AudioId index);
 	void play(MusicId index);
+	void playSiren();
+	void setVolume(int volume);
+	int getVolume();
 	void stop();
 	bool isPlaying();
 private:
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index 2a1c9fb..a0c06a9 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -506,6 +506,10 @@ void GameManager::initGui() {
 	_guiInventoryArrow[1].setTextPosition(273, 186);
 }
 
+bool GameManager::canSaveGameStateCurrently() {
+	return _animationEnabled && _guiEnabled;
+}
+
 void GameManager::updateEvents() {
 	handleTime();
 	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 6b9d463..f78f219 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -187,6 +187,7 @@ public:
 	void initRooms();
 	void destroyRooms();
 	void initGui();
+	bool canSaveGameStateCurrently();
 	bool genericInteract(Action verb, Object &obj1, Object &obj2);
 	bool isHelmetOff();
 	void great(uint number);
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index ba309e8..c07edfa 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -89,6 +89,12 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
 	if (ConfMan.hasKey("textspeed"))
 		_textSpeed = ConfMan.getInt("textspeed");
 
+	if (ConfMan.get("gameid") == "msn1")
+		_MSPart = 1;
+	else if (ConfMan.get("gameid") == "msn2")
+		_MSPart = 2;
+	else
+		_MSPart = 0;
 	DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
 }
 
@@ -133,7 +139,7 @@ void SupernovaEngine::init() {
 	if (status.getCode() != Common::kNoError)
 		error("Failed reading game strings");
 
-	_resMan = new ResourceManager();
+	_resMan = new ResourceManager(_MSPart);
 	_sound = new Sound(_mixer, _resMan);
 	_gm = new GameManager(this, _sound);
 	_screen = new Screen(this, _resMan);
@@ -173,29 +179,52 @@ Common::Error SupernovaEngine::loadGameStrings() {
 	// Note: we don't print any warning or errors here if we cannot find the file
 	// or the format is not as expected. We will get those warning when reading the
 	// strings anyway (actually the engine will even refuse to start).
-	Common::File f;
-	if (!f.open(SUPERNOVA_DAT)) {
-		GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
-		return Common::kReadingFailed;
-	}
+
 
 	// Validate the data file header
+	Common::File f;
 	char id[5], lang[5];
 	id[4] = lang[4] = '\0';
-	f.read(id, 3);
-	if (strncmp(id, "MSN", 3) != 0) {
-		GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
-		return Common::kReadingFailed;
+	if (_MSPart == 1) {
+		if (!f.open(SUPERNOVA_DAT)) {
+			GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
+			return Common::kReadingFailed;
+		}
+		f.read(id, 3);
+		if (strncmp(id, "MSN", 3) != 0) {
+			GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
+			return Common::kReadingFailed;
+		}
+
+		int version = f.readByte();
+		if (version != SUPERNOVA_DAT_VERSION) {
+			GUIErrorMessageFormat(
+				_("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+				SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
+			return Common::kReadingFailed;
+		}
 	}
+	else if (_MSPart == 2) {
+		if (!f.open(SUPERNOVA2_DAT)) {
+			GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA2_DAT);
+			return Common::kReadingFailed;
+		}
+		f.read(id, 3);
+		if (strncmp(id, "MS2", 3) != 0) {
+			GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA2_DAT);
+			return Common::kReadingFailed;
+		}
 
-	int version = f.readByte();
-	if (version != SUPERNOVA_DAT_VERSION) {
-		GUIErrorMessageFormat(
-			_("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
-			SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
-		return Common::kReadingFailed;
+		int version = f.readByte();
+		if (version != SUPERNOVA2_DAT_VERSION) {
+			GUIErrorMessageFormat(
+				_("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+				SUPERNOVA2_DAT, SUPERNOVA2_DAT_VERSION, version);
+			return Common::kReadingFailed;
+		}
 	}
 
+
 	while (!f.eos()) {
 		f.read(id, 4);
 		f.read(lang, 4);
@@ -217,7 +246,7 @@ Common::Error SupernovaEngine::loadGameStrings() {
 	}
 
 	Common::Language l = Common::parseLanguage(cur_lang);
-	GUIErrorMessageFormat(_("Unable to locate the text for %s language in '%s' engine data file."), Common::getLanguageDescription(l), SUPERNOVA_DAT);
+	GUIErrorMessageFormat(_("Unable to locate the text for %s language in engine data file."), Common::getLanguageDescription(l));
 	return Common::kReadingFailed;
 }
 
@@ -294,6 +323,11 @@ void SupernovaEngine::renderMessage(StringId stringId, MessagePosition position,
 	_screen->renderMessage(stringId, position, var1, var2);
 }
 
+void SupernovaEngine::renderMessage(StringId stringId, int x, int y) {
+	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
+	_screen->renderMessage(getGameString(stringId).c_str(), kMessageNormal, x, y);
+}
+
 void SupernovaEngine::removeMessage() {
 	_screen->removeMessage();
 }
@@ -346,9 +380,9 @@ void SupernovaEngine::paletteBrightness() {
 	_screen->paletteBrightness();
 }
 
-void SupernovaEngine::paletteFadeOut() {
+void SupernovaEngine::paletteFadeOut(int minBrightness) {
 	if (!shouldQuit())
-		_screen->paletteFadeOut();
+		_screen->paletteFadeOut(minBrightness);
 }
 
 void SupernovaEngine::paletteFadeIn() {
@@ -586,7 +620,7 @@ Common::Error SupernovaEngine::loadGameState(int slot) {
 
 bool SupernovaEngine::canSaveGameStateCurrently() {
 	// Do not allow saving when either _allowSaveGame, _animationEnabled or _guiEnabled is false
-	return _allowSaveGame && _gm->_animationEnabled && _gm->_guiEnabled;
+	return _allowSaveGame && _gm->canSaveGameStateCurrently();
 }
 
 Common::Error SupernovaEngine::saveGameState(int slot, const Common::String &desc) {
@@ -633,13 +667,18 @@ bool SupernovaEngine::loadGame(int slot) {
 		// continue to try to load it from there.
 	}
 
-	Common::String filename = Common::String::format("msn_save.%03d", slot);
+	Common::String filename;
+	if (_MSPart == 1)
+		filename = Common::String::format("msn_save.%03d", slot);
+	else if (_MSPart == 2)
+		filename = Common::String::format("ms2_save.%03d", slot);
 	Common::InSaveFile *savefile = _saveFileMan->openForLoading(filename);
 	if (!savefile)
 		return false;
 
 	uint saveHeader = savefile->readUint32LE();
-	if (saveHeader != SAVEGAME_HEADER) {
+	if ((_MSPart == 1 && saveHeader != SAVEGAME_HEADER) ||
+		(_MSPart == 2 && saveHeader != SAVEGAME_HEADER2)) {
 		warning("No header found in '%s'", filename.c_str());
 		delete savefile;
 		return false; //Common::kUnknownError
@@ -695,12 +734,20 @@ bool SupernovaEngine::saveGame(int slot, const Common::String &description) {
 		return true;
 	}
 
-	Common::String filename = Common::String::format("msn_save.%03d", slot);
+	Common::String filename;
+	if (_MSPart == 1)
+		filename = Common::String::format("msn_save.%03d", slot);
+	else if (_MSPart == 2)
+		filename = Common::String::format("ms2_save.%03d", slot);
+
 	Common::OutSaveFile *savefile = _saveFileMan->openForSaving(filename);
 	if (!savefile)
 		return false;
 
-	savefile->writeUint32LE(SAVEGAME_HEADER);
+	if (_MSPart == 1)
+		savefile->writeUint32LE(SAVEGAME_HEADER);
+	else if (_MSPart == 2)
+		savefile->writeUint32LE(SAVEGAME_HEADER2);
 	savefile->writeByte(SAVEGAME_VERSION);
 
 	TimeDate currentDate;
@@ -736,5 +783,9 @@ void SupernovaEngine::errorTempSave(bool saving) {
 	error("Unrecoverable error");
 }
 
+void SupernovaEngine::stopSound() {
+	_sound->stop();
+}
+
 
 }
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 94f07ee..afdcf1c 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -44,11 +44,15 @@ namespace Common {
 namespace Supernova {
 
 #define SAVEGAME_HEADER MKTAG('M','S','N','1')
+#define SAVEGAME_HEADER2 MKTAG('M','S','N','2')
 #define SAVEGAME_VERSION 9
 
 #define SUPERNOVA_DAT "supernova.dat"
 #define SUPERNOVA_DAT_VERSION 1
 
+#define SUPERNOVA2_DAT "supernova2.dat"
+#define SUPERNOVA2_DAT_VERSION 1
+
 class GuiElement;
 class ResourceManager;
 class Sound;
@@ -83,6 +87,7 @@ public:
 
 	uint _delay;
 	int  _textSpeed;
+	char _MSPart;
 
 	Common::Error loadGameStrings();
 	void init();
@@ -102,7 +107,7 @@ public:
 	void playSound(AudioId sample);
 	void playSound(MusicId index);
 	void paletteFadeIn();
-	void paletteFadeOut();
+	void paletteFadeOut(int minBrightness = 0);
 	void paletteBrightness();
 	void renderImage(int section);
 	void renderImage(ImageId id, bool removeImage = false);
@@ -115,6 +120,7 @@ public:
 	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
 	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
 					   Common::String var1 = "", Common::String var2 = "");
+	void renderMessage(StringId stringId, int x, int y);
 	void removeMessage();
 	void renderText(const uint16 character);
 	void renderText(const char *text);
@@ -128,6 +134,7 @@ public:
 	void renderBox(int x, int y, int width, int height, byte color);
 	void renderBox(const GuiElement &guiElement);
 	void setColor63(byte value);
+	void stopSound();
 };
 
 }
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
index 0a35090..67aa172 100644
--- a/engines/supernova2/state.cpp
+++ b/engines/supernova2/state.cpp
@@ -352,6 +352,7 @@ void GameManager::initState() {
 	_processInput = false;
 	_guiEnabled = true;
 	_animationEnabled = true;
+	_roomBrightness = 255;
 	_mouseClicked = false;
 	_keyPressed = false;
 	_mouseX = -1;
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index 1851da5..ce1e88f 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -165,6 +165,7 @@ public:
 	bool _processInput;
 	bool _guiEnabled;
 	bool _animationEnabled;
+	byte _roomBrightness;
 	Action _inputVerb;
 	Object _nullObject;
 	Object *_currentInputObject;
@@ -209,6 +210,7 @@ public:
 	void waitOnInput(int ticks);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void screenShake();
+	void roomBrightness() {}
 	void showMenu();
 	void animationOff();
 	void animationOn();
@@ -223,6 +225,8 @@ public:
 	void handleInput();
 	void handleTime();
 	void pauseTimer(bool pause);
+	void loadTime() {}
+	void saveTime() {}
 	void setAnimationTimer(int ticks);
 	void dead(StringId messageId);
 	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
diff --git a/engines/supernova2/supernova2.cpp b/engines/supernova2/supernova2.cpp
index 938cfe6..6023d4d 100644
--- a/engines/supernova2/supernova2.cpp
+++ b/engines/supernova2/supernova2.cpp
@@ -95,12 +95,12 @@ Supernova2Engine::Supernova2Engine(OSystem *syst)
 Supernova2Engine::~Supernova2Engine() {
 	DebugMan.clearAllDebugChannels();
 
+	delete _sleepAutoSave;
 	delete _console;
 	delete _gm;
+	delete _sound;
 	delete _resMan;
 	delete _screen;
-	delete _sleepAutoSave;
-	delete _sound;
 }
 
 Common::Error Supernova2Engine::run() {
@@ -293,6 +293,7 @@ void Supernova2Engine::renderMessage(StringId stringId, MessagePosition position
 	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
 	_screen->renderMessage(stringId, position, var1, var2);
 }
+
 void Supernova2Engine::renderMessage(StringId stringId, int x, int y) {
 	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
 	_screen->renderMessage(getGameString(stringId).c_str(), kMessageNormal, x, y);
@@ -356,8 +357,10 @@ void Supernova2Engine::paletteFadeOut(int minBrightness) {
 }
 
 void Supernova2Engine::paletteFadeIn() {
-	if (!shouldQuit())
-		_screen->paletteFadeIn(255);
+	if (!shouldQuit()) {
+		_gm->roomBrightness();
+		_screen->paletteFadeIn(_gm->_roomBrightness);
+	}
 }
 
 void Supernova2Engine::setColor63(byte value) {
@@ -376,6 +379,7 @@ void Supernova2Engine::setTextSpeed() {
 	int boxHeight = 27;
 
 	_gm->animationOff();
+	_gm->saveTime();
 	saveScreen(boxX, boxY, boxWidth, boxHeight);
 
 	renderBox(boxX, boxY, boxWidth, boxHeight, kColorBlue);
@@ -413,6 +417,7 @@ void Supernova2Engine::setTextSpeed() {
 	_gm->resetInputState();
 
 	restoreScreen();
+	_gm->loadTime();
 	_gm->animationOn();
 }
 


Commit: bc8393deafb440d888db7295a75e59448e45ef7f
    https://github.com/scummvm/scummvm/commit/bc8393deafb440d888db7295a75e59448e45ef7f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Divide GameManager into 2 classes

GameManager got divided into a base class, that will be used
for both parts and a derived class specific to only the first
part.

Changed paths:
  A engines/supernova/game-manager.cpp
  A engines/supernova/game-manager.h
    engines/supernova/module.mk
    engines/supernova/rooms.cpp
    engines/supernova/rooms.h
    engines/supernova/state.cpp
    engines/supernova/state.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/supernova2/state.h


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
new file mode 100644
index 0000000..99d9215
--- /dev/null
+++ b/engines/supernova/game-manager.cpp
@@ -0,0 +1,919 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "graphics/cursorman.h"
+#include "graphics/palette.h"
+#include "gui/message.h"
+
+#include "supernova/screen.h"
+#include "supernova/supernova.h"
+#include "supernova/game-manager.h"
+
+namespace Supernova {
+
+bool GameManager::serialize(Common::WriteStream *out) {
+	return false;
+}
+
+
+bool GameManager::deserialize(Common::ReadStream *in, int version) {
+	return false;
+}
+
+void Inventory::add(Object &obj) {
+	if (_numObjects < kMaxCarry) {
+		_inventory[_numObjects++] = &obj;
+		obj.setProperty(CARRIED);
+	}
+
+	if (getSize() > _inventoryScroll + 8) {
+		_inventoryScroll = getSize() - 8;
+		_inventoryScroll += _inventoryScroll % 2;
+	}
+}
+
+void Inventory::remove(Object &obj) {
+	for (int i = 0; i < _numObjects; ++i) {
+		if (_inventory[i] == &obj) {
+			if (_inventoryScroll >= 2 && getSize() % 2)
+				_inventoryScroll -= 2;
+
+			--_numObjects;
+			while (i < _numObjects) {
+				_inventory[i] = _inventory[i + 1];
+				++i;
+			}
+			obj.disableProperty(CARRIED);
+		}
+	}
+}
+
+void Inventory::clear() {
+	for (int i = 0; i < _numObjects; ++i)
+		_inventory[i]->disableProperty(CARRIED);
+	_numObjects = 0;
+	_inventoryScroll = 0;
+}
+
+Object *Inventory::get(int index) const {
+	if (index < _numObjects)
+		return _inventory[index];
+
+	return _nullObject;
+}
+
+Object *Inventory::get(ObjectId id) const {
+	for (int i = 0; i < _numObjects; ++i) {
+		if (_inventory[i]->_id == id)
+			return _inventory[i];
+	}
+
+	return _nullObject;
+}
+
+
+GuiElement::GuiElement()
+	: _isHighlighted(false)
+	, _bgColorNormal(kColorWhite25)
+	, _bgColorHighlighted(kColorWhite44)
+	, _bgColor(kColorWhite25)
+	, _textColorNormal(kColorGreen)
+	, _textColorHighlighted(kColorLightGreen)
+	, _textColor(kColorGreen)
+{
+	memset(_text, 0, sizeof(_text));
+}
+
+void GuiElement::setText(const char *text) {
+	strncpy(_text, text, sizeof(_text) - 1);
+}
+
+void GuiElement::setTextPosition(int x, int y) {
+	_textPosition = Common::Point(x, y);
+}
+
+void GuiElement::setSize(int x1, int y1, int x2, int y2) {
+	this->left = x1;
+	this->top = y1;
+	this->right = x2;
+	this->bottom = y2;
+
+	_textPosition = Common::Point(x1 + 1, y1 + 1);
+}
+
+void GuiElement::setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted) {
+	_bgColor = bgColor;
+	_textColor = textColor;
+	_bgColorNormal = bgColor;
+	_textColorNormal = textColor;
+	_bgColorHighlighted = bgColorHighlighted;
+	_textColorHighlighted = textColorHightlighted;
+}
+
+void GuiElement::setHighlight(bool isHighlighted_) {
+	if (isHighlighted_) {
+		_bgColor = _bgColorHighlighted;
+		_textColor = _textColorHighlighted;
+	} else {
+		_bgColor = _bgColorNormal;
+		_textColor = _textColorNormal;
+	}
+}
+
+StringId GameManager::guiCommands[] = {
+	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
+	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
+};
+
+StringId GameManager::guiStatusCommands[] = {
+	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
+	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
+};
+
+GameManager::GameManager(SupernovaEngine *vm, Sound *sound)
+	: _inventory(&_nullObject, _inventoryScroll)
+	, _vm(vm)
+    , _sound(sound)
+    , _mouseClickType(Common::EVENT_INVALID) {
+	initGui();
+}
+
+GameManager::~GameManager() {
+}
+
+void GameManager::destroyRooms() {
+}
+
+void GameManager::initState() {
+}
+
+void GameManager::initRooms() {
+}
+
+void GameManager::initGui() {
+	int cmdCount = ARRAYSIZE(_guiCommandButton);
+	int cmdAvailableSpace = 320 - (cmdCount - 1) * 2;
+	for (int i = 0; i < cmdCount; ++i) {
+		const Common::String &text = _vm->getGameString(guiCommands[i]);
+		cmdAvailableSpace -= Screen::textWidth(text);
+	}
+
+	int commandButtonX = 0;
+	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
+		const Common::String &text = _vm->getGameString(guiCommands[i]);
+		int width;
+		if (i < cmdCount - 1) {
+			int space = cmdAvailableSpace / (cmdCount - i);
+			cmdAvailableSpace -= space;
+			width = Screen::textWidth(text) + space;
+		} else
+			width = 320 - commandButtonX;
+
+		_guiCommandButton[i].setSize(commandButtonX, 150, commandButtonX + width, 159);
+		_guiCommandButton[i].setText(text.c_str());
+		_guiCommandButton[i].setColor(kColorWhite25, kColorDarkGreen, kColorWhite44, kColorGreen);
+		commandButtonX += width + 2;
+	}
+
+	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
+		int inventoryX = 136 * (i % 2);
+		int inventoryY = 161 + 10 * (i / 2);
+
+		_guiInventory[i].setSize(inventoryX, inventoryY, inventoryX + 135, inventoryY + 9);
+		_guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+	}
+	_guiInventoryArrow[0].setSize(272, 161, 279, 180);
+	_guiInventoryArrow[0].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+	_guiInventoryArrow[0].setText("\x82");
+	_guiInventoryArrow[0].setTextPosition(273, 166);
+	_guiInventoryArrow[1].setSize(272, 181, 279, 200);
+	_guiInventoryArrow[1].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
+	_guiInventoryArrow[1].setText("\x83");
+	_guiInventoryArrow[1].setTextPosition(273, 186);
+}
+
+bool GameManager::canSaveGameStateCurrently() {
+	return false;
+}
+
+void GameManager::updateEvents() {
+}
+
+void GameManager::processInput(Common::KeyState &state) {
+	_key = state;
+
+	switch (state.keycode) {
+	case Common::KEYCODE_F1:
+		// help
+		_vm->showHelpScreen();
+		break;
+	case Common::KEYCODE_F2:
+		// show game manual
+		_vm->showTextReader("msn.doc");
+		break;
+	case Common::KEYCODE_F3:
+		// show game info
+		_vm->showTextReader("msn.inf");
+		break;
+	case Common::KEYCODE_F4:
+		_vm->setTextSpeed();
+		break;
+	case Common::KEYCODE_F5:
+		// load/save
+		break;
+	case Common::KEYCODE_x:
+		if (state.flags & Common::KBD_ALT) {
+			if (_vm->quitGameDialog())
+				_vm->quitGame();
+		}
+		break;
+	case Common::KEYCODE_d:
+		if (state.flags & Common::KBD_CTRL)
+			_vm->_console->attach();
+		break;
+	default:
+		break;
+	}
+}
+
+void GameManager::resetInputState() {
+	setObjectNull(_inputObject[0]);
+	setObjectNull(_inputObject[1]);
+	_inputVerb = ACTION_WALK;
+	_processInput = false;
+	_mouseClicked = false;
+	_keyPressed = false;
+	_key.reset();
+	_mouseClickType = Common::EVENT_MOUSEMOVE;
+
+	processInput();
+}
+
+void GameManager::processInput() {
+	enum {
+		onNone,
+		onObject,
+		onCmdButton,
+		onInventory,
+		onInventoryArrowUp,
+		onInventoryArrowDown
+	} mouseLocation;
+
+	if (_mouseField >= 0 && _mouseField < 256)
+		mouseLocation = onObject;
+	else if (_mouseField >= 256 && _mouseField < 512)
+		mouseLocation = onCmdButton;
+	else if (_mouseField >= 512 && _mouseField < 768)
+		mouseLocation = onInventory;
+	else if (_mouseField == 768)
+		mouseLocation = onInventoryArrowUp;
+	else if (_mouseField == 769)
+		mouseLocation = onInventoryArrowDown;
+	else
+		mouseLocation = onNone;
+
+	if (_mouseClickType == Common::EVENT_LBUTTONUP) {
+		if (_vm->_screen->isMessageShown()) {
+			// Hide the message and consume the event
+			_vm->removeMessage();
+			if (mouseLocation != onCmdButton)
+				return;
+		}
+
+		switch(mouseLocation) {
+		case onObject:
+		case onInventory:
+			// Fallthrough
+			if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
+				if (isNullObject(_inputObject[0])) {
+					_inputObject[0] = _currentInputObject;
+					if (!_inputObject[0]->hasProperty(COMBINABLE))
+						_processInput = true;
+				} else {
+					_inputObject[1] = _currentInputObject;
+					_processInput = true;
+				}
+			} else {
+				_inputObject[0] = _currentInputObject;
+				if (!isNullObject(_currentInputObject))
+					_processInput = true;
+			}
+			break;
+		case onCmdButton:
+			resetInputState();
+			_inputVerb = static_cast<Action>(_mouseField - 256);
+			break;
+		case onInventoryArrowUp:
+			if (_inventoryScroll >= 2)
+				_inventoryScroll -= 2;
+			break;
+		case onInventoryArrowDown:
+			if (_inventoryScroll < _inventory.getSize() - ARRAYSIZE(_guiInventory))
+				_inventoryScroll += 2;
+			break;
+		case onNone:
+			break;
+		}
+
+	} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
+		if (_vm->_screen->isMessageShown()) {
+			// Hide the message and consume the event
+			_vm->removeMessage();
+			return;
+		}
+
+		if (isNullObject(_currentInputObject))
+			return;
+
+		if (mouseLocation == onObject || mouseLocation == onInventory) {
+			_inputObject[0] = _currentInputObject;
+			ObjectTypes type = _inputObject[0]->_type;
+			if (type & OPENABLE)
+				_inputVerb = (type & OPENED) ? ACTION_CLOSE : ACTION_OPEN;
+			else if (type & PRESS)
+				_inputVerb = ACTION_PRESS;
+			else if (type & TALK)
+				_inputVerb = ACTION_TALK;
+			else
+				_inputVerb = ACTION_LOOK;
+
+			_processInput = true;
+		}
+
+	} else if (_mouseClickType == Common::EVENT_MOUSEMOVE) {
+		int field = -1;
+		int click = -1;
+
+		if ((_mouseY >= _guiCommandButton[0].top) && (_mouseY <= _guiCommandButton[0].bottom)) {
+			/* command row */
+			field = 9;
+			while (_mouseX < _guiCommandButton[field].left - 1)
+				field--;
+			field += 256;
+		} else if ((_mouseX >= 283) && (_mouseX <= 317) && (_mouseY >= 163) && (_mouseY <= 197)) {
+			/* exit box */
+			field = _exitList[(_mouseX - 283) / 7 + 5 * ((_mouseY - 163) / 7)];
+		} else if ((_mouseY >= 161) && (_mouseX <= 270)) {
+			/* inventory box */
+			field = (_mouseX + 1) / 136 + ((_mouseY - 161) / 10) * 2;
+			if (field + _inventoryScroll < _inventory.getSize())
+				field += 512;
+			else
+				field = -1;
+		} else if ((_mouseY >= 161) && (_mouseX >= 271) && (_mouseX < 279)) {
+			/* inventory arrows */
+			field = (_mouseY > 180) ? 769 : 768;
+		} else {
+			/* normal item */
+			for (int i = 0; (_currentRoom->getObject(i)->_id != INVALIDOBJECT) &&
+							(field == -1) && i < kMaxObject; i++) {
+				click = _currentRoom->getObject(i)->_click;
+				const MSNImage *image = _vm->_screen->getCurrentImage();
+				if (click != 255 && image) {
+					const MSNImage::ClickField *clickField = image->_clickField;
+					do {
+						if ((_mouseX >= clickField[click].x1) && (_mouseX <= clickField[click].x2) &&
+							(_mouseY >= clickField[click].y1) && (_mouseY <= clickField[click].y2))
+							field = i;
+
+						click = clickField[click].next;
+					} while ((click != 0) && (field == -1));
+				}
+			}
+		}
+
+		if (_mouseField != field) {
+			switch (mouseLocation) {
+			case onInventoryArrowUp:
+			case onInventoryArrowDown:
+				// Fallthrough
+				_guiInventoryArrow[_mouseField - 768].setHighlight(false);
+				break;
+			case onInventory:
+				_guiInventory[_mouseField - 512].setHighlight(false);
+				break;
+			case onCmdButton:
+				_guiCommandButton[_mouseField - 256].setHighlight(false);
+				break;
+			case onObject:
+			case onNone:
+				// Fallthrough
+				break;
+			}
+
+			setObjectNull(_currentInputObject);
+
+			_mouseField = field;
+			if (_mouseField >= 0 && _mouseField < 256)
+				mouseLocation = onObject;
+			else if (_mouseField >= 256 && _mouseField < 512)
+				mouseLocation = onCmdButton;
+			else if (_mouseField >= 512 && _mouseField < 768)
+				mouseLocation = onInventory;
+			else if (_mouseField == 768)
+				mouseLocation = onInventoryArrowUp;
+			else if (_mouseField == 769)
+				mouseLocation = onInventoryArrowDown;
+			else
+				mouseLocation = onNone;
+
+			switch (mouseLocation) {
+			case onInventoryArrowUp:
+			case onInventoryArrowDown:
+				// Fallthrough
+				_guiInventoryArrow[_mouseField - 768].setHighlight(true);
+				break;
+			case onInventory:
+				_guiInventory[_mouseField - 512].setHighlight(true);
+				_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
+				break;
+			case onCmdButton:
+				_guiCommandButton[_mouseField - 256].setHighlight(true);
+				break;
+			case onObject:
+				_currentInputObject = _currentRoom->getObject(_mouseField);
+				break;
+			case onNone:
+				break;
+			}
+		}
+	}
+}
+
+void GameManager::setObjectNull(Object *&obj) {
+	obj = &_nullObject;
+}
+
+bool GameManager::isNullObject(Object *obj) {
+	return obj == &_nullObject;
+}
+
+void GameManager::sentence(int number, bool brightness) {
+	if (number < 0)
+		return;
+	_vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, brightness ? kColorWhite44 : kColorWhite25);
+	if (_texts[_rowsStart[number]] == kStringDialogSeparator)
+		_vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, brightness ? kColorRed : kColorDarkRed);
+	else {
+		for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r)
+			_vm->renderText(_texts[r], 1, 142 + r * 10, brightness ? kColorGreen : kColorDarkGreen);
+	}
+}
+
+void GameManager::say(StringId textId) {
+	Common::String str = _vm->getGameString(textId);
+	if (!str.empty())
+		say(str.c_str());
+}
+
+void GameManager::say(const char *text) {
+	Common::String t(text);
+	char *row[6];
+	Common::String::iterator p = t.begin();
+	uint numRows = 0;
+	while (*p) {
+		row[numRows++] = p;
+		while ((*p != '\0') && (*p != '|')) {
+			++p;
+		}
+		if (*p == '|') {
+			*p = 0;
+			++p;
+		}
+	}
+
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+	_vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
+	for (uint r = 0; r < numRows; ++r)
+		_vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
+	waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+}
+
+void GameManager::reply(StringId textId, int aus1, int aus2) {
+	Common::String str = _vm->getGameString(textId);
+	if (!str.empty())
+		reply(str.c_str(), aus1, aus2);
+}
+
+void GameManager::reply(const char *text, int aus1, int aus2) {
+	if (*text != '|')
+		_vm->renderMessage(text, kMessageTop);
+
+	for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
+		if (aus1)
+			_vm->renderImage(aus1);
+		waitOnInput(2);
+		if (_keyPressed || _mouseClicked)
+			z = 1;
+		if (aus2)
+			_vm->renderImage(aus2);
+		waitOnInput(2);
+		if (_keyPressed || _mouseClicked)
+			z = 1;
+	}
+	if (*text != '|')
+		_vm->removeMessage();
+}
+
+int GameManager::dialog(int num, byte rowLength[6], StringId text[6], int number) {
+	_vm->_allowLoadGame = false;
+	_guiEnabled = false;
+
+	bool remove[6];
+	for (int i = 0; i < 6; ++i)
+		remove[i] = _currentRoom->sentenceRemoved(i, number);
+
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+	for (int i = 0; i < 6 ; ++i)
+		_sentenceNumber[i] = -1;
+
+	int r = 0, rq = 0;
+	for (int i = 0; i < num; ++i) {
+		if (!remove[i]) {
+			_rowsStart[i] = r;
+			_rows[i] = rowLength[i];
+			for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
+				_texts[r] = text[rq];
+				_sentenceNumber[r] = i;
+			}
+			sentence(i, false);
+		} else
+			rq += rowLength[i];
+	}
+
+	_currentSentence = -1;
+	do {
+		do {
+			updateEvents();
+			mousePosDialog(_mouseX, _mouseY);
+			g_system->updateScreen();
+			g_system->delayMillis(_vm->_delay);
+		} while (!_mouseClicked && !_vm->shouldQuit());
+	} while (_currentSentence == -1 && !_vm->shouldQuit());
+
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+
+	if (number && _currentSentence != -1 && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator)
+		_currentRoom->removeSentence(_currentSentence, number);
+
+	_guiEnabled = true;
+	_vm->_allowLoadGame = true;
+
+	return _currentSentence;
+}
+
+void GameManager::mousePosDialog(int x, int y) {
+	int a = y < 141 ? -1 : _sentenceNumber[(y - 141) / 10];
+	if (a != _currentSentence) {
+		sentence(_currentSentence, false);
+		_currentSentence = a;
+		sentence(_currentSentence, true);
+	}
+}
+
+void GameManager::takeObject(Object &obj) {
+	if (obj.hasProperty(CARRIED))
+		return;
+
+	if (obj._section != 0)
+		_vm->renderImage(obj._section);
+	obj._click = obj._click2 = 255;
+	_inventory.add(obj);
+}
+
+void GameManager::drawCommandBox() {
+	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
+		_vm->renderBox(_guiCommandButton[i]);
+		int space = (_guiCommandButton[i].width() - Screen::textWidth(_guiCommandButton[i].getText())) / 2;
+		_vm->renderText(_guiCommandButton[i].getText(),
+						_guiCommandButton[i].getTextPos().x + space,
+						_guiCommandButton[i].getTextPos().y,
+						_guiCommandButton[i].getTextColor());
+	}
+}
+
+void GameManager::drawInventory() {
+	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
+		_vm->renderBox(_guiInventory[i]);
+		_vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
+						_guiInventory[i].getTextPos().x,
+						_guiInventory[i].getTextPos().y,
+						_guiInventory[i].getTextColor());
+	}
+
+	_vm->renderBox(_guiInventoryArrow[0]);
+	_vm->renderBox(_guiInventoryArrow[1]);
+	if (_inventory.getSize() > ARRAYSIZE(_guiInventory)) {
+		if (_inventoryScroll != 0)
+			_vm->renderText(_guiInventoryArrow[0]);
+		if (_inventoryScroll + ARRAYSIZE(_guiInventory) < _inventory.getSize())
+			_vm->renderText(_guiInventoryArrow[1]);
+	}
+}
+
+int GameManager::getKeyInput() {
+	while (!_vm->shouldQuit()) {
+		updateEvents();
+		if (_keyPressed) {
+			return _key.ascii;
+		}
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+	return 0;
+}
+
+Common::EventType GameManager::getMouseInput() {
+	while (!_vm->shouldQuit()) {
+		updateEvents();
+		if (_mouseClicked)
+			return _mouseClickType;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+	return Common::EVENT_INVALID;
+}
+
+void GameManager::getInput() {
+	while (!_vm->shouldQuit()) {
+		updateEvents();
+		if (_mouseClicked || _keyPressed)
+			break;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+}
+
+void GameManager::roomBrightness() {
+}
+
+void GameManager::changeRoom(RoomId id) {
+	_currentRoom = _rooms[id];
+	_newRoom = true;
+}
+
+void GameManager::wait(int ticks) {
+	int32 end = _time + ticksToMsec(ticks);
+	do {
+		g_system->delayMillis(_vm->_delay);
+		updateEvents();
+		g_system->updateScreen();
+	} while (_time < end && !_vm->shouldQuit());
+}
+
+void GameManager::waitOnInput(int ticks) {
+	int32 end = _time + ticksToMsec(ticks);
+	do {
+		g_system->delayMillis(_vm->_delay);
+		updateEvents();
+		g_system->updateScreen();
+	} while (_time < end && !_vm->shouldQuit() && !_keyPressed && !_mouseClicked);
+}
+
+bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
+	keycode = Common::KEYCODE_INVALID;
+	int32 end = _time + ticksToMsec(ticks);
+	do {
+		g_system->delayMillis(_vm->_delay);
+		updateEvents();
+		g_system->updateScreen();
+		if (_keyPressed) {
+			keycode = _key.keycode;
+			_key.reset();
+			return true;
+		} else if (_mouseClicked)
+			return true;
+	} while (_time < end  && !_vm->shouldQuit());
+	return false;
+}
+
+void GameManager::setAnimationTimer(int ticks) {
+	_animationTimer = ticksToMsec(ticks);
+}
+
+void GameManager::handleTime() {
+}
+
+void GameManager::pauseTimer(bool pause) {
+	if (pause == _timerPaused)
+		return;
+
+	if (pause) {
+		_timerPaused = true;
+		int32 delta = g_system->getMillis() - _oldTime;
+		_timePaused = _time + delta;
+	} else {
+		_time = _timePaused;
+		_oldTime = g_system->getMillis();
+		_timerPaused = false;
+	}
+}
+
+void GameManager::loadTime() {
+}
+
+void GameManager::saveTime() {
+}
+
+void GameManager::screenShake() {
+	for (int i = 0; i < 12; ++i) {
+		_vm->_system->setShakePos(8);
+		wait(1);
+		_vm->_system->setShakePos(0);
+		wait(1);
+	}
+}
+
+void GameManager::showMenu() {
+	_vm->renderBox(0, 138, 320, 62, 0);
+	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
+	drawCommandBox();
+	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+	drawInventory();
+}
+
+void GameManager::drawMapExits() {
+}
+
+void GameManager::animationOff() {
+	_animationEnabled = false;
+}
+
+void GameManager::animationOn() {
+	_animationEnabled = true;
+}
+
+void GameManager::edit(Common::String &input, int x, int y, uint length) {
+	bool isEditing = true;
+	uint cursorIndex = input.size();
+	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
+	int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
+						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
+
+	_guiEnabled = false;
+	while (isEditing) {
+		_vm->_screen->setTextCursorPos(x, y);
+		_vm->_screen->setTextCursorColor(kColorWhite99);
+		Color background = kColorBlack;
+		if (_vm->_MSPart == 1)
+			background = kColorDarkBlue;
+		else if (_vm->_MSPart == 2)
+			background = kColorWhite35;
+		_vm->renderBox(x, y - 1, overdrawWidth, 9, background);
+		for (uint i = 0; i < input.size(); ++i) {
+			// Draw char highlight depending on cursor position
+			if (i == cursorIndex) {
+				_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1,
+							   Screen::textWidth(input[i]), 9, kColorWhite99);
+				_vm->_screen->setTextCursorColor(background);
+				_vm->renderText(input[i]);
+				_vm->_screen->setTextCursorColor(kColorWhite99);
+			} else
+				_vm->renderText(input[i]);
+		}
+
+		if (cursorIndex == input.size()) {
+			_vm->renderBox(_vm->_screen->getTextCursorPos().x + 1, y - 1, 6, 9, background);
+			_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1, 1, 9, kColorWhite99);
+		}
+
+		getKeyInput();
+		if (_vm->shouldQuit())
+			break;
+		switch (_key.keycode) {
+		case Common::KEYCODE_RETURN:
+		case Common::KEYCODE_ESCAPE:
+			isEditing = false;
+			break;
+		case Common::KEYCODE_UP:
+		case Common::KEYCODE_DOWN:
+			cursorIndex = input.size();
+			break;
+		case Common::KEYCODE_LEFT:
+			if (cursorIndex != 0)
+				--cursorIndex;
+			break;
+		case Common::KEYCODE_RIGHT:
+			if (cursorIndex != input.size())
+				++cursorIndex;
+			break;
+		case Common::KEYCODE_DELETE:
+			if (cursorIndex != input.size())
+				input.deleteChar(cursorIndex);
+			break;
+		case Common::KEYCODE_BACKSPACE:
+			if (cursorIndex != 0) {
+				--cursorIndex;
+				input.deleteChar(cursorIndex);
+			}
+			break;
+		default:
+			if (Common::isPrint(_key.ascii) && input.size() < length) {
+				input.insertChar(_key.ascii, cursorIndex);
+				++cursorIndex;
+			}
+			break;
+		}
+	}
+}
+
+void GameManager::takeMoney(int amount) {
+}
+
+void GameManager::drawStatus() {
+	int index = static_cast<int>(_inputVerb);
+	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
+	_vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
+
+	if (isNullObject(_inputObject[0]))
+		_vm->renderText(_currentInputObject->_name);
+	else {
+		_vm->renderText(_inputObject[0]->_name);
+		if (_inputVerb == ACTION_GIVE)
+			_vm->renderText(kPhrasalVerbParticleGiveTo);
+		else if (_inputVerb == ACTION_USE)
+			_vm->renderText(kPhrasalVerbParticleUseWith);
+
+		_vm->renderText(_currentInputObject->_name);
+	}
+}
+
+void GameManager::dead(StringId messageId) {
+	_vm->paletteFadeOut();
+	_guiEnabled = false;
+	if (_vm->_MSPart == 1)
+		_vm->setCurrentImage(11);
+	else if (_vm->_MSPart == 2)
+		_vm->setCurrentImage(43);
+	_vm->renderImage(0);
+	_vm->renderMessage(messageId);
+	_sound->play(kAudioDeath);
+	_vm->paletteFadeIn();
+	getInput();
+	_vm->paletteFadeOut();
+	_vm->removeMessage();
+
+	destroyRooms();
+	initRooms();
+	initState();
+	if (_vm->_MSPart == 1)
+		changeRoom(CABIN_R3);
+	else if (_vm->_MSPart == 2)
+		changeRoom(CABIN_R3);
+	initGui();
+	_inventory.clear();
+	g_system->fillScreen(kColorBlack);
+	_vm->paletteFadeIn();
+
+	_guiEnabled = true;
+}
+
+int GameManager::invertSection(int section) {
+	if (section < 128)
+		section += 128;
+	else
+		section -= 128;
+
+	return section;
+}
+
+bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+void GameManager::handleInput() {
+}
+
+void GameManager::executeRoom() {
+}
+
+void GameManager::drawGUI() {
+	drawMapExits();
+	drawInventory();
+	drawStatus();
+	drawCommandBox();
+}
+
+}
diff --git a/engines/supernova/game-manager.h b/engines/supernova/game-manager.h
new file mode 100644
index 0000000..585d9d2
--- /dev/null
+++ b/engines/supernova/game-manager.h
@@ -0,0 +1,208 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA_GAME_MANAGER_H
+#define SUPERNOVA_GAME_MANAGER_H
+
+#include "common/events.h"
+#include "common/rect.h"
+#include "common/keyboard.h"
+#include "common/error.h"
+#include "supernova/rooms.h"
+#include "supernova/sound.h"
+
+namespace Supernova {
+
+const int32 kMaxTimerValue = 0x7FFFFFFF;
+
+enum EventFunction { kNoFn, kSupernovaFn, kGuardReturnedFn, kGuardWalkFn, kTaxiFn, kSearchStartFn, kSoberFn, kPyramidEndFn, kCaughtFn};
+
+
+class Inventory {
+public:
+	Inventory(Object *nullObject, int &inventoryScroll)
+		: _numObjects(0)
+		, _nullObject(nullObject)
+	    , _inventoryScroll(inventoryScroll) {
+		for (int i = 0; i < kMaxCarry; ++i)
+			_inventory[i] = nullptr;
+	}
+
+	void add(Object &obj);
+	void remove(Object &obj);
+	void clear();
+	Object *get(int index) const;
+	Object *get(ObjectId id) const;
+	int getSize() const { return _numObjects; }
+
+private:
+	Object *_inventory[kMaxCarry];
+	Object *_nullObject;
+	int &_inventoryScroll;
+	int _numObjects;
+};
+
+class GuiElement : public Common::Rect {
+public:
+	GuiElement();
+
+	void setSize(int x1, int y1, int x2, int y2);
+	void setText(const char *text);
+	void setTextPosition(int x, int y);
+	void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
+	void setHighlight(bool isHighlighted);
+
+	const char *getText() const {
+		return _text;
+	}
+	int getBackgroundColor() const {
+		return _bgColor;
+	}
+	int getTextColor() const {
+		return _textColor;
+	}
+	const Common::Point &getTextPos() const {
+		return _textPosition;
+	}
+	bool isHighlighted() const {
+		return _isHighlighted;
+	}
+
+private:
+	Common::Point _textPosition;
+	char _text[128];
+	int _bgColor;
+	int _textColor;
+	int _bgColorNormal;
+	int _bgColorHighlighted;
+	int _textColorNormal;
+	int _textColorHighlighted;
+	bool _isHighlighted;
+};
+
+class GameManager {
+public:
+	GameManager(SupernovaEngine *vm, Sound *sound);
+	virtual ~GameManager();
+
+	virtual void updateEvents();
+	void processInput(Common::KeyState &state);
+	void processInput();
+	virtual void executeRoom();
+	virtual bool serialize(Common::WriteStream *out);
+	virtual bool deserialize(Common::ReadStream *in, int version);
+
+	static StringId guiCommands[];
+	static StringId guiStatusCommands[];
+	SupernovaEngine *_vm;
+	Sound *_sound;
+	Common::KeyState _key;
+	Common::EventType _mouseClickType;
+	bool _mouseClicked;
+	bool _keyPressed;
+	int _mouseX;
+	int _mouseY;
+	int _mouseField;
+	Room *_currentRoom;
+	Room *_lastRoom;
+	bool _newRoom;
+	Room *_rooms[NUMROOMS];
+	Inventory _inventory;
+	bool _processInput;
+	bool _guiEnabled;
+	bool _animationEnabled;
+	byte _roomBrightness;
+	Action _inputVerb;
+	Object _nullObject;
+	Object *_currentInputObject;
+	Object *_inputObject[2];
+	int32 _oldTime;
+	uint _timePaused;
+	bool _timerPaused;
+	int32 _messageDuration;
+	int32 _animationTimer;
+	int _inventoryScroll;
+	int _exitList[25];
+	GuiElement _guiCommandButton[10];
+	GuiElement _guiInventory[8];
+	GuiElement _guiInventoryArrow[2];
+	// Dialog
+	int _currentSentence;
+	int _sentenceNumber[6];
+	StringId _texts[6];
+	byte _rows[6];
+	byte _rowsStart[6];
+	int32 _time;
+
+	void takeObject(Object &obj);
+	void setObjectNull(Object *&obj);
+	bool isNullObject(Object *obj);
+
+	virtual void initState();
+	virtual void initRooms();
+	virtual void destroyRooms();
+	void initGui();
+	virtual bool canSaveGameStateCurrently();
+	virtual bool genericInteract(Action verb, Object &obj1, Object &obj2);
+	Common::EventType getMouseInput();
+	int getKeyInput();
+	void getInput();
+	void wait(int ticks);
+	void waitOnInput(int ticks);
+	bool waitOnInput(int ticks, Common::KeyCode &keycode);
+	void screenShake();
+	virtual void roomBrightness();
+	void showMenu();
+	void animationOff();
+	void animationOn();
+	void edit(Common::String &input, int x, int y, uint length);
+	int invertSection(int section);
+	virtual void drawMapExits();
+	void drawStatus();
+	void drawCommandBox();
+	void drawInventory();
+	void drawGUI();
+	void changeRoom(RoomId id);
+	void resetInputState();
+	virtual void handleInput();
+	virtual void handleTime();
+	void pauseTimer(bool pause);
+	virtual void loadTime();
+	virtual void saveTime();
+	void setAnimationTimer(int ticks);
+	void dead(StringId messageId);
+	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
+	void sentence(int number, bool brightness);
+	void say(StringId textId);
+	void say(const char *text);
+	void reply(StringId textId, int aus1, int aus2);
+	void reply(const char *text, int aus1, int aus2);
+	void mousePosDialog(int x, int y);
+	virtual void takeMoney(int amount);
+
+private:
+	int _prevImgId;
+};
+
+}
+
+#endif // SUPERNOVA_GAME_MANAGER_H
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index c9bc1ca..a075018 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -1,14 +1,15 @@
 MODULE := engines/supernova
 
 MODULE_OBJS := \
+	console.o \
 	detection.o \
-	state.o \
 	graphics.o \
 	resman.o \
 	rooms.o \
 	screen.o \
-	console.o \
 	sound.o \
+	game-manager.o \
+	state.o \
 	supernova.o
 
 MODULE_DIRS += \
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index 10cb988..e6e7dd7 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -180,7 +180,7 @@ bool Room::interact(Action verb, Object &obj1, Object &obj2) {
 }
 
 
-Intro::Intro(SupernovaEngine *vm, GameManager *gm) {
+Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -606,7 +606,7 @@ void Intro::leaveCutscene() {
 	_vm->_allowLoadGame = true;
 }
 
-ShipCorridor::ShipCorridor(SupernovaEngine *vm, GameManager *gm) {
+ShipCorridor::ShipCorridor(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -655,7 +655,7 @@ bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
 	return false;
 }
 
-ShipHall::ShipHall(SupernovaEngine *vm, GameManager *gm) {
+ShipHall::ShipHall(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -702,7 +702,7 @@ bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ShipSleepCabin::ShipSleepCabin(SupernovaEngine *vm, GameManager *gm) {
+ShipSleepCabin::ShipSleepCabin(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -844,8 +844,8 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
 			}
 			_gm->_state._arrivalDaysLeft -= _gm->_state._timeSleep;
 			*energyDaysLeft -= _gm->_state._timeSleep;
-			_gm->_state._time = ticksToMsec(786520); // 12pm
-			_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
+			_gm->_time = ticksToMsec(786520); // 12pm
+			_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
 			if (*energyDaysLeft == 0) {
 				_gm->turnOff();
 				room = _gm->_rooms[GENERATOR];
@@ -915,7 +915,7 @@ void ShipSleepCabin::onEntrance() {
 	}
 }
 
-ShipCockpit::ShipCockpit(SupernovaEngine *vm, GameManager *gm) {
+ShipCockpit::ShipCockpit(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1000,7 +1000,7 @@ void ShipCockpit::onEntrance() {
 	setRoomSeen(true);
 }
 
-ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager *gm) {
+ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1027,7 +1027,7 @@ ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager *gm) {
 	_objectState[11] = Object(_id, kStringToilet, kStringDefaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
 }
 
-ShipCabinL2::ShipCabinL2(SupernovaEngine *vm, GameManager *gm) {
+ShipCabinL2::ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1105,7 +1105,7 @@ bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ShipCabinL3::ShipCabinL3(SupernovaEngine *vm, GameManager *gm) {
+ShipCabinL3::ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1218,7 +1218,7 @@ bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager *gm) {
+ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1239,7 +1239,7 @@ ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager *gm) {
 	_objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
 }
 
-ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager *gm) {
+ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1261,7 +1261,7 @@ ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager *gm) {
 	_objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
 }
 
-ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager *gm) {
+ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1349,7 +1349,7 @@ void ShipCabinR3::onEntrance() {
 	setRoomSeen(true);
 }
 
-ShipCabinBathroom::ShipCabinBathroom(SupernovaEngine *vm, GameManager *gm) {
+ShipCabinBathroom::ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1362,7 +1362,7 @@ ShipCabinBathroom::ShipCabinBathroom(SupernovaEngine *vm, GameManager *gm) {
 	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
 }
 
-ShipAirlock::ShipAirlock(SupernovaEngine *vm, GameManager *gm) {
+ShipAirlock::ShipAirlock(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1488,7 +1488,7 @@ void ShipAirlock::onEntrance() {
 	setRoomSeen(true);
 }
 
-ShipHold::ShipHold(SupernovaEngine *vm, GameManager *gm) {
+ShipHold::ShipHold(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1566,7 +1566,7 @@ void ShipHold::onEntrance() {
 	_gm->_rooms[COCKPIT]->setRoomSeen(true);
 }
 
-ShipLandingModule::ShipLandingModule(SupernovaEngine *vm, GameManager *gm) {
+ShipLandingModule::ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1680,7 +1680,7 @@ bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ShipGenerator::ShipGenerator(SupernovaEngine *vm, GameManager *gm) {
+ShipGenerator::ShipGenerator(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1847,7 +1847,7 @@ bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ShipOuterSpace::ShipOuterSpace(SupernovaEngine *vm, GameManager *gm) {
+ShipOuterSpace::ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1861,7 +1861,7 @@ ShipOuterSpace::ShipOuterSpace(SupernovaEngine *vm, GameManager *gm) {
 
 
 // Arsano
-ArsanoRocks::ArsanoRocks(SupernovaEngine *vm, GameManager *gm) {
+ArsanoRocks::ArsanoRocks(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1896,7 +1896,7 @@ bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
 	return false;
 }
 
-ArsanoCave::ArsanoCave(SupernovaEngine *vm, GameManager *gm) {
+ArsanoCave::ArsanoCave(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1907,7 +1907,7 @@ ArsanoCave::ArsanoCave(SupernovaEngine *vm, GameManager *gm) {
 	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
 }
 
-ArsanoMeetup::ArsanoMeetup(SupernovaEngine *vm, GameManager *gm) {
+ArsanoMeetup::ArsanoMeetup(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -1998,7 +1998,7 @@ bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ArsanoEntrance::ArsanoEntrance(SupernovaEngine *vm, GameManager *gm) {
+ArsanoEntrance::ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -2269,7 +2269,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ArsanoRemaining::ArsanoRemaining(SupernovaEngine *vm, GameManager *gm) {
+ArsanoRemaining::ArsanoRemaining(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -2445,7 +2445,7 @@ void ArsanoRemaining::animation() {
 	_gm->setAnimationTimer(3);
 }
 
-ArsanoRoger::ArsanoRoger(SupernovaEngine *vm, GameManager *gm) {
+ArsanoRoger::ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -2575,9 +2575,9 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->removeMessage();
 		_vm->_screen->setGuiBrightness(0);
 		_vm->paletteBrightness();
-		_gm->_state._time += ticksToMsec(125000); // 2 hours
-		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
-		_gm->_state._eventTime = _gm->_state._time + ticksToMsec(4000);
+		_gm->_time += ticksToMsec(125000); // 2 hours
+		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
+		_gm->_state._eventTime = _gm->_time + ticksToMsec(4000);
 		_gm->_state._eventCallback = kSupernovaFn;
 		setSectionVisible(11, false);
 		setSectionVisible(1, false);
@@ -2596,7 +2596,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ArsanoGlider::ArsanoGlider(SupernovaEngine *vm, GameManager *gm) {
+ArsanoGlider::ArsanoGlider(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -2695,7 +2695,7 @@ bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-ArsanoMeetup2::ArsanoMeetup2(SupernovaEngine *vm, GameManager *gm) {
+ArsanoMeetup2::ArsanoMeetup2(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -2851,7 +2851,7 @@ void ArsanoMeetup2::shipStart() {
 	_vm->renderImage(11 + 128);
 }
 
-ArsanoMeetup3::ArsanoMeetup3(SupernovaEngine *vm, GameManager *gm) {
+ArsanoMeetup3::ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -2993,7 +2993,7 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
 }
 
 // Axacuss
-AxacussCell::AxacussCell(SupernovaEngine *vm, GameManager *gm) {
+AxacussCell::AxacussCell(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3018,8 +3018,8 @@ AxacussCell::AxacussCell(SupernovaEngine *vm, GameManager *gm) {
 void AxacussCell::onEntrance() {
 	if (_gm->_state._dream) {
 		_vm->renderMessage(kStringAxacussCell_1);
-		_gm->_state._time = ticksToMsec(500000);
-		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
+		_gm->_time = ticksToMsec(500000);
+		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
 		_gm->_state._powerOff = false;
 		_gm->_state._dream = false;
 	}
@@ -3188,7 +3188,7 @@ bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussCorridor1::AxacussCorridor1(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor1::AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3212,7 +3212,7 @@ void AxacussCorridor1::onEntrance() {
 }
 
 
-AxacussCorridor2::AxacussCorridor2(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor2::AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3236,7 +3236,7 @@ void AxacussCorridor2::onEntrance() {
 	_gm->corridorOnEntrance();
 }
 
-AxacussCorridor3::AxacussCorridor3(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor3::AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3262,7 +3262,7 @@ void AxacussCorridor4::onEntrance() {
 		_gm->busted(0);
 }
 
-AxacussCorridor4::AxacussCorridor4(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor4::AxacussCorridor4(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3317,7 +3317,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussCorridor5::AxacussCorridor5(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor5::AxacussCorridor5(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3434,7 +3434,7 @@ bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
 	return false;
 }
 
-AxacussCorridor6::AxacussCorridor6(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor6::AxacussCorridor6(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3474,7 +3474,7 @@ bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussCorridor7::AxacussCorridor7(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor7::AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3497,7 +3497,7 @@ void AxacussCorridor7::onEntrance() {
 	_gm->corridorOnEntrance();
 }
 
-AxacussCorridor8::AxacussCorridor8(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor8::AxacussCorridor8(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3543,7 +3543,7 @@ bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussCorridor9::AxacussCorridor9(SupernovaEngine *vm, GameManager *gm) {
+AxacussCorridor9::AxacussCorridor9(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3588,7 +3588,7 @@ bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussBcorridor::AxacussBcorridor(SupernovaEngine *vm, GameManager *gm) {
+AxacussBcorridor::AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3690,7 +3690,7 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussIntersection::AxacussIntersection(SupernovaEngine *vm, GameManager *gm) {
+AxacussIntersection::AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3740,7 +3740,7 @@ bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussExit::AxacussExit(SupernovaEngine *vm, GameManager *gm) {
+AxacussExit::AxacussExit(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3791,7 +3791,7 @@ bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussOffice1::AxacussOffice1(SupernovaEngine *vm, GameManager *gm) {
+AxacussOffice1::AxacussOffice1(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3895,7 +3895,7 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussOffice2::AxacussOffice2(SupernovaEngine *vm, GameManager *gm) {
+AxacussOffice2::AxacussOffice2(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3940,7 +3940,7 @@ bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussOffice3::AxacussOffice3(SupernovaEngine *vm, GameManager *gm) {
+AxacussOffice3::AxacussOffice3(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -3989,7 +3989,7 @@ bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussOffice4::AxacussOffice4(SupernovaEngine *vm, GameManager *gm) {
+AxacussOffice4::AxacussOffice4(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -4031,7 +4031,7 @@ bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussOffice5::AxacussOffice5(SupernovaEngine *vm, GameManager *gm) {
+AxacussOffice5::AxacussOffice5(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -4066,7 +4066,7 @@ bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussElevator::AxacussElevator(SupernovaEngine *vm, GameManager *gm) {
+AxacussElevator::AxacussElevator(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -4132,8 +4132,8 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->removeMessage();
 		_vm->_screen->setGuiBrightness(0);
 		_vm->paletteBrightness();
-		_gm->_state._time += ticksToMsec(125000); // 2 hours
-		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_state._time);
+		_gm->_time += ticksToMsec(125000); // 2 hours
+		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
 		return false;
 	} else
 		return false;
@@ -4141,7 +4141,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussStation::AxacussStation(SupernovaEngine *vm, GameManager *gm) {
+AxacussStation::AxacussStation(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -4167,7 +4167,7 @@ bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-AxacussSign::AxacussSign(SupernovaEngine *vm, GameManager *gm) {
+AxacussSign::AxacussSign(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
@@ -4186,7 +4186,7 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->takeMoney(-180);
 		_vm->renderImage(2);
 		setSectionVisible(1, false);
-		_gm->_state._eventTime = _gm->_state._time + ticksToMsec(600);
+		_gm->_state._eventTime = _gm->_time + ticksToMsec(600);
 		_gm->_state._eventCallback = kTaxiFn;
 		return true;
 	}
@@ -4194,7 +4194,7 @@ bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
 }
 
 
-Outro::Outro(SupernovaEngine *vm, GameManager *gm) {
+Outro::Outro(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
 
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 801bfc4..95e2078 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -34,7 +34,7 @@ class WriteStream;
 
 namespace Supernova {
 
-class GameManager;
+class GameManager1;
 class SupernovaEngine;
 
 class Room {
@@ -68,7 +68,7 @@ protected:
 	Object _objectState[kMaxObject];
 	RoomId _id;
 	SupernovaEngine *_vm;
-	GameManager *_gm;
+	GameManager1 *_gm;
 
 private:
 	bool _seen;
@@ -77,7 +77,7 @@ private:
 // Room 0
 class Intro : public Room {
 public:
-	Intro(SupernovaEngine *vm, GameManager *gm);
+	Intro(SupernovaEngine *vm, GameManager1 *gm);
 	virtual void onEntrance();
 
 private:
@@ -99,21 +99,21 @@ private:
 // Spaceship
 class ShipCorridor : public Room {
 public:
-	ShipCorridor(SupernovaEngine *vm, GameManager *gm);
+	ShipCorridor(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class ShipHall: public Room {
 public:
-	ShipHall(SupernovaEngine *vm, GameManager *gm);
+	ShipHall(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class ShipSleepCabin: public Room {
 public:
-	ShipSleepCabin(SupernovaEngine *vm, GameManager *gm);
+	ShipSleepCabin(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void animation();
@@ -125,7 +125,7 @@ private:
 
 class ShipCockpit : public Room {
 public:
-	ShipCockpit(SupernovaEngine *vm, GameManager *gm);
+	ShipCockpit(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void animation();
@@ -137,36 +137,36 @@ private:
 
 class ShipCabinL1: public Room {
 public:
-	ShipCabinL1(SupernovaEngine *vm, GameManager *gm);
+	ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm);
 };
 
 class ShipCabinL2 : public Room {
 public:
-	ShipCabinL2(SupernovaEngine *vm, GameManager *gm);
+	ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class ShipCabinL3 : public Room {
 public:
-	ShipCabinL3(SupernovaEngine *vm, GameManager *gm);
+	ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class ShipCabinR1 : public Room {
 public:
-	ShipCabinR1(SupernovaEngine *vm, GameManager *gm);
+	ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm);
 };
 
 class ShipCabinR2 : public Room {
 public:
-	ShipCabinR2(SupernovaEngine *vm, GameManager *gm);
+	ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm);
 };
 
 class ShipCabinR3 : public Room {
 public:
-	ShipCabinR3(SupernovaEngine *vm, GameManager *gm);
+	ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void onEntrance();
@@ -174,12 +174,12 @@ public:
 
 class ShipCabinBathroom : public Room  {
 public:
-	ShipCabinBathroom(SupernovaEngine *vm, GameManager *gm);
+	ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm);
 };
 
 class ShipAirlock : public Room {
 public:
-	ShipAirlock(SupernovaEngine *vm, GameManager *gm);
+	ShipAirlock(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void onEntrance();
@@ -187,7 +187,7 @@ public:
 
 class ShipHold : public Room {
 public:
-	ShipHold(SupernovaEngine *vm, GameManager *gm);
+	ShipHold(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void onEntrance();
@@ -195,28 +195,28 @@ public:
 
 class ShipLandingModule : public Room {
 public:
-	ShipLandingModule(SupernovaEngine *vm, GameManager *gm);
+	ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class ShipGenerator : public Room {
 public:
-	ShipGenerator(SupernovaEngine *vm, GameManager *gm);
+	ShipGenerator(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class ShipOuterSpace : public Room {
 public:
-	ShipOuterSpace(SupernovaEngine *vm, GameManager *gm);
+	ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm);
 };
 
 
 // Arsano
 class ArsanoRocks : public Room {
 public:
-	ArsanoRocks(SupernovaEngine *vm, GameManager *gm);
+	ArsanoRocks(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -224,12 +224,12 @@ public:
 
 class ArsanoCave : public Room {
 public:
-	ArsanoCave(SupernovaEngine *vm, GameManager *gm);
+	ArsanoCave(SupernovaEngine *vm, GameManager1 *gm);
 };
 
 class ArsanoMeetup : public Room {
 public:
-	ArsanoMeetup(SupernovaEngine *vm, GameManager *gm);
+	ArsanoMeetup(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual void animation();
@@ -242,7 +242,7 @@ private:
 
 class ArsanoEntrance : public Room {
 public:
-	ArsanoEntrance(SupernovaEngine *vm, GameManager *gm);
+	ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void animation();
@@ -256,7 +256,7 @@ private:
 
 class ArsanoRemaining : public Room {
 public:
-	ArsanoRemaining(SupernovaEngine *vm, GameManager *gm);
+	ArsanoRemaining(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void animation();
 
@@ -267,7 +267,7 @@ private:
 
 class ArsanoRoger : public Room {
 public:
-	ArsanoRoger(SupernovaEngine *vm, GameManager *gm);
+	ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void animation();
 	virtual void onEntrance();
@@ -281,7 +281,7 @@ private:
 
 class ArsanoGlider : public Room {
 public:
-	ArsanoGlider(SupernovaEngine *vm, GameManager *gm);
+	ArsanoGlider(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -292,7 +292,7 @@ private:
 
 class ArsanoMeetup2 : public Room {
 public:
-	ArsanoMeetup2(SupernovaEngine *vm, GameManager *gm);
+	ArsanoMeetup2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -313,7 +313,7 @@ private:
 
 class ArsanoMeetup3 : public Room {
 public:
-	ArsanoMeetup3(SupernovaEngine *vm, GameManager *gm);
+	ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
@@ -329,7 +329,7 @@ private:
 // Axacuss
 class AxacussCell : public Room {
 public:
-	AxacussCell(SupernovaEngine *vm, GameManager *gm);
+	AxacussCell(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void animation();
@@ -338,28 +338,28 @@ public:
 
 class AxacussCorridor1 : public Room {
 public:
-	AxacussCorridor1(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 };
 
 class AxacussCorridor2 : public Room {
 public:
-	AxacussCorridor2(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 };
 
 class AxacussCorridor3 : public Room {
 public:
-	AxacussCorridor3(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 };
 
 class AxacussCorridor4 : public Room {
 public:
-	AxacussCorridor4(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor4(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual void animation();
@@ -368,7 +368,7 @@ public:
 
 class AxacussCorridor5 : public Room {
 public:
-	AxacussCorridor5(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor5(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -387,7 +387,7 @@ private:
 
 class AxacussCorridor6 : public Room {
 public:
-	AxacussCorridor6(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor6(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -395,14 +395,14 @@ public:
 
 class AxacussCorridor7 : public Room {
 public:
-	AxacussCorridor7(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 };
 
 class AxacussCorridor8 : public Room {
 public:
-	AxacussCorridor8(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor8(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -410,7 +410,7 @@ public:
 
 class AxacussCorridor9 : public Room {
 public:
-	AxacussCorridor9(SupernovaEngine *vm, GameManager *gm);
+	AxacussCorridor9(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -418,7 +418,7 @@ public:
 
 class AxacussBcorridor : public Room {
 public:
-	AxacussBcorridor(SupernovaEngine *vm, GameManager *gm);
+	AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -426,7 +426,7 @@ public:
 
 class AxacussIntersection : public Room {
 public:
-	AxacussIntersection(SupernovaEngine *vm, GameManager *gm);
+	AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
@@ -436,7 +436,7 @@ private:
 
 class AxacussExit : public Room {
 public:
-	AxacussExit(SupernovaEngine *vm, GameManager *gm);
+	AxacussExit(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
@@ -446,35 +446,35 @@ private:
 
 class AxacussOffice1 : public Room {
 public:
-	AxacussOffice1(SupernovaEngine *vm, GameManager *gm);
+	AxacussOffice1(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class AxacussOffice2 : public Room {
 public:
-	AxacussOffice2(SupernovaEngine *vm, GameManager *gm);
+	AxacussOffice2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class AxacussOffice3 : public Room {
 public:
-	AxacussOffice3(SupernovaEngine *vm, GameManager *gm);
+	AxacussOffice3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class AxacussOffice4 : public Room {
 public:
-	AxacussOffice4(SupernovaEngine *vm, GameManager *gm);
+	AxacussOffice4(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class AxacussOffice5 : public Room {
 public:
-	AxacussOffice5(SupernovaEngine *vm, GameManager *gm);
+	AxacussOffice5(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
@@ -482,28 +482,28 @@ public:
 
 class AxacussElevator : public Room {
 public:
-	AxacussElevator(SupernovaEngine *vm, GameManager *gm);
+	AxacussElevator(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class AxacussStation : public Room {
 public:
-	AxacussStation(SupernovaEngine *vm, GameManager *gm);
+	AxacussStation(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class AxacussSign : public Room {
 public:
-	AxacussSign(SupernovaEngine *vm, GameManager *gm);
+	AxacussSign(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 };
 
 class Outro : public Room {
 public:
-	Outro(SupernovaEngine *vm, GameManager *gm);
+	Outro(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 	virtual void animation();
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
index a0c06a9..3e0ba61 100644
--- a/engines/supernova/state.cpp
+++ b/engines/supernova/state.cpp
@@ -31,12 +31,12 @@
 
 namespace Supernova {
 
-bool GameManager::serialize(Common::WriteStream *out) {
+bool GameManager1::serialize(Common::WriteStream *out) {
 	if (out->err())
 		return false;
 
 	// GameState
-	out->writeSint32LE(_state._time);
+	out->writeSint32LE(_time);
 	out->writeSint32LE(_state._timeSleep);
 	out->writeSint32LE(_state._timeAlarm);
 	out->writeSint32LE(_state._eventTime);
@@ -82,13 +82,12 @@ bool GameManager::serialize(Common::WriteStream *out) {
 	return !out->err();
 }
 
-
-bool GameManager::deserialize(Common::ReadStream *in, int version) {
+bool GameManager1::deserialize(Common::ReadStream *in, int version) {
 	if (in->err())
 		return false;
 
 	// GameState
-	_state._time = in->readSint32LE();
+	_time = in->readSint32LE();
 	_state._timeSleep = in->readSint32LE();
 	_state._timeAlarm = in->readSint32LE();
 	_state._eventTime = in->readSint32LE();
@@ -157,106 +156,6 @@ bool GameManager::deserialize(Common::ReadStream *in, int version) {
 	return !in->err();
 }
 
-void Inventory::add(Object &obj) {
-	if (_numObjects < kMaxCarry) {
-		_inventory[_numObjects++] = &obj;
-		obj.setProperty(CARRIED);
-	}
-
-	if (getSize() > _inventoryScroll + 8) {
-		_inventoryScroll = getSize() - 8;
-		_inventoryScroll += _inventoryScroll % 2;
-	}
-}
-
-void Inventory::remove(Object &obj) {
-	for (int i = 0; i < _numObjects; ++i) {
-		if (_inventory[i] == &obj) {
-			if (_inventoryScroll >= 2 && getSize() % 2)
-				_inventoryScroll -= 2;
-
-			--_numObjects;
-			while (i < _numObjects) {
-				_inventory[i] = _inventory[i + 1];
-				++i;
-			}
-			obj.disableProperty(CARRIED);
-		}
-	}
-}
-
-void Inventory::clear() {
-	for (int i = 0; i < _numObjects; ++i)
-		_inventory[i]->disableProperty(CARRIED);
-	_numObjects = 0;
-	_inventoryScroll = 0;
-}
-
-Object *Inventory::get(int index) const {
-	if (index < _numObjects)
-		return _inventory[index];
-
-	return _nullObject;
-}
-
-Object *Inventory::get(ObjectId id) const {
-	for (int i = 0; i < _numObjects; ++i) {
-		if (_inventory[i]->_id == id)
-			return _inventory[i];
-	}
-
-	return _nullObject;
-}
-
-
-GuiElement::GuiElement()
-	: _isHighlighted(false)
-	, _bgColorNormal(kColorWhite25)
-	, _bgColorHighlighted(kColorWhite44)
-	, _bgColor(kColorWhite25)
-	, _textColorNormal(kColorGreen)
-	, _textColorHighlighted(kColorLightGreen)
-	, _textColor(kColorGreen)
-{
-	memset(_text, 0, sizeof(_text));
-}
-
-void GuiElement::setText(const char *text) {
-	strncpy(_text, text, sizeof(_text) - 1);
-}
-
-void GuiElement::setTextPosition(int x, int y) {
-	_textPosition = Common::Point(x, y);
-}
-
-void GuiElement::setSize(int x1, int y1, int x2, int y2) {
-	this->left = x1;
-	this->top = y1;
-	this->right = x2;
-	this->bottom = y2;
-
-	_textPosition = Common::Point(x1 + 1, y1 + 1);
-}
-
-void GuiElement::setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted) {
-	_bgColor = bgColor;
-	_textColor = textColor;
-	_bgColorNormal = bgColor;
-	_textColorNormal = textColor;
-	_bgColorHighlighted = bgColorHighlighted;
-	_textColorHighlighted = textColorHightlighted;
-}
-
-void GuiElement::setHighlight(bool isHighlighted_) {
-	if (isHighlighted_) {
-		_bgColor = _bgColorHighlighted;
-		_textColor = _textColorHighlighted;
-	} else {
-		_bgColor = _bgColorNormal;
-		_textColor = _textColorNormal;
-	}
-}
-
 // Used by Look Watch (when it's fixed). Do not remove.
 static Common::String timeToString(int msec) {
 	char s[9] = " 0:00:00";
@@ -277,32 +176,18 @@ static Common::String timeToString(int msec) {
 	return Common::String(s);
 }
 
-StringId GameManager::guiCommands[] = {
-	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
-	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
-};
-
-StringId GameManager::guiStatusCommands[] = {
-	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
-	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
-};
-
-GameManager::GameManager(SupernovaEngine *vm, Sound *sound)
-	: _inventory(&_nullObject, _inventoryScroll)
-	, _vm(vm)
-    , _sound(sound)
-    , _mouseClickType(Common::EVENT_INVALID) {
+GameManager1::GameManager1(SupernovaEngine *vm, Sound *sound)
+	: GameManager(vm, sound) {
 	initRooms();
 	changeRoom(INTRO);
 	initState();
-	initGui();
 }
 
-GameManager::~GameManager() {
+GameManager1::~GameManager1() {
 	destroyRooms();
 }
 
-void GameManager::destroyRooms() {
+void GameManager1::destroyRooms() {
 	delete _rooms[INTRO];
 	delete _rooms[CORRIDOR];
 	delete _rooms[HALL];
@@ -355,7 +240,7 @@ void GameManager::destroyRooms() {
 	delete _rooms[OUTRO];
 }
 
-void GameManager::initState() {
+void GameManager1::initState() {
 	_currentInputObject = &_nullObject;
 	_inputObject[0] = &_nullObject;
 	_inputObject[1] = &_nullObject;
@@ -384,7 +269,7 @@ void GameManager::initState() {
 		_rowsStart[i] = 0;
 	}
 
-	_state._time = ticksToMsec(916364); // 2 pm
+	_time = ticksToMsec(916364); // 2 pm
 	_state._timeSleep = 0;
 	_state._timeAlarm = ticksToMsec(458182);    // 7 am
 	_state._eventTime = kMaxTimerValue;
@@ -411,7 +296,7 @@ void GameManager::initState() {
 	_prevImgId = 0;
 }
 
-void GameManager::initRooms() {
+void GameManager1::initRooms() {
 	_rooms[INTRO] = new Intro(_vm, this);
 	_rooms[CORRIDOR] = new ShipCorridor(_vm, this);
 	_rooms[HALL] = new ShipHall(_vm, this);
@@ -464,58 +349,16 @@ void GameManager::initRooms() {
 	_rooms[OUTRO] = new Outro(_vm, this);
 }
 
-void GameManager::initGui() {
-	int cmdCount = ARRAYSIZE(_guiCommandButton);
-	int cmdAvailableSpace = 320 - (cmdCount - 1) * 2;
-	for (int i = 0; i < cmdCount; ++i) {
-		const Common::String &text = _vm->getGameString(guiCommands[i]);
-		cmdAvailableSpace -= Screen::textWidth(text);
-	}
-
-	int commandButtonX = 0;
-	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
-		const Common::String &text = _vm->getGameString(guiCommands[i]);
-		int width;
-		if (i < cmdCount - 1) {
-			int space = cmdAvailableSpace / (cmdCount - i);
-			cmdAvailableSpace -= space;
-			width = Screen::textWidth(text) + space;
-		} else
-			width = 320 - commandButtonX;
-
-		_guiCommandButton[i].setSize(commandButtonX, 150, commandButtonX + width, 159);
-		_guiCommandButton[i].setText(text.c_str());
-		_guiCommandButton[i].setColor(kColorWhite25, kColorDarkGreen, kColorWhite44, kColorGreen);
-		commandButtonX += width + 2;
-	}
-
-	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
-		int inventoryX = 136 * (i % 2);
-		int inventoryY = 161 + 10 * (i / 2);
-
-		_guiInventory[i].setSize(inventoryX, inventoryY, inventoryX + 135, inventoryY + 9);
-		_guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
-	}
-	_guiInventoryArrow[0].setSize(272, 161, 279, 180);
-	_guiInventoryArrow[0].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
-	_guiInventoryArrow[0].setText("\x82");
-	_guiInventoryArrow[0].setTextPosition(273, 166);
-	_guiInventoryArrow[1].setSize(272, 181, 279, 200);
-	_guiInventoryArrow[1].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
-	_guiInventoryArrow[1].setText("\x83");
-	_guiInventoryArrow[1].setTextPosition(273, 186);
-}
-
-bool GameManager::canSaveGameStateCurrently() {
+bool GameManager1::canSaveGameStateCurrently() {
 	return _animationEnabled && _guiEnabled;
 }
 
-void GameManager::updateEvents() {
+void GameManager1::updateEvents() {
 	handleTime();
 	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
 		_currentRoom->animation();
 
-	if (_state._eventCallback != kNoFn && _state._time >= _state._eventTime) {
+	if (_state._eventCallback != kNoFn && _time >= _state._eventTime) {
 		_vm->_allowLoadGame = false;
 		_vm->_allowSaveGame = false;
 		_state._eventTime = kMaxTimerValue;
@@ -539,13 +382,15 @@ void GameManager::updateEvents() {
 		case kSearchStartFn:
 			searchStartEvent();
 			break;
+		default:
+			break; //shouldn't happen
 		}
 		_vm->_allowLoadGame = true;
 		_vm->_allowSaveGame = true;
 		return;
 	}
 
-	if (_state._alarmOn && _state._timeAlarm <= _state._time) {
+	if (_state._alarmOn && _state._timeAlarm <= _time) {
 		_state._alarmOn = false;
 		alarm();
 		return;
@@ -580,261 +425,12 @@ void GameManager::updateEvents() {
 	}
 }
 
-void GameManager::processInput(Common::KeyState &state) {
-	_key = state;
-
-	switch (state.keycode) {
-	case Common::KEYCODE_F1:
-		// help
-		_vm->showHelpScreen();
-		break;
-	case Common::KEYCODE_F2:
-		// show game manual
-		_vm->showTextReader("msn.doc");
-		break;
-	case Common::KEYCODE_F3:
-		// show game info
-		_vm->showTextReader("msn.inf");
-		break;
-	case Common::KEYCODE_F4:
-		_vm->setTextSpeed();
-		break;
-	case Common::KEYCODE_F5:
-		// load/save
-		break;
-	case Common::KEYCODE_x:
-		if (state.flags & Common::KBD_ALT) {
-			if (_vm->quitGameDialog())
-				_vm->quitGame();
-		}
-		break;
-	case Common::KEYCODE_d:
-		if (state.flags & Common::KBD_CTRL)
-			_vm->_console->attach();
-		break;
-	default:
-		break;
-	}
-}
-
-void GameManager::resetInputState() {
-	setObjectNull(_inputObject[0]);
-	setObjectNull(_inputObject[1]);
-	_inputVerb = ACTION_WALK;
-	_processInput = false;
-	_mouseClicked = false;
-	_keyPressed = false;
-	_key.reset();
-	_mouseClickType = Common::EVENT_MOUSEMOVE;
-
-	processInput();
-}
-
-void GameManager::processInput() {
-	enum {
-		onNone,
-		onObject,
-		onCmdButton,
-		onInventory,
-		onInventoryArrowUp,
-		onInventoryArrowDown
-	} mouseLocation;
-
-	if (_mouseField >= 0 && _mouseField < 256)
-		mouseLocation = onObject;
-	else if (_mouseField >= 256 && _mouseField < 512)
-		mouseLocation = onCmdButton;
-	else if (_mouseField >= 512 && _mouseField < 768)
-		mouseLocation = onInventory;
-	else if (_mouseField == 768)
-		mouseLocation = onInventoryArrowUp;
-	else if (_mouseField == 769)
-		mouseLocation = onInventoryArrowDown;
-	else
-		mouseLocation = onNone;
-
-	if (_mouseClickType == Common::EVENT_LBUTTONUP) {
-		if (_vm->_screen->isMessageShown()) {
-			// Hide the message and consume the event
-			_vm->removeMessage();
-			if (mouseLocation != onCmdButton)
-				return;
-		}
-
-		switch(mouseLocation) {
-		case onObject:
-		case onInventory:
-			// Fallthrough
-			if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
-				if (isNullObject(_inputObject[0])) {
-					_inputObject[0] = _currentInputObject;
-					if (!_inputObject[0]->hasProperty(COMBINABLE))
-						_processInput = true;
-				} else {
-					_inputObject[1] = _currentInputObject;
-					_processInput = true;
-				}
-			} else {
-				_inputObject[0] = _currentInputObject;
-				if (!isNullObject(_currentInputObject))
-					_processInput = true;
-			}
-			break;
-		case onCmdButton:
-			resetInputState();
-			_inputVerb = static_cast<Action>(_mouseField - 256);
-			break;
-		case onInventoryArrowUp:
-			if (_inventoryScroll >= 2)
-				_inventoryScroll -= 2;
-			break;
-		case onInventoryArrowDown:
-			if (_inventoryScroll < _inventory.getSize() - ARRAYSIZE(_guiInventory))
-				_inventoryScroll += 2;
-			break;
-		case onNone:
-			break;
-		}
-
-	} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
-		if (_vm->_screen->isMessageShown()) {
-			// Hide the message and consume the event
-			_vm->removeMessage();
-			return;
-		}
-
-		if (isNullObject(_currentInputObject))
-			return;
-
-		if (mouseLocation == onObject || mouseLocation == onInventory) {
-			_inputObject[0] = _currentInputObject;
-			ObjectTypes type = _inputObject[0]->_type;
-			if (type & OPENABLE)
-				_inputVerb = (type & OPENED) ? ACTION_CLOSE : ACTION_OPEN;
-			else if (type & PRESS)
-				_inputVerb = ACTION_PRESS;
-			else if (type & TALK)
-				_inputVerb = ACTION_TALK;
-			else
-				_inputVerb = ACTION_LOOK;
-
-			_processInput = true;
-		}
-
-	} else if (_mouseClickType == Common::EVENT_MOUSEMOVE) {
-		int field = -1;
-		int click = -1;
-
-		if ((_mouseY >= _guiCommandButton[0].top) && (_mouseY <= _guiCommandButton[0].bottom)) {
-			/* command row */
-			field = 9;
-			while (_mouseX < _guiCommandButton[field].left - 1)
-				field--;
-			field += 256;
-		} else if ((_mouseX >= 283) && (_mouseX <= 317) && (_mouseY >= 163) && (_mouseY <= 197)) {
-			/* exit box */
-			field = _exitList[(_mouseX - 283) / 7 + 5 * ((_mouseY - 163) / 7)];
-		} else if ((_mouseY >= 161) && (_mouseX <= 270)) {
-			/* inventory box */
-			field = (_mouseX + 1) / 136 + ((_mouseY - 161) / 10) * 2;
-			if (field + _inventoryScroll < _inventory.getSize())
-				field += 512;
-			else
-				field = -1;
-		} else if ((_mouseY >= 161) && (_mouseX >= 271) && (_mouseX < 279)) {
-			/* inventory arrows */
-			field = (_mouseY > 180) ? 769 : 768;
-		} else {
-			/* normal item */
-			for (int i = 0; (_currentRoom->getObject(i)->_id != INVALIDOBJECT) &&
-							(field == -1) && i < kMaxObject; i++) {
-				click = _currentRoom->getObject(i)->_click;
-				const MSNImage *image = _vm->_screen->getCurrentImage();
-				if (click != 255 && image) {
-					const MSNImage::ClickField *clickField = image->_clickField;
-					do {
-						if ((_mouseX >= clickField[click].x1) && (_mouseX <= clickField[click].x2) &&
-							(_mouseY >= clickField[click].y1) && (_mouseY <= clickField[click].y2))
-							field = i;
-
-						click = clickField[click].next;
-					} while ((click != 0) && (field == -1));
-				}
-			}
-		}
-
-		if (_mouseField != field) {
-			switch (mouseLocation) {
-			case onInventoryArrowUp:
-			case onInventoryArrowDown:
-				// Fallthrough
-				_guiInventoryArrow[_mouseField - 768].setHighlight(false);
-				break;
-			case onInventory:
-				_guiInventory[_mouseField - 512].setHighlight(false);
-				break;
-			case onCmdButton:
-				_guiCommandButton[_mouseField - 256].setHighlight(false);
-				break;
-			case onObject:
-			case onNone:
-				// Fallthrough
-				break;
-			}
-
-			setObjectNull(_currentInputObject);
-
-			_mouseField = field;
-			if (_mouseField >= 0 && _mouseField < 256)
-				mouseLocation = onObject;
-			else if (_mouseField >= 256 && _mouseField < 512)
-				mouseLocation = onCmdButton;
-			else if (_mouseField >= 512 && _mouseField < 768)
-				mouseLocation = onInventory;
-			else if (_mouseField == 768)
-				mouseLocation = onInventoryArrowUp;
-			else if (_mouseField == 769)
-				mouseLocation = onInventoryArrowDown;
-			else
-				mouseLocation = onNone;
-
-			switch (mouseLocation) {
-			case onInventoryArrowUp:
-			case onInventoryArrowDown:
-				// Fallthrough
-				_guiInventoryArrow[_mouseField - 768].setHighlight(true);
-				break;
-			case onInventory:
-				_guiInventory[_mouseField - 512].setHighlight(true);
-				_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
-				break;
-			case onCmdButton:
-				_guiCommandButton[_mouseField - 256].setHighlight(true);
-				break;
-			case onObject:
-				_currentInputObject = _currentRoom->getObject(_mouseField);
-				break;
-			case onNone:
-				break;
-			}
-		}
-	}
-}
-
-void GameManager::setObjectNull(Object *&obj) {
-	obj = &_nullObject;
-}
-
-bool GameManager::isNullObject(Object *obj) {
-	return obj == &_nullObject;
-}
-
-void GameManager::corridorOnEntrance() {
+void GameManager1::corridorOnEntrance() {
 	if (_state._corridorSearch)
 		busted(0);
 }
 
-void GameManager::telomat(int nr) {
+void GameManager1::telomat(int nr) {
 	static Common::String name[8] = {
 		"DR. ALAB HANSI",
 		"ALAB HANSI",
@@ -946,7 +542,7 @@ void GameManager::telomat(int nr) {
 				waitOnInput(_messageDuration);
 				_vm->removeMessage();
 				if ((_state._destination == 255) && !_rooms[BCORRIDOR]->isSectionVisible(7)) {
-					_state._eventTime = _state._time + ticksToMsec(150);
+					_state._eventTime = _time + ticksToMsec(150);
 					_state._eventCallback = kGuardWalkFn;
 					_state._origin = i;
 					_state._destination = nr;
@@ -996,19 +592,19 @@ void GameManager::telomat(int nr) {
 	} while (true);
 }
 
-void GameManager::startSearch() {
+void GameManager1::startSearch() {
 	if ((_currentRoom->getId() >= CORRIDOR1) && (_currentRoom->getId() <= BCORRIDOR))
 		busted(0);
 
 	_state._corridorSearch = true;
 }
 
-void GameManager::search(int time) {
-	_state._eventTime = _state._time + ticksToMsec(time);
+void GameManager1::search(int time) {
+	_state._eventTime = _time + ticksToMsec(time);
 	_state._eventCallback = kSearchStartFn;
 }
 
-void GameManager::guardNoticed() {
+void GameManager1::guardNoticed() {
 	_vm->paletteFadeOut();
 	Room *r = _currentRoom;
 	_currentRoom = _rooms[GUARD];
@@ -1028,7 +624,7 @@ void GameManager::guardNoticed() {
 	drawMapExits();
 }
 
-void GameManager::busted(int i) {
+void GameManager1::busted(int i) {
 	if (i > 0)
 		_vm->renderImage(i);
 	if (i == 0) {
@@ -1070,7 +666,7 @@ void GameManager::busted(int i) {
 	shot(0, 0);
 }
 
-void GameManager::novaScroll() {
+void GameManager1::novaScroll() {
 	static byte planet_f[6] = {0xeb,0xec,0xf0,0xed,0xf1,0xf2};
 	static byte nova_f[13] = {0xea,0xe9,0xf5,0xf3,0xf7,0xf4,0xf6,
 		0xf9,0xfb,0xfc,0xfd,0xfe,0xfa};
@@ -1112,7 +708,7 @@ void GameManager::novaScroll() {
 	}
 }
 
-void GameManager::supernovaEvent() {
+void GameManager1::supernovaEvent() {
 	_vm->removeMessage();
 	CursorMan.showMouse(false);
 	if (_currentRoom->getId() <= CAVE) {
@@ -1191,7 +787,7 @@ void GameManager::supernovaEvent() {
 	CursorMan.showMouse(true);
 }
 
-void GameManager::guardReturnedEvent() {
+void GameManager1::guardReturnedEvent() {
 	if (_currentRoom->getId() == GUARD)
 		busted(-1);
 	else if ((_currentRoom->getId() == CORRIDOR9) && (_currentRoom->isSectionVisible(27)))
@@ -1208,7 +804,7 @@ void GameManager::guardReturnedEvent() {
 	_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
 }
 
-void GameManager::walk(int imgId) {
+void GameManager1::walk(int imgId) {
 	if (_prevImgId)
 		_vm->renderImage(_prevImgId + 128);
 	_vm->renderImage(imgId);
@@ -1216,7 +812,7 @@ void GameManager::walk(int imgId) {
 	wait(3);
 }
 
-void GameManager::guardWalkEvent() {
+void GameManager1::guardWalkEvent() {
 	_prevImgId = 0;
 	bool behind = (!_rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OCCUPIED) ||
 				   _rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OPENED));
@@ -1325,7 +921,7 @@ void GameManager::guardWalkEvent() {
 			_vm->renderImage(_prevImgId + 128);
 			_rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
 			SWAP(_state._origin, _state._destination);
-			_state._eventTime = _state._time + ticksToMsec(60);
+			_state._eventTime = _time + ticksToMsec(60);
 			_state._eventCallback = kGuardWalkFn;
 		} else {
 			wait(18);
@@ -1342,7 +938,7 @@ void GameManager::guardWalkEvent() {
 		if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
 			busted(0);
 		SWAP(_state._origin, _state._destination);
-		_state._eventTime = _state._time + ticksToMsec(60);
+		_state._eventTime = _time + ticksToMsec(60);
 		_state._eventCallback = kGuardWalkFn;
 	} else {
 		SWAP(_state._origin, _state._destination);
@@ -1350,7 +946,7 @@ void GameManager::guardWalkEvent() {
 	}
 }
 
-void GameManager::taxiEvent() {
+void GameManager1::taxiEvent() {
 	if (_currentRoom->getId() == SIGN) {
 		changeRoom(STATION);
 		_vm->renderRoom(*_currentRoom);
@@ -1374,13 +970,13 @@ void GameManager::taxiEvent() {
 	_rooms[SIGN]->setSectionVisible(3, true);
 }
 
-void GameManager::searchStartEvent() {
+void GameManager1::searchStartEvent() {
 	if ((_currentRoom >= _rooms[CORRIDOR1]) && (_currentRoom <= _rooms[BCORRIDOR]))
 		busted(0);
 	_state._corridorSearch = true;
 }
 
-void GameManager::great(uint number) {
+void GameManager1::great(uint number) {
 	if (number && (_state._greatFlag & (1 << number)))
 		return;
 
@@ -1388,7 +984,7 @@ void GameManager::great(uint number) {
 	_state._greatFlag |= 1 << number;
 }
 
-bool GameManager::airless() {
+bool GameManager1::airless() {
 	return (_currentRoom->getId() == HOLD ||
 			_currentRoom->getId() == LANDINGMODULE ||
 			_currentRoom->getId() == GENERATOR ||
@@ -1401,133 +997,7 @@ bool GameManager::airless() {
 			(_currentRoom->getId() == AIRLOCK && _rooms[AIRLOCK]->getObject(1)->hasProperty(OPENED)));
 }
 
-void GameManager::sentence(int number, bool brightness) {
-	if (number < 0)
-		return;
-	_vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, brightness ? kColorWhite44 : kColorWhite25);
-	if (_texts[_rowsStart[number]] == kStringDialogSeparator)
-		_vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, brightness ? kColorRed : kColorDarkRed);
-	else {
-		for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r)
-			_vm->renderText(_texts[r], 1, 142 + r * 10, brightness ? kColorGreen : kColorDarkGreen);
-	}
-}
-
-void GameManager::say(StringId textId) {
-	Common::String str = _vm->getGameString(textId);
-	if (!str.empty())
-		say(str.c_str());
-}
-
-void GameManager::say(const char *text) {
-	Common::String t(text);
-	char *row[6];
-	Common::String::iterator p = t.begin();
-	uint numRows = 0;
-	while (*p) {
-		row[numRows++] = p;
-		while ((*p != '\0') && (*p != '|')) {
-			++p;
-		}
-		if (*p == '|') {
-			*p = 0;
-			++p;
-		}
-	}
-
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-	_vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
-	for (uint r = 0; r < numRows; ++r)
-		_vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
-	waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-}
-
-void GameManager::reply(StringId textId, int aus1, int aus2) {
-	Common::String str = _vm->getGameString(textId);
-	if (!str.empty())
-		reply(str.c_str(), aus1, aus2);
-}
-
-void GameManager::reply(const char *text, int aus1, int aus2) {
-	if (*text != '|')
-		_vm->renderMessage(text, kMessageTop);
-
-	for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
-		_vm->renderImage(aus1);
-		waitOnInput(2);
-		if (_keyPressed || _mouseClicked)
-			z = 1;
-		_vm->renderImage(aus2);
-		waitOnInput(2);
-		if (_keyPressed || _mouseClicked)
-			z = 1;
-	}
-	if (*text != '|')
-		_vm->removeMessage();
-}
-
-int GameManager::dialog(int num, byte rowLength[6], StringId text[6], int number) {
-	_vm->_allowLoadGame = false;
-	_guiEnabled = false;
-
-	bool remove[6];
-	for (int i = 0; i < 5; ++i)
-		remove[i] = _currentRoom->sentenceRemoved(i, number);
-	// The original does not initialize remove[5]!!!
-	// Set it to false/0. But maybe the loop above should use 6 instead of 5?
-	remove[5] = false;
-
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-
-	for (int i = 0; i < 6 ; ++i)
-		_sentenceNumber[i] = -1;
-
-	int r = 0, rq = 0;
-	for (int i = 0; i < num; ++i) {
-		if (!remove[i]) {
-			_rowsStart[i] = r;
-			_rows[i] = rowLength[i];
-			for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
-				_texts[r] = text[rq];
-				_sentenceNumber[r] = i;
-			}
-			sentence(i, false);
-		} else
-			rq += rowLength[i];
-	}
-
-	_currentSentence = -1;
-	do {
-		do {
-			updateEvents();
-			mousePosDialog(_mouseX, _mouseY);
-			g_system->updateScreen();
-			g_system->delayMillis(_vm->_delay);
-		} while (!_mouseClicked && !_vm->shouldQuit());
-	} while (_currentSentence == -1 && !_vm->shouldQuit());
-
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-
-	if (number && _currentSentence != -1 && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator)
-		_currentRoom->removeSentence(_currentSentence, number);
-
-	_guiEnabled = true;
-	_vm->_allowLoadGame = true;
-
-	return _currentSentence;
-}
-
-void GameManager::mousePosDialog(int x, int y) {
-	int a = y < 141 ? -1 : _sentenceNumber[(y - 141) / 10];
-	if (a != _currentSentence) {
-		sentence(_currentSentence, false);
-		_currentSentence = a;
-		sentence(_currentSentence, true);
-	}
-}
-
-void GameManager::turnOff() {
+void GameManager1::turnOff() {
 	if (_state._powerOff)
 		return;
 
@@ -1535,7 +1005,7 @@ void GameManager::turnOff() {
 	roomBrightness();
 }
 
-void GameManager::turnOn() {
+void GameManager1::turnOn() {
 	if (!_state._powerOff)
 		return;
 
@@ -1546,80 +1016,7 @@ void GameManager::turnOn() {
 	_rooms[COCKPIT]->setSectionVisible(22, false);
 }
 
-void GameManager::takeObject(Object &obj) {
-	if (obj.hasProperty(CARRIED))
-		return;
-
-	if (obj._section != 0)
-		_vm->renderImage(obj._section);
-	obj._click = obj._click2 = 255;
-	_inventory.add(obj);
-}
-
-void GameManager::drawCommandBox() {
-	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
-		_vm->renderBox(_guiCommandButton[i]);
-		int space = (_guiCommandButton[i].width() - Screen::textWidth(_guiCommandButton[i].getText())) / 2;
-		_vm->renderText(_guiCommandButton[i].getText(),
-						_guiCommandButton[i].getTextPos().x + space,
-						_guiCommandButton[i].getTextPos().y,
-						_guiCommandButton[i].getTextColor());
-	}
-}
-
-void GameManager::drawInventory() {
-	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
-		_vm->renderBox(_guiInventory[i]);
-		_vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
-						_guiInventory[i].getTextPos().x,
-						_guiInventory[i].getTextPos().y,
-						_guiInventory[i].getTextColor());
-	}
-
-	_vm->renderBox(_guiInventoryArrow[0]);
-	_vm->renderBox(_guiInventoryArrow[1]);
-	if (_inventory.getSize() > ARRAYSIZE(_guiInventory)) {
-		if (_inventoryScroll != 0)
-			_vm->renderText(_guiInventoryArrow[0]);
-		if (_inventoryScroll + ARRAYSIZE(_guiInventory) < _inventory.getSize())
-			_vm->renderText(_guiInventoryArrow[1]);
-	}
-}
-
-int GameManager::getKeyInput() {
-	while (!_vm->shouldQuit()) {
-		updateEvents();
-		if (_keyPressed) {
-			return _key.ascii;
-		}
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	return 0;
-}
-
-Common::EventType GameManager::getMouseInput() {
-	while (!_vm->shouldQuit()) {
-		updateEvents();
-		if (_mouseClicked)
-			return _mouseClickType;
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	return Common::EVENT_INVALID;
-}
-
-void GameManager::getInput() {
-	while (!_vm->shouldQuit()) {
-		updateEvents();
-		if (_mouseClicked || _keyPressed)
-			break;
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-}
-
-void GameManager::roomBrightness() {
+void GameManager1::roomBrightness() {
 	_roomBrightness = 255;
 	if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) && _state._powerOff)
 		_roomBrightness = 153;
@@ -1634,59 +1031,15 @@ void GameManager::roomBrightness() {
 	_vm->paletteBrightness();
 }
 
-void GameManager::changeRoom(RoomId id) {
-	_currentRoom = _rooms[id];
-	_newRoom = true;
-}
-
-void GameManager::wait(int ticks) {
-	int32 end = _state._time + ticksToMsec(ticks);
-	do {
-		g_system->delayMillis(_vm->_delay);
-		updateEvents();
-		g_system->updateScreen();
-	} while (_state._time < end && !_vm->shouldQuit());
-}
-
-void GameManager::waitOnInput(int ticks) {
-	int32 end = _state._time + ticksToMsec(ticks);
-	do {
-		g_system->delayMillis(_vm->_delay);
-		updateEvents();
-		g_system->updateScreen();
-	} while (_state._time < end && !_vm->shouldQuit() && !_keyPressed && !_mouseClicked);
-}
-
-bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
-	keycode = Common::KEYCODE_INVALID;
-	int32 end = _state._time + ticksToMsec(ticks);
-	do {
-		g_system->delayMillis(_vm->_delay);
-		updateEvents();
-		g_system->updateScreen();
-		if (_keyPressed) {
-			keycode = _key.keycode;
-			_key.reset();
-			return true;
-		} else if (_mouseClicked)
-			return true;
-	} while (_state._time < end  && !_vm->shouldQuit());
-	return false;
-}
-
-void GameManager::setAnimationTimer(int ticks) {
-	_animationTimer = ticksToMsec(ticks);
-}
-
-void GameManager::handleTime() {
+void GameManager1::handleTime() {
 	if (_timerPaused)
 		return;
 	int32 newTime = g_system->getMillis();
 	int32 delta = newTime - _oldTime;
-	_state._time += delta;
-	if (_state._time > 86400000) {
-		_state._time -= 86400000; // 24h wrap around
-		_state._alarmOn = (_state._timeAlarm > _state._time);
+	_time += delta;
+	if (_time > 86400000) {
+		_time -= 86400000; // 24h wrap around
+		_state._alarmOn = (_state._timeAlarm > _time);
 	}
 	if (_animationTimer > delta)
 		_animationTimer -= delta;
@@ -1696,52 +1049,20 @@ void GameManager::handleTime() {
 	_oldTime = newTime;
 }
 
-void GameManager::pauseTimer(bool pause) {
-	if (pause == _timerPaused)
-		return;
-
-	if (pause) {
-		_timerPaused = true;
-		int32 delta = g_system->getMillis() - _oldTime;
-		_timePaused = _state._time + delta;
-	} else {
-		_state._time = _timePaused;
-		_oldTime = g_system->getMillis();
-		_timerPaused = false;
-	}
-}
-
-void GameManager::loadTime() {
+void GameManager1::loadTime() {
 	pauseTimer(false);
 }
 
-void GameManager::saveTime() {
+void GameManager1::saveTime() {
 	pauseTimer(true);
 }
 
-void GameManager::screenShake() {
-	for (int i = 0; i < 12; ++i) {
-		_vm->_system->setShakePos(8);
-		wait(1);
-		_vm->_system->setShakePos(0);
-		wait(1);
-	}
-}
-
-void GameManager::shock() {
+void GameManager1::shock() {
 	_sound->play(kAudioShock);
 	dead(kStringShock);
 }
 
-void GameManager::showMenu() {
-	_vm->renderBox(0, 138, 320, 62, 0);
-	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
-	drawCommandBox();
-	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
-	drawInventory();
-}
-
-void GameManager::drawMapExits() {
+void GameManager1::drawMapExits() {
 // TODO: Preload _exitList on room entry instead on every call
 	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
 
@@ -1758,83 +1079,7 @@ void GameManager::drawMapExits() {
 	}
 }
 
-void GameManager::animationOff() {
-	_animationEnabled = false;
-}
-
-void GameManager::animationOn() {
-	_animationEnabled = true;
-}
-
-void GameManager::edit(Common::String &input, int x, int y, uint length) {
-	bool isEditing = true;
-	uint cursorIndex = input.size();
-	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
-	int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
-						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
-
-	while (isEditing) {
-		_vm->_screen->setTextCursorPos(x, y);
-		_vm->_screen->setTextCursorColor(kColorWhite99);
-		_vm->renderBox(x, y - 1, overdrawWidth, 9, kColorDarkBlue);
-		for (uint i = 0; i < input.size(); ++i) {
-			// Draw char highlight depending on cursor position
-			if (i == cursorIndex) {
-				_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1,
-							   Screen::textWidth(input[i]), 9, kColorWhite99);
-				_vm->_screen->setTextCursorColor(kColorDarkBlue);
-				_vm->renderText(input[i]);
-				_vm->_screen->setTextCursorColor(kColorWhite99);
-			} else
-				_vm->renderText(input[i]);
-		}
-
-		if (cursorIndex == input.size()) {
-			_vm->renderBox(_vm->_screen->getTextCursorPos().x + 1, y - 1, 6, 9, kColorDarkBlue);
-			_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1, 1, 9, kColorWhite99);
-		}
-
-		getKeyInput();
-		if (_vm->shouldQuit())
-			break;
-		switch (_key.keycode) {
-		case Common::KEYCODE_RETURN:
-		case Common::KEYCODE_ESCAPE:
-			isEditing = false;
-			break;
-		case Common::KEYCODE_UP:
-		case Common::KEYCODE_DOWN:
-			cursorIndex = input.size();
-			break;
-		case Common::KEYCODE_LEFT:
-			if (cursorIndex != 0)
-				--cursorIndex;
-			break;
-		case Common::KEYCODE_RIGHT:
-			if (cursorIndex != input.size())
-				++cursorIndex;
-			break;
-		case Common::KEYCODE_DELETE:
-			if (cursorIndex != input.size())
-				input.deleteChar(cursorIndex);
-			break;
-		case Common::KEYCODE_BACKSPACE:
-			if (cursorIndex != 0) {
-				--cursorIndex;
-				input.deleteChar(cursorIndex);
-			}
-			break;
-		default:
-			if (Common::isPrint(_key.ascii) && input.size() < length) {
-				input.insertChar(_key.ascii, cursorIndex);
-				++cursorIndex;
-			}
-			break;
-		}
-	}
-}
-
-void GameManager::shot(int a, int b) {
+void GameManager1::shot(int a, int b) {
 	if (a)
 		_vm->renderImage(a);
 	_sound->play(kAudioGunShot);
@@ -1852,7 +1097,7 @@ void GameManager::shot(int a, int b) {
 	dead(kStringShot);
 }
 
-void GameManager::takeMoney(int amount) {
+void GameManager1::takeMoney(int amount) {
 	Object *moneyObject = _rooms[INTRO]->getObject(4);
 	_state._money += amount;
 	_vm->setGameString(kStringInventoryMoney, Common::String::format("%d Xa", _state._money));
@@ -1866,32 +1111,14 @@ void GameManager::takeMoney(int amount) {
 	}
 }
 
-void GameManager::drawStatus() {
-	int index = static_cast<int>(_inputVerb);
-	_vm->renderBox(0, 140, 320, 9, kColorWhite25);
-	_vm->renderText(_vm->getGameString(guiStatusCommands[index]), 1, 141, kColorDarkGreen);
-
-	if (isNullObject(_inputObject[0]))
-		_vm->renderText(_currentInputObject->_name);
-	else {
-		_vm->renderText(_inputObject[0]->_name);
-		if (_inputVerb == ACTION_GIVE)
-			_vm->renderText(kPhrasalVerbParticleGiveTo);
-		else if (_inputVerb == ACTION_USE)
-			_vm->renderText(kPhrasalVerbParticleUseWith);
-
-		_vm->renderText(_currentInputObject->_name);
-	}
-}
-
-void GameManager::openLocker(const Room *room, Object *obj, Object *lock, int section) {
+void GameManager1::openLocker(const Room *room, Object *obj, Object *lock, int section) {
 	_vm->renderImage(section);
 	obj->setProperty(OPENED);
 	lock->_click = 255;
 	SWAP(obj->_click, obj->_click2);
 }
 
-void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
+void GameManager1::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
 	if (!obj->hasProperty(OPENED))
 		_vm->renderMessage(kStringCloseLocker_1);
 	else {
@@ -1902,40 +1129,7 @@ void GameManager::closeLocker(const Room *room, Object *obj, Object *lock, int s
 	}
 }
 
-void GameManager::dead(StringId messageId) {
-	_vm->paletteFadeOut();
-	_guiEnabled = false;
-	_vm->setCurrentImage(11);
-	_vm->renderImage(0);
-	_vm->renderMessage(messageId);
-	_sound->play(kAudioDeath);
-	_vm->paletteFadeIn();
-	getInput();
-	_vm->paletteFadeOut();
-	_vm->removeMessage();
-
-	destroyRooms();
-	initRooms();
-	initState();
-	initGui();
-	_inventory.clear();
-	changeRoom(CABIN_R3);
-	g_system->fillScreen(kColorBlack);
-	_vm->paletteFadeIn();
-
-	_guiEnabled = true;
-}
-
-int GameManager::invertSection(int section) {
-	if (section < 128)
-		section += 128;
-	else
-		section -= 128;
-
-	return section;
-}
-
-bool GameManager::isHelmetOff() {
+bool GameManager1::isHelmetOff() {
 	Object *helmet = _inventory.get(HELMET);
 	if (helmet && helmet->hasProperty(WORN)) {
 		_vm->renderMessage(kStringIsHelmetOff_1);
@@ -1945,7 +1139,7 @@ bool GameManager::isHelmetOff() {
 	return true;
 }
 
-bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
+bool GameManager1::genericInteract(Action verb, Object &obj1, Object &obj2) {
 	if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
 		if (isHelmetOff()) {
 			takeObject(obj1);
@@ -2017,7 +1211,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderMessage(obj1._description);
 		obj1._description = kStringKeycard2Description2;
 	} else if ((verb == ACTION_LOOK) && (obj1._id == WATCH))
-		_vm->renderMessage(kStringGenericInteract_13, kMessageNormal, timeToString(_state._time), timeToString(_state._timeAlarm));
+		_vm->renderMessage(kStringGenericInteract_13, kMessageNormal, timeToString(_time), timeToString(_state._timeAlarm));
 	else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
 		bool validInput = true;
 		int hours = 0;
@@ -2075,7 +1269,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		_vm->restoreScreen();
 		if (_key.keycode != Common::KEYCODE_ESCAPE) {
 			_state._timeAlarm = (hours * 60 + minutes) * 60 * 1000;
-			_state._alarmOn = (_state._timeAlarm > _state._time);
+			_state._alarmOn = (_state._timeAlarm > _time);
 		}
 	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
 		Room *r = _rooms[CABIN_L3];
@@ -2211,7 +1405,7 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) {
 	return true;
 }
 
-void GameManager::handleInput() {
+void GameManager1::handleInput() {
 	bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
 	if (!validCommand)
 		validCommand = _currentRoom->interact(_inputVerb, *_inputObject[0], *_inputObject[1]);
@@ -2304,7 +1498,7 @@ void GameManager::handleInput() {
 	}
 }
 
-void GameManager::executeRoom() {
+void GameManager1::executeRoom() {
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
 		handleInput();
 		if (_mouseClicked) {
@@ -2341,7 +1535,7 @@ void GameManager::executeRoom() {
 	}
 }
 
-void GameManager::guardShot() {
+void GameManager1::guardShot() {
 	_vm->renderImage(2);
 	_vm->renderImage(5);
 	wait(3);
@@ -2359,7 +1553,7 @@ void GameManager::guardShot() {
 	shot(4, 3);
 }
 
-void GameManager::guard3Shot() {
+void GameManager1::guard3Shot() {
 	_vm->renderImage(1);
 	wait(3);
 	_sound->play(kAudioVoiceHalt); // 46/0
@@ -2372,7 +1566,7 @@ void GameManager::guard3Shot() {
 	shot(3,2);
 }
 
-void GameManager::alarm() {
+void GameManager1::alarm() {
 	if (_rooms[INTRO]->getObject(2)->hasProperty(CARRIED)) {
 		alarmSound();
 		if (_currentRoom->getId() == GUARD)
@@ -2402,17 +1596,17 @@ void GameManager::alarm() {
 			_rooms[GUARD]->setSectionVisible(7, true);
 			_rooms[GUARD]->getObject(5)->_click = 4;
 		}
-		_state._eventTime = _state._time + ticksToMsec(180);
+		_state._eventTime = _time + ticksToMsec(180);
 		_state._eventCallback = kGuardReturnedFn;
 	}
 }
 
-void GameManager::alarmSound() {
+void GameManager1::alarmSound() {
 	animationOff();
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAlarm);
 
-	int32 end = _state._time + ticksToMsec(_messageDuration);
+	int32 end = _time + ticksToMsec(_messageDuration);
 	do {
 		_sound->play(kAudioAlarm);
 		while (_sound->isPlaying()) {
@@ -2420,7 +1614,7 @@ void GameManager::alarmSound() {
 			updateEvents();
 			g_system->updateScreen();
 		}
-	} while (_state._time < end && !_vm->shouldQuit());
+	} while (_time < end && !_vm->shouldQuit());
 
 	_vm->removeMessage();
 	animationOn();
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index f78f219..51dab06 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -29,209 +29,73 @@
 #include "common/keyboard.h"
 #include "supernova/rooms.h"
 #include "supernova/sound.h"
+#include "supernova/game-manager.h"
 
 namespace Supernova {
 
-const int32 kMaxTimerValue = 0x7FFFFFFF;
-
-enum EventFunction { kNoFn, kSupernovaFn, kGuardReturnedFn, kGuardWalkFn, kTaxiFn, kSearchStartFn };
-
-struct GameState {
-	int32  _time;
-	int32  _timeSleep;
-	int32  _timeAlarm;
-	int32  _eventTime;
-	EventFunction _eventCallback;
-	int32  _arrivalDaysLeft;
-	int32  _shipEnergyDaysLeft;
-	int32  _landingModuleEnergyDaysLeft;
-	uint16 _greatFlag;
-	int16  _timeRobot;
-	int16  _money;
-	byte   _coins;
-	byte   _shoes;
-	byte   _origin;
-	byte   _destination;
-	byte   _language;
-	bool   _corridorSearch;
-	bool   _alarmOn;
-	bool   _terminalStripConnected;
-	bool   _terminalStripWire;
-	bool   _cableConnected;
-	bool   _powerOff;
-	bool   _dream;
-	bool   _nameSeen[4];
-	bool   _playerHidden;
-};
-
-class Inventory {
-public:
-	Inventory(Object *nullObject, int &inventoryScroll)
-		: _numObjects(0)
-		, _nullObject(nullObject)
-	    , _inventoryScroll(inventoryScroll) {
-		for (int i = 0; i < kMaxCarry; ++i)
-			_inventory[i] = nullptr;
-	}
-
-	void add(Object &obj);
-	void remove(Object &obj);
-	void clear();
-	Object *get(int index) const;
-	Object *get(ObjectId id) const;
-	int getSize() const { return _numObjects; }
-
-private:
-	Object *_inventory[kMaxCarry];
-	Object *_nullObject;
-	int &_inventoryScroll;
-	int _numObjects;
+class GameManager;
+
+class GameState {
+	public:
+		int32  _timeSleep;
+		int32  _timeAlarm;
+		int32  _eventTime;
+		EventFunction _eventCallback;
+		int32  _arrivalDaysLeft;
+		int32  _shipEnergyDaysLeft;
+		int32  _landingModuleEnergyDaysLeft;
+		uint16 _greatFlag;
+		int16  _timeRobot;
+		int16  _money;
+		byte   _coins;
+		byte   _shoes;
+		byte   _origin;
+		byte   _destination;
+		byte   _language;
+		bool   _corridorSearch;
+		bool   _alarmOn;
+		bool   _terminalStripConnected;
+		bool   _terminalStripWire;
+		bool   _cableConnected;
+		bool   _powerOff;
+		bool   _dream;
+		bool   _nameSeen[4];
+		bool   _playerHidden;
 };
 
-class GuiElement : public Common::Rect {
+class GameManager1 : public GameManager {
 public:
-	GuiElement();
-
-	void setSize(int x1, int y1, int x2, int y2);
-	void setText(const char *text);
-	void setTextPosition(int x, int y);
-	void setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted);
-	void setHighlight(bool isHighlighted);
-
-	const char *getText() const {
-		return _text;
-	}
-	int getBackgroundColor() const {
-		return _bgColor;
-	}
-	int getTextColor() const {
-		return _textColor;
-	}
-	const Common::Point &getTextPos() const {
-		return _textPosition;
-	}
-	bool isHighlighted() const {
-		return _isHighlighted;
-	}
-
-private:
-	Common::Point _textPosition;
-	char _text[128];
-	int _bgColor;
-	int _textColor;
-	int _bgColorNormal;
-	int _bgColorHighlighted;
-	int _textColorNormal;
-	int _textColorHighlighted;
-	bool _isHighlighted;
-};
-
-class GameManager {
-public:
-	GameManager(SupernovaEngine *vm, Sound *sound);
-	~GameManager();
-
-	void updateEvents();
-	void processInput(Common::KeyState &state);
-	void processInput();
-	void executeRoom();
-	bool serialize(Common::WriteStream *out);
-	bool deserialize(Common::ReadStream *in, int version);
+	GameManager1(SupernovaEngine *vm, Sound *sound);
+	virtual ~GameManager1();
 
-	static StringId guiCommands[];
-	static StringId guiStatusCommands[];
-	SupernovaEngine *_vm;
-	Sound *_sound;
-	Common::KeyState _key;
-	Common::EventType _mouseClickType;
-	bool _mouseClicked;
-	bool _keyPressed;
-	int _mouseX;
-	int _mouseY;
-	int _mouseField;
-	Room *_currentRoom;
-	bool _newRoom;
-	Room *_rooms[NUMROOMS];
-	Inventory _inventory;
 	GameState _state;
-	bool _processInput;
-	bool _guiEnabled;
-	bool _animationEnabled;
-	byte _roomBrightness;
-	Action _inputVerb;
-	Object _nullObject;
-	Object *_currentInputObject;
-	Object *_inputObject[2];
-	int32 _oldTime;
-	uint _timePaused;
-	bool _timerPaused;
-	int32 _messageDuration;
-	int32 _animationTimer;
-	int _inventoryScroll;
-	int _exitList[25];
-	GuiElement _guiCommandButton[10];
-	GuiElement _guiInventory[8];
-	GuiElement _guiInventoryArrow[2];
-	// Dialog
-	int _currentSentence;
-	int _sentenceNumber[6];
-	StringId _texts[6];
-	byte _rows[6];
-	byte _rowsStart[6];
 
-	void takeObject(Object &obj);
-	void setObjectNull(Object *&obj);
-	bool isNullObject(Object *obj);
+	virtual void updateEvents();
+	virtual void executeRoom();
+	virtual bool serialize(Common::WriteStream *out);
+	virtual bool deserialize(Common::ReadStream *in, int version);
 
-	void initState();
-	void initRooms();
-	void destroyRooms();
-	void initGui();
-	bool canSaveGameStateCurrently();
-	bool genericInteract(Action verb, Object &obj1, Object &obj2);
+	virtual void initState();
+	virtual void initRooms();
+	virtual void destroyRooms();
+	virtual bool canSaveGameStateCurrently();
+	virtual bool genericInteract(Action verb, Object &obj1, Object &obj2);
 	bool isHelmetOff();
 	void great(uint number);
 	bool airless();
 	void shock();
-	Common::EventType getMouseInput();
-	int getKeyInput();
-	void getInput();
-	void wait(int ticks);
-	void waitOnInput(int ticks);
-	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void turnOff();
 	void turnOn();
-	void screenShake();
-	void roomBrightness();
-	void showMenu();
-	void animationOff();
-	void animationOn();
+	virtual void roomBrightness();
 	void openLocker(const Room *room, Object *obj, Object *lock, int section);
 	void closeLocker(const Room *room, Object *obj, Object *lock, int section);
-	void edit(Common::String &input, int x, int y, uint length);
-	int invertSection(int section);
-	void drawMapExits();
-	void drawStatus();
-	void drawCommandBox();
-	void drawInventory();
-	void changeRoom(RoomId id);
-	void resetInputState();
-	void handleInput();
-	void handleTime();
-	void pauseTimer(bool pause);
-	void loadTime();
-	void saveTime();
-	void setAnimationTimer(int ticks);
-	void dead(StringId messageId);
-	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
-	void sentence(int number, bool brightness);
-	void say(StringId textId);
-	void say(const char *text);
-	void reply(StringId textId, int aus1, int aus2);
-	void reply(const char *text, int aus1, int aus2);
-	void mousePosDialog(int x, int y);
+	virtual void drawMapExits();
+	virtual void handleInput();
+	virtual void handleTime();
+	virtual void loadTime();
+	virtual void saveTime();
 	void shot(int a, int b);
-	void takeMoney(int amount);
+	virtual void takeMoney(int amount);
 	void search(int time);
 	void startSearch();
 	void guardNoticed();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c07edfa..79d64cd 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -46,6 +46,7 @@
 #include "supernova/sound.h"
 #include "supernova/supernova.h"
 #include "supernova/state.h"
+#include "supernova/game-manager.h"
 
 namespace Supernova {
 
@@ -141,7 +142,8 @@ void SupernovaEngine::init() {
 
 	_resMan = new ResourceManager(_MSPart);
 	_sound = new Sound(_mixer, _resMan);
-	_gm = new GameManager(this, _sound);
+	if (_MSPart == 1)
+		_gm = new GameManager1(this, _sound);
 	_screen = new Screen(this, _resMan);
 	_console = new Console(this, _gm);
 
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index afdcf1c..9655d00 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -36,6 +36,7 @@
 #include "supernova/rooms.h"
 #include "supernova/sound.h"
 #include "supernova/imageid.h"
+#include "supernova/game-manager.h"
 
 namespace Common {
 	class MemoryReadWriteStream;
@@ -58,6 +59,7 @@ class ResourceManager;
 class Sound;
 class console;
 class GameManager;
+class GameManager1;
 class Screen;
 
 class SupernovaEngine : public Engine {
diff --git a/engines/supernova2/state.h b/engines/supernova2/state.h
index ce1e88f..1a76a55 100644
--- a/engines/supernova2/state.h
+++ b/engines/supernova2/state.h
@@ -173,7 +173,6 @@ public:
 	int32 _oldTime;
 	uint _timePaused;
 	bool _timerPaused;
-	int _restTime;
 	int32 _messageDuration;
 	int32 _animationTimer;
 	int _inventoryScroll;
@@ -188,12 +187,15 @@ public:
 	byte _rows[6];
 	byte _rowsStart[6];
 	byte _dials[6];
+
+	//state
 	unsigned char _puzzleField[16];
 	bool _mapOn;
 	bool _steps;
 	bool _cracking;
 	bool _alarmBefore;
 	RoomId _securityTab[10];
+	int _restTime;
 
 	void takeObject(Object &obj);
 	void setObjectNull(Object *&obj);


Commit: 4dd72f4ae05c4e0fca7e4f92115f49697736c4ab
    https://github.com/scummvm/scummvm/commit/4dd72f4ae05c4e0fca7e4f92115f49697736c4ab
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Divide rooms into 2 files

Changed paths:
  A engines/supernova/room.cpp
  A engines/supernova/room.h
    engines/supernova/module.mk
    engines/supernova/rooms.cpp
    engines/supernova/rooms.h
    engines/supernova/state.h


diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index a075018..3eb2259 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS := \
 	detection.o \
 	graphics.o \
 	resman.o \
+	room.o \
 	rooms.o \
 	screen.o \
 	sound.o \
diff --git a/engines/supernova/room.cpp b/engines/supernova/room.cpp
new file mode 100644
index 0000000..24e1aa5
--- /dev/null
+++ b/engines/supernova/room.cpp
@@ -0,0 +1,188 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "graphics/palette.h"
+#include "graphics/cursorman.h"
+
+#include "supernova/screen.h"
+#include "supernova/supernova.h"
+#include "supernova/state.h"
+
+namespace Supernova {
+
+Room::Room() {
+	_seen = false;
+	_fileNumber = 0;
+	_id = NULLROOM;
+	_vm = nullptr;
+	_gm = nullptr;
+
+	for (int i = 0; i < kMaxSection; ++i)
+		_shown[i] = kShownFalse;
+	for (int i = 0; i < kMaxDialog; ++i)
+		_sentenceRemoved[i] = 0;
+}
+
+Room::~Room() {
+}
+
+bool Room::serialize(Common::WriteStream *out) {
+	if (out->err())
+		return false;
+
+	out->writeSint32LE(_id);
+	for (int i = 0; i < kMaxSection; ++i)
+		out->writeByte(_shown[i]);
+	for (int i = 0; i < kMaxDialog ; ++i)
+		out->writeByte(_sentenceRemoved[i]);
+
+	int numObjects = 0;
+	while ((numObjects < kMaxObject) && (_objectState[numObjects]._id != INVALIDOBJECT))
+		++numObjects;
+	out->writeSint32LE(numObjects);
+
+	for (int i = 0; i < numObjects; ++i) {
+		out->writeSint32LE(_objectState[i]._name);
+		out->writeSint32LE(_objectState[i]._description);
+		out->writeByte(_objectState[i]._roomId);
+		out->writeSint32LE(_objectState[i]._id);
+		out->writeSint32LE(_objectState[i]._type);
+		out->writeByte(_objectState[i]._click);
+		out->writeByte(_objectState[i]._click2);
+		out->writeByte(_objectState[i]._section);
+		out->writeSint32LE(_objectState[i]._exitRoom);
+		out->writeByte(_objectState[i]._direction);
+	}
+
+	out->writeByte(_seen);
+
+	return !out->err();
+}
+
+bool Room::deserialize(Common::ReadStream *in, int version) {
+	if (in->err())
+		return false;
+
+	in->readSint32LE();
+
+	for (int i = 0; i < kMaxSection; ++i)
+		_shown[i] = in->readByte();
+
+	// Prior to version 3, _sentenceRemoved was part of _shown (the last two values)
+	// But on the other hand dialog was not implemented anyway, so we don't even try to
+	// recover it.
+	for (int i = 0; i < kMaxDialog ; ++i)
+		_sentenceRemoved[i] = version < 3 ? 0 : in->readByte();
+
+	int numObjects = in->readSint32LE();
+	for (int i = 0; i < numObjects; ++i) {
+		_objectState[i]._name = static_cast<StringId>(in->readSint32LE());
+		_objectState[i]._description = static_cast<StringId>(in->readSint32LE());
+		_objectState[i]._roomId = in->readByte();
+		_objectState[i]._id = static_cast<ObjectId>(in->readSint32LE());
+		_objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
+		_objectState[i]._click = in->readByte();
+		_objectState[i]._click2 = in->readByte();
+		_objectState[i]._section = in->readByte();
+		_objectState[i]._exitRoom = static_cast<RoomId>(in->readSint32LE());
+		_objectState[i]._direction = in->readByte();
+	}
+
+	_seen = in->readByte();
+
+	return !in->err();
+}
+
+bool Room::hasSeen() {
+	return _seen;
+}
+void Room::setRoomSeen(bool seen) {
+	_seen = seen;
+}
+
+int Room::getFileNumber() const {
+	return _fileNumber;
+}
+RoomId Room::getId() const {
+	return _id;
+}
+
+void Room::setSectionVisible(uint section, bool visible) {
+	_shown[section] = visible ? kShownTrue : kShownFalse;
+}
+
+bool Room::isSectionVisible(uint index) const {
+	return _shown[index] == kShownTrue;
+}
+
+void Room::removeSentenceByMask(int mask, int number) {
+	if (number > 0) {
+		_sentenceRemoved[number - 1] |= mask;
+	}
+}
+
+void Room::removeSentence(int sentence, int number) {
+	if (number > 0)
+		_sentenceRemoved[number - 1] |= (1 << sentence);
+}
+
+void Room::addSentence(int sentence, int number) {
+	if (number > 0)
+		_sentenceRemoved[number - 1] &= ~(1 << sentence);
+}
+
+void Room::addAllSentences(int number) {
+	if (number > 0)
+		_sentenceRemoved[number - 1] = 0;
+}
+
+bool Room::sentenceRemoved(int sentence, int number) {
+	if (number <= 0)
+		return false;
+	return (_sentenceRemoved[number - 1] & (1 << sentence));
+}
+
+bool Room::allSentencesRemoved(int maxSentence, int number) {
+	if (number <= 0)
+		return false;
+	for (int i = 0, flag = 1 ; i < maxSentence ; ++i, flag <<= 1)
+		if (!(_sentenceRemoved[number - 1] & flag))
+			return false;
+	return true;
+}
+
+Object *Room::getObject(uint index) {
+	return &_objectState[index];
+}
+
+void Room::animation() {
+}
+
+void Room::onEntrance() {
+}
+
+bool Room::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+}
diff --git a/engines/supernova/room.h b/engines/supernova/room.h
new file mode 100644
index 0000000..38d80ab
--- /dev/null
+++ b/engines/supernova/room.h
@@ -0,0 +1,79 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA_ROOM_H
+#define SUPERNOVA_ROOM_H
+
+#include "common/str.h"
+
+#include "supernova/msn_def.h"
+
+namespace Common {
+class ReadStream;
+class WriteStream;
+}
+
+namespace Supernova {
+
+class GameManager1;
+class SupernovaEngine;
+
+class Room {
+public:
+	Room();
+
+	bool hasSeen();
+	void setRoomSeen(bool seen);
+	int getFileNumber() const;
+	RoomId getId() const;
+	void setSectionVisible(uint section, bool visible);
+	bool isSectionVisible(uint index) const;
+	void removeSentence(int sentence, int number);
+	void removeSentenceByMask(int mask, int number);
+	void addSentence(int sentence, int number);
+	void addAllSentences(int number);
+	bool sentenceRemoved(int sentence, int number);
+	bool allSentencesRemoved(int maxSentence, int number);
+	Object *getObject(uint index);
+
+	virtual ~Room();
+	virtual void animation();
+	virtual void onEntrance();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+	virtual bool serialize(Common::WriteStream *out);
+	virtual bool deserialize(Common::ReadStream *in, int version);
+
+protected:
+	int _fileNumber;
+	bool _shown[kMaxSection];
+	byte _sentenceRemoved[kMaxDialog];
+	Object _objectState[kMaxObject];
+	RoomId _id;
+	SupernovaEngine *_vm;
+	GameManager1 *_gm;
+
+private:
+	bool _seen;
+};
+
+}
+#endif // SUPERNOVA_ROOM_H
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
index e6e7dd7..04d8e8d 100644
--- a/engines/supernova/rooms.cpp
+++ b/engines/supernova/rooms.cpp
@@ -30,156 +30,6 @@
 
 namespace Supernova {
 
-Room::Room() {
-	_seen = false;
-	_fileNumber = 0;
-	_id = NULLROOM;
-	_vm = nullptr;
-	_gm = nullptr;
-
-	for (int i = 0; i < kMaxSection; ++i)
-		_shown[i] = kShownFalse;
-	for (int i = 0; i < kMaxDialog; ++i)
-		_sentenceRemoved[i] = 0;
-}
-
-Room::~Room() {
-}
-
-bool Room::serialize(Common::WriteStream *out) {
-	if (out->err())
-		return false;
-
-	out->writeSint32LE(_id);
-	for (int i = 0; i < kMaxSection; ++i)
-		out->writeByte(_shown[i]);
-	for (int i = 0; i < kMaxDialog ; ++i)
-		out->writeByte(_sentenceRemoved[i]);
-
-	int numObjects = 0;
-	while ((numObjects < kMaxObject) && (_objectState[numObjects]._id != INVALIDOBJECT))
-		++numObjects;
-	out->writeSint32LE(numObjects);
-
-	for (int i = 0; i < numObjects; ++i) {
-		out->writeSint32LE(_objectState[i]._name);
-		out->writeSint32LE(_objectState[i]._description);
-		out->writeByte(_objectState[i]._roomId);
-		out->writeSint32LE(_objectState[i]._id);
-		out->writeSint32LE(_objectState[i]._type);
-		out->writeByte(_objectState[i]._click);
-		out->writeByte(_objectState[i]._click2);
-		out->writeByte(_objectState[i]._section);
-		out->writeSint32LE(_objectState[i]._exitRoom);
-		out->writeByte(_objectState[i]._direction);
-	}
-
-	out->writeByte(_seen);
-
-	return !out->err();
-}
-
-bool Room::deserialize(Common::ReadStream *in, int version) {
-	if (in->err())
-		return false;
-
-	in->readSint32LE();
-
-	for (int i = 0; i < kMaxSection; ++i)
-		_shown[i] = in->readByte();
-
-	// Prior to version 3, _sentenceRemoved was part of _shown (the last two values)
-	// But on the other hand dialog was not implemented anyway, so we don't even try to
-	// recover it.
-	for (int i = 0; i < kMaxDialog ; ++i)
-		_sentenceRemoved[i] = version < 3 ? 0 : in->readByte();
-
-	int numObjects = in->readSint32LE();
-	for (int i = 0; i < numObjects; ++i) {
-		_objectState[i]._name = static_cast<StringId>(in->readSint32LE());
-		_objectState[i]._description = static_cast<StringId>(in->readSint32LE());
-		_objectState[i]._roomId = in->readByte();
-		_objectState[i]._id = static_cast<ObjectId>(in->readSint32LE());
-		_objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
-		_objectState[i]._click = in->readByte();
-		_objectState[i]._click2 = in->readByte();
-		_objectState[i]._section = in->readByte();
-		_objectState[i]._exitRoom = static_cast<RoomId>(in->readSint32LE());
-		_objectState[i]._direction = in->readByte();
-	}
-
-	_seen = in->readByte();
-
-	return !in->err();
-}
-
-bool Room::hasSeen() {
-	return _seen;
-}
-void Room::setRoomSeen(bool seen) {
-	_seen = seen;
-}
-
-int Room::getFileNumber() const {
-	return _fileNumber;
-}
-RoomId Room::getId() const {
-	return _id;
-}
-
-void Room::setSectionVisible(uint section, bool visible) {
-	_shown[section] = visible ? kShownTrue : kShownFalse;
-}
-
-bool Room::isSectionVisible(uint index) const {
-	return _shown[index] == kShownTrue;
-}
-
-void Room::removeSentence(int sentence, int number) {
-	if (number > 0)
-		_sentenceRemoved[number - 1] |= (1 << sentence);
-}
-
-void Room::addSentence(int sentence, int number) {
-	if (number > 0)
-		_sentenceRemoved[number - 1] &= ~(1 << sentence);
-}
-
-void Room::addAllSentences(int number) {
-	if (number > 0)
-		_sentenceRemoved[number - 1] = 0;
-}
-
-bool Room::sentenceRemoved(int sentence, int number) {
-	if (number <= 0)
-		return false;
-	return (_sentenceRemoved[number - 1] & (1 << sentence));
-}
-
-bool Room::allSentencesRemoved(int maxSentence, int number) {
-	if (number <= 0)
-		return false;
-	for (int i = 0, flag = 1 ; i < maxSentence ; ++i, flag <<= 1)
-		if (!(_sentenceRemoved[number - 1] & flag))
-			return false;
-	return true;
-}
-
-Object *Room::getObject(uint index) {
-	return &_objectState[index];
-}
-
-void Room::animation() {
-}
-
-void Room::onEntrance() {
-}
-
-bool Room::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-
 Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
index 95e2078..c49e835 100644
--- a/engines/supernova/rooms.h
+++ b/engines/supernova/rooms.h
@@ -26,6 +26,7 @@
 #include "common/str.h"
 
 #include "supernova/msn_def.h"
+#include "supernova/room.h"
 
 namespace Common {
 class ReadStream;
@@ -37,43 +38,6 @@ namespace Supernova {
 class GameManager1;
 class SupernovaEngine;
 
-class Room {
-public:
-	Room();
-
-	bool hasSeen();
-	void setRoomSeen(bool seen);
-	int getFileNumber() const;
-	RoomId getId() const;
-	void setSectionVisible(uint section, bool visible);
-	bool isSectionVisible(uint index) const;
-	void removeSentence(int sentence, int number);
-	void addSentence(int sentence, int number);
-	void addAllSentences(int number);
-	bool sentenceRemoved(int sentence, int number);
-	bool allSentencesRemoved(int maxSentence, int number);
-	Object *getObject(uint index);
-
-	virtual ~Room();
-	virtual void animation();
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual bool serialize(Common::WriteStream *out);
-	virtual bool deserialize(Common::ReadStream *in, int version);
-
-protected:
-	int _fileNumber;
-	bool _shown[kMaxSection];
-	byte _sentenceRemoved[kMaxDialog];
-	Object _objectState[kMaxObject];
-	RoomId _id;
-	SupernovaEngine *_vm;
-	GameManager1 *_gm;
-
-private:
-	bool _seen;
-};
-
 // Room 0
 class Intro : public Room {
 public:
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
index 51dab06..cb38c2a 100644
--- a/engines/supernova/state.h
+++ b/engines/supernova/state.h
@@ -28,6 +28,7 @@
 #include "common/rect.h"
 #include "common/keyboard.h"
 #include "supernova/rooms.h"
+#include "supernova/room.h"
 #include "supernova/sound.h"
 #include "supernova/game-manager.h"
 


Commit: 33d7391f4a3cd5ee457e29eef0072634cbda8922
    https://github.com/scummvm/scummvm/commit/33d7391f4a3cd5ee457e29eef0072634cbda8922
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Move part 1 files to it's own directory

Changed paths:
  A engines/supernova/supernova1/rooms.cpp
  A engines/supernova/supernova1/rooms.h
  A engines/supernova/supernova1/state.cpp
  A engines/supernova/supernova1/state.h
  R engines/supernova/rooms.cpp
  R engines/supernova/rooms.h
  R engines/supernova/state.cpp
  R engines/supernova/state.h
    engines/supernova/console.cpp
    engines/supernova/game-manager.h
    engines/supernova/module.mk
    engines/supernova/room.cpp
    engines/supernova/screen.cpp
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h


diff --git a/engines/supernova/console.cpp b/engines/supernova/console.cpp
index 9e7c15c..39cbf73 100644
--- a/engines/supernova/console.cpp
+++ b/engines/supernova/console.cpp
@@ -23,7 +23,7 @@
 #include "gui/debugger.h"
 
 #include "supernova/supernova.h"
-#include "supernova/state.h"
+#include "supernova/game-manager.h"
 #include "supernova/console.h"
 
 namespace Supernova {
diff --git a/engines/supernova/game-manager.h b/engines/supernova/game-manager.h
index 585d9d2..26c7a9e 100644
--- a/engines/supernova/game-manager.h
+++ b/engines/supernova/game-manager.h
@@ -27,7 +27,7 @@
 #include "common/rect.h"
 #include "common/keyboard.h"
 #include "common/error.h"
-#include "supernova/rooms.h"
+#include "supernova/room.h"
 #include "supernova/sound.h"
 
 namespace Supernova {
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index 3eb2259..2665af4 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -6,11 +6,11 @@ MODULE_OBJS := \
 	graphics.o \
 	resman.o \
 	room.o \
-	rooms.o \
+	supernova1/rooms.o \
 	screen.o \
 	sound.o \
 	game-manager.o \
-	state.o \
+	supernova1/state.o \
 	supernova.o
 
 MODULE_DIRS += \
diff --git a/engines/supernova/room.cpp b/engines/supernova/room.cpp
index 24e1aa5..5ac00f15 100644
--- a/engines/supernova/room.cpp
+++ b/engines/supernova/room.cpp
@@ -26,7 +26,7 @@
 
 #include "supernova/screen.h"
 #include "supernova/supernova.h"
-#include "supernova/state.h"
+#include "supernova/game-manager.h"
 
 namespace Supernova {
 
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp
deleted file mode 100644
index 04d8e8d..0000000
--- a/engines/supernova/rooms.cpp
+++ /dev/null
@@ -1,4164 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/system.h"
-#include "graphics/palette.h"
-#include "graphics/cursorman.h"
-
-#include "supernova/screen.h"
-#include "supernova/supernova.h"
-#include "supernova/state.h"
-
-namespace Supernova {
-
-Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = -1;
-	_id = INTRO;
-	_shown[0] = kShownFalse;
-
-	_objectState[0] =
-	Object(_id, kStringKeycard, kStringKeycardDescription, KEYCARD,
-		   TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
-	_objectState[1] =
-	Object(_id, kStringKnife, kStringKnifeDescription, KNIFE,
-		   TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
-	_objectState[2] =
-	Object(_id, kStringWatch, kStringDefaultDescription, WATCH,
-		   TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
-	_objectState[3] =
-	Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN,
-		   TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
-	_objectState[4] =
-	Object(_id, kStringInventoryMoney, kStringDefaultDescription, MONEY,
-		   TAKE | COMBINABLE, 255, 255, 0);
-
-	_shouldExit = false;
-
-	_introText =
-		_vm->getGameString(kStringIntro1) + '\0' +
-		_vm->getGameString(kStringIntro2) + '\0' +
-		_vm->getGameString(kStringIntro3) + '\0' +
-		_vm->getGameString(kStringIntro4) + '\0' +
-		_vm->getGameString(kStringIntro5) + '\0' +
-		_vm->getGameString(kStringIntro6) + '\0' +
-		_vm->getGameString(kStringIntro7) + '\0' +
-		_vm->getGameString(kStringIntro8) + '\0' +
-		_vm->getGameString(kStringIntro9) + '\0' +
-		_vm->getGameString(kStringIntro10) + '\0' +
-		_vm->getGameString(kStringIntro11) + '\0' +
-		_vm->getGameString(kStringIntro12) + '\0' +
-		_vm->getGameString(kStringIntro13) + '\0';
-}
-
-void Intro::onEntrance() {
-	_gm->_guiEnabled = false;
-	_vm->_allowSaveGame = false;
-	_vm->_allowLoadGame = false;
-	titleScreen();
-	cutscene();
-	leaveCutscene();
-}
-
-void Intro::titleScreen() {
-	// Newspaper
-	CursorMan.showMouse(false);
-	_vm->_screen->setViewportBrightness(0);
-	_vm->_screen->setGuiBrightness(0);
-	_vm->paletteBrightness();
-	_vm->setCurrentImage(1);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_gm->getInput();
-	_vm->paletteFadeOut();
-
-	// Title Screen
-	_vm->setCurrentImage(31);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_gm->wait(1);
-	_vm->playSound(kAudioVoiceSupernova);
-	while (_vm->_sound->isPlaying())
-		_gm->wait(1);
-	titleFadeIn();
-	_vm->renderText(kStringTitleVersion, 295, 190, kColorWhite44);
-	const Common::String& title1 = _vm->getGameString(kStringTitle1);
-	const Common::String& title2 = _vm->getGameString(kStringTitle2);
-	const Common::String& title3 = _vm->getGameString(kStringTitle3);
-	_vm->_screen->renderText(title1, 78 - Screen::textWidth(title1) / 2, 120, kColorLightBlue);
-	_vm->_screen->renderText(title2, 78 - Screen::textWidth(title2) / 2, 132, kColorWhite99);
-	_vm->_screen->renderText(title3, 78 - Screen::textWidth(title3) / 2, 142, kColorWhite99);
-	_gm->wait(1);
-	CursorMan.showMouse(true);
-	_vm->playSound(kMusicIntro);
-
-	Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
-	while (!_vm->shouldQuit()) {
-		_gm->updateEvents();
-		marquee.renderCharacter();
-		if (_gm->_mouseClicked || _gm->_keyPressed)
-			break;
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	_vm->playSound(kAudioVoiceYeah);
-	while (_vm->_sound->isPlaying())
-		_gm->wait(1);
-	_vm->paletteFadeOut();
-}
-
-void Intro::titleFadeIn() {
-	byte titlePaletteColor[] = {0xfe, 0xeb};
-	byte titleNewColor[2][3] = {{255, 255, 255}, {199, 21, 21}};
-	byte newColors[2][3];
-
-	for (int brightness = 1; brightness <= 40; ++brightness) {
-		for (int colorIndex = 0; colorIndex < 2; ++colorIndex) {
-			for (int i = 0; i < 3; ++i) {
-				newColors[colorIndex][i] = (titleNewColor[colorIndex][i] * brightness) / 40;
-			}
-		}
-
-		_vm->_system->getPaletteManager()->setPalette(newColors[0], titlePaletteColor[0], 1);
-		_vm->_system->getPaletteManager()->setPalette(newColors[1], titlePaletteColor[1], 1);
-		_vm->_system->updateScreen();
-		_vm->_system->delayMillis(_vm->_delay);
-	}
-}
-
-bool Intro::animate(int section1, int section2, int duration) {
-	Common::KeyCode key = Common::KEYCODE_INVALID;
-	while (duration) {
-		_vm->renderImage(section1);
-		if (_gm->waitOnInput(2, key))
-			return key != Common::KEYCODE_ESCAPE;
-		_vm->renderImage(section2);
-		if (_gm->waitOnInput(2, key))
-			return key != Common::KEYCODE_ESCAPE;
-		--duration;
-	}
-	return true;
-}
-
-bool Intro::animate(int section1, int section2, int duration,
-					MessagePosition position, StringId textId) {
-	Common::KeyCode key = Common::KEYCODE_INVALID;
-	const Common::String& text = _vm->getGameString(textId);
-	_vm->renderMessage(text, position);
-	int delay = (MIN(text.size(), (uint)512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
-	while (delay) {
-		if (section1)
-			_vm->renderImage(section1);
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
-		}
-		if (section2)
-			_vm->renderImage(section2);
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
-		}
-		--delay;
-	}
-	_vm->removeMessage();
-	return true;
-}
-
-bool Intro::animate(int section1, int section2, int section3, int section4,
-					int duration, MessagePosition position, StringId textId) {
-	Common::KeyCode key = Common::KEYCODE_INVALID;
-	const Common::String& text = _vm->getGameString(textId);
-	_vm->renderMessage(text, position);
-	if (duration == 0)
-		duration = (MIN(text.size(), (uint)512) + 20) * _vm->_textSpeed / 40;
-
-	while(duration) {
-		_vm->renderImage(section1);
-		_vm->renderImage(section3);
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
-		}
-		_vm->renderImage(section2);
-		_vm->renderImage(section4);
-		if (_gm->waitOnInput(2, key)) {
-			_vm->removeMessage();
-			return key != Common::KEYCODE_ESCAPE;
-		}
-		duration--;
-	}
-	_vm->removeMessage();
-	return true;
-}
-
-void Intro::cutscene() {
-#define exitOnEscape(X) do { \
-	Common::KeyCode key = Common::KEYCODE_INVALID; \
-	if ((_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) || _vm->shouldQuit()) { \
-		CursorMan.showMouse(true); \
-		return; \
-	} \
-} while (0);
-
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->setCurrentImage(31);
-	_vm->_screen->setGuiBrightness(255);
-	_vm->paletteBrightness();
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene1))
-		return;
-	_vm->_screen->setGuiBrightness(0);
-	_vm->paletteBrightness();
-	exitOnEscape(1);
-
-	_vm->setCurrentImage(9);
-	_vm->renderImage(0);
-	_vm->renderImage(1);
-	_vm->renderImage(9);
-	_vm->paletteFadeIn();
-	if (!animate(11, 10, 6, kMessageRight, kStringIntroCutscene2))
-		return;
-	_vm->renderImage(3);
-	exitOnEscape(4);
-	_vm->renderImage(4);
-	if (!animate(11, 10, 3)) {// test duration
-		_vm->removeMessage();
-		return;
-	}
-	_vm->removeMessage();
-	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
-		return;
-	_vm->renderImage(3);
-	exitOnEscape(3);
-	_vm->renderImage(2);
-	exitOnEscape(3);
-	_vm->renderImage(7);
-	exitOnEscape(6);
-	_vm->renderImage(6);
-	exitOnEscape(6);
-	if (!animate(0, 0, 0, kMessageLeft, kStringIntroCutscene4))
-		return;
-	_vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
-	exitOnEscape(28);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringIntroCutscene6, kMessageLeft);
-	exitOnEscape(28);
-	_vm->removeMessage();
-
-	StringId textCounting[4] =
-	{kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9, kStringIntroCutscene10};
-	_vm->setCurrentImage(31);
-	_vm->renderImage(0);
-	_vm->paletteBrightness();
-	for (int i = 0; i < 4; ++i){
-		_vm->renderMessage(textCounting[i], kMessageLeft);
-		for (int j = 0; j < 28; ++j) {
-			_vm->renderImage((j % 3) + 1);
-			Common::KeyCode key = Common::KEYCODE_INVALID;
-			if (_gm->waitOnInput(1, key)) {
-				if (key == Common::KEYCODE_ESCAPE)
-					return;
-				break;
-			}
-		}
-		_vm->removeMessage();
-	}
-	_vm->renderMessage(kStringIntroCutscene11, kMessageLeft);
-	_vm->renderImage(6);
-	exitOnEscape(3);
-	_vm->renderImage(3);
-	exitOnEscape(3);
-	_vm->renderImage(4);
-	exitOnEscape(3);
-	_vm->renderImage(5);
-	exitOnEscape(3);
-	_vm->renderImage(_gm->invertSection(5));
-	exitOnEscape(18);
-	_vm->removeMessage();
-
-	_vm->setCurrentImage(9);
-	_vm->renderImage(0);
-	_vm->renderImage(1);
-	_vm->renderImage(9);
-	_vm->paletteBrightness();
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-	_vm->paletteBrightness();
-	if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene12))
-		return;
-	_vm->renderImage(3);
-	exitOnEscape(3);
-	_vm->renderImage(4);
-	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene13))
-		return;
-	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene14))
-		return;
-	_vm->renderImage(12);
-	exitOnEscape(2);
-	_vm->renderImage(13);
-	exitOnEscape(2);
-	_vm->renderImage(14);
-	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene15))
-		return;
-	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene16))
-		return;
-	exitOnEscape(20);
-	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene17))
-		return;
-	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene18))
-		return;
-	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene19))
-		return;
-	_vm->renderImage(16);
-	exitOnEscape(3);
-	_vm->renderImage(17);
-	if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene20))
-		return;
-	if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene21))
-		return;
-	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
-		return;
-	_vm->renderImage(3);
-	exitOnEscape(3);
-	_vm->renderImage(2);
-	exitOnEscape(3);
-	_vm->renderImage(8);
-	exitOnEscape(6);
-	_vm->renderImage(6);
-	_vm->playSound(kAudioSiren);
-
-	exitOnEscape(6);
-	_vm->renderImage(3);
-	exitOnEscape(3);
-	_vm->renderImage(4);
-	_vm->renderImage(16);
-	exitOnEscape(3);
-	_vm->renderImage(15);
-	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene22))
-		return;
-	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene23))
-		return;
-	exitOnEscape(10);
-	_vm->renderImage(13);
-	exitOnEscape(2);
-	_vm->renderImage(12);
-	exitOnEscape(2);
-	_vm->renderImage(9);
-	if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene24))
-		return;
-	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
-		return;
-	_vm->paletteFadeOut();
-
-	while (_vm->_sound->isPlaying())
-		exitOnEscape(1);
-
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->_screen->setGuiBrightness(255);
-	_vm->paletteBrightness();
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene25))
-		return;
-	_vm->_screen->setGuiBrightness(5);
-	_vm->paletteBrightness();
-
-	_vm->setCurrentImage(31);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene26))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene27))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene28))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene29))
-		return;
-	exitOnEscape(54);
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene30))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene31))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene32))
-		return;
-
-	CursorMan.showMouse(false);
-	_vm->_screen->setViewportBrightness(0);
-	_vm->paletteBrightness();
-	exitOnEscape(10);
-	_vm->playSound(kAudioSnoring);
-	while (_vm->_sound->isPlaying())
-		_gm->wait(1);
-	exitOnEscape(10);
-	_vm->playSound(kAudioSnoring);
-	while (_vm->_sound->isPlaying())
-		_gm->wait(1);
-	exitOnEscape(10);
-	_vm->playSound(kAudioSnoring);
-	while (_vm->_sound->isPlaying())
-		_gm->wait(1);
-	exitOnEscape(30);
-	CursorMan.showMouse(true);
-
-	_vm->setCurrentImage(22);
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene33))
-		return;
-	exitOnEscape(18);
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene34))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene35))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene36))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene37))
-		return;
-	exitOnEscape(18);
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene38))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene39))
-		return;
-	exitOnEscape(18);
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene40))
-		return;
-	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene41))
-		return;
-	exitOnEscape(36);
-	animate(0, 0, 0, kMessageNormal, kStringIntroCutscene42);
-	_vm->removeMessage();
-
-#undef exitOnEscape
-}
-
-void Intro::leaveCutscene() {
-	_vm->_screen->setViewportBrightness(255);
-	_vm->removeMessage();
-	_gm->changeRoom(CABIN_R3);
-	_gm->_guiEnabled = true;
-	_vm->_allowSaveGame = true;
-	_vm->_allowLoadGame = true;
-}
-
-ShipCorridor::ShipCorridor(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 17;
-	_id = CORRIDOR;
-	_shown[0] = kShownTrue;
-	_shown[4] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringHatch, kStringDefaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
-	_objectState[1] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
-	_objectState[2] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
-	_objectState[3] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
-	_objectState[4] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
-	_objectState[5] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
-	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
-	_objectState[7] = Object(_id, kStringButton, kStringHatchButtonDescription, BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
-	_objectState[8] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
-	_objectState[9] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
-}
-
-bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
-		if (_objectState[6].hasProperty(OPENED)) {
-			_vm->playSound(kAudioSlideDoor);
-			_objectState[6].disableProperty(OPENED);
-			_vm->renderImage(8);
-			setSectionVisible(9, false);
-			_gm->wait(2);
-			_vm->renderImage(7);
-			setSectionVisible(8, false);
-			_gm->wait(2);
-			_vm->renderImage(_gm->invertSection(7));
-		} else {
-			_vm->playSound(kAudioSlideDoor);
-			_objectState[6].setProperty(OPENED);
-			_vm->renderImage(7);
-			_gm->wait(2);
-			_vm->renderImage(8);
-			setSectionVisible(7, false);
-			_gm->wait(2);
-			_vm->renderImage(9);
-			setSectionVisible(8, false);
-		}
-		return true;
-	}
-	return false;
-}
-
-ShipHall::ShipHall(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 15;
-	_id = HALL;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringHatch, kStringCockpitHatchDescription, NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
-	_objectState[1] = Object(_id, kStringHatch, kStringKitchenHatchDescription, KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
-	_objectState[2] = Object(_id, kStringHatch, kStringStasisHatchDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
-	_objectState[3] = Object(_id, kStringSlot, kStringSlotDescription, SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
-	_objectState[4] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
-	_objectState[5] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
-}
-
-bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
-		_vm->renderMessage(kStringShipHall1);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
-		if (_objectState[2].hasProperty(OPENED)) {
-			_objectState[2].disableProperty(OPENED);
-			_vm->renderImage(3);
-			setSectionVisible(4, false);
-			_gm->wait(2);
-			_vm->renderImage(2);
-			setSectionVisible(3, false);
-			_gm->wait(2);
-			_vm->renderImage(_gm->invertSection(2));
-		} else {
-			_objectState[2].setProperty(OPENED);
-			_vm->renderImage(2);
-			_gm->wait(2);
-			_vm->renderImage(3);
-			setSectionVisible(2, false);
-			_gm->wait(2);
-			_vm->renderImage(4);
-			setSectionVisible(3, false);
-			_gm->great(1);
-		}
-	} else {
-		return false;
-	}
-
-	return true;
-}
-
-ShipSleepCabin::ShipSleepCabin(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 33;
-	_id = SLEEP;
-	_shown[0] = kShownTrue;
-	_color = kColorBlack;
-
-	_objectState[0] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
-	_objectState[1] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
-	_objectState[2] = Object(_id, kStringComputer, kStringDefaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
-	_objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
-}
-
-bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
-	Room *room;
-	Common::String input;
-
-	if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
-		_gm->_guiEnabled = false;
-		setSectionVisible(4, false);
-		g_system->fillScreen(kColorDarkBlue);
-		if (_gm->_state._arrivalDaysLeft == 0) {
-			// Destination reached
-			_vm->renderText(kStringShipSleepCabin1, 60, 95, kColorWhite99);
-			_gm->getInput();
-		} else if (_gm->_state._powerOff) {
-			// Energy depleted
-			_vm->renderText(kStringShipSleepCabin2, 60, 95, kColorWhite99);
-			// Artificial coma interrupted
-			_vm->renderText(kStringShipSleepCabin3, 60, 115, kColorWhite99);
-			_gm->getInput();
-		} else if (isSectionVisible(5)) {
-			// Sleep duration in days
-			_vm->renderText(kStringShipSleepCabin4, 30, 85, kColorWhite99);
-			_vm->renderText(Common::String::format("%d",_gm->_state._timeSleep).c_str(),
-							150, 85, kColorWhite99);
-			_vm->renderText(kStringShipSleepCabin5, 30, 105, kColorWhite99);
-			_gm->getInput();
-		} else {
-			_vm->renderText(kStringShipSleepCabin6, 100, 85, kColorWhite99);
-			_gm->edit(input, 100, 105, 30);
-
-			input.toUppercase();
-			if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
-				if (input == _vm->getGameString(kStringComputerPassword)) {
-					_gm->great(6);
-					g_system->fillScreen(kColorDarkBlue);
-					_vm->renderText(kStringShipSleepCabin7, 30, 85, kColorWhite99);
-					uint daysSleep = 0;
-					do {
-						input.clear();
-						_vm->renderBox(150, 85, 150, 8, kColorDarkBlue);
-						_gm->edit(input, 150, 85, 10);
-
-						if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
-							break;
-						} else {
-							daysSleep = input.asUint64();
-							for (uint i = 0; i < input.size(); i++) {
-								if (!Common::isDigit(input[i])) {
-									daysSleep = 0;
-									break;
-								}
-							}
-						}
-						if (daysSleep != 0) {
-							_gm->_state._timeSleep = daysSleep;
-							_vm->renderText(kStringShipSleepCabin8, 30, 105, kColorWhite99);
-							_gm->wait(18);
-							setSectionVisible(5, true);
-						}
-					} while (daysSleep == 0);
-				} else {
-					_vm->renderText(kStringShipSleepCabin9, 100, 125, kColorLightRed);
-					_gm->wait(18);
-				}
-			}
-		}
-
-		_gm->_guiEnabled = true;
-		input.clear();
-	} else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
-			   ((obj1._id == CABINS) || (obj1._id == CABIN))) {
-		room = _gm->_rooms[AIRLOCK];
-		if (!(obj1._id == CABIN) || !isSectionVisible(5)) {
-			_vm->renderMessage(kStringShipSleepCabin10);
-		} else if (room->getObject(5)->hasProperty(WORN)) {
-			_vm->renderMessage(kStringShipSleepCabin11);
-		} else {
-			_vm->paletteFadeOut();
-			_vm->renderImage(_gm->invertSection(5));
-			_vm->renderImage(_gm->invertSection(4));
-			room = _gm->_rooms[GENERATOR];
-			int32 *energyDaysLeft;
-			if (room->isSectionVisible(9)) {
-				energyDaysLeft = &_gm->_state._landingModuleEnergyDaysLeft;
-			} else {
-				energyDaysLeft = &_gm->_state._shipEnergyDaysLeft;
-			}
-			if (_gm->_state._timeSleep > _gm->_state._arrivalDaysLeft) {
-				_gm->_state._timeSleep = _gm->_state._arrivalDaysLeft;
-			}
-			if (_gm->_state._timeSleep >= *energyDaysLeft) {
-				_gm->_state._timeSleep = *energyDaysLeft;
-				if (room->isSectionVisible(9)) {
-					room = _gm->_rooms[LANDINGMODULE]; // Monitors off
-					room->setSectionVisible(2, false);
-					room->setSectionVisible(7, false);
-					room->setSectionVisible(8, false);
-					room->setSectionVisible(9, false);
-					room->setSectionVisible(10, false);
-				}
-			}
-			if (_gm->_state._timeSleep == _gm->_state._arrivalDaysLeft) {
-				_vm->renderImage(3);
-				room = _gm->_rooms[COCKPIT];
-				room->setSectionVisible(23, true);
-				room = _gm->_rooms[CABIN_R2];
-				room->setSectionVisible(5, false);
-				room->setSectionVisible(6, true);
-				room->getObject(2)->_click = 10;
-				room = _gm->_rooms[HOLD];
-				room->setSectionVisible(0, false);
-				room->setSectionVisible(1, true);
-				room->getObject(1)->_click = 255;
-				room->getObject(3)->_click = 255;
-				room = _gm->_rooms[GENERATOR];
-				room->setSectionVisible(6, false);
-				room->setSectionVisible(7, true);
-				room->getObject(1)->_click = 14;
-				if (room->isSectionVisible(1)) {
-					room->setSectionVisible(10, true);
-				}
-				if (room->isSectionVisible(12)) {
-					room->setSectionVisible(12, false);
-					room->setSectionVisible(11, true);
-				}
-			}
-			_gm->_state._arrivalDaysLeft -= _gm->_state._timeSleep;
-			*energyDaysLeft -= _gm->_state._timeSleep;
-			_gm->_time = ticksToMsec(786520); // 12pm
-			_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
-			if (*energyDaysLeft == 0) {
-				_gm->turnOff();
-				room = _gm->_rooms[GENERATOR];
-				room->setSectionVisible(4, room->isSectionVisible(2));
-			}
-			if (_gm->_state._arrivalDaysLeft == 0) {
-				_gm->saveTime();
-				if (!_vm->saveGame(kSleepAutosaveSlot, "Sleep autosave"))
-					_vm->errorTempSave(true);
-				_gm->_state._dream = true;
-				_gm->loadTime();
-			}
-			_gm->wait(18);
-			_vm->paletteFadeIn();
-			if (_gm->_state._arrivalDaysLeft == 0) {
-				_vm->playSound(kAudioCrash);
-				_gm->screenShake();
-				_gm->wait(18);
-				_vm->renderMessage(kStringShipSleepCabin12);
-			}
-		}
-	} else {
-		return false;
-	}
-
-	return true;
-}
-
-void ShipSleepCabin::animation() {
-	if (_gm->_state._powerOff && _gm->_state._arrivalDaysLeft) {
-		if (_gm->_guiEnabled) {
-			if (isSectionVisible(1)) {
-				_vm->renderImage(2);
-				setSectionVisible(1, false);
-			} else {
-				_vm->renderImage(1);
-				setSectionVisible(2, false);
-			}
-		} else {
-			if (_color == kColorLightRed) {
-				_color = kColorDarkBlue;
-			} else {
-				_color = kColorLightRed;
-			}
-
-			_vm->renderText(kStringShipSleepCabin13, 60, 75, _color);
-		}
-	} else if (isSectionVisible(5) && _gm->_guiEnabled) {
-		if (isSectionVisible(4))
-			_vm->renderImage(_gm->invertSection(4));
-		else
-			_vm->renderImage(4);
-	}
-
-	_gm->setAnimationTimer(6);
-}
-void ShipSleepCabin::onEntrance() {
-	if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
-		_vm->renderMessage(kStringShipSleepCabin14);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_vm->renderMessage(kStringShipSleepCabin15);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_vm->renderMessage(kStringShipSleepCabin16);
-		_gm->_state._dream = false;
-	}
-}
-
-ShipCockpit::ShipCockpit(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 9;
-	_id = COCKPIT;
-	_shown[0] = kShownTrue;
-	_color = kColorBlack;
-
-	_objectState[0] = Object(_id, kStringInstruments, kStringInstrumentsDescription1, INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
-	_objectState[1] = Object(_id, kStringMonitor, kStringDefaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
-	_objectState[2] = Object(_id, kStringMonitor, kStringMonitorDescription, NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
-	_objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
-}
-
-bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
-	// TODO: distance and remaining time not accurate
-
-	if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
-		char c[2] = {0, 0};
-		_gm->_guiEnabled = false;
-		_vm->renderBox(0, 0, 320, 200, kColorBlack);
-		_vm->renderText(kStringShipCockpit1, 50, 50, kColorLightYellow);
-		if (_gm->_state._arrivalDaysLeft)
-			_vm->renderText(kStringShipCockpit2);
-		else
-			_vm->renderText(kStringShipCockpit3);
-		_vm->renderText(kStringShipCockpit4, 50, 70, kColorLightYellow);
-		_vm->renderText(kStringShipCockpit5, 50, 90, kColorLightYellow);
-		_vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft / 400).c_str());
-		_vm->renderText(",");
-		c[0] = (_gm->_state._arrivalDaysLeft / 40) % 10 + '0';
-		_vm->renderText(c);
-		c[0] = (_gm->_state._arrivalDaysLeft / 4) % 10 + '0';
-		_vm->renderText(c);
-		_vm->renderText(kStringShipCockpit6);
-		_vm->renderText(kStringShipCockpit7, 50, 110, kColorLightYellow);
-		_vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft).c_str(),
-						50, 120, kColorLightYellow);
-		_vm->renderText(kStringShipCockpit8);
-
-		_gm->getInput();
-		_gm->_guiEnabled = true;
-	} else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
-		_vm->renderMessage(kStringShipCockpit9);
-	else
-		return false;
-
-	return true;
-}
-void ShipCockpit::animation() {
-	if (!_gm->_guiEnabled) {
-		if (_color) {
-			_color = kColorBlack;
-			_gm->setAnimationTimer(5);
-		} else {
-			_color = kColorLightYellow;
-			_gm->setAnimationTimer(10);
-		}
-		_vm->renderText(kStringShipCockpit10, 50, 145, _color);
-	} else if (isSectionVisible(21)) {
-		_vm->renderImage(_gm->invertSection(21));
-		_gm->setAnimationTimer(5);
-	} else {
-		_vm->renderImage(21);
-		_gm->setAnimationTimer(10);
-	}
-
-	if (_gm->_state._powerOff) {
-		if (!_gm->_guiEnabled) {
-			_vm->renderText(kStringShipCockpit11, 97, 165, _color);
-			_vm->renderText(kStringShipCockpit12, 97, 175, _color);
-		} else if (isSectionVisible(21))
-			_vm->renderImage(22);
-		else
-			_vm->renderImage(_gm->invertSection(22));
-	}
-}
-
-void ShipCockpit::onEntrance() {
-	if (!hasSeen())
-		_vm->renderMessage(kStringShipCockpit13);
-	setRoomSeen(true);
-}
-
-ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 21;
-	_id = CABIN_L1;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringImage, kStringGenericDescription1, NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
-	_objectState[1] = Object(_id, kStringImage, kStringGenericDescription2, NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
-	_objectState[2] = Object(_id, kStringImage, kStringGenericDescription3, NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
-	_objectState[3] = Object(_id, kStringMagnete, kStringMagneteDescription, NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
-	_objectState[4] = Object(_id, kStringImage, kStringGenericDescription4, NULLOBJECT, UNNECESSARY, 9, 9, 0);
-	_objectState[5] = Object(_id, kStringPen, kStringPenDescription, PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
-	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
-	_objectState[7] = Object(_id, kStringSlot, kStringSlotDescription, NULLOBJECT, COMBINABLE, 0, 0, 0);
-	_objectState[8] = Object(_id, kStringShelf, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
-	_objectState[9] = Object(_id, kStringCompartment, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
-	_objectState[10] = Object(_id, kStringSocket, kStringDefaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
-	_objectState[11] = Object(_id, kStringToilet, kStringDefaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
-}
-
-ShipCabinL2::ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 21;
-	_id = CABIN_L2;
-	_shown[0] = kShownTrue;
-	_shown[16] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL1,COMBINABLE,31,31,0);
-	_objectState[1] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL2,COMBINABLE,32,32,0);
-	_objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL3,COMBINABLE,33,33,0);
-	_objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL4,COMBINABLE,45,45,0);
-	_objectState[4] = Object(_id, kStringShelf,kStringDefaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
-	_objectState[5] = Object(_id, kStringPistol,kStringPistolDescription,PISTOL,TAKE,39,39,20);
-	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
-	_objectState[7] = Object(_id, kStringBooks,kStringBooksDescription,NULLOBJECT,UNNECESSARY,40,40,0);
-	_objectState[8] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
-	_objectState[9] = Object(_id, kStringSpool,kStringSpoolDescription, SPOOL,TAKE | COMBINABLE,41,41,21);
-	_objectState[10] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
-	_objectState[11] = Object(_id, kStringBook,kStringDefaultDescription,BOOK2,TAKE,46,46,23);
-	_objectState[12] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,34,34,0);
-	_objectState[13] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,35,35,0);
-	_objectState[14] = Object(_id, kStringClothes,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
-	_objectState[15] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,37,37,0);
-	_objectState[16] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,38,38,0);
-	_objectState[17] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,23,23,0);
-	_objectState[18] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
-	_objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
-	_objectState[20] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
-	_objectState[21] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
-	_objectState[22] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
-	_objectState[23] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
-	_objectState[24] = Object(_id, kStringFolders,kStringFoldersDescription,NULLOBJECT,UNNECESSARY,49,49,0);
-}
-
-bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL1, KEYCARD2)) {
-		_gm->openLocker(this, getObject(4), getObject(0), 17);
-		if (getObject(5)->_click == 255)
-			_vm->renderImage(20); // Remove Pistol
-		_gm->great(2);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
-		_gm->openLocker(this, getObject(6), getObject(1), 18);
-		_gm->great(2);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
-		_gm->openLocker(this, getObject(8), getObject(2), 19);
-		if (getObject(9)->_click == 255)
-			_vm->renderImage(21); // Remove cable spool
-		_gm->great(2);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
-		_gm->openLocker(this, getObject(10), getObject(3), 22);
-		if (getObject(11)->_click == 255)
-			_vm->renderImage(23); // Remove book
-		_gm->great(2);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
-		_gm->closeLocker(this, getObject(4), getObject(0), 17);
-		setSectionVisible(20, false);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
-		_gm->closeLocker(this, getObject(6), getObject(1), 18);
-	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L3)) {
-		_gm->closeLocker(this, getObject(8), getObject(2), 19);
-		setSectionVisible(21, false);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
-		_gm->closeLocker(this, getObject(10), getObject(3), 22);
-		setSectionVisible(23, false);
-	} else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) && !obj1.hasProperty(CARRIED)) {
-		getObject(8)->_click = 42;  // empty shelf
-		return false;
-	} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) && !obj1.hasProperty(CARRIED)) {
-		getObject(10)->_click = 47;  // empty shelf
-		return false;
-	} else
-		return false;
-
-	return true;
-}
-
-ShipCabinL3::ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 21;
-	_id = CABIN_L3;
-	_shown[0] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[7] = kShownTrue;
-	_shown[8] = kShownTrue;
-	_shown[9] = kShownTrue;
-	_shown[12] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringPoster,kStringPosterDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
-	_objectState[1] = Object(_id, kStringPoster,kStringPosterDescription2,NULLOBJECT,UNNECESSARY,12,12,0);
-	_objectState[2] = Object(_id, kStringSpeaker,kStringDefaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
-	_objectState[3] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,14,14,0);
-	_objectState[4] = Object(_id, kStringRecord,kStringRecordDescription,RECORD,TAKE | COMBINABLE,15,15,8 | 128);
-	_objectState[5] = Object(_id, kStringRecordStand,kStringRecordStandDescription,NULLOBJECT,UNNECESSARY,16,16,0);
-	_objectState[6] = Object(_id, kStringButton,kStringDefaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
-	_objectState[7] = Object(_id, kStringTurntable,kStringTurntableDescription,TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
-	_objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,WIRE,COMBINABLE,18,18,0);
-	_objectState[9] = Object(_id, kStringWire,kStringDefaultDescription,WIRE2,COMBINABLE,19,19,0);
-	_objectState[10] = Object(_id, kStringPlug,kStringDefaultDescription,PLUG,COMBINABLE,20,20,0);
-	_objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
-	_objectState[12] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
-	_objectState[13] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
-	_objectState[14] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
-	_objectState[15] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
-	_objectState[16] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
-}
-
-bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
-	Room *r;
-
-	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
-		if (!_gm->_guiEnabled || isSectionVisible(15))
-			_vm->renderMessage(kStringShipCabinL3_1);
-		else {
-			if (!getObject(4)->hasProperty(CARRIED))
-				_vm->renderImage(_gm->invertSection(8));
-			else
-				_gm->_inventory.remove(*getObject(4));
-			_vm->renderImage(15);
-			getObject(4)->_click = 48;
-		}
-	} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
-		if (!isSectionVisible(15)) {
-			_vm->renderMessage(kStringShipCabinL3_2);
-		} else if (!isSectionVisible(10) && !isSectionVisible(11) && isSectionVisible(12)) {
-			_vm->renderImage(14);
-			setSectionVisible(15, false);
-			for (int i = 3; i; i--) {
-				_vm->playSound(kAudioTurntable);
-				while (_vm->_sound->isPlaying()) {
-					if (isSectionVisible(13)) {
-						_vm->renderImage(14);
-						setSectionVisible(13, false);
-					} else {
-						_vm->renderImage(13);
-						setSectionVisible(14, false);
-					}
-					_gm->wait(3);
-				}
-			}
-
-			_vm->renderImage(15);
-			setSectionVisible(14, false);
-			setSectionVisible(13, false);
-			_vm->renderMessage(kStringShipCabinL3_3);
-		}
-	} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) && (obj1._click != 15)) {
-		_vm->renderImage(9);
-		setSectionVisible(13, false);
-		setSectionVisible(14, false);
-		setSectionVisible(15, false);
-		obj1._section = 0;
-		_gm->takeObject(obj1);
-	} else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
-		_vm->renderImage(10);
-		setSectionVisible(7, false);
-		obj1._click = 21;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
-		_vm->renderImage(7);
-		setSectionVisible(10, false);
-		getObject(10)->_click = 20;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
-		_vm->renderMessage(kStringShipCabinL3_4); // cutting near plug
-	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
-		r = _gm->_rooms[AIRLOCK];
-		if (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
-			_vm->renderImage(25);
-			_gm->shock();
-		}
-		_vm->renderImage(11);
-		_vm->renderImage(26);
-		setSectionVisible(12, false);
-	} else if ((verb == ACTION_TAKE) && ((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
-		if (isSectionVisible(10) && isSectionVisible(11)) {
-			_vm->renderImage(_gm->invertSection(10));
-			_vm->renderImage(_gm->invertSection(11));
-			getObject(8)->_name = kStringWireAndPlug;
-			_gm->takeObject(*getObject(8));
-			getObject(9)->_click = 255;
-			getObject(10)->_click = 255;
-		} else
-			_vm->renderMessage(kStringShipCabinL3_5);
-	} else
-		return false;
-
-	return true;
-}
-
-ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 22;
-	_id = CABIN_R1;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[2] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringImage,kStringImageDescription1,NULLOBJECT,UNNECESSARY,5,5,0);
-	_objectState[1] = Object(_id, kStringDrawingInstruments,kStringDrawingInstrumentsDescription,NULLOBJECT,UNNECESSARY,6,6,0);
-	_objectState[2] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,7,7,0);
-	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
-	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
-	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
-	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
-	_objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
-	_objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
-}
-
-ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 22;
-	_id = CABIN_R2;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
-	_objectState[1] = Object(_id, kStringTennisRacket,kStringTennisRacketDescription,NULLOBJECT,UNNECESSARY,8,8,0);
-	_objectState[2] = Object(_id, kStringTennisBall,kStringGenericDescription2,NULLOBJECT,UNNECESSARY,9,9,0);
-	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
-	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
-	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
-	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
-	_objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
-	_objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
-}
-
-ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 22;
-	_id = CABIN_R3;
-	_shown[0] = kShownTrue;
-	_shown[7] = kShownTrue;
-	_shown[8] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | 128);
-	_objectState[1] = Object(_id, kStringBed,kStringBedDescription,NULLOBJECT,NULLTYPE,13,13,0);
-	_objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K1,COMBINABLE,27,27,0);
-	_objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K2,COMBINABLE,28,28,0);
-	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K3,COMBINABLE,29,29,0);
-	_objectState[5] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K4,COMBINABLE,30,30,0);
-	_objectState[6] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF1,OPENABLE | CLOSED,14,18,9);
-	_objectState[7] = Object(_id, kStringAlbums,kStringAlbumsDescription,NULLOBJECT,UNNECESSARY,14,14,0);
-	_objectState[8] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF2,OPENABLE | CLOSED,15,19,10);
-	_objectState[9] = Object(_id, kStringRope,kStringRopeDescription,ROPE,TAKE | COMBINABLE,15,15,12);
-	_objectState[10] = Object(_id, kStringShelf,kStringShelfDescription,SHELF3,OPENABLE | CLOSED,16,17,11);
-	_objectState[11] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,20,20,0);
-	_objectState[12] = Object(_id, kStringClothes,kStringClothesDescription,NULLOBJECT,UNNECESSARY,21,21,0);
-	_objectState[13] = Object(_id, kStringUnderwear,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
-	_objectState[14] = Object(_id, kStringSocks,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
-	_objectState[15] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF4,OPENABLE | CLOSED,24,25,13);
-	_objectState[16] = Object(_id, kStringBook,kStringBookHitchhiker,BOOK,TAKE,26,26,14);
-	_objectState[17] = Object(_id, kStringDiscman,kStringDiscmanDescription,DISCMAN,TAKE | COMBINABLE,33,33,16);
-	_objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
-	_objectState[19] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
-	_objectState[20] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
-	_objectState[21] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
-	_objectState[22] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
-	_objectState[23] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
-}
-
-bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD))
-		_gm->openLocker(this, getObject(6), getObject(2), 9);
-	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
-		_gm->openLocker(this, getObject(8), getObject(3), 10);
-		if (getObject(9)->_click == 255)
-			_vm->renderImage(12); // Remove rope
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
-		_gm->openLocker(this, getObject(10), getObject(4), 11);
-		if (getObject(17)->_click == 255)
-			_vm->renderImage(16); // Remove Discman
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
-		_gm->openLocker(this, getObject(15), getObject(5), 13);
-		if (getObject(16)->_click == 255)
-			_vm->renderImage(14); // Remove Book
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
-		_gm->closeLocker(this, getObject(6), getObject(2), 9);
-	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
-		setSectionVisible(12, false);
-		_gm->closeLocker(this, getObject(8), getObject(3), 10);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF3)) {
-		setSectionVisible(16, false);
-		_gm->closeLocker(this, getObject(10), getObject(4), 11);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF4)) {
-		setSectionVisible(14, false);
-		setSectionVisible(14, false);
-		_gm->closeLocker(this, getObject(15), getObject(5), 13);
-	} else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) && !_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
-		getObject(10)->_click = 34; // Locker empty
-		obj1._click = 255;
-		_gm->takeObject(*_gm->_rooms[0]->getObject(3));
-		_vm->renderImage(16);
-	} else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) && obj1.hasProperty(CARRIED)) {
-		getObject(8)->_click = 31; // Shelf empty
-		return false;
-	} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) && !obj1.hasProperty(CARRIED)) {
-		getObject(15)->_click = 32; // Shelf empty
-		return false;
-	} else
-		return false;
-
-	return true;
-}
-
-void ShipCabinR3::onEntrance() {
-	for (int i = 0; i < 3; ++i)
-		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
-
-	setRoomSeen(true);
-}
-
-ShipCabinBathroom::ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 23;
-	_id = BATHROOM;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringBathroom,kStringBathroomDescription,TOILET,NULLTYPE,0,0,0);
-	_objectState[1] = Object(_id, kStringShower,kStringDefaultDescription,SHOWER,NULLTYPE,1,1,0);
-	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
-}
-
-ShipAirlock::ShipAirlock(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 34;
-	_id = AIRLOCK;
-	_shown[0] = kShownTrue;
-	_shown[6] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
-	_objectState[1] = Object(_id, kStringHatch,kStringHatchDescription2,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
-	_objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,2,2,0);
-	_objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,3,3,0);
-	_objectState[4] = Object(_id, kStringHelmet,kStringHelmetDescription,HELMET,TAKE,4,4,7);
-	_objectState[5] = Object(_id, kStringSuit,kStringSuitDescription,SUIT,TAKE,5,5,8);
-	_objectState[6] = Object(_id, kStringLifeSupport,kStringLifeSupportDescription,LIFESUPPORT,TAKE,6,6,9);
-}
-
-bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
-	Room *r;
-
-	if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
-		if (!getObject(1)->hasProperty(OPENED)) {
-			_vm->renderImage(10);
-			_vm->playSound(kAudioSlideDoor);
-			if (getObject(0)->hasProperty(OPENED)) {
-				getObject(0)->disableProperty(OPENED);
-				_vm->renderImage(1);
-				_gm->wait(2);
-				_vm->renderImage(2);
-				setSectionVisible(1, false);
-				_gm->wait(2);
-				_vm->renderImage(3);
-				setSectionVisible(2, false);
-			} else {
-				getObject(0)->setProperty(OPENED);
-				_vm->renderImage(2);
-				setSectionVisible(3, false);
-				_gm->wait(2);
-				_vm->renderImage(1);
-				setSectionVisible(2, false);
-				_gm->wait(2);
-				_vm->renderImage(_gm->invertSection(1));
-			}
-			_vm->renderImage(_gm->invertSection(10));
-		}
-	} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
-		if (!getObject(0)->hasProperty(OPENED)) {
-			_vm->renderImage(11);
-			if (getObject(1)->hasProperty(OPENED)) {
-				_vm->playSound(kAudioSlideDoor);
-				getObject(1)->disableProperty(OPENED);
-				_vm->renderImage(4);
-				_gm->wait(2);
-				_vm->renderImage(5);
-				setSectionVisible(4, false);
-				_gm->wait(2);
-				_vm->renderImage(6);
-				setSectionVisible(5, false);
-				_vm->renderImage(16);
-				setSectionVisible(17, false);
-				_gm->wait(3);
-				_vm->renderImage(15);
-				setSectionVisible(16, false);
-				_gm->wait(3);
-				_vm->renderImage(14);
-				setSectionVisible(15, false);
-				_gm->wait(3);
-				_vm->renderImage(13);
-				setSectionVisible(14, false);
-				_gm->wait(3);
-				_vm->renderImage(12);
-				setSectionVisible(13, false);
-				_gm->wait(3);
-				_vm->renderImage(_gm->invertSection(12));
-			} else {
-				getObject(1)->setProperty(OPENED);
-				_vm->renderImage(12);
-				_gm->wait(3);
-				_vm->renderImage(13);
-				setSectionVisible(12, false);
-				_gm->wait(3);
-				_vm->renderImage(14);
-				setSectionVisible(13, false);
-				_gm->wait(3);
-				_vm->renderImage(15);
-				setSectionVisible(14, false);
-				_gm->wait(3);
-				_vm->renderImage(16);
-				setSectionVisible(15, false);
-				_gm->wait(3);
-				_vm->renderImage(17);
-				setSectionVisible(16, false);
-				_vm->playSound(kAudioSlideDoor);
-				_vm->renderImage(5);
-				setSectionVisible(6, false);
-				_gm->wait(2);
-				_vm->renderImage(4);
-				setSectionVisible(5, false);
-				_gm->wait(2);
-				_vm->renderImage(_gm->invertSection(4));
-				r = _gm->_rooms[AIRLOCK];
-				if (!r->getObject(4)->hasProperty(WORN) ||
-					!r->getObject(5)->hasProperty(WORN) ||
-					!r->getObject(6)->hasProperty(WORN)) {
-					_gm->dead(kStringShipAirlock1);
-					return true;
-				}
-			}
-			_vm->renderImage(_gm->invertSection(11));
-		}
-	} else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER))
-		_vm->renderMessage(getObject(1)->hasProperty(OPENED) ? kStringShipAirlock2 : kStringShipAirlock3);
-	else
-		return false;
-
-	return true;
-}
-
-void ShipAirlock::onEntrance() {
-	if (!hasSeen())
-		_vm->renderMessage(kStringShipAirlock4);
-
-	setRoomSeen(true);
-}
-
-ShipHold::ShipHold(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 24;
-	_id = HOLD;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kNoString,kStringDefaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
-	_objectState[1] = Object(_id, kStringScrap,kStringScrapDescription1,SCRAP_LK,NULLTYPE,4,4,0);
-	_objectState[2] = Object(_id, kStringTerminalStrip,kStringDefaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
-	_objectState[3] = Object(_id, kStringScrap,kStringScrapDescription2,NULLOBJECT,NULLTYPE,5,5,0);
-	_objectState[4] = Object(_id, kStringReactor,kStringReactorDescription,NULLOBJECT,NULLTYPE,6,6,0);
-	_objectState[5] = Object(_id, kStringNozzle,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
-	_objectState[6] = Object(_id, kStringPumpkin,kStringPumpkinDescription,NULLOBJECT,NULLTYPE,8,8,0);
-	_objectState[7] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
-	_objectState[8] = Object(_id, kStringLandingModule,kStringLandingModuleDescription,NULLOBJECT,NULLTYPE,0,0,0);
-	_objectState[9] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
-	_objectState[10] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
-	_objectState[11] = Object(_id, kStringGenerator,kStringGeneratorDescription,GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
-}
-
-bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
-	Room *room;
-
-	if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) && (obj1._description != kStringScrapDescription3)) {
-		_vm->renderMessage(obj1._description);
-		obj1._description = kStringScrapDescription3;
-		_gm->takeObject(*getObject(2));
-	} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) && (obj1._id == OUTERHATCH_TOP))
-		_vm->renderMessage(kStringShipHold1);
-	else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && (isSectionVisible(4) || isSectionVisible(6)))
-		_vm->renderMessage(kStringCable1);
-	else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
-			 ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
-		_vm->renderMessage(kStringCable2);
-	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
-		getObject(0)->_name = kStringWireAndClip;
-		_gm->_inventory.remove(*getObject(2));
-		_gm->_state._terminalStripConnected = true;
-		_gm->_state._terminalStripWire = true;
-		_vm->renderMessage(kStringOk);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
-		if (!_gm->_state._terminalStripConnected)
-			_vm->renderMessage(kStringCable3);
-		else {
-			_vm->renderImage(5);
-			getObject(0)->_name = kStringWireAndPlug2;
-			getObject(0)->_click = 10;
-			room = _gm->_rooms[CABIN_L2];
-			_gm->_inventory.remove(*getObject(9));
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
-		if (isSectionVisible(5)) {
-			room = _gm->_rooms[GENERATOR];
-			room->getObject(0)->_click = 15;
-			room->getObject(1)->_click = 13;
-			room->setSectionVisible(6, true);
-			room->setSectionVisible(8, true);
-			_vm->renderImage(_gm->invertSection(5));
-			_vm->renderImage(6);
-			setSectionVisible(4, false);
-			getObject(0)->_click = 11;
-		} else
-			_vm->renderMessage(kStringCable4);
-	} else
-		return false;
-
-	return true;
-}
-
-void ShipHold::onEntrance() {
-	if (!hasSeen())
-		_vm->renderMessage(kStringShipHold2);
-	setRoomSeen(true);
-	_gm->_rooms[COCKPIT]->setRoomSeen(true);
-}
-
-ShipLandingModule::ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 25;
-	_id = LANDINGMODULE;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSocket,kStringDefaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
-	_objectState[1] = Object(_id, kStringButton,kSafetyButtonDescription,LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
-	_objectState[2] = Object(_id, kStringMonitor,kStringDefaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
-	_objectState[3] = Object(_id, kStringKeyboard,kStringDefaultDescription,KEYBOARD,NULLTYPE,4,4,0);
-	_objectState[4] = Object(_id, kNoString,kStringDefaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
-	_objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
-}
-
-bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
-		_vm->renderMessage(obj1._description);
-	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
-		if (_gm->_state._landingModuleEnergyDaysLeft) {
-			Room *r = _gm->_rooms[GENERATOR];
-			if (isSectionVisible(7)) {
-				_vm->renderImage(_gm->invertSection(9));
-				_vm->renderImage(_gm->invertSection(2));
-				_vm->renderImage(_gm->invertSection(8));
-				_vm->renderImage(_gm->invertSection(7));
-				_vm->renderImage(_gm->invertSection(10));
-				if (r->isSectionVisible(9))
-					_gm->_state._powerOff = true;
-				_gm->roomBrightness();
-			} else {
-				_vm->renderImage(7);
-				if (r->isSectionVisible(9))
-					_gm->_state._powerOff = false;
-				_gm->roomBrightness();
-				r = _gm->_rooms[SLEEP];
-				r->setSectionVisible(1, false);
-				r->setSectionVisible(2, false);
-				_gm->wait(2);
-				_vm->renderImage(2);
-				_gm->wait(3);
-				_vm->renderImage(8);
-				_gm->wait(2);
-				_vm->renderImage(9);
-				_gm->wait(1);
-				_vm->renderImage(10);
-			}
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
-		_vm->renderMessage(kStringShipHold3);
-	else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) && isSectionVisible(7))
-		_vm->renderMessage(kStringShipHold4);
-	else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
-		_vm->renderMessage(kStringShipHold5);
-	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
-		Room *r = _gm->_rooms[CABIN_L3];
-		_gm->_inventory.remove(*r->getObject(8));
-		getObject(4)->_name = r->getObject(8)->_name;
-		_vm->renderImage(4);
-		if (_gm->_state._cableConnected) {
-			_vm->renderImage(5);
-			getObject(4)->_click = 6;
-		} else {
-			getObject(4)->_click = 5;
-			if (_gm->_state._terminalStripWire)
-				_vm->renderImage(11);
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
-		_vm->renderMessage(kStringShipHold8);
-	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
-		_vm->renderImage(11);
-		getObject(4)->_name = kStringWireAndClip;
-		Room *r = _gm->_rooms[HOLD];
-		_gm->_inventory.remove(*r->getObject(2));
-		_gm->_state._terminalStripConnected = true;
-		_gm->_state._terminalStripWire = true;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, SPOOL)) {
-		if (!_gm->_state._terminalStripConnected)
-			_vm->renderMessage(kStringCable3);
-		else {
-			_vm->renderImage(5);
-			getObject(4)->_name = kStringWireAndPlug2;
-			getObject(4)->_click = 6;
-			_gm->_inventory.remove(*_gm->_rooms[CABIN_L2]->getObject(9));
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
-		if (getObject(5)->hasProperty(OPENED)) {
-			Room *r = _gm->_rooms[HOLD];
-			if (isSectionVisible(5)) {
-				r->setSectionVisible(5, true);
-				r->getObject(0)->_click = 10;
-			} else
-				r->getObject(0)->_click = 9;
-
-			r->setSectionVisible(4, true);
-			r->getObject(0)->_name = getObject(4)->_name;
-			_vm->renderImage(_gm->invertSection(5));
-			_vm->renderImage(_gm->invertSection(4));
-			setSectionVisible(11, false);
-			_vm->renderImage(6);
-			getObject(4)->_click = 7;
-		} else
-			_vm->renderMessage(kStringShipHold6);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && isSectionVisible(6))
-		_vm->renderMessage(kStringCable1);
-	else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) && (obj1._id == LANDINGMOD_WIRE))
-		_vm->renderMessage(kStringCable2);
-	else
-		return false;
-
-	return true;
-}
-
-ShipGenerator::ShipGenerator(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 18;
-	_id = GENERATOR;
-	_shown[0] = kShownTrue;
-	_shown[5] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringGeneratorWire,kStringDefaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
-	_objectState[1] = Object(_id, kStringEmptySpool,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
-	_objectState[2] = Object(_id, kStringKeycard2,kStringKeycard2Description,KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
-	_objectState[3] = Object(_id, kStringRope,kStringDefaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
-	_objectState[4] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
-	_objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
-	_objectState[6] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,4,4,0);
-	_objectState[7] = Object(_id, kStringTrap,kStringDefaultDescription,TRAP,OPENABLE,5,6,2);
-	_objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
-	_objectState[9] = Object(_id, kStringVoltmeter,kStringDefaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
-	_objectState[10] = Object(_id, kStringClip,kStringDefaultDescription,CLIP,COMBINABLE,8,8,0);
-	_objectState[11] = Object(_id, kStringWire,kStringWireDescription,SHORT_WIRE,COMBINABLE,10,10,0);
-	_objectState[12] = Object(_id, kStringLadder,kStringDefaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
-}
-
-bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
-		if (obj1.hasProperty(OPENED))
-			return false;
-		_vm->playSound(kAudioSlideDoor);
-		_vm->renderImage(1);
-		if (isSectionVisible(7))
-			_vm->renderImage(10);
-		if (isSectionVisible(13))
-			_vm->renderImage(13);
-		_gm->_rooms[HOLD]->setSectionVisible(3, true);
-		obj1.setProperty(OPENED);
-		obj1._click = 2;
-		_vm->playSound(kAudioDoorOpen);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
-		if (!obj1.hasProperty(OPENED))
-			return false;
-		if (isSectionVisible(11) || isSectionVisible(12))
-			_vm->renderMessage(kStringShipHold7);
-		else {
-			_vm->playSound(kAudioSlideDoor);
-			_vm->renderImage(_gm->invertSection(1));
-			setSectionVisible(10, false);
-			if (isSectionVisible(13))
-				_vm->renderImage(13);
-			_gm->_rooms[HOLD]->setSectionVisible(3, false);
-			obj1.disableProperty(OPENED);
-			obj1._click = 1;
-			_vm->playSound(kAudioDoorClose);
-		}
-	} else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
-			   isSectionVisible(7)) {
-		if (!obj1.hasProperty(OPENED))
-			_vm->renderMessage(kStringShipHold9);
-		else if (!isSectionVisible(11))
-			_vm->renderMessage(kStringShipHold10);
-		else {
-			obj1._exitRoom = ROCKS;
-			return false;
-		}
-	} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_WIRE))
-		_vm->renderMessage(kStringCable2);
-	else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
-			 (obj1._click != 11)) {
-		_vm->renderImage(3);
-		_vm->renderImage(4);
-		obj1._click = 11;
-		_gm->turnOff();
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
-			   (getObject(11)->_click == 11) && !isSectionVisible(9)) {
-		_vm->renderImage(2);
-		setSectionVisible(3, false);
-		setSectionVisible(4, false);
-		getObject(11)->_click = 10;
-		if (_gm->_state._shipEnergyDaysLeft)
-			_gm->turnOn();
-		else
-			_vm->renderImage(4);
-	} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
-		_vm->playSound(kAudioSlideDoor);
-		_vm->renderImage(2);
-		if (getObject(11)->_click == 11)
-			_vm->renderImage(3);
-		if (_gm->_state._powerOff)
-			_vm->renderImage(4);
-		obj1.setProperty(OPENED);
-		obj1._click = 6;
-
-		obj1._click2 = 5;
-		_vm->playSound(kAudioDoorOpen);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
-		if (isSectionVisible(9))
-			_vm->renderMessage(kStringCable1);
-		else {
-			setSectionVisible(3, false);
-			return false;
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
-			   isSectionVisible(3) && (getObject(0)->_click != 16)) {
-		_vm->renderImage(_gm->invertSection(8));
-		_vm->renderImage(2);
-		setSectionVisible(4, false);
-		_vm->renderImage(3);
-		_vm->renderImage(9);
-		getObject(0)->_click = 16;
-		Room *r = _gm->_rooms[LANDINGMODULE];
-		if (_gm->_state._landingModuleEnergyDaysLeft && r->isSectionVisible(7))
-			_gm->turnOn();
-		else
-			_vm->renderImage(4);
-		_gm->_rooms[HOLD]->setSectionVisible(7, true);
-		_gm->great(3);
-	} else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) && (obj1._click == 16)) {
-		_vm->renderImage(_gm->invertSection(9));
-		_vm->renderImage(2);
-		_vm->renderImage(3);
-		_vm->renderImage(4);
-		_vm->renderImage(8);
-		obj1._click = 15;
-		_gm->turnOff();
-		_gm->_rooms[HOLD]->setSectionVisible(7, false);
-	} else if ((verb == ACTION_USE) &&
-			   (Object::combine(obj1, obj2, WIRE, CLIP) ||
-				Object::combine(obj1, obj2, SPOOL, CLIP)) &&
-			   isSectionVisible(3)) {
-		_vm->renderMessage(kStringShipHold11);
-	} else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
-		if (_gm->_state._powerOff)
-			_vm->renderMessage(kStringShipHold12);
-		else
-			_vm->renderMessage(kStringShipHold13);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
-		_vm->renderImage(13);
-		Room *r = _gm->_rooms[CABIN_R3];
-		_gm->_inventory.remove(*r->getObject(9));
-		getObject(3)->_click = 18;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
-		if (!isSectionVisible(1))
-			_vm->renderMessage(kStringShipHold14);
-		else {
-			_vm->renderImage(_gm->invertSection(13));
-			_vm->renderImage(1);
-			if (isSectionVisible(7)) {
-				_vm->renderImage(10);
-				_vm->renderImage(11);
-			} else
-				_vm->renderImage(12);
-
-			Room *r = _gm->_rooms[OUTSIDE];
-			r->setSectionVisible(1, true);
-			r->getObject(1)->_click = 1;
-			getObject(3)->_click = 17;
-		}
-	} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE))
-		_vm->renderMessage(kStringShipHold15);
-	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) && isSectionVisible(1))
-		_vm->renderMessage(kStringShipHold16);
-	else
-		return false;
-
-	return true;
-}
-
-ShipOuterSpace::ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 4;
-	_id = OUTSIDE;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
-	_objectState[1] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
-}
-
-
-// Arsano
-ArsanoRocks::ArsanoRocks(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 12;
-	_id = OUTSIDE;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
-	_objectState[1] = Object(_id, kStringStone,kStringDefaultDescription,STONE,NULLTYPE,1,1,0);
-	_objectState[2] = Object(_id, kStringStone,kStringDefaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
-	_objectState[3] = Object(_id, kStringCaveOpening,kStringCaveOpeningDescription,NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
-}
-
-void ArsanoRocks::onEntrance() {
-	_gm->great(8);
-}
-
-bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
-	if (((verb == ACTION_PULL) || (verb == ACTION_PRESS)) &&
-		(obj1._id == STONE) && !isSectionVisible(3)) {
-		_vm->renderImage(1);
-		_gm->wait(2);
-		_vm->renderImage(2);
-		_gm->wait(2);
-		_vm->renderImage(3);
-		_vm->playSound(kAudioRocks);
-		obj1._click = 3;
-		getObject(3)->_click = 4;
-		getObject(3)->setProperty(EXIT);
-		return true;
-	}
-	return false;
-}
-
-ArsanoCave::ArsanoCave(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 12;
-	_id = CAVE;
-
-	_objectState[0] = Object(_id, kStringExit,kStringExitDescription,NULLOBJECT,EXIT,255,255,0,ROCKS,22);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
-}
-
-ArsanoMeetup::ArsanoMeetup(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 37;
-	_id = MEETUP;
-	_shown[0] = kShownTrue;
-	_sign = 0;
-	_beacon = 0;
-
-	_objectState[0] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
-	_objectState[1] = Object(_id, kStringSign,kStringSignDescription,MEETUP_SIGN,NULLTYPE,0,0,0);
-	_objectState[2] = Object(_id, kStringEntrance,kStringDefaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
-	_objectState[3] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,2,2,0);
-	_objectState[4] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
-	_objectState[5] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIP,COMBINABLE,4,4,0);
-}
-
-void ArsanoMeetup::onEntrance() {
-	if (isSectionVisible(7)) {
-		_gm->wait(3);
-		_vm->renderImage(6);
-		setSectionVisible(7, false);
-		_gm->wait(3);
-		_vm->renderImage(_gm->invertSection(6));
-	}
-	if (!(_gm->_state._greatFlag & 0x8000)) {
-		_vm->playSound(kAudioFoundLocation);
-		_gm->_state._greatFlag |= 0x8000;
-	}
-}
-
-void ArsanoMeetup::animation() {
-	_vm->renderImage(_gm->invertSection(1) + _beacon);
-	_beacon = (_beacon + 1) % 5;
-	_vm->renderImage(_beacon + 1);
-	_vm->renderImage(_beacon + 8);
-	if (isSectionVisible(_sign + 13))
-		_vm->renderImage(_gm->invertSection(13) + _sign);
-	else
-		_vm->renderImage(13 + _sign);
-
-	_sign = (_sign + 1) % 14;
-	_gm->setAnimationTimer(3);
-}
-
-bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_WALK) &&
-		((obj1._id == SPACESHIPS) ||
-		 ((obj1._id == SPACESHIP) && !obj1.hasProperty(OPENED)))) {
-		_vm->renderMessage(kStringArsanoMeetup1);
-	} else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP))
-		_gm->changeRoom(GLIDER);
-	else if ((verb == ACTION_WALK) && (obj1._id == STAR))
-		_vm->renderMessage(kStringArsanoMeetup2);
-	else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
-		_vm->setCurrentImage(26);
-		_vm->renderImage(0);
-		_vm->paletteBrightness();
-		_gm->animationOff();
-		_gm->getInput();
-		_gm->animationOn();
-		g_system->fillScreen(kColorBlack);
-		_vm->renderRoom(*this);
-		_vm->paletteBrightness();
-	} else if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
-		_vm->renderImage(6);
-		_gm->wait(3);
-		_vm->renderImage(7);
-		setSectionVisible(6, false);
-		_gm->wait(3);
-
-		return false;
-	} else if ((verb == ACTION_LOOK) && (obj1._id == MEETUP_SIGN) && _gm->_state._language) {
-		if (_gm->_state._language == 2)
-			_vm->renderMessage(kStringArsanoMeetup3);
-
-		obj1._description = kStringSignDescription2;
-		if (_gm->_state._language == 1)
-			return false;
-
-		_gm->_state._language = 1;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP)) {
-		getObject(5)->setProperty(OPENED);
-		_gm->changeRoom(GLIDER);
-	} else
-		return false;
-
-	return true;
-}
-
-ArsanoEntrance::ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 10;
-	_id = ENTRANCE;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringPorter,kStringPorterDescription,PORTER,TALK,0,0,0);
-	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
-	_objectState[2] = Object(_id, kStringSign,kStringSignDescription,KITCHEN_SIGN,NULLTYPE,2,2,0);
-	_objectState[3] = Object(_id, kStringChewingGum,kStringDefaultDescription,SCHNUCK,TAKE,255,255,10+128);
-	_objectState[4] = Object(_id, kStringGummyBears,kStringDefaultDescription,SCHNUCK,TAKE,255,255,11+128);
-	_objectState[5] = Object(_id, kStringChocolateBall,kStringDefaultDescription,SCHNUCK,TAKE,255,255,12+128);
-	_objectState[6] = Object(_id, kStringEgg,kStringDefaultDescription,EGG,TAKE,255,255,13+128);
-	_objectState[7] = Object(_id, kStringLiquorice,kStringDefaultDescription,SCHNUCK,TAKE,255,255,14+128);
-	_objectState[8] = Object(_id, kStringPill,kStringPillDescription,PILL,TAKE,255,255,0);
-	_objectState[9] = Object(_id, kStringSlot,kStringDefaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
-	_objectState[10] = Object(_id, kStringVendingMachine,kStringVendingMachineDescription,NULLOBJECT,NULLTYPE,5,5,0);
-	_objectState[11] = Object(_id, kStringToilet,kStringToiletDescription,ARSANO_BATHROOM,NULLTYPE,255,255,0);
-	_objectState[12] = Object(_id, kStringButton,kStringDefaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
-	_objectState[13] = Object(_id, kStringSign,kStringSignDescription,BATHROOM_SIGN,NULLTYPE,4,4,0);
-	_objectState[14] = Object(_id, kStringStaircase,kStringDefaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
-	_objectState[15] = Object(_id, kStringExit,kStringDefaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
-	_objectState[16] = Object(_id, kStringCoins,kStringCoinsDescription,COINS,TAKE|COMBINABLE,255,255,0);
-	_objectState[17] = Object(_id, kStringTabletPackage,kStringTabletPackageDescription,PILL_HULL,TAKE,255,255,0);
-
-	_dialog1[0] = kStringArsanoDialog7;
-	_dialog1[1] = kStringArsanoDialog1;
-	_dialog1[2] = kStringArsanoDialog8;
-	_dialog1[3] = kStringArsanoDialog9;
-	_dialog1[4] = kStringDialogSeparator;
-
-	_dialog2[0] = kStringArsanoDialog1;
-	_dialog2[1] = kStringArsanoDialog2;
-	_dialog2[2] = kStringArsanoDialog3;
-	_dialog2[3] = kStringArsanoDialog4;
-	_dialog2[4] = kStringDialogSeparator;
-
-	_dialog3[0] = kStringArsanoDialog5;
-	_dialog3[1] = kStringArsanoDialog6;
-
-	_eyewitness = 5;
-}
-
-void ArsanoEntrance::animation() {
-	if (!_vm->_screen->isMessageShown() && isSectionVisible(kMaxSection - 5)) {
-		_gm->animationOff(); // to avoid recursive call
-		_vm->playSound(kAudioSlideDoor);
-		_vm->renderImage(8);
-		setSectionVisible(9, false);
-		_gm->wait(2);
-		_vm->renderImage(7);
-		setSectionVisible(8, false);
-		_gm->wait(2);
-		_vm->renderImage(6);
-		setSectionVisible(7, false);
-		_gm->wait(2);
-		_vm->renderImage(5);
-		setSectionVisible(6, false);
-		_gm->wait(2);
-		_vm->renderImage(_gm->invertSection(5));
-		getObject(11)->_click = 255;
-		setSectionVisible(kMaxSection - 5, false);
-		_gm->animationOn();
-	}
-	if (isSectionVisible(2))
-		_vm->renderImage(_gm->invertSection(2));
-	else if (_eyewitness)
-		--_eyewitness;
-	else {
-		_eyewitness = 20;
-		_vm->renderImage(2);
-	}
-
-	_gm->setAnimationTimer(4);
-}
-
-bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
-	static byte row1[6] = {1, 1, 1, 1, 1, 0};
-	static byte row2[6] = {1, 1, 1, 1, 1, 0};
-	static byte row3[6] = {1, 1, 0, 0, 0, 0};
-
-	if ((verb == ACTION_TALK) && (obj1._id == PORTER)) {
-		if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
-			_vm->renderMessage(kStringArsanoEntrance1);
-		else {
-			if (_gm->_state._language) {
-				int e;
-				do {
-					if (_gm->_state._shoes == 1) {
-						_dialog2[2] = kStringArsanoEntrance2;
-						addSentence(2, 2);
-					} else if (_gm->_state._shoes > 1)
-						removeSentence(2, 2);
-
-					switch (e = _gm->dialog(5, row2, _dialog2, 2)) {
-					case 0:
-						_gm->reply(kStringArsanoEntrance3, 1, _gm->invertSection(1));
-						_gm->reply(kStringArsanoEntrance4, 1, _gm->invertSection(1));
-						_gm->reply(kStringArsanoEntrance5, 1, _gm->invertSection(1));
-						removeSentence(1, 1);
-						break;
-					case 1:
-						_gm->reply(kStringArsanoEntrance6, 1, _gm->invertSection(1));
-						addSentence(1, 2);
-						break;
-					case 2:
-						if (_gm->_state._shoes == 1) {
-							_gm->reply(kStringArsanoEntrance7, 1, _gm->invertSection(1));
-							_gm->_state._shoes = 2;
-						} else {
-							_gm->reply(kStringArsanoEntrance8, 1, _gm->invertSection(1));
-							_gm->_state._shoes = 1;
-						}
-						break;
-					case 3:
-						_gm->reply(kStringArsanoEntrance9, 1, _gm->invertSection(1));
-					}
-				} while (e != 4);
-			} else if (_gm->dialog(5, row2, _dialog2, 0) != 4)
-				_gm->reply(kStringArsanoEntrance10, 1, _gm->invertSection(1));
-		}
-	} else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state._shoes != 3)) {
-		_vm->renderImage(3);
-		_gm->wait(2);
-		_vm->renderImage(4);
-		setSectionVisible(3, false);
-		if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
-			_gm->reply(kStringDialogSeparator, 1, _gm->invertSection(1));
-		else if (_gm->_state._language)
-			_gm->reply(kStringArsanoEntrance11, 1, _gm->invertSection(1));
-		else
-			_gm->reply(kStringArsanoEntrance12, 1, _gm->invertSection(1));
-		_vm->renderImage(3);
-		setSectionVisible(4, false);
-		_gm->wait(2);
-		_vm->renderImage(_gm->invertSection(3));
-		if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
-			if (_gm->_state._language) {
-				if (_gm->_state._shoes)
-					_gm->reply(kStringArsanoEntrance13, 1, _gm->invertSection(1));
-				else
-					_gm->reply(kStringArsanoEntrance14, 1, _gm->invertSection(1));
-				int e = 0;
-				while ((e < 3) && (!allSentencesRemoved(4, 1))) {
-					switch (e = _gm->dialog(5, row1, _dialog1, 1)) {
-					case 0:
-						_gm->reply(kStringArsanoEntrance15, 1, 1 + 128);
-						break;
-					case 1:
-						_gm->reply(kStringArsanoEntrance3, 1, 1 + 128);
-						_gm->reply(kStringArsanoEntrance4, 1, 1 + 128);
-						_gm->reply(kStringArsanoEntrance5, 1, 1 + 128);
-						removeSentence(0, 2);
-						break;
-					case 2:
-						_gm->reply(kStringArsanoEntrance7, 1, 1 + 128);
-						_gm->_state._shoes = 2;
-						break;
-					case 3:
-						_vm->renderImage(3);
-						_gm->wait(2);
-						_vm->renderImage(4);
-						setSectionVisible(3, false);
-						_gm->reply(kStringArsanoEntrance16, 1, 1 + 128);
-						_vm->renderImage(3);
-						setSectionVisible(4, false);
-						_gm->wait(2);
-						_vm->renderImage(_gm->invertSection(3));
-						break;
-					}
-					removeSentence(0, 1);
-				}
-			} else {
-				_gm->dialog(2, row3, _dialog3, 0);
-				_gm->reply(kStringArsanoEntrance10, 1, 1 + 128);
-			}
-		}
-	} else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
-		_vm->playSound(kAudioSlideDoor);
-		_vm->renderImage(5);
-		_gm->wait(2);
-		_vm->renderImage(6);
-		setSectionVisible(5, false);
-		_gm->wait(2);
-		_vm->renderImage(7);
-		setSectionVisible(6, false);
-		_gm->wait(2);
-		_vm->renderImage(8);
-		setSectionVisible(7, false);
-		_gm->wait(2);
-		_vm->renderImage(9);
-		setSectionVisible(8, false);
-		getObject(11)->_click = 9;
-	} else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
-		if (_gm->_state._coins) {
-			if (_gm->_state._shoes == 2) {
-				_vm->renderMessage(kStringArsanoEntrance17);
-				_gm->_state._shoes = 3;
-				removeSentence(2, 2);
-				removeSentence(3, 2);
-			} else if (_gm->_state._shoes == 3) {
-				_vm->renderMessage(kStringArsanoEntrance18);
-				_gm->_state._shoes = 2;
-			} else
-				_vm->renderMessage(kStringArsanoEntrance19);
-		} else {
-			if (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN))
-				_vm->renderMessage(kStringArsanoEntrance20);
-			else {
-				_vm->renderMessage(kStringArsanoEntrance21);
-				_gm->waitOnInput(_gm->_messageDuration);
-				_vm->removeMessage();
-				_vm->renderMessage(kStringArsanoEntrance22);
-				_gm->takeObject(*getObject(16));
-				_gm->_state._coins = 5;
-			}
-		}
-		// This shown object is an abuse in the original engine as it's not a real shown variable
-		// It's an internal (boolean) status
-		_shown[kMaxSection - 5] = kShownTrue;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COINS, CAR_SLOT)) {
-		if ((_gm->_state._coins < 5) && (getObject(7 - _gm->_state._coins)->_click == 7))
-			_vm->renderMessage(kStringArsanoEntrance23);
-		else {
-			_vm->renderImage(15 - _gm->_state._coins);
-			getObject(8 - _gm->_state._coins)->_click = 7;
-			--_gm->_state._coins;
-			if (_gm->_state._coins == 1)
-				getObject(16)->_name = kStringCoin;
-
-			if (_gm->_state._coins == 0) {
-				_gm->_inventory.remove(*getObject(16));
-				_gm->_state._coins = 255;
-			}
-		}
-	} else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state._language) {
-		if (_gm->_state._language == 2)
-			_vm->renderMessage(kStringArsanoEntrance24);
-		obj1._description = kStringDoorDescription5;
-		if (_gm->_state._language == 1)
-			return false;
-		_gm->_state._language = 1;
-	} else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state._language) {
-		if (_gm->_state._language == 2)
-			_vm->renderMessage(kStringArsanoEntrance25);
-		obj1._description = kStringDoorDescription6;
-		if (_gm->_state._language == 1)
-			return false;
-		_gm->_state._language = 1;
-	} else if ((verb == ACTION_WALK) && (obj1._id == MEETUP_EXIT)) {
-		if (!((_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) &&
-			  (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN)) &&
-			  (_gm->_rooms[AIRLOCK]->getObject(6)->hasProperty(WORN)))) {
-			_vm->renderMessage(kStringArsanoEntrance26);
-			_gm->_rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
-			_gm->_rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
-			_gm->_rooms[AIRLOCK]->getObject(6)->setProperty(WORN);
-			_gm->waitOnInput(_gm->_messageDuration);
-			_vm->removeMessage();
-		}
-		return false;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, PORTER))
-		_vm->renderMessage(kStringArsanoEntrance27);
-	else
-		return false;
-
-	return true;
-}
-
-ArsanoRemaining::ArsanoRemaining(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 28;
-	_id = REST;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringStaircase,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
-	_objectState[1] = Object(_id, kStringChair,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
-	_objectState[2] = Object(_id, kStringShoes,kStringShoesDescription,NULLOBJECT,NULLTYPE,2,2,0);
-
-	_chewing = kShownTrue;
-	_i = 0;
-}
-
-void ArsanoRemaining::animation() {
-	switch (_i) {
-	case  0:
-		_vm->renderImage(1);
-		_vm->renderImage(_gm->invertSection(4));
-		break;
-	case  1:
-		_vm->renderImage(_gm->invertSection(1));
-		_vm->renderImage(4);
-		break;
-	case  2:
-		_vm->renderImage(2);
-		_vm->renderImage(_gm->invertSection(4));
-		break;
-
-	case  3:
-		_vm->renderImage(7); // Dragon
-		_vm->renderImage(_gm->invertSection(2));
-		_vm->renderImage(4);
-		break;
-	case  4:
-		_vm->renderImage(8);
-		setSectionVisible(7, false);
-		_vm->renderImage(2);
-		_vm->renderImage(_gm->invertSection(4));
-		break;
-	case  5:
-		_vm->renderImage(_gm->invertSection(8));
-		_vm->renderImage(_gm->invertSection(2));
-		break;
-	case  6:
-		_vm->renderImage(3);
-		_vm->renderImage(2);
-		break;
-	case  7:
-		_vm->renderImage(_gm->invertSection(3));
-		_vm->renderImage(_gm->invertSection(2));
-		break;
-	case  8:
-		_vm->renderImage(3);
-		break;
-	case  9:
-		_vm->renderImage(14); // Card Player 1
-		_vm->renderImage(4);
-		_vm->renderImage(_gm->invertSection(3));
-		break;
-	case 10:
-		_vm->renderImage(15);
-		_vm->renderImage(14);
-		_vm->renderImage(_gm->invertSection(4));
-		_vm->renderImage(3);
-		break;
-	case 11:
-		_vm->renderImage(16);
-		setSectionVisible(15, false);
-		_vm->renderImage(4);
-		_vm->renderImage(_gm->invertSection(3));
-		break;
-	case 12:
-		_vm->renderImage(17);
-		setSectionVisible(16, false);
-		_vm->renderImage(_gm->invertSection(4));
-		_vm->renderImage(3);
-		break;
-	case 13:
-		_vm->renderImage(_gm->invertSection(17));
-		_vm->renderImage(4);
-		_vm->renderImage(_gm->invertSection(3));
-		break;
-	case 14:
-		_vm->renderImage(_gm->invertSection(4));
-		break;
-	case 15:
-		_vm->renderImage(6);
-		break;
-	case 16:
-		_vm->renderImage(18); // Card Player 2
-		_vm->renderImage(5);
-		break;
-	case 17:
-		_vm->renderImage(19);
-		setSectionVisible(18, false);
-		_vm->renderImage(_gm->invertSection(5));
-		break;
-	case 18:
-		_vm->renderImage(20);
-		setSectionVisible(19, false);
-		_vm->renderImage(5);
-		break;
-	case 19:
-		_vm->renderImage(21);
-		setSectionVisible(20, false);
-		_vm->renderImage(_gm->invertSection(5));
-		break;
-	case 20:
-		_vm->renderImage(_gm->invertSection(21));
-		_vm->renderImage(5);
-		break;
-	case 21:
-		_vm->renderImage(_gm->invertSection(5));
-		break;
-	case 22:
-		_vm->renderImage(5);
-		break;
-	case 23:
-		_vm->renderImage(10);
-		_chewing = false;
-		_vm->renderImage(_gm->invertSection(5));
-		break;
-	case 24:
-		_vm->renderImage(11);
-		setSectionVisible(10, false);
-		break;
-	case 25:
-		_vm->renderImage(12);
-		setSectionVisible(11, false);
-		break;
-	case 26:
-		_vm->renderImage(13);
-		setSectionVisible(12, false);
-		break;
-	case 27:
-		_vm->renderImage(12);
-		setSectionVisible(13, false);
-		break;
-	case 28:
-		_vm->renderImage(11);
-		setSectionVisible(12, false);
-		break;
-	case 29:
-		_vm->renderImage(10);
-		setSectionVisible(11, false);
-		break;
-	case 30:
-		_vm->renderImage(_gm->invertSection(10));
-		_chewing = true;
-		break;
-	case 31:
-		_vm->renderImage(22); // Card Player 3
-		break;
-	case 32:
-		_vm->renderImage(_gm->invertSection(22));
-		break;
-	case 33:
-		_vm->renderImage(_gm->invertSection(6));
-		break;
-	case 34:
-		_vm->renderImage(4);
-	}
-
-	_i = (_i + 1) % 35;
-	if (_chewing) {
-		if (isSectionVisible(9))
-			_vm->renderImage(_gm->invertSection(9));
-		else
-			_vm->renderImage(9);
-	}
-	_gm->setAnimationTimer(3);
-}
-
-ArsanoRoger::ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 29;
-	_id = ROGER;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
-	_objectState[1] = Object(_id, kStringFrogFace,kStringDefaultDescription,ROGER_W,TALK,0,0,0);
-	_objectState[2] = Object(_id, kStringScrible,kStringScribleDescription,NULLOBJECT,NULLTYPE,3,3,0);
-	_objectState[3] = Object(_id, kStringWallet,kStringDefaultDescription,WALLET,TAKE,1,1,4);
-	_objectState[4] = Object(_id, kStringMenu,kStringMenuDescription,NULLOBJECT,UNNECESSARY,2,2,0);
-	_objectState[5] = Object(_id, kStringCup,kStringCupDescription,CUP,UNNECESSARY,4,4,0);
-	_objectState[6] = Object(_id, kStringChessGame,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
-	_objectState[7] = Object(_id, kStringBill,kStringBillDescription,NULLOBJECT,TAKE|COMBINABLE,255,255,0);
-	_objectState[8] = Object(_id, kStringKeycard3,kStringDefaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
-
-	_dialog1[0] = kStringDialogArsanoRoger1;
-	_dialog1[1] = kStringDialogArsanoRoger2;
-	_dialog1[2] = kStringDialogArsanoRoger3;
-	_dialog1[3] = kStringDialogSeparator;
-
-	_eyewitness = 5;
-	_hands = 0;
-}
-
-void ArsanoRoger::onEntrance() {
-	if (!sentenceRemoved(0, 2)) {
-		_gm->say(kStringArsanoRoger1);
-		_gm->reply(kStringArsanoRoger2, 2, 2 + 128);
-		removeSentence(0, 2);
-	}
-}
-
-void ArsanoRoger::animation() {
-	if (isSectionVisible(1))
-		_vm->renderImage(_gm->invertSection(1));
-	else if (isSectionVisible(10)) {
-		_vm->renderImage(12);
-		setSectionVisible(10, false);
-		setSectionVisible(12, false);
-	} else if (_eyewitness) {
-		--_eyewitness;
-	} else {
-		_eyewitness = 20;
-		if (isSectionVisible(3))
-			_vm->renderImage(10);
-		else
-			_vm->renderImage(1);
-	}
-
-	if (isSectionVisible(3)) {
-		setSectionVisible(5 + _hands, false);
-		_hands = (_hands + 1) % 5;
-		_vm->renderImage(5 + _hands);
-	}
-	_gm->setAnimationTimer(4);
-}
-
-bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
-	static byte row1[6] = {1, 1, 1, 1, 0, 0};
-
-	if ((verb == ACTION_TAKE) && (obj1._id == WALLET)) {
-		if (isSectionVisible(3)) {
-			_gm->great(0);
-			return false;
-		}
-		_gm->reply(kStringArsanoRoger3, 2, 2 + 128);
-	} else if ((verb == ACTION_USE) && (obj1._id == CUP))
-		_vm->renderMessage(kStringArsanoRoger4);
-	else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
-		if (isSectionVisible(3))
-			_vm->renderMessage(kStringArsanoRoger5);
-		else {
-			switch (_gm->dialog(4, row1, _dialog1, 1)) {
-			case 0:
-				_gm->reply(kStringArsanoRoger6, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger7, 2, 2 + 128);
-				break;
-			case 1:
-				_gm->reply(kStringArsanoRoger8, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger9, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger10);
-				break;
-			case 2:
-				_gm->reply(kStringArsanoRoger11, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger12);
-				_gm->reply(kStringArsanoRoger13, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger14);
-				_gm->reply(kStringArsanoRoger15, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger16, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger17);
-				_gm->say(kStringArsanoRoger18);
-				_gm->reply(kStringArsanoRoger19, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger20);
-				_gm->say(kStringArsanoRoger21);
-				_gm->reply(kStringArsanoRoger22, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger23);
-				_gm->reply(kStringArsanoRoger24, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger25, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger26);
-				_gm->reply(kStringArsanoRoger27, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger28, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger29);
-				_gm->reply(kStringArsanoRoger30, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger31, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger32);
-				_gm->reply(kStringArsanoRoger33, 2, 2 + 128);
-				_gm->say(kStringArsanoRoger34);
-				_gm->reply(kStringArsanoRoger35, 2, 2 + 128);
-			}
-		}
-	} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, CHESS, ROGER_W)) ||
-			   ((verb == ACTION_GIVE) && (obj1._id == CHESS) && (obj2._id == ROGER_W))) {
-		_vm->renderImage(11);
-		_gm->great(0);
-		_gm->say(kStringArsanoRoger36);
-		_gm->reply(kStringArsanoRoger37, 2, 2 + 128);
-		_gm->say(kStringArsanoRoger38);
-		_vm->paletteFadeOut();
-		_gm->_inventory.remove(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess board
-		g_system->fillScreen(kColorBlack);
-		_vm->_screen->setGuiBrightness(255);
-		_vm->paletteBrightness();
-		_vm->renderMessage(kStringArsanoRoger39);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_vm->_screen->setGuiBrightness(0);
-		_vm->paletteBrightness();
-		_gm->_time += ticksToMsec(125000); // 2 hours
-		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
-		_gm->_state._eventTime = _gm->_time + ticksToMsec(4000);
-		_gm->_state._eventCallback = kSupernovaFn;
-		setSectionVisible(11, false);
-		setSectionVisible(1, false);
-		_vm->renderRoom(*this);
-		_vm->renderImage(3);
-		getObject(3)->_click = 5;
-		getObject(5)->_click = 6;
-		getObject(6)->_click = 7;
-		_vm->paletteFadeIn();
-		_vm->renderMessage(kStringArsanoRoger40);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-	} else
-		return false;
-
-	return true;
-}
-
-ArsanoGlider::ArsanoGlider(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 19;
-	_id = GLIDER;
-	_shown[0] = kShownTrue;
-	_sinus = 0;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
-	_objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
-	_objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
-	_objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
-	_objectState[4] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
-	_objectState[5] = Object(_id, kStringKeycard,kStringDefaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
-	_objectState[6] = Object(_id, kStringSlot,kStringDefaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
-	_objectState[7] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE,5,6,6);
-	_objectState[8] = Object(_id, kStringKeyboard,kStringDefaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
-	_objectState[9] = Object(_id, kStringAnnouncement,kStringAnnouncementDescription,GLIDER_DISPLAY,NULLTYPE,8,8,0);
-	_objectState[10] = Object(_id, kStringInstruments,kStringAnnouncementDescription,GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
-}
-
-void ArsanoGlider::animation() {
-	if (isSectionVisible(8)) {
-		setSectionVisible(24 + _sinus, false);
-		_sinus = (_sinus + 1) % 14;
-		_vm->renderImage(24 + _sinus);
-	} else if (isSectionVisible(24 + _sinus))
-		_vm->renderImage(_gm->invertSection(24 + _sinus));
-
-	_gm->setAnimationTimer(2);
-}
-
-bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
-	static char l, r;
-	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, GLIDER_SLOT)) {
-		_vm->renderImage(5);
-		_gm->wait(7);
-		_vm->renderImage(8);
-		getObject(5)->_click = 10;
-		_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
-	} else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
-			   (obj1._id == GLIDER_KEYCARD)) {
-		_vm->renderImage(_gm->invertSection(5));
-		_vm->renderImage(_gm->invertSection(8));
-		getObject(5)->_click = 255;
-		_gm->takeObject(*_gm->_rooms[ROGER]->getObject(8));
-		for (int i = 9; i <= 22; i++)
-			_vm->renderImage(_gm->invertSection(i));
-		l = r = 0;
-	} else if ((verb == ACTION_PRESS) &&
-			   (obj1._id >= GLIDER_BUTTON1) && (obj1._id <= GLIDER_BUTTON4)) {
-		int i = obj1._id - GLIDER_BUTTON1 + 1;
-		_vm->renderImage(i);
-		if (isSectionVisible(8)) {
-			l = 0;
-			r = 0;
-			for (int j = 1; j < 8; j++) {
-				if (isSectionVisible(j + 8))
-					l = j;
-				if (isSectionVisible(j + 15))
-					r = j;
-			}
-			switch (i) {
-			case 1:
-				if (l < 7) {
-					l++;
-					_vm->renderImage(l + 8);
-				}
-				break;
-			case 3:
-				if (r < 7) {
-					r++;
-					_vm->renderImage(r + 15);
-				}
-				break;
-			case 2:
-				if (l) {
-					_vm->renderImage(_gm->invertSection(l + 8));
-					l--;
-				}
-				break;
-			case 4:
-				if (r) {
-					_vm->renderImage(_gm->invertSection(r + 15));
-					r--;
-				}
-			}
-		}
-		_gm->wait(4);
-		_vm->renderImage(_gm->invertSection(i));
-	} else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS))
-		_vm->renderMessage(kStringArsanoGlider1);
-	else
-		return false;
-
-	return true;
-}
-
-ArsanoMeetup2::ArsanoMeetup2(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 38;
-	_id = MEETUP2;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRoger, kStringDefaultDescription, ROGER_W, TALK, 255, 255, 0);
-	_objectState[1] = Object(_id, kStringSpaceshift, kStringDefaultDescription, SPACESHIP, COMBINABLE, 255, 255, 0);
-	_objectState[2] = Object(_id, kStringCave, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CAVE, 22);
-
-	_dialog1[0] = kStringDialogArsanoMeetup2_1;
-	_dialog1[1] = kStringDialogArsanoMeetup2_2;
-	_dialog2[0] = kStringDialogArsanoMeetup2_3;
-	_dialog2[1] = kStringDialogArsanoMeetup2_4;
-	_dialog3[0] = kStringDialogArsanoMeetup2_5;
-	_dialog3[1] = kStringDialogArsanoMeetup2_6;
-	_dialog3[2] = kStringDialogArsanoMeetup2_7;
-	_dialog3[3] = kStringDialogArsanoMeetup2_8;
-	_dialog4[0] = kStringDialogArsanoMeetup2_9;
-	_dialog4[1] = kStringDialogArsanoMeetup2_10;
-	_dialog4[2] = kStringDialogArsanoMeetup2_11;
-}
-
-void ArsanoMeetup2::onEntrance() {
-	if (sentenceRemoved(0, 1)) {
-		if (sentenceRemoved(1, 1))
-			_vm->renderMessage(kStringArsanoMeetup2_2); // All spaceships have left the planet, except one ...
-		else
-			shipStart();
-	} else if (sentenceRemoved(1, 1))
-		_vm->renderMessage(kStringArsanoMeetup2_1); // All spaceships have left the planet
-
-	addAllSentences(1);
-}
-
-bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
-	static byte row1[6] = {1, 1, 0, 0, 0, 0};
-	static byte row2[6] = {1, 1, 0, 0, 0, 0};
-	static byte row3[6] = {1, 1, 1, 1, 0, 0};
-	static byte row4[6] = {2, 1, 0, 0, 0, 0};
-
-	if (((verb == ACTION_WALK) &&
-			((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
-			((verb == ACTION_TALK) && (obj1._id == ROGER_W))) {
-		_gm->changeRoom(INTRO);
-		_vm->setCurrentImage(30);
-		_vm->renderImage(0);
-		_vm->paletteBrightness();
-		bool found;
-		if (sentenceRemoved(0, 2) || sentenceRemoved(1, 2)) {
-			_gm->reply(kStringArsanoMeetup2_3, 1, 1 + 128);
-			found = !_gm->dialog(2, row4, _dialog4, 0);
-			if (!(found))
-				_gm->reply(kStringArsanoMeetup2_4, 1, 1 + 128);
-		} else {
-			_gm->reply(kStringArsanoMeetup2_5, 1, 1 + 128);
-			_gm->reply(kStringArsanoMeetup2_6, 1, 1 + 128);
-			found = !_gm->dialog(2, row1, _dialog1, 0);
-			removeSentence(0, 2);
-		}
-		if (found) {
-			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(3));
-			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(7));
-			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
-			_gm->reply(kStringArsanoMeetup2_7, 1, 1 + 128);
-			_gm->reply(kStringArsanoMeetup2_8, 1, 1 + 128);
-			bool flight = _gm->dialog(2, row2, _dialog2, 0);
-			if (flight) {
-				_gm->reply(kStringArsanoMeetup2_9, 1, 1 + 128);
-				_gm->dialog(4, row3, _dialog3, 0);
-				_gm->reply(kStringArsanoMeetup2_10, 1, 1 + 128);
-			} else
-				_gm->reply(kStringArsanoMeetup2_11, 1, 1 + 128);
-
-			_gm->changeRoom(MEETUP2);
-			_gm->_rooms[MEETUP2]->setSectionVisible(12, false);
-			_gm->_rooms[MEETUP2]->getObject(0)->_click = 255;
-			_gm->_rooms[MEETUP2]->getObject(1)->_click = 255;
-			_vm->renderRoom(*this);
-			_vm->paletteBrightness();
-			shipStart();
-			if (flight) {
-				_vm->setCurrentImage(13);
-				_vm->renderImage(0);
-				_vm->paletteBrightness();
-				_gm->wait(36);
-				for (int i = 1; i <= 13; i++) {
-					if (i > 1)
-						_vm->renderImage(_gm->invertSection(i - 1));
-					_vm->renderImage(i);
-					_gm->wait(2);
-				}
-				_vm->renderImage(_gm->invertSection(13));
-				_gm->wait(20);
-				_vm->setCurrentImage(14);
-				_vm->renderImage(0);
-				_vm->paletteBrightness();
-				_gm->wait(36);
-				for (int i = 1; i <= 13; i++) {
-					if (i > 1)
-						_vm->renderImage(_gm->invertSection(i - 1));
-					_vm->renderImage(i);
-					_gm->wait(2);
-				}
-				_vm->renderImage(_gm->invertSection(13));
-				_gm->wait(9);
-				_vm->playSound(kAudioCrash);
-				for (int i = 14; i <= 19; i++) {
-					_vm->renderImage(i);
-					_gm->wait(3);
-				}
-				_vm->paletteFadeOut();
-				_vm->setCurrentImage(11);
-				_vm->renderImage(0);
-				_vm->paletteFadeIn();
-				_gm->wait(18);
-				_vm->renderMessage(kStringArsanoMeetup2_12);
-				_gm->great(0);
-				_gm->waitOnInput(_gm->_messageDuration);
-				_vm->removeMessage();
-				_vm->paletteFadeOut();
-				g_system->fillScreen(kColorBlack);
-				_gm->_state._dream = false;
-				if (!_vm->loadGame(kSleepAutosaveSlot))
-					_vm->errorTempSave(false);
-				_gm->loadTime();
-				_gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
-				_gm->_state._dream = true;
-			}
-		} else {
-			_gm->changeRoom(MEETUP2);
-			_vm->renderRoom(*this);
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP))
-		_vm->renderMessage(kStringArsanoMeetup2_13);
-	else
-		return false;
-
-	return true;
-}
-
-void ArsanoMeetup2::shipStart() {
-	_gm->wait(12);
-	for (int i = 2; i <= 11; ++i) {
-		if (i >= 9)
-			_vm->renderImage(i - 1 + 128);
-		else
-			setSectionVisible(i - 1, false);
-		_vm->renderImage(i);
-		_gm->wait(2);
-	}
-	_vm->renderImage(11 + 128);
-}
-
-ArsanoMeetup3::ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 39;
-	_id = MEETUP3;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringUfo,kStringUfoDescription,UFO,EXIT,0,0,0,NULLROOM,3);
-	_objectState[1] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,1,1,0);
-	_objectState[2] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
-
-	_dialog2[0] = kStringArsanoDialog1;
-	_dialog2[1] = kStringDialogArsanoMeetup3_1;
-	_dialog2[2] = kStringDialogArsanoMeetup3_2;
-	_dialog2[3] = kStringDialogArsanoMeetup3_3;
-	_dialog3[0] = kStringDialogArsanoMeetup3_4;
-	_dialog3[1] = kStringDialogArsanoMeetup3_5;
-
-	_dialogsX[0] = kStringDialogX1;
-	_dialogsX[1] = kStringDialogX2;
-	_dialogsX[2] = kStringDialogX3;
-}
-
-bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
-	byte row2[6] = {1, 1, 1, 1, 0, 0};
-	byte row3[6] = {1, 1, 0, 0, 0, 0};
-	byte rowsX[6] = {1, 1, 1, 0, 0, 0};
-
-	if ((verb == ACTION_WALK) && (obj1._id == STAR))
-		_vm->renderMessage(kStringArsanoMeetup2);
-	else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
-		_vm->setCurrentImage(26);
-		_vm->renderImage(0);
-		_vm->paletteBrightness();
-		_gm->getInput();
-		g_system->fillScreen(kColorBlack);
-		_vm->renderRoom(*this);
-	} else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
-		g_system->fillScreen(kColorBlack);
-		_vm->setCurrentImage(36);
-		_vm->renderImage(0);
-		_vm->paletteBrightness();
-		_gm->dialog(3, rowsX, _dialogsX, 0);
-		_vm->renderImage(1);
-		_gm->wait(3);
-		_vm->renderImage(2);
-		_gm->wait(3);
-		_vm->renderImage(3);
-		_gm->wait(6);
-		_vm->renderImage(4);
-		_vm->playSound(kAudioGunShot);
-
-		while (_vm->_sound->isPlaying())
-			_gm->wait(1);
-
-		_vm->renderImage(5);
-		_gm->wait(3);
-		_vm->renderImage(4);
-		_vm->playSound(kAudioGunShot);
-
-		while (_vm->_sound->isPlaying())
-			_gm->wait(1);
-
-		_vm->renderImage(5);
-		_vm->paletteFadeOut();
-		_gm->wait(12);
-		_vm->setCurrentImage(0);
-		_vm->renderImage(0);
-		_vm->paletteFadeIn();
-		_gm->wait(18);
-		_gm->reply(kStringArsanoMeetup3_1, 2, 2 + 128);
-		_gm->wait(10);
-		_gm->reply(kStringArsanoMeetup3_2, 1, 1 + 128);
-
-		do {
-			int i = _gm->dialog(4, row2, _dialog2, 2);
-			switch (i) {
-			case 0:
-				_gm->reply(kStringArsanoMeetup3_3, 1, 1 + 128);
-				_gm->reply(kStringArsanoMeetup3_4, 1, 1 + 128);
-				break;
-			case 1:
-				_gm->reply(kStringArsanoMeetup3_5, 2, 2 + 128);
-				_gm->say(kStringArsanoMeetup3_6);
-				_gm->reply(kStringArsanoMeetup3_7, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_8, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_9, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_10, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_11, 2, 2 + 128);
-				if (_gm->dialog(2, row3, _dialog3, 0)) {
-					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
-					_gm->say(kStringArsanoMeetup3_13);
-				}
-				_gm->reply(kStringArsanoMeetup3_14, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_15, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_16, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_17, 2, 2 + 128);
-				if (_gm->dialog(2, row3, _dialog3, 0)) {
-					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
-					_gm->say(kStringArsanoMeetup3_13);
-				}
-				_gm->reply(kStringArsanoMeetup3_18, 2, 2 + 128);
-				break;
-			case 2:
-				_gm->reply(kStringArsanoMeetup3_19, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_20, 2, 2 + 128);
-				break;
-			case 3:
-				_gm->reply(kStringArsanoMeetup3_21, 1, 1 + 128);
-				_gm->reply(kStringArsanoMeetup3_22, 1, 1 + 128);
-				_gm->say(kStringArsanoMeetup3_23);
-				_gm->reply(kStringArsanoMeetup3_24, 1, 1 + 128);
-				_gm->reply(kStringArsanoMeetup3_25, 1, 1 + 128);
-			}
-			removeSentence(2, 2);
-		} while (!allSentencesRemoved(4, 2));
-		_gm->say(kStringArsanoMeetup3_26);
-		_gm->reply(kStringArsanoMeetup3_27, 1, 1 + 128);
-		_gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
-		_vm->paletteFadeOut();
-		// Remove all objects from the inventory except the Knife, Watch and Discman
-		bool has_knife = _gm->_rooms[INTRO]->getObject(1)->hasProperty(CARRIED);
-		bool has_watch = _gm->_rooms[INTRO]->getObject(2)->hasProperty(CARRIED);
-		bool has_discman = _gm->_rooms[INTRO]->getObject(3)->hasProperty(CARRIED);
-		_gm->_inventory.clear();
-		_gm->_inventoryScroll = 0;
-		if (has_knife)
-			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1));
-		if (has_watch)
-			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2));
-		if (has_discman)
-			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3));
-		_gm->changeRoom(CELL);
-		_gm->_state._dream = true;
-	} else
-		return false;
-
-	return true;
-}
-
-// Axacuss
-AxacussCell::AxacussCell(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 43;
-	_id = CELL;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[31] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,CELL_BUTTON,PRESS,1,1,0);
-	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
-	_objectState[2] = Object(_id, kStringTray,kStringTrayDescription,TRAY,UNNECESSARY,255,255,0);
-	_objectState[3] = Object(_id, kStringLamp,kStringLampDescription,NULLOBJECT,COMBINABLE,3,3,0);
-	_objectState[4] = Object(_id, kStringEyes,kStringEyesDescription,NULLOBJECT,NULLTYPE,4,4,0);
-	_objectState[5] = Object(_id, kStringWire,kStringDefaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
-	_objectState[6] = Object(_id, kStringSocket,kStringSocketDescription,SOCKET,COMBINABLE,5,5,0);
-	_objectState[7] = Object(_id, kStringMetalBlock,kStringMetalBlockDescription,MAGNET,TAKE|COMBINABLE,255,255,30);
-	_objectState[8] = Object(_id, kStringRobot,kStringRobotDescription,NULLOBJECT,NULLTYPE,255,255,0);
-	_objectState[9] = Object(_id, kStringTable,kStringTableDescription,CELL_TABLE,COMBINABLE,2,2,0);
-}
-
-void AxacussCell::onEntrance() {
-	if (_gm->_state._dream) {
-		_vm->renderMessage(kStringAxacussCell_1);
-		_gm->_time = ticksToMsec(500000);
-		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
-		_gm->_state._powerOff = false;
-		_gm->_state._dream = false;
-	}
-}
-
-void AxacussCell::animation() {
-	++_gm->_state._timeRobot;
-
-	if (_gm->_state._timeRobot == 299) {
-		_vm->renderImage(_gm->invertSection(31));
-		_vm->renderImage(28);
-		getObject(0)->_click = 255;
-		getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
-	} else if ((_gm->_state._timeRobot >= 301) && (_gm->_state._timeRobot <= 320)) {
-		_vm->renderImage(_gm->invertSection(329 - _gm->_state._timeRobot));
-		_vm->renderImage(328 - _gm->_state._timeRobot);
-	} else if (_gm->_state._timeRobot == 321) {
-		_vm->renderImage(31);
-		setSectionVisible(8, false);
-		getObject(0)->_click = 1;
-		getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
-	}
-
-	if (_gm->_state._timeRobot == 599) {
-		_vm->renderImage(_gm->invertSection(31));
-		_vm->renderImage(8);
-		getObject(0)->_click = 255;
-		getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
-	} else if ((_gm->_state._timeRobot >= 601) && (_gm->_state._timeRobot <= 620)) {
-		_vm->renderImage(_gm->_state._timeRobot - 593 + 128);
-		_vm->renderImage(_gm->_state._timeRobot - 592);
-	} else if (_gm->_state._timeRobot == 621) {
-		_vm->renderImage(31);
-		setSectionVisible(28, false);
-		getObject(0)->_click = 1;
-		getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
-	} else if (_gm->_state._timeRobot == 700)
-		_gm->_state._timeRobot = 0;
-	else if (_gm->_state._timeRobot == 10002) {
-		_vm->renderImage(18 + 128);
-		_vm->renderImage(29);
-		_vm->renderImage(7);
-		getObject(2)->_click = 13;
-	} else if (_gm->_state._timeRobot == 10003) {
-		setSectionVisible(29, false);
-		_vm->renderImage(30);
-		getObject(8)->_click = 12;
-		getObject(7)->_click = 14;
-		_vm->playSound(kAudioRobotBreaks);
-	} else if (_gm->_state._timeRobot == 10010)
-		--_gm->_state._timeRobot;
-
-	if (_gm->_state._timeRobot == 312) {
-		_vm->renderImage(7);
-		getObject(2)->_click = 13;
-	} else if (_gm->_state._timeRobot == 610) {
-		setSectionVisible(7, false);
-		getObject(2)->_click = 255;
-	}
-
-	if ((isSectionVisible(6)) &&
-		((_gm->_state._timeRobot == 310) || (_gm->_state._timeRobot == 610))) {
-		_vm->playSound(kAudioRobotShock);
-		_gm->_state._timeRobot = 10000;
-	}
-
-	_gm->setAnimationTimer(3);
-}
-
-bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_PRESS) && (obj1._id == CELL_BUTTON))
-		_vm->renderMessage(kStringAxacussCell_2);
-	else if ((verb == ACTION_PULL) && (obj1._id == CELL_WIRE) &&
-			 !isSectionVisible(2) &&
-			 !isSectionVisible(3) &&
-			 !isSectionVisible(5)) {
-		if (isSectionVisible(1)) {
-			_vm->renderImage(_gm->invertSection(1));
-			_vm->renderImage(2);
-			getObject(5)->_click = 7;
-		} else if (isSectionVisible(4)) {
-			_vm->renderImage(_gm->invertSection(4));
-			_vm->renderImage(3);
-			getObject(5)->_click = 8;
-		} else if (isSectionVisible(6)) {
-			_vm->renderImage(_gm->invertSection(6));
-			_vm->renderImage(5);
-			getObject(5)->_click = 10;
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, SOCKET) &&
-			   !isSectionVisible(1) && !isSectionVisible(4) && !isSectionVisible(6)) {
-		if (isSectionVisible(2)) {
-			_vm->renderImage(_gm->invertSection(2));
-			_vm->renderImage(1);
-			getObject(5)->_click = 6;
-		} else if (isSectionVisible(3)) {
-			_vm->renderImage(_gm->invertSection(3));
-			_vm->renderImage(4);
-			getObject(5)->_click = 9;
-		} else if (isSectionVisible(5)) {
-			_vm->renderImage(_gm->invertSection(5));
-			_vm->renderImage(6);
-			getObject(5)->_click = 11;
-		} else {
-			_gm->_inventory.remove(*getObject(5));
-			_vm->renderImage(4);
-			getObject(5)->_click = 9;
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, KNIFE) &&
-			   ((isSectionVisible(1)) || (isSectionVisible(2)))) {
-		if (isSectionVisible(1))
-			_gm->shock();
-		else {
-			_vm->renderImage(_gm->invertSection(2));
-			_vm->renderImage(3);
-			getObject(5)->_click = 8;
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, CELL_TABLE) &&
-			   !isSectionVisible(1) &&
-			   !isSectionVisible(2) &&
-			   !isSectionVisible(5) &&
-			   !isSectionVisible(6)) {
-		if (isSectionVisible(3)) {
-			_vm->renderImage(_gm->invertSection(3));
-			_vm->renderImage(5);
-			getObject(5)->_click = 10;
-		} else if (isSectionVisible(4)) {
-			_vm->renderImage(_gm->invertSection(4));
-			_vm->renderImage(6);
-			_gm->shock();
-		} else {
-			_gm->_inventory.remove(*getObject(5));
-			_vm->renderImage(5);
-			getObject(5)->_click = 10;
-		}
-	} else if ((verb == ACTION_TAKE) && (obj1._id == CELL_WIRE) && !(obj1.hasProperty(CARRIED))) {
-		if (isSectionVisible(3)) {
-			_vm->renderImage(_gm->invertSection(3));
-			_gm->takeObject(obj1);
-		} else if (isSectionVisible(5)) {
-			_vm->renderImage(_gm->invertSection(5));
-			_gm->takeObject(obj1);
-		} else
-			_vm->renderMessage(kStringAxacussCell_3);
-	} else if ((verb == ACTION_WALK) && (obj1._id == CELL_DOOR) && (obj1.hasProperty(OPENED))) {
-		if (isSectionVisible(30) || isSectionVisible(29))
-			return false;
-		_vm->playSound(kAudioGunShot);
-
-		while (_vm->_sound->isPlaying())
-			_gm->wait(1);
-
-		_vm->playSound(kAudioGunShot);
-		_vm->playSound(kAudioGunShot);
-		_gm->dead(kStringAxacussCell_4);
-	} else if ((verb == ACTION_USE) && (obj1._id == TRAY))
-		_vm->renderMessage(kStringAxacussCell_5);
-	else if ((verb == ACTION_TAKE) && (obj1._id == MAGNET)) {
-		if (isSectionVisible(6))
-			_gm->shock();
-		_gm->takeObject(obj1);
-		_vm->renderMessage(kStringOk);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussCorridor1::AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR1;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[21] = kShownTrue;
-	_shown[23] = kShownTrue;
-	_shown[25] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
-}
-
-void AxacussCorridor1::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-
-AxacussCorridor2::AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR2;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[17] = kShownTrue;
-	_shown[21] = kShownTrue;
-	_shown[24] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
-	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
-}
-
-void AxacussCorridor2::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-AxacussCorridor3::AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR3;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[19] = kShownTrue;
-	_shown[23] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
-}
-
-void AxacussCorridor3::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-void AxacussCorridor4::onEntrance() {
-	_gm->great(4);
-	_gm->corridorOnEntrance();
-	if (_gm->_rooms[GUARD]->isSectionVisible(1))
-		_gm->busted(0);
-}
-
-AxacussCorridor4::AxacussCorridor4(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR4;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[8] = kShownTrue;
-	_shown[9] = kShownTrue;
-	_shown[11] = kShownTrue;
-	_shown[15] = kShownTrue;
-	_shown[18] = kShownTrue;
-	_shown[20] = kShownTrue;
-	_shown[26] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
-	_objectState[2] = Object(_id, kStringCellDoor,kStringCellDoorDescription,DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
-	_objectState[3] = Object(_id, kStringLaptop,kStringDefaultDescription,NEWSPAPER,TAKE,6,6,8);
-	_objectState[4] = Object(_id, kStringWristwatch,kStringDefaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
-	_objectState[5] = Object(_id, kStringTable,kStringDefaultDescription,TABLE,COMBINABLE,5,5,0);
-}
-
-void AxacussCorridor4::animation() {
-}
-
-bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_TAKE) && (obj1._id == NEWSPAPER)) {
-		setSectionVisible(9, false);
-		_gm->takeObject(obj1);
-		if (isSectionVisible(29))
-			_vm->renderImage(29);
-	} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, TABLE, WATCH)) ||
-			   ((verb == ACTION_GIVE) && (obj1._id == WATCH) && (obj2._id == TABLE))) {
-		if (obj1._id == WATCH)
-			_gm->_inventory.remove(obj1);
-		else
-			_gm->_inventory.remove(obj2);
-
-		_vm->renderImage(29);
-		getObject(4)->_click = 8;
-	} else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) && !obj1.hasProperty(CARRIED)) {
-		setSectionVisible(29, false);
-		getObject(4)->_click = 255;
-		_gm->takeObject(*_gm->_rooms[INTRO]->getObject(2));
-		if (isSectionVisible(9))
-			_vm->renderImage(9);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussCorridor5::AxacussCorridor5(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR5;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[12] = kShownTrue;
-	_shown[22] = kShownTrue;
-	_shown[23] = kShownTrue;
-	_shown[24] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
-
-	_dialog1[0] = kStringDialogAxacussCorridor5_1;
-	_dialog1[1] = kStringDialogAxacussCorridor5_2;
-	_dialog2[0] = kStringDialogAxacussCorridor5_3;
-	_dialog2[1] = kStringDialogAxacussCorridor5_4;
-	_dialog3[0] = kStringDialogAxacussCorridor5_5;
-	_dialog3[1] = kStringDialogAxacussCorridor5_6;
-	_dialog3[2] = kStringDialogAxacussCorridor5_7;
-	_dialog3[3] = kStringDialogAxacussCorridor5_7;
-
-	_rows[0] = 1;
-	_rows[1] = 1;
-	_rows[2] = 1;
-	_rows[3] = 1;
-	_rows[4] = 0;
-	_rows[5] = 0;
-}
-
-void AxacussCorridor5::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-bool AxacussCorridor5::handleMoneyDialog() {
-	if (_gm->dialog(2, _rows, _dialog2, 0) == 0) {
-		_gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
-		addAllSentences(2);
-		if (_gm->_state._money == 0) {
-			removeSentence(2, 2);
-			removeSentence(3, 2);
-		} else {
-			Common::String string = _vm->getGameString(kStringDialogAxacussCorridor5_7);
-			_vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), _gm->_state._money - 200));
-			_vm->setGameString(kStringPlaceholder2, Common::String::format(string.c_str(), _gm->_state._money));
-			_dialog3[2] = kStringPlaceholder1;
-			_dialog3[3] = kStringPlaceholder2;
-		}
-		switch (_gm->dialog(4, _rows, _dialog3, 2)) {
-		case 1:
-			_gm->wait(3);
-			_vm->renderImage(1);
-			_vm->playSound(kAudioVoiceHalt);
-			_vm->renderImage(_gm->invertSection(1));
-			_gm->wait(5);
-			_vm->renderImage(2);
-			_gm->wait(2);
-			_gm->shot(3, _gm->invertSection(3));
-			break;
-		case 2:
-			if (_gm->_state._money > 1100) {
-				stopInteract(_gm->_state._money - 200);
-				return true;
-			}
-			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
-			break;
-		case 3:
-			if (_gm->_state._money >= 900) {
-				stopInteract(_gm->_state._money);
-				return true;
-			}
-			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
-			break;
-		}
-	}
-	return false;
-}
-
-void AxacussCorridor5::stopInteract(int sum) {
-	_gm->reply(kStringAxacussCorridor5_7, 1, 1 + 128);
-	_gm->great(0);
-	_gm->changeRoom(ELEVATOR);
-	_gm->takeMoney(-sum);
-}
-
-bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
-		g_system->fillScreen(kColorBlack);
-		_vm->setCurrentImage(41);
-		_vm->renderImage(0);
-		_vm->paletteBrightness();
-		if (_gm->_guiEnabled) {
-			_gm->reply(kStringAxacussCorridor5_1, 1, 1 + 128);
-			if (handleMoneyDialog())
-				return true;
-		} else {
-			_gm->_guiEnabled = true;
-			_gm->reply(kStringAxacussCorridor5_2, 1, 1 + 128);
-			if (_gm->dialog(2, _rows, _dialog1, 0))
-				_gm->reply(kStringAxacussCorridor5_3, 1, 1 + 128);
-			else {
-				_gm->reply(kStringAxacussCorridor5_4, 1, 1 + 128);
-				if (handleMoneyDialog())
-					return true;
-			}
-		}
-		g_system->fillScreen(kColorBlack);
-		return true;
-	}
-	return false;
-}
-
-AxacussCorridor6::AxacussCorridor6(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR6;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[22] = kShownTrue;
-	_shown[24] = kShownTrue;
-	_shown[25] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
-	_objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
-}
-
-void AxacussCorridor6::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
-			(obj1.hasProperty(OPENED))) {
-		_vm->renderImage(6);
-		setSectionVisible(7, false);
-		obj1.resetProperty(EXIT | OPENABLE | CLOSED);
-		_gm->_rooms[CORRIDOR8]->setSectionVisible(27, false);
-		_gm->_rooms[CORRIDOR8]->setSectionVisible(28, true);
-		_gm->_rooms[CORRIDOR8]->getObject(0)->disableProperty(OPENED);
-		_vm->playSound(kAudioDoorClose);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussCorridor7::AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR7;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[10] = kShownTrue;
-	_shown[21] = kShownTrue;
-	_shown[24] = kShownTrue;
-	_shown[25] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
-}
-
-void AxacussCorridor7::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-AxacussCorridor8::AxacussCorridor8(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR8;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[15] = kShownTrue;
-	_shown[20] = kShownTrue;
-	_shown[22] = kShownTrue;
-	_shown[28] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
-	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
-}
-
-void AxacussCorridor8::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
-		_vm->renderImage(27);
-		setSectionVisible(28, false);
-		obj1.setProperty(OPENED);
-		_gm->_rooms[CORRIDOR6]->setSectionVisible(6, false);
-		_gm->_rooms[CORRIDOR6]->setSectionVisible(7, true);
-		_gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | OPENED | OPENABLE);
-		_gm->_rooms[CORRIDOR6]->getObject(2)->_click = 4;
-		_vm->playSound(kAudioDoorOpen);
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1._type & OPENED)) {
-		_vm->renderImage(28);
-		setSectionVisible(27, false);
-		obj1.disableProperty(OPENED);
-		_gm->_rooms[CORRIDOR6]->setSectionVisible(6, true);
-		_gm->_rooms[CORRIDOR6]->setSectionVisible(7, false);
-		_gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | CLOSED | OPENABLE);
-		_vm->playSound(kAudioDoorClose);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussCorridor9::AxacussCorridor9(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = CORRIDOR9;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[19] = kShownTrue;
-	_shown[23] = kShownTrue;
-	_shown[28] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
-	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
-}
-
-void AxacussCorridor9::onEntrance() {
-	_gm->corridorOnEntrance();
-}
-
-bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1.hasProperty(OPENED))) {
-		_vm->renderImage(28);
-		setSectionVisible(27, false);
-		obj1.disableProperty(OPENED);
-		_gm->_rooms[GUARD]->setSectionVisible(6, false);
-		_gm->_rooms[GUARD]->getObject(2)->disableProperty(OPENED);
-		_vm->playSound(kAudioDoorClose);
-	} else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
-		_vm->renderImage(27);
-		setSectionVisible(28, false);
-		obj1.setProperty(OPENED);
-		_gm->_rooms[GUARD]->setSectionVisible(6, true);
-		_gm->_rooms[GUARD]->getObject(2)->setProperty(OPENED);
-		_vm->playSound(kAudioDoorOpen);
-		if (!_gm->_rooms[GUARD]->isSectionVisible(1))
-			_gm->busted(0);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussBcorridor::AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 6;
-	_id = BCORRIDOR;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR1,NULLTYPE,4,4,0);
-	_objectState[1] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR2,NULLTYPE,5,5,0);
-	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
-	_objectState[3] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
-	_objectState[4] = Object(_id, kStringDoor,kStringDoorDescription1,DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
-	_objectState[5] = Object(_id, kStringDoor,kStringDoorDescription2,DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
-	_objectState[6] = Object(_id, kStringDoor,kStringDoorDescription3,DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
-	_objectState[7] = Object(_id, kStringDoor,kStringDoorDescription4,DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
-}
-
-void AxacussBcorridor::onEntrance() {
-	_gm->corridorOnEntrance();
-	if (isSectionVisible(7))
-		_gm->busted(-1);
-}
-
-bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
-	if (obj1.hasProperty(EXIT) ||
-		((verb == ACTION_USE) && obj1.hasProperty(COMBINABLE) && obj2.hasProperty(EXIT))) {
-		_gm->_state._playerHidden = false;
-	}
-
-	if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) && obj1.hasProperty(OPENED)) {
-		_vm->renderImage(_gm->invertSection(obj1._id - DOOR1 + 1));
-		_vm->playSound(kAudioDoorClose);
-		obj1.disableProperty(OPENED);
-		obj1.setProperty(CLOSED);
-		if (obj1.hasProperty(OCCUPIED)) {
-			_gm->_state._destination = 255;
-			obj1.disableProperty(OCCUPIED);
-			obj1.setProperty(CAUGHT);
-			if (!_gm->_rooms[OFFICE_L1 + obj1._id - DOOR1]->isSectionVisible(4))
-				_gm->search(180);
-			else
-				_gm->_state._eventTime = kMaxTimerValue;
-		}
-	} else if (((verb == ACTION_WALK) || ((verb == ACTION_OPEN) && !obj1.hasProperty(OPENED))) &&
-			   (obj1._id >= DOOR1) && (obj1._id <= DOOR4) &&
-			   obj1.hasProperty(OCCUPIED)) {
-		_vm->renderMessage(kStringDontEnter);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR1) &&
-			   !getObject(4)->hasProperty(OPENED)) {
-		if (getObject(4)->hasProperty(OCCUPIED))
-			_vm->renderMessage(kStringDontEnter);
-		else {
-			_vm->renderImage(1);
-			_vm->playSound(kAudioDoorOpen);
-			if (getObject(4)->hasProperty(CAUGHT))
-				_gm->busted(11);
-			getObject(4)->resetProperty(EXIT | OPENABLE | OPENED);
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) && !getObject(5)->hasProperty(OPENED)) {
-		if (getObject(5)->hasProperty(OCCUPIED))
-			_vm->renderMessage(kStringDontEnter);
-		else {
-			_vm->renderImage(2);
-			_vm->playSound(kAudioDoorOpen);
-			if (getObject(5)->hasProperty(CAUGHT))
-				_gm->busted(16);
-			getObject(5)->resetProperty(EXIT | OPENABLE | OPENED);
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) && !getObject(6)->hasProperty(OPENED)) {
-		if (getObject(6)->hasProperty(OCCUPIED))
-			_vm->renderMessage(kStringDontEnter);
-		else {
-			_vm->renderImage(3);
-			_vm->playSound(kAudioDoorOpen);
-			if (getObject(6)->hasProperty(CAUGHT))
-				_gm->busted(15);
-			getObject(6)->resetProperty(EXIT | OPENABLE | OPENED);
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) && !getObject(7)->hasProperty(OPENED)) {
-		if (getObject(7)->hasProperty(OCCUPIED)) {
-			_vm->renderMessage(kStringDontEnter);
-		} else {
-			_vm->renderImage(4);
-			_vm->playSound(kAudioDoorOpen);
-			if (getObject(7)->hasProperty(CAUGHT))
-				_gm->busted(20);
-			getObject(7)->resetProperty(EXIT | OPENABLE | OPENED);
-		}
-	} else if ((verb == ACTION_LOOK) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
-		_gm->_state._nameSeen[obj1._id - DOOR1] = true;
-		return false;
-	} else if ((verb == ACTION_WALK) && ((obj1._id == PILLAR1) || (obj1._id == PILLAR2))) {
-		_vm->renderMessage(kStringAxacussBcorridor_1);
-		_gm->_state._playerHidden = true;
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussIntersection::AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 40;
-	_id = GUARD;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CORRIDOR4, 21);
-	_objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 3, 3, 0, CORRIDOR7, 5);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 6, CORRIDOR9, 3);
-	_objectState[3] = Object(_id, kStringAxacussan, kStringAxacussanDescription, GUARDIAN, TALK, 0, 0, 0);
-	_objectState[4] = Object(_id, kStringImage, kStringImageDescription2, NULLOBJECT, NULLTYPE, 2, 2, 0);
-	_objectState[5] = Object(_id, kStringMastercard, kStringMastercardDescription, MASTERKEYCARD, TAKE | COMBINABLE, 255, 255, 1);
-
-	_dialogsX[0] = kStringDialogX1;
-	_dialogsX[1] = kStringDialogX2;
-	_dialogsX[2] = kStringDialogX3;
-}
-
-bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
-	byte rowsX[6] = {1, 1, 1, 0, 0, 0};
-
-	if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !isSectionVisible(1))
-		_gm->guardShot();
-	else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
-		_gm->_rooms[CORRIDOR9]->setSectionVisible(27, true);
-		_gm->_rooms[CORRIDOR9]->setSectionVisible(28, false);
-		_gm->_rooms[CORRIDOR9]->getObject(1)->setProperty(OPENED);
-		return false;
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
-		_gm->_rooms[CORRIDOR9]->setSectionVisible(27, false);
-		_gm->_rooms[CORRIDOR9]->setSectionVisible(28, true);
-		_gm->_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
-		return false;
-	} else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
-		_gm->dialog(3, rowsX, _dialogsX, 0);
-		_gm->guardShot();
-	} else if ((verb == ACTION_TAKE) && (obj1._id == MASTERKEYCARD)) {
-		_gm->great(0);
-		setSectionVisible(7, false);
-		return false;
-	} else if ((verb == ACTION_USE) && (Object::combine(obj1, obj2, MAGNET, GUARDIAN) || Object::combine(obj1, obj2, KNIFE, GUARDIAN)))
-		_vm->renderMessage(kStringArsanoEntrance27);
-	else
-		return false;
-
-	return true;
-}
-
-AxacussExit::AxacussExit(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 42;
-	_id = GUARD3;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CORRIDOR1,22);
-	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,0,0,0,NULLROOM,20);
-	_objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,15);
-	_objectState[3] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,2,2,11,OFFICE_L,0);
-	_objectState[4] = Object(_id, kStringLamp2,kStringDefaultDescription,LAMP,COMBINABLE,3,3,0);
-	_objectState[5] = Object(_id, kStringAxacussan,kStringDefaultDescription,GUARDIAN,TALK,5,5,0);
-	_objectState[6] = Object(_id, kStringImage,kStringGenericDescription5,NULLOBJECT,NULLTYPE,4,4,0);
-
-	_dialogsX[0] = kStringDialogX1;
-	_dialogsX[1] = kStringDialogX2;
-	_dialogsX[2] = kStringDialogX3;
-}
-
-bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
-	byte rowsX[6] = {1, 1, 1, 0, 0, 0};
-
-	if (((verb == ACTION_WALK) || (verb == ACTION_OPEN)) && (obj1._id == DOOR) && !_gm->_state._powerOff)
-		_gm->guard3Shot();
-	else if ((verb == ACTION_TALK) && (obj1._id == GUARDIAN)) {
-		_gm->dialog(3, rowsX, _dialogsX,0);
-		_gm->guard3Shot();
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LAMP, MAGNET)) {
-		_gm->_inventory.remove(*_gm->_rooms[CELL]->getObject(7));
-		for (int i = 4; i <= 11; i++) {
-			_vm->renderImage(i);
-			if (i == 11)
-				_vm->playSound(kAudioSmash); // 046/4020
-			_gm->wait(1);
-			_vm->renderImage(i + 128);
-		}
-		_gm->_state._powerOff = true;
-		_objectState[5]._click = 255;
-
-		_gm->search(450);
-		_gm->roomBrightness();
-	} else if ((verb == ACTION_USE) && (Object::combine(obj1,obj2,MAGNET,GUARDIAN) || Object::combine(obj1,obj2,KNIFE,GUARDIAN)))
-		_vm->renderMessage(kStringArsanoEntrance27);
-	else
-		return false;
-
-	return true;
-}
-
-AxacussOffice1::AxacussOffice1(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 7;
-	_id = OFFICE_L1;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[7] = kShownTrue;
-	_shown[9] = kShownTrue;
-	_shown[16] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
-	_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
-	_objectState[2] = Object(_id, kStringMoney,kStringMoneyDescription1,MONEY,TAKE,255,255,0);
-	_objectState[3] = Object(_id, kStringLocker,kStringLockerDescription,LOCKER,OPENABLE|CLOSED,5,5,0);
-	_objectState[4] = Object(_id, kStringLetter,kStringDefaultDescription,LETTER,UNNECESSARY,3,3,0);
-}
-
-bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) {
-	Common::String input;
-	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
-			obj1.hasProperty(OPENED)) {
-		_vm->renderImage(_gm->invertSection(9));
-		obj1.disableProperty(OPENED);
-		obj1.setProperty(CLOSED);
-		_vm->playSound(kAudioDoorClose);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
-			   !getObject(0)->hasProperty(OPENED)) {
-		_vm->renderImage(9);
-		getObject(0)->disableProperty(CLOSED);
-		getObject(0)->setProperty(OPENED);
-		_vm->playSound(kAudioDoorOpen);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
-		_vm->renderImage(4);
-		setSectionVisible(16, false);
-		_vm->playSound(kAudioSmash);
-	} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
-		if (isSectionVisible(4))
-			_vm->renderMessage(kStringBroken);
-		else
-			_gm->telomat(0);
-	} else if (((verb == ACTION_OPEN) || (verb == ACTION_USE)) &&
-			   (obj1._id == LOCKER) &&
-			   !obj1.hasProperty(OPENED)) {
-		_vm->renderMessage(kStringAxacussOffice1_1);
-		_vm->renderBox(160, 70, 70, 10, kColorDarkBlue);
-		_gm->edit(input, 161, 71, 10);
-
-		_vm->removeMessage();
-		if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
-			if (!input.equals("89814")) {
-				if (input.equals("41898"))
-					_vm->renderMessage(kStringAxacussOffice1_2);
-				else
-					_vm->renderMessage(kStringAxacussOffice1_3);
-			} else {
-				_vm->renderImage(6);
-				setSectionVisible(7, false);
-				obj1.resetProperty(OPENABLE | OPENED);
-				if (getObject(2)->hasProperty(TAKE)) {
-					_vm->renderImage(8);
-					getObject(2)->_click = 9;
-				}
-				_vm->playSound(kAudioDoorOpen);
-				_gm->great(7);
-			}
-		}
-	} else if ((verb == ACTION_CLOSE) && (obj1._id == LOCKER) && obj1.hasProperty(OPENED)) {
-		_vm->renderImage(7);
-		setSectionVisible(6, false);
-		obj1.resetProperty(OPENABLE | CLOSED);
-		setSectionVisible(8, false);
-		getObject(2)->_click = 255;
-		_vm->playSound(kAudioDoorClose);
-	} else if ((verb == ACTION_TAKE) && (obj1._id == MONEY)) {
-		_vm->renderImage(6);
-		setSectionVisible(8, false);
-		getObject(2)->_click = 255;
-		getObject(2)->resetProperty();
-		_gm->takeMoney(500);
-	} else if ((verb == ACTION_LOOK) && (obj1._id == LETTER)) {
-		g_system->fillScreen(kColorBlack);
-		_vm->renderText(kStringAxacussOffice1_4, 10, 10, 4);
-		_vm->renderText(kStringAxacussOffice1_5, 270, 10, 4);
-		_vm->renderText(kStringAxacussOffice1_6, 10, 60, 4);
-		_vm->renderText(kStringAxacussOffice1_7, 10, 75, 4);
-		_vm->renderText(kStringAxacussOffice1_8, 10, 86, 4);
-		_vm->renderText(kStringAxacussOffice1_9, 10, 97, 4);
-		_vm->renderText(kStringAxacussOffice1_10, 10, 108, 4);
-		_vm->renderText(kStringAxacussOffice1_11, 10, 119, 4);
-		_vm->renderText(kStringAxacussOffice1_12, 10, 130, 4);
-		_vm->renderText(kStringAxacussOffice1_13, 10, 147, 4);
-		_vm->renderText(kStringAxacussOffice1_14, 200, 170, 4);
-		_vm->renderText(kStringAxacussOffice1_15, 200, 181, 4);
-		_gm->getInput();
-		g_system->fillScreen(kColorBlack);
-		_vm->renderMessage(kStringAxacussOffice1_16);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussOffice2::AxacussOffice2(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 7;
-	_id = OFFICE_L2;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[9] = kShownTrue;
-	_shown[16] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,9,BCORRIDOR,9);
-	_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
-	_objectState[2] = Object(_id, kStringCube,kStringGenericDescription6,NULLOBJECT,NULLTYPE,0,0,0);
-	_objectState[3] = Object(_id, kStringImage,kStringGenericDescription7,NULLOBJECT,NULLTYPE,1,1,0);
-	_objectState[4] = Object(_id, kStringStrangeThing,kStringGenericDescription8,NULLOBJECT,UNNECESSARY,2,2,0);
-}
-
-bool AxacussOffice2::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
-			obj1.hasProperty(OPENED)) {
-		_vm->renderImage(_gm->invertSection(9));
-		obj1.disableProperty(OPENED);
-		obj1.setProperty(CLOSED);
-		_vm->playSound(kAudioDoorClose);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) && !getObject(0)->hasProperty(OPENED)) {
-		_vm->renderImage(9);
-		getObject(0)->disableProperty(CLOSED);
-		getObject(0)->setProperty(OPENED);
-		_vm->playSound(kAudioDoorOpen);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
-		_vm->renderImage(4);
-		setSectionVisible(16, false);
-		_vm->playSound(kAudioSmash);
-	} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
-		if (isSectionVisible(4))
-			_vm->renderMessage(kStringBroken);
-		else
-			_gm->telomat(1);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussOffice3::AxacussOffice3(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 8;
-	_id = OFFICE_R1;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[3] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
-	_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
-	_objectState[2] = Object(_id, kStringImage,kStringImageDescription2,NULLOBJECT,UNNECESSARY,1,1,0);
-	_objectState[3] = Object(_id, kStringImage,kStringImageDescription2,PAINTING,UNNECESSARY,2,2,0);
-	_objectState[4] = Object(_id, kStringPlant,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,3,3,0);
-	_objectState[5] = Object(_id, kNoString,kStringDefaultDescription,MONEY,TAKE|COMBINABLE,255,255,0);
-}
-
-bool AxacussOffice3::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
-			obj1.hasProperty(OPENED)) {
-		_vm->renderImage(_gm->invertSection(3));
-		obj1.disableProperty(OPENED);
-		obj1.setProperty(CLOSED);
-		_vm->playSound(kAudioDoorClose);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
-			   !getObject(0)->hasProperty(OPENED)) {
-		_vm->renderImage(3);
-		getObject(0)->disableProperty(CLOSED);
-		getObject(0)->setProperty(OPENED);
-		_vm->playSound(kAudioDoorOpen);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
-		_vm->renderImage(4);
-		_vm->playSound(kAudioSmash);
-	} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
-		if (isSectionVisible(4))
-			_vm->renderMessage(kStringBroken);
-		else
-			_gm->telomat(2);
-	} else if ((verb == ACTION_LOOK) && (obj1._id == PAINTING)) {
-		_vm->renderMessage(kStringAxacussOffice3_1);
-		_gm->takeMoney(300);
-		obj1._id = NULLOBJECT;
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussOffice4::AxacussOffice4(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 8;
-	_id = OFFICE_R2;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,0,0,3,BCORRIDOR,5);
-	_objectState[1] = Object(_id, kStringComputer,kStringDefaultDescription,COMPUTER,COMBINABLE,4,4,0);
-	_objectState[2] = Object(_id, kStringStatue,kStringStatueDescription,NULLOBJECT,UNNECESSARY,6,6,0);
-	_objectState[3] = Object(_id, kStringPlant,kStringPlantDescription,NULLOBJECT,UNNECESSARY,5,5,0);
-}
-
-bool AxacussOffice4::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
-		_vm->renderImage(_gm->invertSection(3));
-		obj1.disableProperty(OPENED);
-		obj1.setProperty(CLOSED);
-		_vm->playSound(kAudioDoorClose);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR) &&
-			   !getObject(0)->hasProperty(OPENED)) {
-		_vm->renderImage(3);
-		getObject(0)->disableProperty(CLOSED);
-		getObject(0)->setProperty(OPENED);
-		_vm->playSound(kAudioDoorOpen);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
-		_vm->renderImage(4);
-		_vm->playSound(kAudioSmash);
-	} else if ((verb == ACTION_LOOK) && (obj1._id == COMPUTER)) {
-		if (isSectionVisible(4))
-			_vm->renderMessage(kStringBroken);
-		else
-			_gm->telomat(3);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussOffice5::AxacussOffice5(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 7;
-	_id = OFFICE_L;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[17] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|OPENED,6,6,17,GUARD3,9);
-	_objectState[1] = Object(_id, kStringComputer,kStringComputerDescription,COMPUTER,COMBINABLE,4,4,0);
-	_objectState[2] = Object(_id, kStringGraffiti,kStringGraffitiDescription,NULLOBJECT,NULLTYPE,7,7,0);
-	_objectState[3] = Object(_id, kStringMoney,kStringMoneyDescription2,MONEY,TAKE,8,8,0);
-}
-
-void AxacussOffice5::onEntrance() {
-	_gm->great(5);
-}
-
-bool AxacussOffice5::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COMPUTER, MAGNET)) {
-		_vm->renderImage(4);
-		_vm->playSound(kAudioSmash);
-	} else if ((verb == ACTION_TAKE) && (obj1._id == MONEY)) {
-		_vm->renderImage(_gm->invertSection(5));
-		obj1._click = 255;
-		_gm->takeMoney(350);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussElevator::AxacussElevator(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 3;
-	_id = ELEVATOR;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,0,0,0);
-	_objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,1,1,0);
-	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,255,255,0,NULLROOM,22);
-	_objectState[3] = Object(_id, kStringJungle,kStringJungleDescription,JUNGLE,NULLTYPE,255,255,0,STATION,2);
-}
-
-bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
-		g_system->fillScreen(kColorBlack);
-		_vm->setCurrentImage(41);
-		_vm->renderImage(0);
-		_vm->paletteBrightness();
-		_gm->reply(kStringAxacussElevator_1, 1, 1 + 128);
-		_gm->say(kStringAxacussElevator_2);
-		g_system->fillScreen(kColorBlack);
-	} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
-		if (!isSectionVisible(3)) {
-			_vm->renderImage(1);
-			getObject(2)->resetProperty();
-			_vm->playSound(kAudioSlideDoor);
-			_gm->wait(25);
-			for (int i = 3; i <= 7; i++) {
-				_gm->wait(2);
-				_vm->renderImage(i);
-			}
-			getObject(3)->resetProperty(EXIT);
-			getObject(3)->_click = 2;
-			_vm->renderImage(_gm->invertSection(1));
-			if (!(_gm->_state._greatFlag & 0x4000)) {
-				_vm->playSound(kAudioFoundLocation);
-				_gm->_state._greatFlag |= 0x4000;
-			}
-		}
-	} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
-		if (isSectionVisible(3)) {
-			_vm->renderImage(2);
-			getObject(3)->resetProperty();
-			getObject(3)->_click = 255;
-			_vm->playSound(kAudioSlideDoor);
-			for (int i = 7; i >= 3; i--) {
-				_gm->wait(2);
-				_vm->renderImage(_gm->invertSection(i));
-			}
-			_gm->wait(25);
-			_vm->playSound(kAudioSlideDoor);
-			getObject(2)->resetProperty(EXIT);
-			_vm->renderImage(_gm->invertSection(2));
-		}
-	} else if ((verb == ACTION_WALK) && (obj1._id == JUNGLE)) {
-		_vm->paletteFadeOut();
-		g_system->fillScreen(kColorBlack);
-		_vm->_screen->setGuiBrightness(255);
-		_vm->paletteBrightness();
-		_vm->renderMessage(kStringAxacussElevator_3);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_vm->_screen->setGuiBrightness(0);
-		_vm->paletteBrightness();
-		_gm->_time += ticksToMsec(125000); // 2 hours
-		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
-		return false;
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussStation::AxacussStation(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 5;
-	_id = STATION;
-	_shown[0] = kShownTrue;
-	_objectState[0] = Object(_id, kStringSign,kStringDefaultDescription,STATION_SIGN,NULLTYPE,0,0,0);
-	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE|CLOSED,1,1,0,NULLROOM,7);
-}
-
-bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_LOOK) && (obj1._id == STATION_SIGN)) {
-		_gm->changeRoom(SIGN);
-	} else if ((verb == ACTION_WALK) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
-		_gm->great(0);
-		_gm->_guiEnabled = false;
-		_vm->paletteFadeOut();
-		_vm->_system->fillScreen(kColorBlack);
-		_gm->changeRoom(OUTRO);
-	} else
-		return false;
-
-	return true;
-}
-
-AxacussSign::AxacussSign(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 32;
-	_id = SIGN;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,STATION,22);
-	_objectState[1] = Object(_id, kStringSlot,kStringDefaultDescription,STATION_SLOT,COMBINABLE,0,0,0);
-}
-
-bool AxacussSign::interact(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, STATION_SLOT, MONEY) &&
-		isSectionVisible(1)) {
-		_gm->takeMoney(-180);
-		_vm->renderImage(2);
-		setSectionVisible(1, false);
-		_gm->_state._eventTime = _gm->_time + ticksToMsec(600);
-		_gm->_state._eventCallback = kTaxiFn;
-		return true;
-	}
-	return false;
-}
-
-
-Outro::Outro(SupernovaEngine *vm, GameManager1 *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = -1;
-	_id = OUTRO;
-	_shown[0] = kShownFalse;
-
-	_outroText =
-		_vm->getGameString(kStringOutro1) + '\0' +
-		_vm->getGameString(kStringOutro2) + '\0' +
-		_vm->getGameString(kStringOutro3) + '\0' +
-		_vm->getGameString(kStringOutro4) + '\0' +
-		_vm->getGameString(kStringOutro5) + '\0' +
-		_vm->getGameString(kStringOutro6) + '\0' +
-		_vm->getGameString(kStringOutro7) + '\0' +
-		_vm->getGameString(kStringOutro8) + '\0' +
-		_vm->getGameString(kStringOutro9) + '\0' +
-		_vm->getGameString(kStringOutro10) + '\0' +
-		_vm->getGameString(kStringOutro11) + '\0' +
-		_vm->getGameString(kStringOutro12) + '\0' +
-		_vm->getGameString(kStringOutro13) + '\0' +
-		_vm->getGameString(kStringOutro14) + '\0';
-}
-
-void Outro::onEntrance() {
-	_vm->setCurrentImage(35);
-	_vm->renderImage(0);
-	_vm->renderImage(1);
-	_vm->paletteFadeIn();
-	_gm->wait(10);
-	for (int i = 8; i <= 21; i++) {
-		_vm->renderImage(i);
-		_gm->wait(2);
-		_vm->renderImage(_gm->invertSection(i));
-	}
-	_gm->wait(18);
-	_vm->renderImage(_gm->invertSection(1));
-	for (int i = 2; i <= 7; i++) {
-		_vm->renderImage(i);
-		_gm->wait(3);
-		_vm->renderImage(_gm->invertSection(i));
-	}
-
-	_vm->playSound(kMusicOutro);
-	Marquee marquee(_vm->_screen, Marquee::kMarqueeOutro, _outroText.c_str());
-	while (!_vm->shouldQuit()) {
-		_gm->updateEvents();
-		marquee.renderCharacter();
-		if (_gm->_mouseClicked || _gm->_keyPressed)
-			break;
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	_vm->paletteFadeOut();
-	_vm->setCurrentImage(55);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_gm->getInput();
-	_vm->paletteFadeOut();
-	_vm->_screen->setViewportBrightness(1);
-
-	Common::Event event;
-	event.type = Common::EVENT_RTL;
-	_vm->getEventManager()->pushEvent(event);
-}
-
-void Outro::animation() {
-}
-
-void Outro::animate(int filenumber, int section1, int section2, int duration) {
-	_vm->setCurrentImage(filenumber);
-	while (duration) {
-		_vm->renderImage(section1);
-		_gm->wait(2);
-		_vm->renderImage(section2);
-		_gm->wait(2);
-		--duration;
-	}
-}
-
-void Outro::animate(int filenumber, int section1, int section2, int duration,
-					MessagePosition position, const char *text) {
-	_vm->renderMessage(text, position);
-	int delay = (Common::strnlen(text, 512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
-	_vm->setCurrentImage(filenumber);
-	while (delay) {
-		if (section1)
-			_vm->renderImage(section1);
-		_gm->wait(2);
-		if (section2)
-			_vm->renderImage(section2);
-		_gm->wait(2);
-		--delay;
-	}
-	_vm->removeMessage();
-}
-
-void Outro::animate(int filenumber, int section1, int section2, int section3, int section4,
-					int duration, MessagePosition position, const char *text) {
-	_vm->renderMessage(text, position);
-	if (duration == 0)
-		duration = (Common::strnlen(text, 512) + 20) * _vm->_textSpeed / 40;
-
-	_vm->setCurrentImage(filenumber);
-	while(duration) {
-		_vm->renderImage(section1);
-		_vm->renderImage(section3);
-		_gm->wait(2);
-		_vm->renderImage(section2);
-		_vm->renderImage(section4);
-		_gm->wait(2);
-		duration--;
-	}
-	_vm->removeMessage();
-}
-
-}
diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h
deleted file mode 100644
index c49e835..0000000
--- a/engines/supernova/rooms.h
+++ /dev/null
@@ -1,486 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA_ROOMS_H
-#define SUPERNOVA_ROOMS_H
-
-#include "common/str.h"
-
-#include "supernova/msn_def.h"
-#include "supernova/room.h"
-
-namespace Common {
-class ReadStream;
-class WriteStream;
-}
-
-namespace Supernova {
-
-class GameManager1;
-class SupernovaEngine;
-
-// Room 0
-class Intro : public Room {
-public:
-	Intro(SupernovaEngine *vm, GameManager1 *gm);
-	virtual void onEntrance();
-
-private:
-	bool animate(int section1, int section2, int duration);
-	bool animate(int section1, int section2, int duration, MessagePosition position,
-				 StringId text);
-	bool animate(int section1, int section2, int section3, int section4, int duration,
-				 MessagePosition position, StringId text);
-
-	void titleScreen();
-	void titleFadeIn();
-	void cutscene();
-	void leaveCutscene();
-
-	bool _shouldExit;
-	Common::String _introText;
-};
-
-// Spaceship
-class ShipCorridor : public Room {
-public:
-	ShipCorridor(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class ShipHall: public Room {
-public:
-	ShipHall(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class ShipSleepCabin: public Room {
-public:
-	ShipSleepCabin(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual void animation();
-	virtual void onEntrance();
-
-private:
-	byte _color;
-};
-
-class ShipCockpit : public Room {
-public:
-	ShipCockpit(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual void animation();
-	virtual void onEntrance();
-
-private:
-	byte _color;
-};
-
-class ShipCabinL1: public Room {
-public:
-	ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm);
-};
-
-class ShipCabinL2 : public Room {
-public:
-	ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class ShipCabinL3 : public Room {
-public:
-	ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class ShipCabinR1 : public Room {
-public:
-	ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm);
-};
-
-class ShipCabinR2 : public Room {
-public:
-	ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm);
-};
-
-class ShipCabinR3 : public Room {
-public:
-	ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual void onEntrance();
-};
-
-class ShipCabinBathroom : public Room  {
-public:
-	ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm);
-};
-
-class ShipAirlock : public Room {
-public:
-	ShipAirlock(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual void onEntrance();
-};
-
-class ShipHold : public Room {
-public:
-	ShipHold(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual void onEntrance();
-};
-
-class ShipLandingModule : public Room {
-public:
-	ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class ShipGenerator : public Room {
-public:
-	ShipGenerator(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class ShipOuterSpace : public Room {
-public:
-	ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm);
-};
-
-
-// Arsano
-class ArsanoRocks : public Room {
-public:
-	ArsanoRocks(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class ArsanoCave : public Room {
-public:
-	ArsanoCave(SupernovaEngine *vm, GameManager1 *gm);
-};
-
-class ArsanoMeetup : public Room {
-public:
-	ArsanoMeetup(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	byte _sign;
-	byte _beacon;
-};
-
-class ArsanoEntrance : public Room {
-public:
-	ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual void animation();
-
-private:
-	StringId _dialog1[5];
-	StringId _dialog2[5];
-	StringId _dialog3[5];
-	byte _eyewitness;
-};
-
-class ArsanoRemaining : public Room {
-public:
-	ArsanoRemaining(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void animation();
-
-private:
-	bool _chewing;
-	int _i;
-};
-
-class ArsanoRoger : public Room {
-public:
-	ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void animation();
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	StringId _dialog1[4];
-	byte _eyewitness;
-	byte _hands;
-};
-
-class ArsanoGlider : public Room {
-public:
-	ArsanoGlider(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	byte _sinus;
-};
-
-class ArsanoMeetup2 : public Room {
-public:
-	ArsanoMeetup2(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-	void shipStart();
-
-private:
-	// TODO: change to 6, fix initialization
-	StringId _dialog1[2];
-	StringId _dialog2[2];
-	StringId _dialog3[4];
-	StringId _dialog4[3];
-
-	// FIXME: Remove following unused bool variables?
-	//bool _found;
-	//bool _flug;
-};
-
-class ArsanoMeetup3 : public Room {
-public:
-	ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	StringId _dialog2[4];
-	StringId _dialog3[2];
-
-	// TODO: Hack, to be move away and renamed when the other uses are found
-	StringId _dialogsX[6];
-};
-
-
-// Axacuss
-class AxacussCell : public Room {
-public:
-	AxacussCell(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual void animation();
-	virtual void onEntrance();
-};
-
-class AxacussCorridor1 : public Room {
-public:
-	AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-};
-
-class AxacussCorridor2 : public Room {
-public:
-	AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-};
-
-class AxacussCorridor3 : public Room {
-public:
-	AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-};
-
-class AxacussCorridor4 : public Room {
-public:
-	AxacussCorridor4(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussCorridor5 : public Room {
-public:
-	AxacussCorridor5(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	void stopInteract(int sum);
-	bool handleMoneyDialog();
-
-	// TODO: Change to 6, or change struct, and fix initialization
-	StringId _dialog1[2];
-	StringId _dialog2[2];
-	StringId _dialog3[4];
-
-	byte _rows[6];
-};
-
-class AxacussCorridor6 : public Room {
-public:
-	AxacussCorridor6(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussCorridor7 : public Room {
-public:
-	AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-};
-
-class AxacussCorridor8 : public Room {
-public:
-	AxacussCorridor8(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussCorridor9 : public Room {
-public:
-	AxacussCorridor9(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussBcorridor : public Room {
-public:
-	AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussIntersection : public Room {
-public:
-	AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	StringId _dialogsX[6];
-};
-
-class AxacussExit : public Room {
-public:
-	AxacussExit(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	StringId _dialogsX[6];
-};
-
-class AxacussOffice1 : public Room {
-public:
-	AxacussOffice1(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussOffice2 : public Room {
-public:
-	AxacussOffice2(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussOffice3 : public Room {
-public:
-	AxacussOffice3(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussOffice4 : public Room {
-public:
-	AxacussOffice4(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussOffice5 : public Room {
-public:
-	AxacussOffice5(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussElevator : public Room {
-public:
-	AxacussElevator(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussStation : public Room {
-public:
-	AxacussStation(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class AxacussSign : public Room {
-public:
-	AxacussSign(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-};
-
-class Outro : public Room {
-public:
-	Outro(SupernovaEngine *vm, GameManager1 *gm);
-
-	virtual void onEntrance();
-	virtual void animation();
-
-private:
-	void animate(int filenumber, int section1, int section2, int duration);
-	void animate(int filenumber, int section1, int section2, int duration, MessagePosition position,
-				 const char *text);
-	void animate(int filenumber, int section1, int section2, int section3, int section4, int duration,
-				 MessagePosition position, const char *text);
-
-	Common::String _outroText;
-};
-
-}
-#endif // SUPERNOVA_ROOMS_H
diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index 0240a76..5a89b40 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -30,7 +30,7 @@
 
 #include "supernova/imageid.h"
 #include "supernova/resman.h"
-#include "supernova/state.h"
+#include "supernova/game-manager.h"
 #include "supernova/screen.h"
 #include "supernova/supernova.h"
 
diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp
deleted file mode 100644
index 3e0ba61..0000000
--- a/engines/supernova/state.cpp
+++ /dev/null
@@ -1,1623 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/system.h"
-#include "graphics/cursorman.h"
-#include "graphics/palette.h"
-#include "gui/message.h"
-
-#include "supernova/screen.h"
-#include "supernova/supernova.h"
-#include "supernova/state.h"
-
-namespace Supernova {
-
-bool GameManager1::serialize(Common::WriteStream *out) {
-	if (out->err())
-		return false;
-
-	// GameState
-	out->writeSint32LE(_time);
-	out->writeSint32LE(_state._timeSleep);
-	out->writeSint32LE(_state._timeAlarm);
-	out->writeSint32LE(_state._eventTime);
-	out->writeSint32LE(_state._eventCallback);
-	out->writeSint32LE(_state._arrivalDaysLeft);
-	out->writeSint32LE(_state._shipEnergyDaysLeft);
-	out->writeSint32LE(_state._landingModuleEnergyDaysLeft);
-	out->writeUint16LE(_state._greatFlag);
-	out->writeSint16LE(_state._timeRobot);
-	out->writeSint16LE(_state._money);
-	out->writeByte(_state._coins);
-	out->writeByte(_state._shoes);
-	out->writeByte(_state._origin);
-	out->writeByte(_state._destination);
-	out->writeByte(_state._language);
-	out->writeByte(_state._corridorSearch);
-	out->writeByte(_state._alarmOn);
-	out->writeByte(_state._terminalStripConnected);
-	out->writeByte(_state._terminalStripWire);
-	out->writeByte(_state._cableConnected);
-	out->writeByte(_state._powerOff);
-	out->writeByte(_state._dream);
-	for (int i = 0; i < 4; i++)
-		out->writeByte(_state._nameSeen[i]);
-	out->writeByte(_state._playerHidden);
-
-	// Inventory
-	out->writeSint32LE(_inventory.getSize());
-	out->writeSint32LE(_inventoryScroll);
-	for (int i = 0; i < _inventory.getSize(); ++i) {
-		Object *objectStateBegin = _rooms[_inventory.get(i)->_roomId]->getObject(0);
-		byte objectIndex = _inventory.get(i) - objectStateBegin;
-		out->writeSint32LE(_inventory.get(i)->_roomId);
-		out->writeSint32LE(objectIndex);
-	}
-
-	// Rooms
-	out->writeByte(_currentRoom->getId());
-	for (int i = 0; i < NUMROOMS; ++i) {
-		_rooms[i]->serialize(out);
-	}
-
-	return !out->err();
-}
-
-bool GameManager1::deserialize(Common::ReadStream *in, int version) {
-	if (in->err())
-		return false;
-
-	// GameState
-	_time = in->readSint32LE();
-	_state._timeSleep = in->readSint32LE();
-	_state._timeAlarm = in->readSint32LE();
-	_state._eventTime = in->readSint32LE();
-	if (version >= 4)
-		_state._eventCallback = (EventFunction)in->readSint32LE();
-	else
-		_state._eventCallback = kNoFn;
-	_state._arrivalDaysLeft = in->readSint32LE();
-	_state._shipEnergyDaysLeft = in->readSint32LE();
-	_state._landingModuleEnergyDaysLeft = in->readSint32LE();
-	_state._greatFlag = in->readUint16LE();
-	_state._timeRobot = in->readSint16LE();
-	_state._money = in->readSint16LE();
-	_vm->setGameString(kStringInventoryMoney, Common::String::format("%d Xa", _state._money));
-	_state._coins = in->readByte();
-	_state._shoes = in->readByte();
-	if (version >= 6)
-		_state._origin = in->readByte();
-	else
-		_state._origin = 0;
-	_state._destination = in->readByte();
-	_state._language = in->readByte();
-	_state._corridorSearch = in->readByte();
-	_state._alarmOn = in->readByte();
-	_state._terminalStripConnected = in->readByte();
-	_state._terminalStripWire = in->readByte();
-	_state._cableConnected = in->readByte();
-	_state._powerOff = in->readByte();
-	_state._dream = in->readByte();
-
-	for (int i = 0; i < 4; i++) {
-		if (version >= 7)
-			_state._nameSeen[i] = in->readByte();
-		else
-			_state._nameSeen[i] = false;
-	}
-
-	if (version >= 8)
-		_state._playerHidden = in->readByte();
-	else
-		_state._playerHidden = false;
-
-	_oldTime = g_system->getMillis();
-
-	// Inventory
-	int inventorySize = in->readSint32LE();
-	_inventoryScroll = in->readSint32LE();
-	_inventory.clear();
-	for (int i = 0; i < inventorySize; ++i) {
-		RoomId objectRoom = static_cast<RoomId>(in->readSint32LE());
-		int objectIndex = in->readSint32LE();
-		_inventory.add(*_rooms[objectRoom]->getObject(objectIndex));
-	}
-
-	// Rooms
-	RoomId curRoomId = static_cast<RoomId>(in->readByte());
-	for (int i = 0; i < NUMROOMS; ++i) {
-		_rooms[i]->deserialize(in, version);
-	}
-	changeRoom(curRoomId);
-
-	// Some additional variables
-	_guiEnabled = true;
-	_animationEnabled = true;
-
-	return !in->err();
-}
-
-// Used by Look Watch (when it's fixed). Do not remove.
-static Common::String timeToString(int msec) {
-	char s[9] = " 0:00:00";
-	msec /= 1000;
-	s[7] = msec % 10 + '0';
-	msec /= 10;
-	s[6] = msec %  6 + '0';
-	msec /=  6;
-	s[4] = msec % 10 + '0';
-	msec /= 10;
-	s[3] = msec %  6 + '0';
-	msec /=  6;
-	s[1] = msec % 10 + '0';
-	msec /= 10;
-	if (msec)
-		s[0] = msec + '0';
-
-	return Common::String(s);
-}
-
-GameManager1::GameManager1(SupernovaEngine *vm, Sound *sound)
-	: GameManager(vm, sound) {
-	initRooms();
-	changeRoom(INTRO);
-	initState();
-}
-
-GameManager1::~GameManager1() {
-	destroyRooms();
-}
-
-void GameManager1::destroyRooms() {
-	delete _rooms[INTRO];
-	delete _rooms[CORRIDOR];
-	delete _rooms[HALL];
-	delete _rooms[SLEEP];
-	delete _rooms[COCKPIT];
-	delete _rooms[AIRLOCK];
-	delete _rooms[HOLD];
-	delete _rooms[LANDINGMODULE];
-	delete _rooms[GENERATOR];
-	delete _rooms[OUTSIDE];
-	delete _rooms[CABIN_R1];
-	delete _rooms[CABIN_R2];
-	delete _rooms[CABIN_R3];
-	delete _rooms[CABIN_L1];
-	delete _rooms[CABIN_L2];
-	delete _rooms[CABIN_L3];
-	delete _rooms[BATHROOM];
-
-	delete _rooms[ROCKS];
-	delete _rooms[CAVE];
-	delete _rooms[MEETUP];
-	delete _rooms[ENTRANCE];
-	delete _rooms[REST];
-	delete _rooms[ROGER];
-	delete _rooms[GLIDER];
-	delete _rooms[MEETUP2];
-	delete _rooms[MEETUP3];
-
-	delete _rooms[CELL];
-	delete _rooms[CORRIDOR1];
-	delete _rooms[CORRIDOR2];
-	delete _rooms[CORRIDOR3];
-	delete _rooms[CORRIDOR4];
-	delete _rooms[CORRIDOR5];
-	delete _rooms[CORRIDOR6];
-	delete _rooms[CORRIDOR7];
-	delete _rooms[CORRIDOR8];
-	delete _rooms[CORRIDOR9];
-	delete _rooms[BCORRIDOR];
-	delete _rooms[GUARD];
-	delete _rooms[GUARD3];
-	delete _rooms[OFFICE_L1];
-	delete _rooms[OFFICE_L2];
-	delete _rooms[OFFICE_R1];
-	delete _rooms[OFFICE_R2];
-	delete _rooms[OFFICE_L];
-	delete _rooms[ELEVATOR];
-	delete _rooms[STATION];
-	delete _rooms[SIGN];
-	delete _rooms[OUTRO];
-}
-
-void GameManager1::initState() {
-	_currentInputObject = &_nullObject;
-	_inputObject[0] = &_nullObject;
-	_inputObject[1] = &_nullObject;
-	_inputVerb = ACTION_WALK;
-	_processInput = false;
-	_guiEnabled = true;
-	_animationEnabled = true;
-	_roomBrightness = 255;
-	_mouseClicked = false;
-	_keyPressed = false;
-	_mouseX = -1;
-	_mouseY = -1;
-	_mouseField = -1;
-	_inventoryScroll = 0;
-	_oldTime = g_system->getMillis();
-	_timerPaused = 0;
-	_timePaused = false;
-	_messageDuration = 0;
-	_animationTimer = 0;
-
-	_currentSentence = -1;
-	for (int i = 0 ; i < 6 ; ++i) {
-		_sentenceNumber[i] = -1;
-		_texts[i] = kNoString;
-		_rows[i] = 0;
-		_rowsStart[i] = 0;
-	}
-
-	_time = ticksToMsec(916364); // 2 pm
-	_state._timeSleep = 0;
-	_state._timeAlarm = ticksToMsec(458182);    // 7 am
-	_state._eventTime = kMaxTimerValue;
-	_state._eventCallback = kNoFn;
-	_state._arrivalDaysLeft = 2840;
-	_state._shipEnergyDaysLeft = 2135;
-	_state._landingModuleEnergyDaysLeft = 923;
-	_state._greatFlag = 0;
-	_state._timeRobot = 0;
-	_state._money = 0;
-	_state._coins = 0;
-	_state._shoes = 0;
-	_state._origin = 0;
-	_state._destination = 255;
-	_state._language = 0;
-	_state._corridorSearch = false;
-	_state._alarmOn = false;
-	_state._terminalStripConnected = false;
-	_state._terminalStripWire = false;
-	_state._cableConnected = false;
-	_state._powerOff = false;
-	_state._dream = false;
-
-	_prevImgId = 0;
-}
-
-void GameManager1::initRooms() {
-	_rooms[INTRO] = new Intro(_vm, this);
-	_rooms[CORRIDOR] = new ShipCorridor(_vm, this);
-	_rooms[HALL] = new ShipHall(_vm, this);
-	_rooms[SLEEP] = new ShipSleepCabin(_vm, this);
-	_rooms[COCKPIT] = new ShipCockpit(_vm, this);
-	_rooms[AIRLOCK] = new ShipAirlock(_vm, this);
-	_rooms[HOLD] = new ShipHold(_vm, this);
-	_rooms[LANDINGMODULE] = new ShipLandingModule(_vm, this);
-	_rooms[GENERATOR] = new ShipGenerator(_vm, this);
-	_rooms[OUTSIDE] = new ShipOuterSpace(_vm, this);
-	_rooms[CABIN_R1] = new ShipCabinR1(_vm, this);
-	_rooms[CABIN_R2] = new ShipCabinR2(_vm, this);
-	_rooms[CABIN_R3] = new ShipCabinR3(_vm, this);
-	_rooms[CABIN_L1] = new ShipCabinL1(_vm, this);
-	_rooms[CABIN_L2] = new ShipCabinL2(_vm, this);
-	_rooms[CABIN_L3] = new ShipCabinL3(_vm, this);
-	_rooms[BATHROOM] = new ShipCabinBathroom(_vm, this);
-
-	_rooms[ROCKS] = new ArsanoRocks(_vm, this);
-	_rooms[CAVE] = new ArsanoCave(_vm, this);
-	_rooms[MEETUP] = new ArsanoMeetup(_vm, this);
-	_rooms[ENTRANCE] = new ArsanoEntrance(_vm, this);
-	_rooms[REST] = new ArsanoRemaining(_vm, this);
-	_rooms[ROGER] = new ArsanoRoger(_vm, this);
-	_rooms[GLIDER] = new ArsanoGlider(_vm, this);
-	_rooms[MEETUP2] = new ArsanoMeetup2(_vm, this);
-	_rooms[MEETUP3] = new ArsanoMeetup3(_vm, this);
-
-	_rooms[CELL] = new AxacussCell(_vm, this);
-	_rooms[CORRIDOR1] = new AxacussCorridor1(_vm, this);
-	_rooms[CORRIDOR2] = new AxacussCorridor2(_vm, this);
-	_rooms[CORRIDOR3] = new AxacussCorridor3(_vm, this);
-	_rooms[CORRIDOR4] = new AxacussCorridor4(_vm, this);
-	_rooms[CORRIDOR5] = new AxacussCorridor5(_vm, this);
-	_rooms[CORRIDOR6] = new AxacussCorridor6(_vm, this);
-	_rooms[CORRIDOR7] = new AxacussCorridor7(_vm, this);
-	_rooms[CORRIDOR8] = new AxacussCorridor8(_vm, this);
-	_rooms[CORRIDOR9] = new AxacussCorridor9(_vm, this);
-	_rooms[BCORRIDOR] = new AxacussBcorridor(_vm, this);
-	_rooms[GUARD] = new AxacussIntersection(_vm, this);
-	_rooms[GUARD3] = new AxacussExit(_vm, this);
-	_rooms[OFFICE_L1] = new AxacussOffice1(_vm, this);
-	_rooms[OFFICE_L2] = new AxacussOffice2(_vm, this);
-	_rooms[OFFICE_R1] = new AxacussOffice3(_vm, this);
-	_rooms[OFFICE_R2] = new AxacussOffice4(_vm, this);
-	_rooms[OFFICE_L] = new AxacussOffice5(_vm, this);
-	_rooms[ELEVATOR] = new AxacussElevator(_vm, this);
-	_rooms[STATION] = new AxacussStation(_vm, this);
-	_rooms[SIGN] = new AxacussSign(_vm, this);
-	_rooms[OUTRO] = new Outro(_vm, this);
-}
-
-bool GameManager1::canSaveGameStateCurrently() {
-	return _animationEnabled && _guiEnabled;
-}
-
-void GameManager1::updateEvents() {
-	handleTime();
-	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
-		_currentRoom->animation();
-
-	if (_state._eventCallback != kNoFn && _time >= _state._eventTime) {
-		_vm->_allowLoadGame = false;
-		_vm->_allowSaveGame = false;
-		_state._eventTime = kMaxTimerValue;
-		EventFunction fn = _state._eventCallback;
-		_state._eventCallback = kNoFn;
-		switch (fn) {
-		case kNoFn:
-			break;
-		case kSupernovaFn:
-			supernovaEvent();
-			break;
-		case kGuardReturnedFn:
-			guardReturnedEvent();
-			break;
-		case kGuardWalkFn:
-			guardWalkEvent();
-			break;
-		case kTaxiFn:
-			taxiEvent();
-			break;
-		case kSearchStartFn:
-			searchStartEvent();
-			break;
-		default:
-			break; //shouldn't happen
-		}
-		_vm->_allowLoadGame = true;
-		_vm->_allowSaveGame = true;
-		return;
-	}
-
-	if (_state._alarmOn && _state._timeAlarm <= _time) {
-		_state._alarmOn = false;
-		alarm();
-		return;
-	}
-
-	_mouseClicked = false;
-	_keyPressed = false;
-	Common::Event event;
-	while (g_system->getEventManager()->pollEvent(event)) {
-		switch (event.type) {
-		case Common::EVENT_KEYDOWN:
-			_keyPressed = true;
-			processInput(event.kbd);
-			break;
-		case Common::EVENT_LBUTTONUP:
-			// fallthrough
-		case Common::EVENT_RBUTTONUP:
-			if (_currentRoom->getId() != INTRO && _sound->isPlaying())
-				return;
-			_mouseClicked = true;
-			// fallthrough
-		case Common::EVENT_MOUSEMOVE:
-			_mouseClickType = event.type;
-			_mouseX = event.mouse.x;
-			_mouseY = event.mouse.y;
-			if (_guiEnabled)
-				processInput();
-			break;
-		default:
-			break;
-		}
-	}
-}
-
-void GameManager1::corridorOnEntrance() {
-	if (_state._corridorSearch)
-		busted(0);
-}
-
-void GameManager1::telomat(int nr) {
-	static Common::String name[8] = {
-		"DR. ALAB HANSI",
-		"ALAB HANSI",
-		"SAVAL LUN",
-		"x",
-		"PROF. DR. UGNUL TSCHABB",
-		"UGNUL TSCHABB",
-		"ALGA HURZ LI",
-		"x"
-	};
-
-	static Common::String name2[4] = {
-		"Alab Hansi",
-		"Saval Lun",
-		"Ugnul Tschabb",
-		"Alga Hurz Li"
-	};
-
-	StringId dial1[4];
-	dial1[0] = kStringTelomat1;
-	dial1[1] = kNoString;
-	dial1[2] = kStringTelomat3;
-	dial1[3] = kStringDialogSeparator;
-
-	static byte rows1[3] = {1, 2, 1};
-
-	StringId dial2[4];
-	dial2[0] = kStringTelomat4;
-	dial2[1] = kStringTelomat5;
-	dial2[2] = kStringTelomat6;
-	dial2[3] = kStringDialogSeparator;
-
-	static byte rows2[4] = {1, 1, 1, 1};
-
-	_vm->renderBox(0, 0, 320, 200, kColorBlack);
-	_vm->renderText(kStringTelomat7, 100, 70, kColorGreen);
-	_vm->renderText(kStringTelomat8, 100, 81, kColorGreen);
-	_vm->renderText(kStringTelomat9, 100, 92, kColorGreen);
-	_vm->renderText(kStringTelomat10, 100, 103, kColorGreen);
-	_vm->renderText(kStringTelomat11, 100, 120, kColorDarkGreen);
-	Common::String input;
-	do {
-		getInput();
-
-		switch (_key.keycode) {
-		case Common::KEYCODE_2: {
-			_vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
-			_vm->renderText(kStringTelomat12, 50, 80, kColorGreen);
-			_vm->renderText(kStringTelomat13, 50, 91, kColorGreen);
-			do {
-				edit(input, 50, 105, 30);
-			} while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE));
-
-			if (_key.keycode == Common::KEYCODE_ESCAPE) {
-				_vm->renderBox(0, 0, 320, 200, kColorBlack);
-				_vm->renderRoom(*_currentRoom);
-				_vm->paletteBrightness();
-				_guiEnabled = true;
-				drawMapExits();
-				return;
-			}
-
-			input.toUppercase();
-
-			int i = 0;
-			while ((i < 8) && (input != name[i]))
-				i++;
-			i >>= 1;
-			if (i == 4) {
-				_vm->renderText(kStringTelomat14, 50, 120, kColorGreen);
-				wait(10);
-				_vm->renderBox(0, 0, 320, 200, kColorBlack);
-				_vm->renderRoom(*_currentRoom);
-				_vm->paletteBrightness();
-				_guiEnabled = true;
-				drawMapExits();
-				return;
-			}
-
-			if ((i == nr) || _rooms[BCORRIDOR]->getObject(4 + i)->hasProperty(CAUGHT)) {
-				_vm->renderText(kStringTelomat15, 50, 120, kColorGreen);
-				wait(10);
-				_vm->renderBox(0, 0, 320, 200, kColorBlack);
-				_vm->renderRoom(*_currentRoom);
-				_vm->paletteBrightness();
-				_guiEnabled = true;
-				drawMapExits();
-				return;
-			}
-
-			_vm->renderText(kStringTelomat16, 50, 120, kColorGreen);
-			wait(10);
-			_vm->renderBox(0, 0, 320, 200, kColorBlack);
-			_vm->renderRoom(*_currentRoom);
-			_vm->paletteBrightness();
-			_vm->renderMessage(kStringTelomat17, kMessageTop, name2[i]);
-			waitOnInput(_messageDuration);
-			_vm->removeMessage();
-			if (_state._nameSeen[nr]) {
-				Common::String string = _vm->getGameString(kStringTelomat2);
-				_vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), name2[nr].c_str()));
-				dial1[1] = kStringPlaceholder1;
-				_currentRoom->addSentence(1, 1);
-			} else
-				_currentRoom->removeSentence(1, 1);
-
-			switch (dialog(3, rows1, dial1, 1)) {
-			case 1: _vm->renderMessage(kStringTelomat18, kMessageTop);
-				waitOnInput(_messageDuration);
-				_vm->removeMessage();
-				if ((_state._destination == 255) && !_rooms[BCORRIDOR]->isSectionVisible(7)) {
-					_state._eventTime = _time + ticksToMsec(150);
-					_state._eventCallback = kGuardWalkFn;
-					_state._origin = i;
-					_state._destination = nr;
-				}
-				break;
-			case 0: _vm->renderMessage(kStringTelomat19, kMessageTop);
-				waitOnInput(_messageDuration);
-				_vm->removeMessage();
-				if (dialog(4, rows2, dial2, 0) != 3) {
-					wait(10);
-					say(kStringTelomat20);
-				}
-				_rooms[BCORRIDOR]->setSectionVisible(7, true);
-				_rooms[BCORRIDOR]->setSectionVisible(i + 1, true);
-				_state._eventTime = kMaxTimerValue;
-				_currentRoom->addSentence(0, 1);
-			}
-			_guiEnabled = true;
-			drawMapExits();
-			return;
-			}
-		case Common::KEYCODE_1:
-		case Common::KEYCODE_3:
-		case Common::KEYCODE_4:
-			_vm->renderBox(0, 0, 320, 200, kColorDarkBlue);
-			_vm->renderText(kStringTelomat21, 100, 90, kColorGreen);
-			input = "";
-			do {
-				edit(input, 100, 105, 30);
-			} while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE));
-
-			if (_key.keycode == Common::KEYCODE_RETURN) {
-				_vm->renderText(kStringShipSleepCabin9, 100, 120, kColorGreen);
-				wait(10);
-			}
-			// fallthrough
-		case Common::KEYCODE_ESCAPE:
-			_vm->renderBox(0, 0, 320, 200, kColorBlack);
-			_vm->renderRoom(*_currentRoom);
-			_vm->paletteBrightness();
-			_guiEnabled = true;
-			drawMapExits();
-			return;
-		default:
-			break;
-		}
-	} while (true);
-}
-
-void GameManager1::startSearch() {
-	if ((_currentRoom->getId() >= CORRIDOR1) && (_currentRoom->getId() <= BCORRIDOR))
-		busted(0);
-
-	_state._corridorSearch = true;
-}
-
-void GameManager1::search(int time) {
-	_state._eventTime = _time + ticksToMsec(time);
-	_state._eventCallback = kSearchStartFn;
-}
-
-void GameManager1::guardNoticed() {
-	_vm->paletteFadeOut();
-	Room *r = _currentRoom;
-	_currentRoom = _rooms[GUARD];
-	_vm->setCurrentImage(40);
-	_vm->renderBox(0, 0, 320, 200, 0);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_vm->renderImage(2);
-	reply(kStringGuardNoticed1, 2, 5);
-	wait(2);
-	reply(kStringGuardNoticed2, 2, 5);
-	_vm->paletteFadeOut();
-	_currentRoom->setSectionVisible(2, false);
-	_currentRoom->setSectionVisible(5, false);
-	_currentRoom = r;
-	_guiEnabled = true;
-	drawMapExits();
-}
-
-void GameManager1::busted(int i) {
-	if (i > 0)
-		_vm->renderImage(i);
-	if (i == 0) {
-		if ((_currentRoom->getId() >= OFFICE_L1) && (_currentRoom->getId() <= OFFICE_R2)) {
-			if (_currentRoom->getId() < OFFICE_R1)
-				i = 10;
-			else
-				i = 5;
-			if (!_currentRoom->getObject(0)->hasProperty(OPENED)) {
-				_vm->renderImage(i - 1);
-				_sound->play(kAudioDoorOpen);
-				wait(2);
-			}
-			_vm->renderImage(i);
-			wait(3);
-			_vm->renderImage(i + 3);
-			_sound->play(kAudioVoiceHalt);
-			_vm->renderImage(i);
-			wait(5);
-			if (_currentRoom->getId() == OFFICE_L2)
-				i = 13;
-			_vm->renderImage(i + 1);
-			wait(3);
-			_vm->renderImage(i + 2);
-			shot(0, 0);
-		} else if (_currentRoom->getId() == BCORRIDOR)
-			_vm->renderImage(21);
-		else if (_currentRoom->isSectionVisible(4))
-			_vm->renderImage(32); // below
-		else if (_currentRoom->isSectionVisible(2))
-			_vm->renderImage(30); // right
-		else if (_currentRoom->isSectionVisible(1))
-			_vm->renderImage(31); // left
-		else
-			_vm->renderImage(33); // above
-	}
-	_sound->play(kAudioVoiceHalt);
-	wait(3);
-	shot(0, 0);
-}
-
-void GameManager1::novaScroll() {
-	static byte planet_f[6] = {0xeb,0xec,0xf0,0xed,0xf1,0xf2};
-	static byte nova_f[13] = {0xea,0xe9,0xf5,0xf3,0xf7,0xf4,0xf6,
-		0xf9,0xfb,0xfc,0xfd,0xfe,0xfa};
-	static byte rgb[65][3] = {
-		{ 5, 0, 0},{10, 0, 0},{15, 0, 0},{20, 0, 0},{25, 0, 0},
-		{30, 0, 0},{35, 0, 0},{40, 0, 0},{45, 0, 0},{50, 0, 0},
-		{55, 0, 0},{60, 0, 0},{63,10, 5},{63,20,10},{63,30,15},
-		{63,40,20},{63,50,25},{63,60,30},{63,63,33},{63,63,30},
-		{63,63,25},{63,63,20},{63,63,15},{63,63,10},{60,60,15},
-		{57,57,20},{53,53,25},{50,50,30},{47,47,35},{43,43,40},
-		{40,40,45},{37,37,50},{33,33,53},{30,30,56},{27,27,59},
-		{23,23,61},{20,20,63},{21,25,63},{22,30,63},{25,35,63},
-		{30,40,63},{35,45,63},{40,50,63},{45,55,63},{50,60,63},
-		{55,63,63},{59,63,63},{63,63,63},{63,60,63},{60,50,60},
-		{55,40,55},{50,30,50},{45,20,45},{40,10,40},{42,15,42},
-		{45,20,45},{47,25,47},{50,30,50},{52,35,52},{55,40,55},
-		{57,45,57},{60,50,60},{62,55,62},{63,60,63},{63,63,63}};
-
-	byte palette[768];
-	_vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
-
-	for (int t = 0; t < 65; ++t) {
-		for (int i = 0; i < 6; ++i) {
-			int idx = 3 * (planet_f[i] - 1);
-			for (int c = 0 ; c < 3 ; ++c) {
-				if (palette[idx+c] < rgb[t][c])
-					palette[idx+c] = rgb[t][c];
-			}
-		}
-		for (int cycle = 0; cycle < t && cycle < 13; ++cycle) {
-			int idx = 3 * (nova_f[cycle] - 1);
-			for (int c = 0 ; c < 3 ; ++c)
-				palette[idx + c] = rgb[t - cycle - 1][c];
-		}
-
-		_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
-		_vm->_system->updateScreen();
-		_vm->_system->delayMillis(_vm->_delay);
-	}
-}
-
-void GameManager1::supernovaEvent() {
-	_vm->removeMessage();
-	CursorMan.showMouse(false);
-	if (_currentRoom->getId() <= CAVE) {
-		_vm->renderMessage(kStringSupernova1);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->paletteFadeOut();
-		changeRoom(MEETUP);
-		_rooms[AIRLOCK]->getObject(0)->disableProperty(OPENED);
-		_rooms[AIRLOCK]->setSectionVisible(3, true);
-		_rooms[AIRLOCK]->getObject(1)->setProperty(OPENED);
-		_rooms[AIRLOCK]->setSectionVisible(17, true);
-		_rooms[AIRLOCK]->setSectionVisible(6, false);
-		_vm->renderRoom(*_currentRoom);
-		_vm->paletteFadeIn();
-	}
-	_vm->renderMessage(kStringSupernova2);
-	waitOnInput(_messageDuration);
-	_vm->removeMessage();
-	_vm->setCurrentImage(26);
-	_vm->renderImage(0);
-	_vm->paletteBrightness();
-	novaScroll();
-	_vm->paletteFadeOut();
-	_vm->renderBox(0, 0, 320, 200, kColorBlack);
-	_vm->_screen->setGuiBrightness(255);
-	_vm->paletteBrightness();
-
-	if (_currentRoom->getId() == GLIDER) {
-		_vm->renderMessage(kStringSupernova3);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->_screen->setGuiBrightness(0);
-		_vm->paletteBrightness();
-		_vm->renderRoom(*_currentRoom);
-		_vm->paletteFadeIn();
-		_vm->renderMessage(kStringSupernova4, kMessageTop);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->renderMessage(kStringSupernova5, kMessageTop);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->renderMessage(kStringSupernova6, kMessageTop);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->renderMessage(kStringSupernova7, kMessageTop);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		changeRoom(MEETUP2);
-		_rooms[MEETUP2]->setSectionVisible(1, true);
-		_rooms[MEETUP2]->removeSentence(0, 1);
-		_inventory.remove(*(_rooms[ROGER]->getObject(3)));
-		_inventory.remove(*(_rooms[ROGER]->getObject(7)));
-		_inventory.remove(*(_rooms[ROGER]->getObject(8)));
-	} else {
-		_vm->renderMessage(kStringSupernova8);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->_screen->setGuiBrightness(0);
-		_vm->paletteBrightness();
-		changeRoom(MEETUP2);
-		if (_rooms[ROGER]->getObject(3)->hasProperty(CARRIED) && !_rooms[GLIDER]->isSectionVisible(5)) {
-			_rooms[MEETUP2]->setSectionVisible(1, true);
-			_rooms[MEETUP2]->setSectionVisible(12, true);
-			_rooms[MEETUP2]->getObject(1)->_click = 0;
-			_rooms[MEETUP2]->getObject(0)->_click = 1;
-			_rooms[MEETUP2]->removeSentence(0, 1);
-		}
-		_rooms[MEETUP2]->removeSentence(1, 1);
-	}
-	_rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
-	_rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
-	_rooms[AIRLOCK]->getObject(6)->setProperty(WORN);
-	_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP2;
-	_guiEnabled = true;
-	CursorMan.showMouse(true);
-}
-
-void GameManager1::guardReturnedEvent() {
-	if (_currentRoom->getId() == GUARD)
-		busted(-1);
-	else if ((_currentRoom->getId() == CORRIDOR9) && (_currentRoom->isSectionVisible(27)))
-		busted(0);
-
-	_rooms[GUARD]->setSectionVisible(1, false);
-	_rooms[GUARD]->getObject(3)->_click = 0;
-	_rooms[GUARD]->setSectionVisible(6, false);
-	_rooms[GUARD]->getObject(2)->disableProperty(OPENED);
-	_rooms[GUARD]->setSectionVisible(7, false);
-	_rooms[GUARD]->getObject(5)->_click = 255;
-	_rooms[CORRIDOR9]->setSectionVisible(27, false);
-	_rooms[CORRIDOR9]->setSectionVisible(28, true);
-	_rooms[CORRIDOR9]->getObject(1)->disableProperty(OPENED);
-}
-
-void GameManager1::walk(int imgId) {
-	if (_prevImgId)
-		_vm->renderImage(_prevImgId + 128);
-	_vm->renderImage(imgId);
-	_prevImgId = imgId;
-	wait(3);
-}
-
-void GameManager1::guardWalkEvent() {
-	_prevImgId = 0;
-	bool behind = (!_rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OCCUPIED) ||
-				   _rooms[BCORRIDOR]->getObject(_state._origin + 4)->hasProperty(OPENED));
-	_rooms[BCORRIDOR]->getObject(_state._origin + 4)->disableProperty(OCCUPIED);
-	if (_currentRoom == _rooms[BCORRIDOR]) {
-		if (_vm->_screen->isMessageShown())
-			_vm->removeMessage();
-
-		if (!behind) {
-			_vm->renderImage(_state._origin + 1);
-			_prevImgId = _state._origin + 1;
-			_sound->play(kAudioDoorOpen);
-			wait(3);
-		}
-
-		int imgId;
-		switch (_state._origin) {
-		case 0:
-			imgId = 11;
-			break;
-		case 1:
-			imgId = 16;
-			break;
-		case 2:
-			imgId = 15;
-			break;
-		case 3:
-		default:
-			imgId = 20;
-			break;
-		}
-		_vm->renderImage(imgId);
-		if (!behind) {
-			wait(3);
-			_vm->renderImage(_prevImgId + 128);
-			_sound->play(kAudioDoorClose);
-		}
-
-		_prevImgId = imgId;
-		wait(3);
-		switch (_state._origin) {
-		case 0:
-			walk(12);
-			walk(13);
-			break;
-		case 1:
-			walk(17);
-			walk(18);
-			break;
-		case 2:
-			walk(14);
-			walk(13);
-			break;
-		case 3:
-			walk(19);
-			walk(18);
-		}
-
-		if (!_state._playerHidden) {
-			if (_state._origin & 1)
-				walk(10);
-			else
-				walk(5);
-			busted(-1);
-		}
-
-		if ((_state._origin & 1) && !(_state._destination & 1)) {
-			for (int i = 10; i >= 5; i--)
-				walk(i);
-			walk(13);
-		} else if (!(_state._origin & 1) && (_state._destination & 1)) {
-			for (int i = 5; i <= 10; i++)
-				walk(i);
-			walk(18);
-		}
-
-		switch (_state._destination) {
-		case 0:
-			for (int i = 13; i >= 11; i--)
-				walk(i);
-			break;
-		case 1:
-			for (int i = 18; i >= 16; i--)
-				walk(i);
-			break;
-		case 2:
-			for (int i = 13; i <= 15; i++)
-				walk(i);
-			break;
-		case 3:
-			for (int i = 18; i <= 20; i++)
-				walk(i);
-		}
-
-		if (behind) {
-			_vm->renderImage(_state._destination + 1);
-			_sound->play(kAudioDoorOpen);
-			wait(3);
-			_vm->renderImage(_prevImgId + 128);
-			wait(3);
-			_vm->renderImage(_state._destination + 1 + 128);
-			_sound->play(kAudioDoorClose);
-			_rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
-			_state._destination = 255;
-		} else if (_rooms[BCORRIDOR]->isSectionVisible(_state._destination + 1)) {
-			_vm->renderImage(_prevImgId + 128);
-			_rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
-			SWAP(_state._origin, _state._destination);
-			_state._eventTime = _time + ticksToMsec(60);
-			_state._eventCallback = kGuardWalkFn;
-		} else {
-			wait(18);
-			SWAP(_state._origin, _state._destination);
-			_state._eventCallback = kGuardWalkFn;
-		}
-	} else if (behind) {
-		_rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
-		if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
-			busted(0);
-		_state._destination = 255;
-	} else if (_rooms[BCORRIDOR]->isSectionVisible(_state._destination + 1) && _rooms[OFFICE_L1 + _state._destination]->getObject(0)->hasProperty(OPENED)) {
-		_rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
-		if (_currentRoom == _rooms[OFFICE_L1 + _state._destination])
-			busted(0);
-		SWAP(_state._origin, _state._destination);
-		_state._eventTime = _time + ticksToMsec(60);
-		_state._eventCallback = kGuardWalkFn;
-	} else {
-		SWAP(_state._origin, _state._destination);
-		_state._eventCallback = kGuardWalkFn;
-	}
-}
-
-void GameManager1::taxiEvent() {
-	if (_currentRoom->getId() == SIGN) {
-		changeRoom(STATION);
-		_vm->renderRoom(*_currentRoom);
-	}
-
-	_vm->renderImage(1);
-	_vm->renderImage(2);
-	_sound->play(kAudioRocks);
-	screenShake();
-	_vm->renderImage(9);
-	_currentRoom->getObject(1)->setProperty(OPENED);
-	_vm->renderImage(1);
-	_currentRoom->setSectionVisible(2, false);
-	_vm->renderImage(3);
-	for (int i = 4; i <= 8; i++) {
-		wait(2);
-		_vm->renderImage(invertSection(i - 1));
-		_vm->renderImage(i);
-	}
-	_rooms[SIGN]->setSectionVisible(2, false);
-	_rooms[SIGN]->setSectionVisible(3, true);
-}
-
-void GameManager1::searchStartEvent() {
-	if ((_currentRoom >= _rooms[CORRIDOR1]) && (_currentRoom <= _rooms[BCORRIDOR]))
-		busted(0);
-	_state._corridorSearch = true;
-}
-
-void GameManager1::great(uint number) {
-	if (number && (_state._greatFlag & (1 << number)))
-		return;
-
-	_sound->play(kAudioSuccess);
-	_state._greatFlag |= 1 << number;
-}
-
-bool GameManager1::airless() {
-	return (_currentRoom->getId() == HOLD ||
-			_currentRoom->getId() == LANDINGMODULE ||
-			_currentRoom->getId() == GENERATOR ||
-			_currentRoom->getId() == OUTSIDE ||
-			_currentRoom->getId() == ROCKS ||
-			_currentRoom->getId() == CAVE ||
-			_currentRoom->getId() == MEETUP ||
-			_currentRoom->getId() == MEETUP2 ||
-			_currentRoom->getId() == MEETUP3 ||
-			(_currentRoom->getId() == AIRLOCK && _rooms[AIRLOCK]->getObject(1)->hasProperty(OPENED)));
-}
-
-void GameManager1::turnOff() {
-	if (_state._powerOff)
-		return;
-
-	_state._powerOff = true;
-	roomBrightness();
-}
-
-void GameManager1::turnOn() {
-	if (!_state._powerOff)
-		return;
-
-	_state._powerOff = false;
-	_vm->_screen->setViewportBrightness(255);
-	_rooms[SLEEP]->setSectionVisible(1, false);
-	_rooms[SLEEP]->setSectionVisible(2, false);
-	_rooms[COCKPIT]->setSectionVisible(22, false);
-}
-
-void GameManager1::roomBrightness() {
-	_roomBrightness = 255;
-	if ((_currentRoom->getId() != OUTSIDE) && (_currentRoom->getId() < ROCKS) && _state._powerOff)
-		_roomBrightness = 153;
-	else if (_currentRoom->getId() == CAVE)
-		_roomBrightness = 0;
-	else if ((_currentRoom->getId() == GUARD3) && _state._powerOff)
-		_roomBrightness = 0;
-
-	if (_vm->_screen->getViewportBrightness() != 0)
-		_vm->_screen->setViewportBrightness(_roomBrightness);
-
-	_vm->paletteBrightness();
-}
-
-void GameManager1::handleTime() {
-	if (_timerPaused)
-		return;
-	int32 newTime = g_system->getMillis();
-	int32 delta = newTime - _oldTime;
-	_time += delta;
-	if (_time > 86400000) {
-		_time -= 86400000; // 24h wrap around
-		_state._alarmOn = (_state._timeAlarm > _time);
-	}
-	if (_animationTimer > delta)
-		_animationTimer -= delta;
-	else
-		_animationTimer = 0;
-
-	_oldTime = newTime;
-}
-
-void GameManager1::loadTime() {
-	pauseTimer(false);
-}
-
-void GameManager1::saveTime() {
-	pauseTimer(true);
-}
-
-void GameManager1::shock() {
-	_sound->play(kAudioShock);
-	dead(kStringShock);
-}
-
-void GameManager1::drawMapExits() {
-// TODO: Preload _exitList on room entry instead on every call
-	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
-
-	for (int i = 0; i < 25; i++)
-		_exitList[i] = -1;
-	for (int i = 0; i < kMaxObject; i++) {
-		if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
-			byte r = _currentRoom->getObject(i)->_direction;
-			_exitList[r] = i;
-			int x = 284 + 7 * (r % 5);
-			int y = 164 + 7 * (r / 5);
-			_vm->renderBox(x, y, 5, 5, kColorDarkRed);
-		}
-	}
-}
-
-void GameManager1::shot(int a, int b) {
-	if (a)
-		_vm->renderImage(a);
-	_sound->play(kAudioGunShot);
-	wait(2);
-	if (b)
-		_vm->renderImage(b);
-	wait(2);
-	if (a)
-		_vm->renderImage(a);
-	_sound->play(kAudioGunShot);
-	wait(2);
-	if (b)
-		_vm->renderImage(b);
-
-	dead(kStringShot);
-}
-
-void GameManager1::takeMoney(int amount) {
-	Object *moneyObject = _rooms[INTRO]->getObject(4);
-	_state._money += amount;
-	_vm->setGameString(kStringInventoryMoney, Common::String::format("%d Xa", _state._money));
-
-	if (_state._money > 0) {
-		takeObject(*moneyObject);
-		if (amount > 0)
-			great(0);
-	} else {
-		_inventory.remove(*moneyObject);
-	}
-}
-
-void GameManager1::openLocker(const Room *room, Object *obj, Object *lock, int section) {
-	_vm->renderImage(section);
-	obj->setProperty(OPENED);
-	lock->_click = 255;
-	SWAP(obj->_click, obj->_click2);
-}
-
-void GameManager1::closeLocker(const Room *room, Object *obj, Object *lock, int section) {
-	if (!obj->hasProperty(OPENED))
-		_vm->renderMessage(kStringCloseLocker_1);
-	else {
-		_vm->renderImage(invertSection(section));
-		obj->disableProperty(OPENED);
-		lock->_click = lock->_click2;
-		SWAP(obj->_click, obj->_click2);
-	}
-}
-
-bool GameManager1::isHelmetOff() {
-	Object *helmet = _inventory.get(HELMET);
-	if (helmet && helmet->hasProperty(WORN)) {
-		_vm->renderMessage(kStringIsHelmetOff_1);
-		return false;
-	}
-
-	return true;
-}
-
-bool GameManager1::genericInteract(Action verb, Object &obj1, Object &obj2) {
-	if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) {
-		if (isHelmetOff()) {
-			takeObject(obj1);
-			_vm->renderMessage(kStringGenericInteract_1);
-			_inventory.remove(obj1);
-		}
-	} else if ((verb == ACTION_USE) && (obj1._id == EGG)) {
-		if (isHelmetOff()) {
-			takeObject(obj1);
-			if (obj1.hasProperty(OPENED))
-				_vm->renderMessage(kStringGenericInteract_1);
-			else
-				_vm->renderMessage(kStringGenericInteract_2);
-
-			_inventory.remove(obj1);
-		}
-	} else if ((verb == ACTION_OPEN) && (obj1._id == EGG)) {
-		takeObject(obj1);
-		if (obj1.hasProperty(OPENED))
-			_vm->renderMessage(kStringGenericInteract_3);
-		else {
-			takeObject(*_rooms[ENTRANCE]->getObject(8));
-			_vm->renderMessage(kStringGenericInteract_4);
-			obj1.setProperty(OPENED);
-		}
-	} else if ((verb == ACTION_USE) && (obj1._id == PILL)) {
-		if (isHelmetOff()) {
-			_vm->renderMessage(kStringGenericInteract_5);
-			great(0);
-			_inventory.remove(obj1);
-			_state._language = 2;
-			takeObject(*_rooms[ENTRANCE]->getObject(17));
-		}
-	} else if ((verb == ACTION_LOOK) && (obj1._id == PILL_HULL) &&
-			   (_state._language == 2)) {
-		_vm->renderMessage(kStringGenericInteract_6);
-		_state._language = 1;
-	} else if ((verb == ACTION_OPEN) && (obj1._id == WALLET)) {
-		if (!_rooms[ROGER]->getObject(3)->hasProperty(CARRIED))
-			_vm->renderMessage(kStringGenericInteract_7);
-		else if (_rooms[ROGER]->getObject(7)->hasProperty(CARRIED))
-			_vm->renderMessage(kStringGenericInteract_8);
-		else {
-			_vm->renderMessage(kStringGenericInteract_9);
-			takeObject(*_rooms[ROGER]->getObject(7));
-			takeObject(*_rooms[ROGER]->getObject(8));
-		}
-	} else if ((verb == ACTION_LOOK) && (obj1._id == NEWSPAPER)) {
-		animationOff();
-		saveTime();
-
-		_vm->renderMessage(kStringGenericInteract_10);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->renderMessage(kStringGenericInteract_11);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->setCurrentImage(2);
-		_vm->renderImage(0);
-		_vm->setColor63(40);
-		getInput();
-		_vm->renderRoom(*_currentRoom);
-		roomBrightness();
-		_vm->renderMessage(kStringGenericInteract_12);
-
-		loadTime();
-		animationOn();
-	} else if ((verb == ACTION_LOOK) && (obj1._id == KEYCARD2)) {
-		_vm->renderMessage(obj1._description);
-		obj1._description = kStringKeycard2Description2;
-	} else if ((verb == ACTION_LOOK) && (obj1._id == WATCH))
-		_vm->renderMessage(kStringGenericInteract_13, kMessageNormal, timeToString(_time), timeToString(_state._timeAlarm));
-	else if ((verb == ACTION_PRESS) && (obj1._id == WATCH)) {
-		bool validInput = true;
-		int hours = 0;
-		int minutes = 0;
-
-		animationOff();
-		_vm->saveScreen(88, 87, 144, 24);
-		_vm->renderBox(88, 87, 144, 24, kColorWhite35);
-		_vm->renderText(kStringGenericInteract_14, 91, 90, kColorWhite99);
-		Common::String input;
-		do {
-			validInput = true;
-			input.clear();
-			_vm->renderBox(91, 99, 138, 9, kColorDarkBlue);
-			edit(input, 91, 100, 5);
-
-			int seperator = -1;
-			for (uint i = 0; i < input.size(); ++i) {
-				if (input[i] == ':') {
-					seperator = i;
-					break;
-				}
-			}
-			if ((seperator == -1) || (seperator > 2)) {
-				validInput = false;
-				continue;
-			}
-
-			int decimalPlace = 1;
-			for (int i = 0; i < seperator; ++i) {
-				if (Common::isDigit(input[i])) {
-					hours = hours * decimalPlace + (input[i] - '0');
-					decimalPlace *= 10;
-				} else {
-					validInput = false;
-					break;
-				}
-			}
-			decimalPlace = 1;
-			for (uint i = seperator + 1; i < input.size(); ++i) {
-				if (Common::isDigit(input[i])) {
-					minutes = minutes * decimalPlace + (input[i] - '0');
-					decimalPlace *= 10;
-				} else {
-					validInput = false;
-					break;
-				}
-			}
-			if ((hours > 23) || (minutes > 59))
-				validInput = false;
-
-			animationOn();
-		} while (!validInput && (_key.keycode != Common::KEYCODE_ESCAPE));
-
-		_vm->restoreScreen();
-		if (_key.keycode != Common::KEYCODE_ESCAPE) {
-			_state._timeAlarm = (hours * 60 + minutes) * 60 * 1000;
-			_state._alarmOn = (_state._timeAlarm > _time);
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, WIRE)) {
-		Room *r = _rooms[CABIN_L3];
-		if (!r->getObject(8)->hasProperty(CARRIED)) {
-			if (r->isSectionVisible(26))
-				_vm->renderMessage(kStringTakeMessage);
-			else
-				return false;
-		} else {
-			r->getObject(8)->_name = kStringWireAndClip;
-			r = _rooms[HOLD];
-			_inventory.remove(*r->getObject(2));
-			_state._terminalStripConnected = true;
-			_state._terminalStripWire = true;
-			_vm->renderMessage(kStringOk);
-		}
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, SPOOL)) {
-		Room *r = _rooms[CABIN_L2];
-		takeObject(*r->getObject(9));
-		r->getObject(9)->_name = kSringSpoolAndClip;
-		r = _rooms[HOLD];
-		_inventory.remove(*r->getObject(2));
-		_state._terminalStripConnected = true;
-		_vm->renderMessage(kStringOk);
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SPOOL)) {
-		Room *r = _rooms[CABIN_L3];
-		if (!_state._terminalStripConnected) {
-			if (r->isSectionVisible(26))
-				_vm->renderMessage(kStringCable3);
-			else
-				return false;
-		} else {
-			if (!r->getObject(8)->hasProperty(CARRIED))
-				_vm->renderMessage(kStringTakeMessage);
-			else {
-				r = _rooms[CABIN_L2];
-				takeObject(*r->getObject(9));
-				r = _rooms[CABIN_L3];
-				r->getObject(8)->_name = kStringGeneratorWire;
-				r = _rooms[CABIN_L2];
-				_inventory.remove(*r->getObject(9));
-				_state._cableConnected = true;
-				_vm->renderMessage(kStringOk);
-			}
-		}
-	} else if ((verb == ACTION_USE) && (obj1._id == SUIT)) {
-		takeObject(obj1);
-		if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
-			if (obj1.hasProperty(WORN)) {
-				_vm->renderMessage(kStringGenericInteract_15);
-				_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
-				_rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
-				_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
-			} else
-				_vm->renderMessage(kStringGenericInteract_16);
-		} else {
-			if (obj1.hasProperty(WORN)) {
-				Room *r = _rooms[AIRLOCK];
-				if (r->getObject(4)->hasProperty(WORN))
-					_vm->renderMessage(kStringGenericInteract_17);
-				else if (r->getObject(6)->hasProperty(WORN))
-					_vm->renderMessage(kStringGenericInteract_18);
-				else {
-					obj1.disableProperty(WORN);
-					_vm->renderMessage(kStringGenericInteract_19);
-				}
-			} else {
-				obj1.setProperty(WORN);
-				_vm->renderMessage(kStringGenericInteract_20);
-			}
-		}
-	} else if ((verb == ACTION_USE) && (obj1._id == HELMET)) {
-		takeObject(obj1);
-		if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
-			if (obj1.hasProperty(WORN)) {
-				_vm->renderMessage(kStringGenericInteract_21);
-				_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
-				_rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
-				_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
-			} else
-				_vm->renderMessage(kStringGenericInteract_22);
-		} else if (obj1.hasProperty(WORN)) {
-			obj1.disableProperty(WORN);
-			_vm->renderMessage(kStringGenericInteract_24);
-			getInput();
-			if (airless())
-				dead(kStringGenericInteract_23);
-		} else {
-			Room *r = _rooms[AIRLOCK];
-			if (r->getObject(5)->hasProperty(WORN)) {
-				obj1.setProperty(WORN);
-				_vm->renderMessage(kStringGenericInteract_25);
-			} else
-				_vm->renderMessage(kStringGenericInteract_26);
-		}
-	} else if ((verb == ACTION_USE) && (obj1._id == LIFESUPPORT)) {
-		takeObject(obj1);
-		if ((_currentRoom->getId() >= ENTRANCE) && (_currentRoom->getId() <= ROGER)) {
-			if (obj1.hasProperty(WORN)) {
-				_vm->renderMessage(kStringGenericInteract_21);
-				_rooms[AIRLOCK]->getObject(4)->disableProperty(WORN);
-				_rooms[AIRLOCK]->getObject(5)->disableProperty(WORN);
-				_rooms[AIRLOCK]->getObject(6)->disableProperty(WORN);
-			} else
-				_vm->renderMessage(kStringGenericInteract_22);
-		} else if (obj1.hasProperty(WORN)) {
-			obj1.disableProperty(WORN);
-			_vm->renderMessage(kStringGenericInteract_28);
-			getInput();
-			if (airless())
-				dead(kStringGenericInteract_27);
-		} else {
-			Room *r = _rooms[AIRLOCK];
-			if (r->getObject(5)->hasProperty(WORN)) {
-				obj1.setProperty(WORN);
-				_vm->renderMessage(kStringGenericInteract_29);
-			} else
-				_vm->renderMessage(kStringGenericInteract_26);
-		}
-	} else if ((verb == ACTION_WALK) && (obj1._id == BATHROOM_DOOR)) {
-		_rooms[BATHROOM]->getObject(2)->_exitRoom = _currentRoom->getId();
-		return false;
-	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, SOCKET))
-		_vm->renderMessage(kStringGenericInteract_30);
-	else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
-		_vm->renderMessage(kStringGenericInteract_31);
-		waitOnInput(_messageDuration);
-		_vm->removeMessage();
-		_vm->renderMessage(kStringGenericInteract_32);
-	} else
-		return false;
-
-	return true;
-}
-
-void GameManager1::handleInput() {
-	bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
-	if (!validCommand)
-		validCommand = _currentRoom->interact(_inputVerb, *_inputObject[0], *_inputObject[1]);
-	if (!validCommand) {
-		switch (_inputVerb) {
-		case ACTION_LOOK:
-			_vm->renderMessage(_inputObject[0]->_description);
-			break;
-
-		case ACTION_WALK:
-			if (_inputObject[0]->hasProperty(CARRIED)) {
-				// You already carry this.
-				_vm->renderMessage(kStringGenericInteract_33);
-			} else if (!_inputObject[0]->hasProperty(EXIT)) {
-				// You're already there.
-				_vm->renderMessage(kStringGenericInteract_34);
-			} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
-				// This is closed
-				_vm->renderMessage(kStringShipHold9);
-			} else
-				changeRoom(_inputObject[0]->_exitRoom);
-
-			break;
-
-		case ACTION_TAKE:
-			if (_inputObject[0]->hasProperty(OPENED)) {
-				// You already have that
-				_vm->renderMessage(kStringGenericInteract_35);
-			} else if (_inputObject[0]->hasProperty(UNNECESSARY)) {
-				// You do not need that.
-				_vm->renderMessage(kStringGenericInteract_36);
-			} else if (!_inputObject[0]->hasProperty(TAKE)) {
-				// You can't take that.
-				_vm->renderMessage(kStringGenericInteract_37);
-			} else
-				takeObject(*_inputObject[0]);
-
-			break;
-
-		case ACTION_OPEN:
-			if (!_inputObject[0]->hasProperty(OPENABLE)) {
-				// This can't be opened
-				_vm->renderMessage(kStringGenericInteract_38);
-			} else if (_inputObject[0]->hasProperty(OPENED)) {
-				// This is already opened.
-				_vm->renderMessage(kStringGenericInteract_39);
-			} else if (_inputObject[0]->hasProperty(CLOSED)) {
-				// This is locked.
-				_vm->renderMessage(kStringGenericInteract_40);
-			} else {
-				_vm->renderImage(_inputObject[0]->_section);
-				_inputObject[0]->setProperty(OPENED);
-				byte i = _inputObject[0]->_click;
-				_inputObject[0]->_click  = _inputObject[0]->_click2;
-				_inputObject[0]->_click2 = i;
-				_sound->play(kAudioDoorOpen);
-			}
-			break;
-
-		case ACTION_CLOSE:
-			if (!_inputObject[0]->hasProperty(OPENABLE) ||
-				(_inputObject[0]->hasProperty(CLOSED) &&
-				 _inputObject[0]->hasProperty(OPENED))) {
-				// This can't be closed.
-				_vm->renderMessage(kStringGenericInteract_41);
-			} else if (!_inputObject[0]->hasProperty(OPENED)) {
-				// This is already closed.
-				_vm->renderMessage(kStringCloseLocker_1);
-			} else {
-				_vm->renderImage(invertSection(_inputObject[0]->_section));
-				_inputObject[0]->disableProperty(OPENED);
-				byte i = _inputObject[0]->_click;
-				_inputObject[0]->_click  = _inputObject[0]->_click2;
-				_inputObject[0]->_click2 = i;
-				_sound->play(kAudioDoorClose);
-			}
-			break;
-
-		case ACTION_GIVE:
-			if (_inputObject[0]->hasProperty(CARRIED)) {
-				// Better keep it!
-				_vm->renderMessage(kStringGenericInteract_42);
-			}
-			break;
-
-		default:
-			// This is not possible.
-			_vm->renderMessage(kStringGenericInteract_43);
-		}
-	}
-}
-
-void GameManager1::executeRoom() {
-	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
-		handleInput();
-		if (_mouseClicked) {
-			Common::Event event;
-			event.type = Common::EVENT_MOUSEMOVE;
-			event.mouse = Common::Point(0, 0);
-			_vm->getEventManager()->pushEvent(event);
-			event.type = Common::EVENT_MOUSEMOVE;
-			event.mouse = Common::Point(_mouseX, _mouseY);
-			_vm->getEventManager()->pushEvent(event);
-		}
-
-		resetInputState();
-	}
-
-	if (_guiEnabled) {
-		if (!_vm->_screen->isMessageShown()) {
-			g_system->fillScreen(kColorBlack);
-			_vm->renderRoom(*_currentRoom);
-		}
-		drawMapExits();
-		drawInventory();
-		drawStatus();
-		drawCommandBox();
-	}
-
-	roomBrightness();
-	if (_vm->_screen->getViewportBrightness() == 0)
-		_vm->paletteFadeIn();
-
-	if (!_currentRoom->hasSeen() && _newRoom) {
-		_newRoom = false;
-		_currentRoom->onEntrance();
-	}
-}
-
-void GameManager1::guardShot() {
-	_vm->renderImage(2);
-	_vm->renderImage(5);
-	wait(3);
-	_vm->renderImage(2);
-
-	_sound->play(kAudioVoiceHalt);
-	while (_sound->isPlaying())
-		wait(1);
-
-	_vm->renderImage(5);
-	wait(5);
-	_vm->renderImage(3);
-	wait(3);
-
-	shot(4, 3);
-}
-
-void GameManager1::guard3Shot() {
-	_vm->renderImage(1);
-	wait(3);
-	_sound->play(kAudioVoiceHalt); // 46/0
-	while (_sound->isPlaying())
-		wait(1);
-
-	wait(5);
-	_vm->renderImage(2);
-	wait(3);
-	shot(3,2);
-}
-
-void GameManager1::alarm() {
-	if (_rooms[INTRO]->getObject(2)->hasProperty(CARRIED)) {
-		alarmSound();
-		if (_currentRoom->getId() == GUARD)
-			guardShot();
-		else if (_currentRoom->getId() == CORRIDOR4 || _currentRoom->getId() == CORRIDOR7) {
-			guardNoticed();
-			_state._corridorSearch = true;
-		} else if (_currentRoom->getId() == GUARD3)
-			guard3Shot();
-		else if (_currentRoom->getId() == CORRIDOR1)
-			busted(33);
-	} else {
-		if (_currentRoom->getId() == CORRIDOR2 || _currentRoom->getId() == CORRIDOR4 ||
-			_currentRoom->getId() == GUARD     || _currentRoom->getId() == CORRIDOR7 ||
-			_currentRoom->getId() == CELL)
-		{
-			alarmSound();
-			if (_currentRoom->getId() == GUARD)
-				guardShot();
-			guardNoticed();
-			if (_currentRoom->getId() == CORRIDOR4)
-				_state._corridorSearch = true;
-		}
-		_rooms[GUARD]->setSectionVisible(1, true);
-		_rooms[GUARD]->getObject(3)->_click = 255;
-		if (!_rooms[GUARD]->getObject(5)->hasProperty(CARRIED)) {
-			_rooms[GUARD]->setSectionVisible(7, true);
-			_rooms[GUARD]->getObject(5)->_click = 4;
-		}
-		_state._eventTime = _time + ticksToMsec(180);
-		_state._eventCallback = kGuardReturnedFn;
-	}
-}
-
-void GameManager1::alarmSound() {
-	animationOff();
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAlarm);
-
-	int32 end = _time + ticksToMsec(_messageDuration);
-	do {
-		_sound->play(kAudioAlarm);
-		while (_sound->isPlaying()) {
-			g_system->delayMillis(_vm->_delay);
-			updateEvents();
-			g_system->updateScreen();
-		}
-	} while (_time < end && !_vm->shouldQuit());
-
-	_vm->removeMessage();
-	animationOn();
-}
-
-}
diff --git a/engines/supernova/state.h b/engines/supernova/state.h
deleted file mode 100644
index cb38c2a..0000000
--- a/engines/supernova/state.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA_STATE_H
-#define SUPERNOVA_STATE_H
-
-#include "common/error.h"
-#include "common/events.h"
-#include "common/rect.h"
-#include "common/keyboard.h"
-#include "supernova/rooms.h"
-#include "supernova/room.h"
-#include "supernova/sound.h"
-#include "supernova/game-manager.h"
-
-namespace Supernova {
-
-class GameManager;
-
-class GameState {
-	public:
-		int32  _timeSleep;
-		int32  _timeAlarm;
-		int32  _eventTime;
-		EventFunction _eventCallback;
-		int32  _arrivalDaysLeft;
-		int32  _shipEnergyDaysLeft;
-		int32  _landingModuleEnergyDaysLeft;
-		uint16 _greatFlag;
-		int16  _timeRobot;
-		int16  _money;
-		byte   _coins;
-		byte   _shoes;
-		byte   _origin;
-		byte   _destination;
-		byte   _language;
-		bool   _corridorSearch;
-		bool   _alarmOn;
-		bool   _terminalStripConnected;
-		bool   _terminalStripWire;
-		bool   _cableConnected;
-		bool   _powerOff;
-		bool   _dream;
-		bool   _nameSeen[4];
-		bool   _playerHidden;
-};
-
-class GameManager1 : public GameManager {
-public:
-	GameManager1(SupernovaEngine *vm, Sound *sound);
-	virtual ~GameManager1();
-
-	GameState _state;
-
-	virtual void updateEvents();
-	virtual void executeRoom();
-	virtual bool serialize(Common::WriteStream *out);
-	virtual bool deserialize(Common::ReadStream *in, int version);
-
-	virtual void initState();
-	virtual void initRooms();
-	virtual void destroyRooms();
-	virtual bool canSaveGameStateCurrently();
-	virtual bool genericInteract(Action verb, Object &obj1, Object &obj2);
-	bool isHelmetOff();
-	void great(uint number);
-	bool airless();
-	void shock();
-	void turnOff();
-	void turnOn();
-	virtual void roomBrightness();
-	void openLocker(const Room *room, Object *obj, Object *lock, int section);
-	void closeLocker(const Room *room, Object *obj, Object *lock, int section);
-	virtual void drawMapExits();
-	virtual void handleInput();
-	virtual void handleTime();
-	virtual void loadTime();
-	virtual void saveTime();
-	void shot(int a, int b);
-	virtual void takeMoney(int amount);
-	void search(int time);
-	void startSearch();
-	void guardNoticed();
-	void busted(int i);
-	void corridorOnEntrance();
-	void telomat(int number);
-	void novaScroll();
-	void supernovaEvent();
-	void guardReturnedEvent();
-	void walk(int a);
-	void guardWalkEvent();
-	void taxiEvent();
-	void searchStartEvent();
-	void guardShot();
-	void guard3Shot();
-	void alarm();
-	void alarmSound();
-
-private:
-	int _prevImgId;
-};
-
-}
-
-#endif // SUPERNOVA_STATE_H
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 79d64cd..9c7cdde 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -45,7 +45,7 @@
 #include "supernova/screen.h"
 #include "supernova/sound.h"
 #include "supernova/supernova.h"
-#include "supernova/state.h"
+#include "supernova/supernova1/state.h"
 #include "supernova/game-manager.h"
 
 namespace Supernova {
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 9655d00..d50fe6a 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -33,7 +33,7 @@
 #include "supernova/console.h"
 #include "supernova/graphics.h"
 #include "supernova/msn_def.h"
-#include "supernova/rooms.h"
+#include "supernova/room.h"
 #include "supernova/sound.h"
 #include "supernova/imageid.h"
 #include "supernova/game-manager.h"
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
new file mode 100644
index 0000000..4c52903
--- /dev/null
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -0,0 +1,4164 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "graphics/palette.h"
+#include "graphics/cursorman.h"
+
+#include "supernova/screen.h"
+#include "supernova/supernova.h"
+#include "supernova/supernova1/state.h"
+
+namespace Supernova {
+
+Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = -1;
+	_id = INTRO;
+	_shown[0] = kShownFalse;
+
+	_objectState[0] =
+	Object(_id, kStringKeycard, kStringKeycardDescription, KEYCARD,
+		   TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+	_objectState[1] =
+	Object(_id, kStringKnife, kStringKnifeDescription, KNIFE,
+		   TAKE | CARRIED | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+	_objectState[2] =
+	Object(_id, kStringWatch, kStringDefaultDescription, WATCH,
+		   TAKE | COMBINABLE | CARRIED, 255, 255, 8, NULLROOM, 0);
+	_objectState[3] =
+	Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN,
+		   TAKE | COMBINABLE, 255, 255, 0, NULLROOM, 0);
+	_objectState[4] =
+	Object(_id, kStringInventoryMoney, kStringDefaultDescription, MONEY,
+		   TAKE | COMBINABLE, 255, 255, 0);
+
+	_shouldExit = false;
+
+	_introText =
+		_vm->getGameString(kStringIntro1) + '\0' +
+		_vm->getGameString(kStringIntro2) + '\0' +
+		_vm->getGameString(kStringIntro3) + '\0' +
+		_vm->getGameString(kStringIntro4) + '\0' +
+		_vm->getGameString(kStringIntro5) + '\0' +
+		_vm->getGameString(kStringIntro6) + '\0' +
+		_vm->getGameString(kStringIntro7) + '\0' +
+		_vm->getGameString(kStringIntro8) + '\0' +
+		_vm->getGameString(kStringIntro9) + '\0' +
+		_vm->getGameString(kStringIntro10) + '\0' +
+		_vm->getGameString(kStringIntro11) + '\0' +
+		_vm->getGameString(kStringIntro12) + '\0' +
+		_vm->getGameString(kStringIntro13) + '\0';
+}
+
+void Intro::onEntrance() {
+	_gm->_guiEnabled = false;
+	_vm->_allowSaveGame = false;
+	_vm->_allowLoadGame = false;
+	titleScreen();
+	cutscene();
+	leaveCutscene();
+}
+
+void Intro::titleScreen() {
+	// Newspaper
+	CursorMan.showMouse(false);
+	_vm->_screen->setViewportBrightness(0);
+	_vm->_screen->setGuiBrightness(0);
+	_vm->paletteBrightness();
+	_vm->setCurrentImage(1);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->getInput();
+	_vm->paletteFadeOut();
+
+	// Title Screen
+	_vm->setCurrentImage(31);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->wait(1);
+	_vm->playSound(kAudioVoiceSupernova);
+	while (_vm->_sound->isPlaying())
+		_gm->wait(1);
+	titleFadeIn();
+	_vm->renderText(kStringTitleVersion, 295, 190, kColorWhite44);
+	const Common::String& title1 = _vm->getGameString(kStringTitle1);
+	const Common::String& title2 = _vm->getGameString(kStringTitle2);
+	const Common::String& title3 = _vm->getGameString(kStringTitle3);
+	_vm->_screen->renderText(title1, 78 - Screen::textWidth(title1) / 2, 120, kColorLightBlue);
+	_vm->_screen->renderText(title2, 78 - Screen::textWidth(title2) / 2, 132, kColorWhite99);
+	_vm->_screen->renderText(title3, 78 - Screen::textWidth(title3) / 2, 142, kColorWhite99);
+	_gm->wait(1);
+	CursorMan.showMouse(true);
+	_vm->playSound(kMusicIntro);
+
+	Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
+	while (!_vm->shouldQuit()) {
+		_gm->updateEvents();
+		marquee.renderCharacter();
+		if (_gm->_mouseClicked || _gm->_keyPressed)
+			break;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+	_vm->playSound(kAudioVoiceYeah);
+	while (_vm->_sound->isPlaying())
+		_gm->wait(1);
+	_vm->paletteFadeOut();
+}
+
+void Intro::titleFadeIn() {
+	byte titlePaletteColor[] = {0xfe, 0xeb};
+	byte titleNewColor[2][3] = {{255, 255, 255}, {199, 21, 21}};
+	byte newColors[2][3];
+
+	for (int brightness = 1; brightness <= 40; ++brightness) {
+		for (int colorIndex = 0; colorIndex < 2; ++colorIndex) {
+			for (int i = 0; i < 3; ++i) {
+				newColors[colorIndex][i] = (titleNewColor[colorIndex][i] * brightness) / 40;
+			}
+		}
+
+		_vm->_system->getPaletteManager()->setPalette(newColors[0], titlePaletteColor[0], 1);
+		_vm->_system->getPaletteManager()->setPalette(newColors[1], titlePaletteColor[1], 1);
+		_vm->_system->updateScreen();
+		_vm->_system->delayMillis(_vm->_delay);
+	}
+}
+
+bool Intro::animate(int section1, int section2, int duration) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	while (duration) {
+		_vm->renderImage(section1);
+		if (_gm->waitOnInput(2, key))
+			return key != Common::KEYCODE_ESCAPE;
+		_vm->renderImage(section2);
+		if (_gm->waitOnInput(2, key))
+			return key != Common::KEYCODE_ESCAPE;
+		--duration;
+	}
+	return true;
+}
+
+bool Intro::animate(int section1, int section2, int duration,
+					MessagePosition position, StringId textId) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	const Common::String& text = _vm->getGameString(textId);
+	_vm->renderMessage(text, position);
+	int delay = (MIN(text.size(), (uint)512) + 20) * (10 - duration) * _vm->_textSpeed / 400;
+	while (delay) {
+		if (section1)
+			_vm->renderImage(section1);
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
+		}
+		if (section2)
+			_vm->renderImage(section2);
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
+		}
+		--delay;
+	}
+	_vm->removeMessage();
+	return true;
+}
+
+bool Intro::animate(int section1, int section2, int section3, int section4,
+					int duration, MessagePosition position, StringId textId) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	const Common::String& text = _vm->getGameString(textId);
+	_vm->renderMessage(text, position);
+	if (duration == 0)
+		duration = (MIN(text.size(), (uint)512) + 20) * _vm->_textSpeed / 40;
+
+	while(duration) {
+		_vm->renderImage(section1);
+		_vm->renderImage(section3);
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
+		}
+		_vm->renderImage(section2);
+		_vm->renderImage(section4);
+		if (_gm->waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE;
+		}
+		duration--;
+	}
+	_vm->removeMessage();
+	return true;
+}
+
+void Intro::cutscene() {
+#define exitOnEscape(X) do { \
+	Common::KeyCode key = Common::KEYCODE_INVALID; \
+	if ((_gm->waitOnInput(X, key) && key == Common::KEYCODE_ESCAPE) || _vm->shouldQuit()) { \
+		CursorMan.showMouse(true); \
+		return; \
+	} \
+} while (0);
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->setCurrentImage(31);
+	_vm->_screen->setGuiBrightness(255);
+	_vm->paletteBrightness();
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene1))
+		return;
+	_vm->_screen->setGuiBrightness(0);
+	_vm->paletteBrightness();
+	exitOnEscape(1);
+
+	_vm->setCurrentImage(9);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(9);
+	_vm->paletteFadeIn();
+	if (!animate(11, 10, 6, kMessageRight, kStringIntroCutscene2))
+		return;
+	_vm->renderImage(3);
+	exitOnEscape(4);
+	_vm->renderImage(4);
+	if (!animate(11, 10, 3)) {// test duration
+		_vm->removeMessage();
+		return;
+	}
+	_vm->removeMessage();
+	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
+		return;
+	_vm->renderImage(3);
+	exitOnEscape(3);
+	_vm->renderImage(2);
+	exitOnEscape(3);
+	_vm->renderImage(7);
+	exitOnEscape(6);
+	_vm->renderImage(6);
+	exitOnEscape(6);
+	if (!animate(0, 0, 0, kMessageLeft, kStringIntroCutscene4))
+		return;
+	_vm->renderMessage(kStringIntroCutscene5, kMessageLeft);
+	exitOnEscape(28);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringIntroCutscene6, kMessageLeft);
+	exitOnEscape(28);
+	_vm->removeMessage();
+
+	StringId textCounting[4] =
+	{kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9, kStringIntroCutscene10};
+	_vm->setCurrentImage(31);
+	_vm->renderImage(0);
+	_vm->paletteBrightness();
+	for (int i = 0; i < 4; ++i){
+		_vm->renderMessage(textCounting[i], kMessageLeft);
+		for (int j = 0; j < 28; ++j) {
+			_vm->renderImage((j % 3) + 1);
+			Common::KeyCode key = Common::KEYCODE_INVALID;
+			if (_gm->waitOnInput(1, key)) {
+				if (key == Common::KEYCODE_ESCAPE)
+					return;
+				break;
+			}
+		}
+		_vm->removeMessage();
+	}
+	_vm->renderMessage(kStringIntroCutscene11, kMessageLeft);
+	_vm->renderImage(6);
+	exitOnEscape(3);
+	_vm->renderImage(3);
+	exitOnEscape(3);
+	_vm->renderImage(4);
+	exitOnEscape(3);
+	_vm->renderImage(5);
+	exitOnEscape(3);
+	_vm->renderImage(_gm->invertSection(5));
+	exitOnEscape(18);
+	_vm->removeMessage();
+
+	_vm->setCurrentImage(9);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(9);
+	_vm->paletteBrightness();
+	_vm->renderBox(0, 138, 320, 62, kColorBlack);
+	_vm->paletteBrightness();
+	if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene12))
+		return;
+	_vm->renderImage(3);
+	exitOnEscape(3);
+	_vm->renderImage(4);
+	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene13))
+		return;
+	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene14))
+		return;
+	_vm->renderImage(12);
+	exitOnEscape(2);
+	_vm->renderImage(13);
+	exitOnEscape(2);
+	_vm->renderImage(14);
+	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene15))
+		return;
+	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene16))
+		return;
+	exitOnEscape(20);
+	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene17))
+		return;
+	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene18))
+		return;
+	if (!animate(0, 0, 0, kMessageCenter, kStringIntroCutscene19))
+		return;
+	_vm->renderImage(16);
+	exitOnEscape(3);
+	_vm->renderImage(17);
+	if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene20))
+		return;
+	if (!animate(19, 20, 18, 17, 0, kMessageRight, kStringIntroCutscene21))
+		return;
+	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
+		return;
+	_vm->renderImage(3);
+	exitOnEscape(3);
+	_vm->renderImage(2);
+	exitOnEscape(3);
+	_vm->renderImage(8);
+	exitOnEscape(6);
+	_vm->renderImage(6);
+	_vm->playSound(kAudioSiren);
+
+	exitOnEscape(6);
+	_vm->renderImage(3);
+	exitOnEscape(3);
+	_vm->renderImage(4);
+	_vm->renderImage(16);
+	exitOnEscape(3);
+	_vm->renderImage(15);
+	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene22))
+		return;
+	if (!animate(19, 20, 0, kMessageRight, kStringIntroCutscene23))
+		return;
+	exitOnEscape(10);
+	_vm->renderImage(13);
+	exitOnEscape(2);
+	_vm->renderImage(12);
+	exitOnEscape(2);
+	_vm->renderImage(9);
+	if (!animate(11, 10, 0, kMessageRight, kStringIntroCutscene24))
+		return;
+	if (!animate(5, 4, 0, kMessageLeft, kStringIntroCutscene3))
+		return;
+	_vm->paletteFadeOut();
+
+	while (_vm->_sound->isPlaying())
+		exitOnEscape(1);
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->_screen->setGuiBrightness(255);
+	_vm->paletteBrightness();
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene25))
+		return;
+	_vm->_screen->setGuiBrightness(5);
+	_vm->paletteBrightness();
+
+	_vm->setCurrentImage(31);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene26))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene27))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene28))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene29))
+		return;
+	exitOnEscape(54);
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene30))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene31))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene32))
+		return;
+
+	CursorMan.showMouse(false);
+	_vm->_screen->setViewportBrightness(0);
+	_vm->paletteBrightness();
+	exitOnEscape(10);
+	_vm->playSound(kAudioSnoring);
+	while (_vm->_sound->isPlaying())
+		_gm->wait(1);
+	exitOnEscape(10);
+	_vm->playSound(kAudioSnoring);
+	while (_vm->_sound->isPlaying())
+		_gm->wait(1);
+	exitOnEscape(10);
+	_vm->playSound(kAudioSnoring);
+	while (_vm->_sound->isPlaying())
+		_gm->wait(1);
+	exitOnEscape(30);
+	CursorMan.showMouse(true);
+
+	_vm->setCurrentImage(22);
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene33))
+		return;
+	exitOnEscape(18);
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene34))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene35))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene36))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene37))
+		return;
+	exitOnEscape(18);
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene38))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene39))
+		return;
+	exitOnEscape(18);
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene40))
+		return;
+	if (!animate(0, 0, 0, kMessageNormal, kStringIntroCutscene41))
+		return;
+	exitOnEscape(36);
+	animate(0, 0, 0, kMessageNormal, kStringIntroCutscene42);
+	_vm->removeMessage();
+
+#undef exitOnEscape
+}
+
+void Intro::leaveCutscene() {
+	_vm->_screen->setViewportBrightness(255);
+	_vm->removeMessage();
+	_gm->changeRoom(CABIN_R3);
+	_gm->_guiEnabled = true;
+	_vm->_allowSaveGame = true;
+	_vm->_allowLoadGame = true;
+}
+
+ShipCorridor::ShipCorridor(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 17;
+	_id = CORRIDOR;
+	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringHatch, kStringDefaultDescription, HATCH1, OPENABLE | EXIT, 0, 6, 1, CABIN_L1, 15);
+	_objectState[1] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 1, 7, 2, CABIN_L2, 10);
+	_objectState[2] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 2, 8, 3, CABIN_L3, 5);
+	_objectState[3] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 5, 11, 6, CABIN_R1, 19);
+	_objectState[4] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT, 4, 10, 5, CABIN_R2, 14);
+	_objectState[5] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | EXIT | OPENED, 9, 3, 4, CABIN_R3, 9);
+	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 12, 12, 0, AIRLOCK, 2);
+	_objectState[7] = Object(_id, kStringButton, kStringHatchButtonDescription, BUTTON, PRESS, 13, 13, 0, NULLROOM, 0);
+	_objectState[8] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 14, 14, 0, NULLROOM, 0);
+	_objectState[9] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 15, 15, 0, HALL, 22);
+}
+
+bool ShipCorridor::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_PRESS) && (obj1._id == BUTTON)) {
+		if (_objectState[6].hasProperty(OPENED)) {
+			_vm->playSound(kAudioSlideDoor);
+			_objectState[6].disableProperty(OPENED);
+			_vm->renderImage(8);
+			setSectionVisible(9, false);
+			_gm->wait(2);
+			_vm->renderImage(7);
+			setSectionVisible(8, false);
+			_gm->wait(2);
+			_vm->renderImage(_gm->invertSection(7));
+		} else {
+			_vm->playSound(kAudioSlideDoor);
+			_objectState[6].setProperty(OPENED);
+			_vm->renderImage(7);
+			_gm->wait(2);
+			_vm->renderImage(8);
+			setSectionVisible(7, false);
+			_gm->wait(2);
+			_vm->renderImage(9);
+			setSectionVisible(8, false);
+		}
+		return true;
+	}
+	return false;
+}
+
+ShipHall::ShipHall(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 15;
+	_id = HALL;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringHatch, kStringCockpitHatchDescription, NULLOBJECT, OPENABLE | EXIT, 4, 5, 1, COCKPIT, 10);
+	_objectState[1] = Object(_id, kStringHatch, kStringKitchenHatchDescription, KITCHEN_HATCH, OPENABLE | EXIT, 0, 0, 0, NULLROOM, 1);
+	_objectState[2] = Object(_id, kStringHatch, kStringStasisHatchDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
+	_objectState[3] = Object(_id, kStringSlot, kStringSlotDescription, SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
+	_objectState[4] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
+	_objectState[5] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
+}
+
+bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_OPEN) && (obj1._id == KITCHEN_HATCH)) {
+		_vm->renderMessage(kStringShipHall1);
+	} else if ((verb == ACTION_USE) && Object::combine(obj1,obj2,KEYCARD2,SLEEP_SLOT)) {
+		if (_objectState[2].hasProperty(OPENED)) {
+			_objectState[2].disableProperty(OPENED);
+			_vm->renderImage(3);
+			setSectionVisible(4, false);
+			_gm->wait(2);
+			_vm->renderImage(2);
+			setSectionVisible(3, false);
+			_gm->wait(2);
+			_vm->renderImage(_gm->invertSection(2));
+		} else {
+			_objectState[2].setProperty(OPENED);
+			_vm->renderImage(2);
+			_gm->wait(2);
+			_vm->renderImage(3);
+			setSectionVisible(2, false);
+			_gm->wait(2);
+			_vm->renderImage(4);
+			setSectionVisible(3, false);
+			_gm->great(1);
+		}
+	} else {
+		return false;
+	}
+
+	return true;
+}
+
+ShipSleepCabin::ShipSleepCabin(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 33;
+	_id = SLEEP;
+	_shown[0] = kShownTrue;
+	_color = kColorBlack;
+
+	_objectState[0] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABINS, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+	_objectState[1] = Object(_id, kStringHatch, kStringStasisHatchDescription2, CABIN, NULLTYPE, 1, 1, 0, NULLROOM, 0);
+	_objectState[2] = Object(_id, kStringComputer, kStringDefaultDescription, COMPUTER, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+	_objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
+}
+
+bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) {
+	Room *room;
+	Common::String input;
+
+	if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) {
+		_gm->_guiEnabled = false;
+		setSectionVisible(4, false);
+		g_system->fillScreen(kColorDarkBlue);
+		if (_gm->_state._arrivalDaysLeft == 0) {
+			// Destination reached
+			_vm->renderText(kStringShipSleepCabin1, 60, 95, kColorWhite99);
+			_gm->getInput();
+		} else if (_gm->_state._powerOff) {
+			// Energy depleted
+			_vm->renderText(kStringShipSleepCabin2, 60, 95, kColorWhite99);
+			// Artificial coma interrupted
+			_vm->renderText(kStringShipSleepCabin3, 60, 115, kColorWhite99);
+			_gm->getInput();
+		} else if (isSectionVisible(5)) {
+			// Sleep duration in days
+			_vm->renderText(kStringShipSleepCabin4, 30, 85, kColorWhite99);
+			_vm->renderText(Common::String::format("%d",_gm->_state._timeSleep).c_str(),
+							150, 85, kColorWhite99);
+			_vm->renderText(kStringShipSleepCabin5, 30, 105, kColorWhite99);
+			_gm->getInput();
+		} else {
+			_vm->renderText(kStringShipSleepCabin6, 100, 85, kColorWhite99);
+			_gm->edit(input, 100, 105, 30);
+
+			input.toUppercase();
+			if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) {
+				if (input == _vm->getGameString(kStringComputerPassword)) {
+					_gm->great(6);
+					g_system->fillScreen(kColorDarkBlue);
+					_vm->renderText(kStringShipSleepCabin7, 30, 85, kColorWhite99);
+					uint daysSleep = 0;
+					do {
+						input.clear();
+						_vm->renderBox(150, 85, 150, 8, kColorDarkBlue);
+						_gm->edit(input, 150, 85, 10);
+
+						if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) {
+							break;
+						} else {
+							daysSleep = input.asUint64();
+							for (uint i = 0; i < input.size(); i++) {
+								if (!Common::isDigit(input[i])) {
+									daysSleep = 0;
+									break;
+								}
+							}
+						}
+						if (daysSleep != 0) {
+							_gm->_state._timeSleep = daysSleep;
+							_vm->renderText(kStringShipSleepCabin8, 30, 105, kColorWhite99);
+							_gm->wait(18);
+							setSectionVisible(5, true);
+						}
+					} while (daysSleep == 0);
+				} else {
+					_vm->renderText(kStringShipSleepCabin9, 100, 125, kColorLightRed);
+					_gm->wait(18);
+				}
+			}
+		}
+
+		_gm->_guiEnabled = true;
+		input.clear();
+	} else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) &&
+			   ((obj1._id == CABINS) || (obj1._id == CABIN))) {
+		room = _gm->_rooms[AIRLOCK];
+		if (!(obj1._id == CABIN) || !isSectionVisible(5)) {
+			_vm->renderMessage(kStringShipSleepCabin10);
+		} else if (room->getObject(5)->hasProperty(WORN)) {
+			_vm->renderMessage(kStringShipSleepCabin11);
+		} else {
+			_vm->paletteFadeOut();
+			_vm->renderImage(_gm->invertSection(5));
+			_vm->renderImage(_gm->invertSection(4));
+			room = _gm->_rooms[GENERATOR];
+			int32 *energyDaysLeft;
+			if (room->isSectionVisible(9)) {
+				energyDaysLeft = &_gm->_state._landingModuleEnergyDaysLeft;
+			} else {
+				energyDaysLeft = &_gm->_state._shipEnergyDaysLeft;
+			}
+			if (_gm->_state._timeSleep > _gm->_state._arrivalDaysLeft) {
+				_gm->_state._timeSleep = _gm->_state._arrivalDaysLeft;
+			}
+			if (_gm->_state._timeSleep >= *energyDaysLeft) {
+				_gm->_state._timeSleep = *energyDaysLeft;
+				if (room->isSectionVisible(9)) {
+					room = _gm->_rooms[LANDINGMODULE]; // Monitors off
+					room->setSectionVisible(2, false);
+					room->setSectionVisible(7, false);
+					room->setSectionVisible(8, false);
+					room->setSectionVisible(9, false);
+					room->setSectionVisible(10, false);
+				}
+			}
+			if (_gm->_state._timeSleep == _gm->_state._arrivalDaysLeft) {
+				_vm->renderImage(3);
+				room = _gm->_rooms[COCKPIT];
+				room->setSectionVisible(23, true);
+				room = _gm->_rooms[CABIN_R2];
+				room->setSectionVisible(5, false);
+				room->setSectionVisible(6, true);
+				room->getObject(2)->_click = 10;
+				room = _gm->_rooms[HOLD];
+				room->setSectionVisible(0, false);
+				room->setSectionVisible(1, true);
+				room->getObject(1)->_click = 255;
+				room->getObject(3)->_click = 255;
+				room = _gm->_rooms[GENERATOR];
+				room->setSectionVisible(6, false);
+				room->setSectionVisible(7, true);
+				room->getObject(1)->_click = 14;
+				if (room->isSectionVisible(1)) {
+					room->setSectionVisible(10, true);
+				}
+				if (room->isSectionVisible(12)) {
+					room->setSectionVisible(12, false);
+					room->setSectionVisible(11, true);
+				}
+			}
+			_gm->_state._arrivalDaysLeft -= _gm->_state._timeSleep;
+			*energyDaysLeft -= _gm->_state._timeSleep;
+			_gm->_time = ticksToMsec(786520); // 12pm
+			_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
+			if (*energyDaysLeft == 0) {
+				_gm->turnOff();
+				room = _gm->_rooms[GENERATOR];
+				room->setSectionVisible(4, room->isSectionVisible(2));
+			}
+			if (_gm->_state._arrivalDaysLeft == 0) {
+				_gm->saveTime();
+				if (!_vm->saveGame(kSleepAutosaveSlot, "Sleep autosave"))
+					_vm->errorTempSave(true);
+				_gm->_state._dream = true;
+				_gm->loadTime();
+			}
+			_gm->wait(18);
+			_vm->paletteFadeIn();
+			if (_gm->_state._arrivalDaysLeft == 0) {
+				_vm->playSound(kAudioCrash);
+				_gm->screenShake();
+				_gm->wait(18);
+				_vm->renderMessage(kStringShipSleepCabin12);
+			}
+		}
+	} else {
+		return false;
+	}
+
+	return true;
+}
+
+void ShipSleepCabin::animation() {
+	if (_gm->_state._powerOff && _gm->_state._arrivalDaysLeft) {
+		if (_gm->_guiEnabled) {
+			if (isSectionVisible(1)) {
+				_vm->renderImage(2);
+				setSectionVisible(1, false);
+			} else {
+				_vm->renderImage(1);
+				setSectionVisible(2, false);
+			}
+		} else {
+			if (_color == kColorLightRed) {
+				_color = kColorDarkBlue;
+			} else {
+				_color = kColorLightRed;
+			}
+
+			_vm->renderText(kStringShipSleepCabin13, 60, 75, _color);
+		}
+	} else if (isSectionVisible(5) && _gm->_guiEnabled) {
+		if (isSectionVisible(4))
+			_vm->renderImage(_gm->invertSection(4));
+		else
+			_vm->renderImage(4);
+	}
+
+	_gm->setAnimationTimer(6);
+}
+void ShipSleepCabin::onEntrance() {
+	if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
+		_vm->renderMessage(kStringShipSleepCabin14);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_vm->renderMessage(kStringShipSleepCabin15);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_vm->renderMessage(kStringShipSleepCabin16);
+		_gm->_state._dream = false;
+	}
+}
+
+ShipCockpit::ShipCockpit(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 9;
+	_id = COCKPIT;
+	_shown[0] = kShownTrue;
+	_color = kColorBlack;
+
+	_objectState[0] = Object(_id, kStringInstruments, kStringInstrumentsDescription1, INSTRUMENTS, NULLTYPE, 2, 2, 0, NULLROOM, 0);
+	_objectState[1] = Object(_id, kStringMonitor, kStringDefaultDescription, MONITOR, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+	_objectState[2] = Object(_id, kStringMonitor, kStringMonitorDescription, NULLOBJECT, TAKE, 1, 0, 0, NULLROOM, 0);
+	_objectState[3] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
+}
+
+bool ShipCockpit::interact(Action verb, Object &obj1, Object &obj2) {
+	// TODO: distance and remaining time not accurate
+
+	if ((verb == ACTION_LOOK) && (obj1._id == MONITOR)) {
+		char c[2] = {0, 0};
+		_gm->_guiEnabled = false;
+		_vm->renderBox(0, 0, 320, 200, kColorBlack);
+		_vm->renderText(kStringShipCockpit1, 50, 50, kColorLightYellow);
+		if (_gm->_state._arrivalDaysLeft)
+			_vm->renderText(kStringShipCockpit2);
+		else
+			_vm->renderText(kStringShipCockpit3);
+		_vm->renderText(kStringShipCockpit4, 50, 70, kColorLightYellow);
+		_vm->renderText(kStringShipCockpit5, 50, 90, kColorLightYellow);
+		_vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft / 400).c_str());
+		_vm->renderText(",");
+		c[0] = (_gm->_state._arrivalDaysLeft / 40) % 10 + '0';
+		_vm->renderText(c);
+		c[0] = (_gm->_state._arrivalDaysLeft / 4) % 10 + '0';
+		_vm->renderText(c);
+		_vm->renderText(kStringShipCockpit6);
+		_vm->renderText(kStringShipCockpit7, 50, 110, kColorLightYellow);
+		_vm->renderText(Common::String::format("%d", _gm->_state._arrivalDaysLeft).c_str(),
+						50, 120, kColorLightYellow);
+		_vm->renderText(kStringShipCockpit8);
+
+		_gm->getInput();
+		_gm->_guiEnabled = true;
+	} else if ((verb == ACTION_USE) && (obj1._id == INSTRUMENTS))
+		_vm->renderMessage(kStringShipCockpit9);
+	else
+		return false;
+
+	return true;
+}
+void ShipCockpit::animation() {
+	if (!_gm->_guiEnabled) {
+		if (_color) {
+			_color = kColorBlack;
+			_gm->setAnimationTimer(5);
+		} else {
+			_color = kColorLightYellow;
+			_gm->setAnimationTimer(10);
+		}
+		_vm->renderText(kStringShipCockpit10, 50, 145, _color);
+	} else if (isSectionVisible(21)) {
+		_vm->renderImage(_gm->invertSection(21));
+		_gm->setAnimationTimer(5);
+	} else {
+		_vm->renderImage(21);
+		_gm->setAnimationTimer(10);
+	}
+
+	if (_gm->_state._powerOff) {
+		if (!_gm->_guiEnabled) {
+			_vm->renderText(kStringShipCockpit11, 97, 165, _color);
+			_vm->renderText(kStringShipCockpit12, 97, 175, _color);
+		} else if (isSectionVisible(21))
+			_vm->renderImage(22);
+		else
+			_vm->renderImage(_gm->invertSection(22));
+	}
+}
+
+void ShipCockpit::onEntrance() {
+	if (!hasSeen())
+		_vm->renderMessage(kStringShipCockpit13);
+	setRoomSeen(true);
+}
+
+ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 21;
+	_id = CABIN_L1;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringImage, kStringGenericDescription1, NULLOBJECT, UNNECESSARY, 5, 5, 0, NULLROOM, 0);
+	_objectState[1] = Object(_id, kStringImage, kStringGenericDescription2, NULLOBJECT, UNNECESSARY, 6, 6, 0, NULLROOM, 0);
+	_objectState[2] = Object(_id, kStringImage, kStringGenericDescription3, NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
+	_objectState[3] = Object(_id, kStringMagnete, kStringMagneteDescription, NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
+	_objectState[4] = Object(_id, kStringImage, kStringGenericDescription4, NULLOBJECT, UNNECESSARY, 9, 9, 0);
+	_objectState[5] = Object(_id, kStringPen, kStringPenDescription, PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
+	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
+	_objectState[7] = Object(_id, kStringSlot, kStringSlotDescription, NULLOBJECT, COMBINABLE, 0, 0, 0);
+	_objectState[8] = Object(_id, kStringShelf, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
+	_objectState[9] = Object(_id, kStringCompartment, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
+	_objectState[10] = Object(_id, kStringSocket, kStringDefaultDescription, SOCKET, COMBINABLE, 4, 4, 0);
+	_objectState[11] = Object(_id, kStringToilet, kStringDefaultDescription, BATHROOM_DOOR, EXIT, 255, 255, 0, BATHROOM, 22);
+}
+
+ShipCabinL2::ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 21;
+	_id = CABIN_L2;
+	_shown[0] = kShownTrue;
+	_shown[16] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL1,COMBINABLE,31,31,0);
+	_objectState[1] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL2,COMBINABLE,32,32,0);
+	_objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL3,COMBINABLE,33,33,0);
+	_objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_KL4,COMBINABLE,45,45,0);
+	_objectState[4] = Object(_id, kStringShelf,kStringDefaultDescription,SHELF_L1,OPENABLE | CLOSED,25,26,17);
+	_objectState[5] = Object(_id, kStringPistol,kStringPistolDescription,PISTOL,TAKE,39,39,20);
+	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L2,OPENABLE | CLOSED,27,28,18);
+	_objectState[7] = Object(_id, kStringBooks,kStringBooksDescription,NULLOBJECT,UNNECESSARY,40,40,0);
+	_objectState[8] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L3,OPENABLE | CLOSED,29,30,19);
+	_objectState[9] = Object(_id, kStringSpool,kStringSpoolDescription, SPOOL,TAKE | COMBINABLE,41,41,21);
+	_objectState[10] = Object(_id, kStringCompartment,kStringDefaultDescription,SHELF_L4,OPENABLE | CLOSED,43,44,22);
+	_objectState[11] = Object(_id, kStringBook,kStringDefaultDescription,BOOK2,TAKE,46,46,23);
+	_objectState[12] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,34,34,0);
+	_objectState[13] = Object(_id, kStringUnderwear,kStringUnderwearDescription,NULLOBJECT,UNNECESSARY,35,35,0);
+	_objectState[14] = Object(_id, kStringClothes,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,36,36,0);
+	_objectState[15] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,37,37,0);
+	_objectState[16] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,38,38,0);
+	_objectState[17] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,23,23,0);
+	_objectState[18] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+	_objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+	_objectState[20] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+	_objectState[21] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+	_objectState[22] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+	_objectState[23] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+	_objectState[24] = Object(_id, kStringFolders,kStringFoldersDescription,NULLOBJECT,UNNECESSARY,49,49,0);
+}
+
+bool ShipCabinL2::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL1, KEYCARD2)) {
+		_gm->openLocker(this, getObject(4), getObject(0), 17);
+		if (getObject(5)->_click == 255)
+			_vm->renderImage(20); // Remove Pistol
+		_gm->great(2);
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL2, KEYCARD2)) {
+		_gm->openLocker(this, getObject(6), getObject(1), 18);
+		_gm->great(2);
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL3, KEYCARD2)) {
+		_gm->openLocker(this, getObject(8), getObject(2), 19);
+		if (getObject(9)->_click == 255)
+			_vm->renderImage(21); // Remove cable spool
+		_gm->great(2);
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_KL4, KEYCARD2)) {
+		_gm->openLocker(this, getObject(10), getObject(3), 22);
+		if (getObject(11)->_click == 255)
+			_vm->renderImage(23); // Remove book
+		_gm->great(2);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L1)) {
+		_gm->closeLocker(this, getObject(4), getObject(0), 17);
+		setSectionVisible(20, false);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L2))
+		_gm->closeLocker(this, getObject(6), getObject(1), 18);
+	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L3)) {
+		_gm->closeLocker(this, getObject(8), getObject(2), 19);
+		setSectionVisible(21, false);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF_L4)) {
+		_gm->closeLocker(this, getObject(10), getObject(3), 22);
+		setSectionVisible(23, false);
+	} else if ((verb == ACTION_TAKE) && (obj1._id == SPOOL) && !obj1.hasProperty(CARRIED)) {
+		getObject(8)->_click = 42;  // empty shelf
+		return false;
+	} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK2) && !obj1.hasProperty(CARRIED)) {
+		getObject(10)->_click = 47;  // empty shelf
+		return false;
+	} else
+		return false;
+
+	return true;
+}
+
+ShipCabinL3::ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 21;
+	_id = CABIN_L3;
+	_shown[0] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[9] = kShownTrue;
+	_shown[12] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringPoster,kStringPosterDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
+	_objectState[1] = Object(_id, kStringPoster,kStringPosterDescription2,NULLOBJECT,UNNECESSARY,12,12,0);
+	_objectState[2] = Object(_id, kStringSpeaker,kStringDefaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
+	_objectState[3] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,14,14,0);
+	_objectState[4] = Object(_id, kStringRecord,kStringRecordDescription,RECORD,TAKE | COMBINABLE,15,15,8 | 128);
+	_objectState[5] = Object(_id, kStringRecordStand,kStringRecordStandDescription,NULLOBJECT,UNNECESSARY,16,16,0);
+	_objectState[6] = Object(_id, kStringButton,kStringDefaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
+	_objectState[7] = Object(_id, kStringTurntable,kStringTurntableDescription,TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
+	_objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,WIRE,COMBINABLE,18,18,0);
+	_objectState[9] = Object(_id, kStringWire,kStringDefaultDescription,WIRE2,COMBINABLE,19,19,0);
+	_objectState[10] = Object(_id, kStringPlug,kStringDefaultDescription,PLUG,COMBINABLE,20,20,0);
+	_objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+	_objectState[12] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+	_objectState[13] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+	_objectState[14] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+	_objectState[15] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+	_objectState[16] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+}
+
+bool ShipCabinL3::interact(Action verb, Object &obj1, Object &obj2) {
+	Room *r;
+
+	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, RECORD, TURNTABLE)) {
+		if (!_gm->_guiEnabled || isSectionVisible(15))
+			_vm->renderMessage(kStringShipCabinL3_1);
+		else {
+			if (!getObject(4)->hasProperty(CARRIED))
+				_vm->renderImage(_gm->invertSection(8));
+			else
+				_gm->_inventory.remove(*getObject(4));
+			_vm->renderImage(15);
+			getObject(4)->_click = 48;
+		}
+	} else if ((verb == ACTION_PRESS) && (obj1._id == TURNTABLE_BUTTON)) {
+		if (!isSectionVisible(15)) {
+			_vm->renderMessage(kStringShipCabinL3_2);
+		} else if (!isSectionVisible(10) && !isSectionVisible(11) && isSectionVisible(12)) {
+			_vm->renderImage(14);
+			setSectionVisible(15, false);
+			for (int i = 3; i; i--) {
+				_vm->playSound(kAudioTurntable);
+				while (_vm->_sound->isPlaying()) {
+					if (isSectionVisible(13)) {
+						_vm->renderImage(14);
+						setSectionVisible(13, false);
+					} else {
+						_vm->renderImage(13);
+						setSectionVisible(14, false);
+					}
+					_gm->wait(3);
+				}
+			}
+
+			_vm->renderImage(15);
+			setSectionVisible(14, false);
+			setSectionVisible(13, false);
+			_vm->renderMessage(kStringShipCabinL3_3);
+		}
+	} else if ((verb == ACTION_TAKE) && (obj1._id == RECORD) && (obj1._click != 15)) {
+		_vm->renderImage(9);
+		setSectionVisible(13, false);
+		setSectionVisible(14, false);
+		setSectionVisible(15, false);
+		obj1._section = 0;
+		_gm->takeObject(obj1);
+	} else if ((verb == ACTION_PULL) && (obj1._id == PLUG)) {
+		_vm->renderImage(10);
+		setSectionVisible(7, false);
+		obj1._click = 21;
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PLUG, SOCKET)) {
+		_vm->renderImage(7);
+		setSectionVisible(10, false);
+		getObject(10)->_click = 20;
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE2))
+		_vm->renderMessage(kStringShipCabinL3_4); // cutting near plug
+	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, WIRE)) {
+		r = _gm->_rooms[AIRLOCK];
+		if (!isSectionVisible(10) && !r->getObject(5)->hasProperty(WORN)) {
+			_vm->renderImage(25);
+			_gm->shock();
+		}
+		_vm->renderImage(11);
+		_vm->renderImage(26);
+		setSectionVisible(12, false);
+	} else if ((verb == ACTION_TAKE) && ((obj1._id == WIRE) || (obj1._id == WIRE2) || (obj1._id == PLUG))) {
+		if (isSectionVisible(10) && isSectionVisible(11)) {
+			_vm->renderImage(_gm->invertSection(10));
+			_vm->renderImage(_gm->invertSection(11));
+			getObject(8)->_name = kStringWireAndPlug;
+			_gm->takeObject(*getObject(8));
+			getObject(9)->_click = 255;
+			getObject(10)->_click = 255;
+		} else
+			_vm->renderMessage(kStringShipCabinL3_5);
+	} else
+		return false;
+
+	return true;
+}
+
+ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 22;
+	_id = CABIN_R1;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringImage,kStringImageDescription1,NULLOBJECT,UNNECESSARY,5,5,0);
+	_objectState[1] = Object(_id, kStringDrawingInstruments,kStringDrawingInstrumentsDescription,NULLOBJECT,UNNECESSARY,6,6,0);
+	_objectState[2] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,7,7,0);
+	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+	_objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+	_objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+}
+
+ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 22;
+	_id = CABIN_R2;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
+	_objectState[1] = Object(_id, kStringTennisRacket,kStringTennisRacketDescription,NULLOBJECT,UNNECESSARY,8,8,0);
+	_objectState[2] = Object(_id, kStringTennisBall,kStringGenericDescription2,NULLOBJECT,UNNECESSARY,9,9,0);
+	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+	_objectState[7] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+	_objectState[8] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+}
+
+ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 22;
+	_id = CABIN_R3;
+	_shown[0] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | 128);
+	_objectState[1] = Object(_id, kStringBed,kStringBedDescription,NULLOBJECT,NULLTYPE,13,13,0);
+	_objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K1,COMBINABLE,27,27,0);
+	_objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K2,COMBINABLE,28,28,0);
+	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K3,COMBINABLE,29,29,0);
+	_objectState[5] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K4,COMBINABLE,30,30,0);
+	_objectState[6] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF1,OPENABLE | CLOSED,14,18,9);
+	_objectState[7] = Object(_id, kStringAlbums,kStringAlbumsDescription,NULLOBJECT,UNNECESSARY,14,14,0);
+	_objectState[8] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF2,OPENABLE | CLOSED,15,19,10);
+	_objectState[9] = Object(_id, kStringRope,kStringRopeDescription,ROPE,TAKE | COMBINABLE,15,15,12);
+	_objectState[10] = Object(_id, kStringShelf,kStringShelfDescription,SHELF3,OPENABLE | CLOSED,16,17,11);
+	_objectState[11] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,20,20,0);
+	_objectState[12] = Object(_id, kStringClothes,kStringClothesDescription,NULLOBJECT,UNNECESSARY,21,21,0);
+	_objectState[13] = Object(_id, kStringUnderwear,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,22,22,0);
+	_objectState[14] = Object(_id, kStringSocks,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,23,23,0);
+	_objectState[15] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF4,OPENABLE | CLOSED,24,25,13);
+	_objectState[16] = Object(_id, kStringBook,kStringBookHitchhiker,BOOK,TAKE,26,26,14);
+	_objectState[17] = Object(_id, kStringDiscman,kStringDiscmanDescription,DISCMAN,TAKE | COMBINABLE,33,33,16);
+	_objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
+	_objectState[19] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
+	_objectState[20] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
+	_objectState[21] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
+	_objectState[22] = Object(_id, kStringSocket,kStringDefaultDescription,SOCKET,COMBINABLE,4,4,0);
+	_objectState[23] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
+}
+
+bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K1, KEYCARD))
+		_gm->openLocker(this, getObject(6), getObject(2), 9);
+	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K2, KEYCARD)) {
+		_gm->openLocker(this, getObject(8), getObject(3), 10);
+		if (getObject(9)->_click == 255)
+			_vm->renderImage(12); // Remove rope
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K3, KEYCARD)) {
+		_gm->openLocker(this, getObject(10), getObject(4), 11);
+		if (getObject(17)->_click == 255)
+			_vm->renderImage(16); // Remove Discman
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SLOT_K4, KEYCARD)) {
+		_gm->openLocker(this, getObject(15), getObject(5), 13);
+		if (getObject(16)->_click == 255)
+			_vm->renderImage(14); // Remove Book
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF1))
+		_gm->closeLocker(this, getObject(6), getObject(2), 9);
+	else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF2)) {
+		setSectionVisible(12, false);
+		_gm->closeLocker(this, getObject(8), getObject(3), 10);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF3)) {
+		setSectionVisible(16, false);
+		_gm->closeLocker(this, getObject(10), getObject(4), 11);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == SHELF4)) {
+		setSectionVisible(14, false);
+		setSectionVisible(14, false);
+		_gm->closeLocker(this, getObject(15), getObject(5), 13);
+	} else if ((verb == ACTION_TAKE) && (obj1._id == DISCMAN) && !_gm->_rooms[0]->getObject(3)->hasProperty(CARRIED)) {
+		getObject(10)->_click = 34; // Locker empty
+		obj1._click = 255;
+		_gm->takeObject(*_gm->_rooms[0]->getObject(3));
+		_vm->renderImage(16);
+	} else if ((verb == ACTION_TAKE) && (obj1._id == ROPE) && obj1.hasProperty(CARRIED)) {
+		getObject(8)->_click = 31; // Shelf empty
+		return false;
+	} else if ((verb == ACTION_TAKE) && (obj1._id == BOOK) && !obj1.hasProperty(CARRIED)) {
+		getObject(15)->_click = 32; // Shelf empty
+		return false;
+	} else
+		return false;
+
+	return true;
+}
+
+void ShipCabinR3::onEntrance() {
+	for (int i = 0; i < 3; ++i)
+		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
+
+	setRoomSeen(true);
+}
+
+ShipCabinBathroom::ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 23;
+	_id = BATHROOM;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringBathroom,kStringBathroomDescription,TOILET,NULLTYPE,0,0,0);
+	_objectState[1] = Object(_id, kStringShower,kStringDefaultDescription,SHOWER,NULLTYPE,1,1,0);
+	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,BATHROOM_EXIT,EXIT,255,255,0,CABIN_R3,2);
+}
+
+ShipAirlock::ShipAirlock(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 34;
+	_id = AIRLOCK;
+	_shown[0] = kShownTrue;
+	_shown[6] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
+	_objectState[1] = Object(_id, kStringHatch,kStringHatchDescription2,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
+	_objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,2,2,0);
+	_objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,3,3,0);
+	_objectState[4] = Object(_id, kStringHelmet,kStringHelmetDescription,HELMET,TAKE,4,4,7);
+	_objectState[5] = Object(_id, kStringSuit,kStringSuitDescription,SUIT,TAKE,5,5,8);
+	_objectState[6] = Object(_id, kStringLifeSupport,kStringLifeSupportDescription,LIFESUPPORT,TAKE,6,6,9);
+}
+
+bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
+	Room *r;
+
+	if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
+		if (!getObject(1)->hasProperty(OPENED)) {
+			_vm->renderImage(10);
+			_vm->playSound(kAudioSlideDoor);
+			if (getObject(0)->hasProperty(OPENED)) {
+				getObject(0)->disableProperty(OPENED);
+				_vm->renderImage(1);
+				_gm->wait(2);
+				_vm->renderImage(2);
+				setSectionVisible(1, false);
+				_gm->wait(2);
+				_vm->renderImage(3);
+				setSectionVisible(2, false);
+			} else {
+				getObject(0)->setProperty(OPENED);
+				_vm->renderImage(2);
+				setSectionVisible(3, false);
+				_gm->wait(2);
+				_vm->renderImage(1);
+				setSectionVisible(2, false);
+				_gm->wait(2);
+				_vm->renderImage(_gm->invertSection(1));
+			}
+			_vm->renderImage(_gm->invertSection(10));
+		}
+	} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON2)) {
+		if (!getObject(0)->hasProperty(OPENED)) {
+			_vm->renderImage(11);
+			if (getObject(1)->hasProperty(OPENED)) {
+				_vm->playSound(kAudioSlideDoor);
+				getObject(1)->disableProperty(OPENED);
+				_vm->renderImage(4);
+				_gm->wait(2);
+				_vm->renderImage(5);
+				setSectionVisible(4, false);
+				_gm->wait(2);
+				_vm->renderImage(6);
+				setSectionVisible(5, false);
+				_vm->renderImage(16);
+				setSectionVisible(17, false);
+				_gm->wait(3);
+				_vm->renderImage(15);
+				setSectionVisible(16, false);
+				_gm->wait(3);
+				_vm->renderImage(14);
+				setSectionVisible(15, false);
+				_gm->wait(3);
+				_vm->renderImage(13);
+				setSectionVisible(14, false);
+				_gm->wait(3);
+				_vm->renderImage(12);
+				setSectionVisible(13, false);
+				_gm->wait(3);
+				_vm->renderImage(_gm->invertSection(12));
+			} else {
+				getObject(1)->setProperty(OPENED);
+				_vm->renderImage(12);
+				_gm->wait(3);
+				_vm->renderImage(13);
+				setSectionVisible(12, false);
+				_gm->wait(3);
+				_vm->renderImage(14);
+				setSectionVisible(13, false);
+				_gm->wait(3);
+				_vm->renderImage(15);
+				setSectionVisible(14, false);
+				_gm->wait(3);
+				_vm->renderImage(16);
+				setSectionVisible(15, false);
+				_gm->wait(3);
+				_vm->renderImage(17);
+				setSectionVisible(16, false);
+				_vm->playSound(kAudioSlideDoor);
+				_vm->renderImage(5);
+				setSectionVisible(6, false);
+				_gm->wait(2);
+				_vm->renderImage(4);
+				setSectionVisible(5, false);
+				_gm->wait(2);
+				_vm->renderImage(_gm->invertSection(4));
+				r = _gm->_rooms[AIRLOCK];
+				if (!r->getObject(4)->hasProperty(WORN) ||
+					!r->getObject(5)->hasProperty(WORN) ||
+					!r->getObject(6)->hasProperty(WORN)) {
+					_gm->dead(kStringShipAirlock1);
+					return true;
+				}
+			}
+			_vm->renderImage(_gm->invertSection(11));
+		}
+	} else if ((verb == ACTION_LOOK) && (obj1._id == MANOMETER))
+		_vm->renderMessage(getObject(1)->hasProperty(OPENED) ? kStringShipAirlock2 : kStringShipAirlock3);
+	else
+		return false;
+
+	return true;
+}
+
+void ShipAirlock::onEntrance() {
+	if (!hasSeen())
+		_vm->renderMessage(kStringShipAirlock4);
+
+	setRoomSeen(true);
+}
+
+ShipHold::ShipHold(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 24;
+	_id = HOLD;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kNoString,kStringDefaultDescription,HOLD_WIRE,COMBINABLE,255,255,0);
+	_objectState[1] = Object(_id, kStringScrap,kStringScrapDescription1,SCRAP_LK,NULLTYPE,4,4,0);
+	_objectState[2] = Object(_id, kStringTerminalStrip,kStringDefaultDescription,TERMINALSTRIP,COMBINABLE,255,255,0);
+	_objectState[3] = Object(_id, kStringScrap,kStringScrapDescription2,NULLOBJECT,NULLTYPE,5,5,0);
+	_objectState[4] = Object(_id, kStringReactor,kStringReactorDescription,NULLOBJECT,NULLTYPE,6,6,0);
+	_objectState[5] = Object(_id, kStringNozzle,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+	_objectState[6] = Object(_id, kStringPumpkin,kStringPumpkinDescription,NULLOBJECT,NULLTYPE,8,8,0);
+	_objectState[7] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_OUTERHATCH,EXIT | OPENABLE,1,2,2,LANDINGMODULE,6);
+	_objectState[8] = Object(_id, kStringLandingModule,kStringLandingModuleDescription,NULLOBJECT,NULLTYPE,0,0,0);
+	_objectState[9] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,AIRLOCK,22);
+	_objectState[10] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH_TOP,EXIT | OPENABLE | OPENED,3,3,0,GENERATOR,8);
+	_objectState[11] = Object(_id, kStringGenerator,kStringGeneratorDescription,GENERATOR_TOP,EXIT,12,12,0,GENERATOR,8);
+}
+
+bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
+	Room *room;
+
+	if ((verb == ACTION_LOOK) && (obj1._id == SCRAP_LK) && (obj1._description != kStringScrapDescription3)) {
+		_vm->renderMessage(obj1._description);
+		obj1._description = kStringScrapDescription3;
+		_gm->takeObject(*getObject(2));
+	} else if (((verb == ACTION_OPEN) || (verb == ACTION_CLOSE)) && (obj1._id == OUTERHATCH_TOP))
+		_vm->renderMessage(kStringShipHold1);
+	else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && (isSectionVisible(4) || isSectionVisible(6)))
+		_vm->renderMessage(kStringCable1);
+	else if (((verb == ACTION_TAKE) && (obj1._id == HOLD_WIRE)) ||
+			 ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, LANDINGMOD_HATCH)))
+		_vm->renderMessage(kStringCable2);
+	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, TERMINALSTRIP, HOLD_WIRE)) {
+		getObject(0)->_name = kStringWireAndClip;
+		_gm->_inventory.remove(*getObject(2));
+		_gm->_state._terminalStripConnected = true;
+		_gm->_state._terminalStripWire = true;
+		_vm->renderMessage(kStringOk);
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, SPOOL)) {
+		if (!_gm->_state._terminalStripConnected)
+			_vm->renderMessage(kStringCable3);
+		else {
+			_vm->renderImage(5);
+			getObject(0)->_name = kStringWireAndPlug2;
+			getObject(0)->_click = 10;
+			room = _gm->_rooms[CABIN_L2];
+			_gm->_inventory.remove(*getObject(9));
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, HOLD_WIRE, GENERATOR_TOP)) {
+		if (isSectionVisible(5)) {
+			room = _gm->_rooms[GENERATOR];
+			room->getObject(0)->_click = 15;
+			room->getObject(1)->_click = 13;
+			room->setSectionVisible(6, true);
+			room->setSectionVisible(8, true);
+			_vm->renderImage(_gm->invertSection(5));
+			_vm->renderImage(6);
+			setSectionVisible(4, false);
+			getObject(0)->_click = 11;
+		} else
+			_vm->renderMessage(kStringCable4);
+	} else
+		return false;
+
+	return true;
+}
+
+void ShipHold::onEntrance() {
+	if (!hasSeen())
+		_vm->renderMessage(kStringShipHold2);
+	setRoomSeen(true);
+	_gm->_rooms[COCKPIT]->setRoomSeen(true);
+}
+
+ShipLandingModule::ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 25;
+	_id = LANDINGMODULE;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSocket,kStringDefaultDescription,LANDINGMOD_SOCKET,COMBINABLE,1,1,0);
+	_objectState[1] = Object(_id, kStringButton,kSafetyButtonDescription,LANDINGMOD_BUTTON,PRESS | COMBINABLE,2,2,0);
+	_objectState[2] = Object(_id, kStringMonitor,kStringDefaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
+	_objectState[3] = Object(_id, kStringKeyboard,kStringDefaultDescription,KEYBOARD,NULLTYPE,4,4,0);
+	_objectState[4] = Object(_id, kNoString,kStringDefaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
+	_objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
+}
+
+bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_PRESS) && (obj1._id == LANDINGMOD_BUTTON))
+		_vm->renderMessage(obj1._description);
+	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, PEN, LANDINGMOD_BUTTON)) {
+		if (_gm->_state._landingModuleEnergyDaysLeft) {
+			Room *r = _gm->_rooms[GENERATOR];
+			if (isSectionVisible(7)) {
+				_vm->renderImage(_gm->invertSection(9));
+				_vm->renderImage(_gm->invertSection(2));
+				_vm->renderImage(_gm->invertSection(8));
+				_vm->renderImage(_gm->invertSection(7));
+				_vm->renderImage(_gm->invertSection(10));
+				if (r->isSectionVisible(9))
+					_gm->_state._powerOff = true;
+				_gm->roomBrightness();
+			} else {
+				_vm->renderImage(7);
+				if (r->isSectionVisible(9))
+					_gm->_state._powerOff = false;
+				_gm->roomBrightness();
+				r = _gm->_rooms[SLEEP];
+				r->setSectionVisible(1, false);
+				r->setSectionVisible(2, false);
+				_gm->wait(2);
+				_vm->renderImage(2);
+				_gm->wait(3);
+				_vm->renderImage(8);
+				_gm->wait(2);
+				_vm->renderImage(9);
+				_gm->wait(1);
+				_vm->renderImage(10);
+			}
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, LANDINGMOD_BUTTON))
+		_vm->renderMessage(kStringShipHold3);
+	else if ((verb == ACTION_LOOK) && (obj1._id == LANDINGMOD_MONITOR) && isSectionVisible(7))
+		_vm->renderMessage(kStringShipHold4);
+	else if ((verb == ACTION_USE) && (obj1._id == KEYBOARD))
+		_vm->renderMessage(kStringShipHold5);
+	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, WIRE, LANDINGMOD_SOCKET)) {
+		Room *r = _gm->_rooms[CABIN_L3];
+		_gm->_inventory.remove(*r->getObject(8));
+		getObject(4)->_name = r->getObject(8)->_name;
+		_vm->renderImage(4);
+		if (_gm->_state._cableConnected) {
+			_vm->renderImage(5);
+			getObject(4)->_click = 6;
+		} else {
+			getObject(4)->_click = 5;
+			if (_gm->_state._terminalStripWire)
+				_vm->renderImage(11);
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SPOOL, LANDINGMOD_SOCKET))
+		_vm->renderMessage(kStringShipHold8);
+	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, TERMINALSTRIP)) {
+		_vm->renderImage(11);
+		getObject(4)->_name = kStringWireAndClip;
+		Room *r = _gm->_rooms[HOLD];
+		_gm->_inventory.remove(*r->getObject(2));
+		_gm->_state._terminalStripConnected = true;
+		_gm->_state._terminalStripWire = true;
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, SPOOL)) {
+		if (!_gm->_state._terminalStripConnected)
+			_vm->renderMessage(kStringCable3);
+		else {
+			_vm->renderImage(5);
+			getObject(4)->_name = kStringWireAndPlug2;
+			getObject(4)->_click = 6;
+			_gm->_inventory.remove(*_gm->_rooms[CABIN_L2]->getObject(9));
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LANDINGMOD_WIRE, LANDINGMOD_HATCH)) {
+		if (getObject(5)->hasProperty(OPENED)) {
+			Room *r = _gm->_rooms[HOLD];
+			if (isSectionVisible(5)) {
+				r->setSectionVisible(5, true);
+				r->getObject(0)->_click = 10;
+			} else
+				r->getObject(0)->_click = 9;
+
+			r->setSectionVisible(4, true);
+			r->getObject(0)->_name = getObject(4)->_name;
+			_vm->renderImage(_gm->invertSection(5));
+			_vm->renderImage(_gm->invertSection(4));
+			setSectionVisible(11, false);
+			_vm->renderImage(6);
+			getObject(4)->_click = 7;
+		} else
+			_vm->renderMessage(kStringShipHold6);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == LANDINGMOD_HATCH) && isSectionVisible(6))
+		_vm->renderMessage(kStringCable1);
+	else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) && (obj1._id == LANDINGMOD_WIRE))
+		_vm->renderMessage(kStringCable2);
+	else
+		return false;
+
+	return true;
+}
+
+ShipGenerator::ShipGenerator(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 18;
+	_id = GENERATOR;
+	_shown[0] = kShownTrue;
+	_shown[5] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringGeneratorWire,kStringDefaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
+	_objectState[1] = Object(_id, kStringEmptySpool,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+	_objectState[2] = Object(_id, kStringKeycard2,kStringKeycard2Description,KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
+	_objectState[3] = Object(_id, kStringRope,kStringDefaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
+	_objectState[4] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
+	_objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
+	_objectState[6] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,4,4,0);
+	_objectState[7] = Object(_id, kStringTrap,kStringDefaultDescription,TRAP,OPENABLE,5,6,2);
+	_objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,NULLOBJECT,NULLTYPE,7,7,0);
+	_objectState[9] = Object(_id, kStringVoltmeter,kStringDefaultDescription,VOLTMETER,NULLTYPE,9,9,0,NULLROOM,0);
+	_objectState[10] = Object(_id, kStringClip,kStringDefaultDescription,CLIP,COMBINABLE,8,8,0);
+	_objectState[11] = Object(_id, kStringWire,kStringWireDescription,SHORT_WIRE,COMBINABLE,10,10,0);
+	_objectState[12] = Object(_id, kStringLadder,kStringDefaultDescription,LADDER,EXIT,0,0,0,HOLD,1);
+}
+
+bool ShipGenerator::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_OPEN) && (obj1._id == OUTERHATCH)) {
+		if (obj1.hasProperty(OPENED))
+			return false;
+		_vm->playSound(kAudioSlideDoor);
+		_vm->renderImage(1);
+		if (isSectionVisible(7))
+			_vm->renderImage(10);
+		if (isSectionVisible(13))
+			_vm->renderImage(13);
+		_gm->_rooms[HOLD]->setSectionVisible(3, true);
+		obj1.setProperty(OPENED);
+		obj1._click = 2;
+		_vm->playSound(kAudioDoorOpen);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == OUTERHATCH)) {
+		if (!obj1.hasProperty(OPENED))
+			return false;
+		if (isSectionVisible(11) || isSectionVisible(12))
+			_vm->renderMessage(kStringShipHold7);
+		else {
+			_vm->playSound(kAudioSlideDoor);
+			_vm->renderImage(_gm->invertSection(1));
+			setSectionVisible(10, false);
+			if (isSectionVisible(13))
+				_vm->renderImage(13);
+			_gm->_rooms[HOLD]->setSectionVisible(3, false);
+			obj1.disableProperty(OPENED);
+			obj1._click = 1;
+			_vm->playSound(kAudioDoorClose);
+		}
+	} else if ((verb == ACTION_WALK) && (obj1._id == OUTERHATCH) &&
+			   isSectionVisible(7)) {
+		if (!obj1.hasProperty(OPENED))
+			_vm->renderMessage(kStringShipHold9);
+		else if (!isSectionVisible(11))
+			_vm->renderMessage(kStringShipHold10);
+		else {
+			obj1._exitRoom = ROCKS;
+			return false;
+		}
+	} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_WIRE))
+		_vm->renderMessage(kStringCable2);
+	else if ((verb == ACTION_PULL) && (obj1._id == SHORT_WIRE) &&
+			 (obj1._click != 11)) {
+		_vm->renderImage(3);
+		_vm->renderImage(4);
+		obj1._click = 11;
+		_gm->turnOff();
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, SHORT_WIRE, CLIP) &&
+			   (getObject(11)->_click == 11) && !isSectionVisible(9)) {
+		_vm->renderImage(2);
+		setSectionVisible(3, false);
+		setSectionVisible(4, false);
+		getObject(11)->_click = 10;
+		if (_gm->_state._shipEnergyDaysLeft)
+			_gm->turnOn();
+		else
+			_vm->renderImage(4);
+	} else if ((verb == ACTION_OPEN) && (obj1._id == TRAP)) {
+		_vm->playSound(kAudioSlideDoor);
+		_vm->renderImage(2);
+		if (getObject(11)->_click == 11)
+			_vm->renderImage(3);
+		if (_gm->_state._powerOff)
+			_vm->renderImage(4);
+		obj1.setProperty(OPENED);
+		obj1._click = 6;
+
+		obj1._click2 = 5;
+		_vm->playSound(kAudioDoorOpen);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == TRAP)) {
+		if (isSectionVisible(9))
+			_vm->renderMessage(kStringCable1);
+		else {
+			setSectionVisible(3, false);
+			return false;
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, GENERATOR_WIRE, CLIP) &&
+			   isSectionVisible(3) && (getObject(0)->_click != 16)) {
+		_vm->renderImage(_gm->invertSection(8));
+		_vm->renderImage(2);
+		setSectionVisible(4, false);
+		_vm->renderImage(3);
+		_vm->renderImage(9);
+		getObject(0)->_click = 16;
+		Room *r = _gm->_rooms[LANDINGMODULE];
+		if (_gm->_state._landingModuleEnergyDaysLeft && r->isSectionVisible(7))
+			_gm->turnOn();
+		else
+			_vm->renderImage(4);
+		_gm->_rooms[HOLD]->setSectionVisible(7, true);
+		_gm->great(3);
+	} else if ((verb == ACTION_PULL) && (obj1._id == GENERATOR_WIRE) && (obj1._click == 16)) {
+		_vm->renderImage(_gm->invertSection(9));
+		_vm->renderImage(2);
+		_vm->renderImage(3);
+		_vm->renderImage(4);
+		_vm->renderImage(8);
+		obj1._click = 15;
+		_gm->turnOff();
+		_gm->_rooms[HOLD]->setSectionVisible(7, false);
+	} else if ((verb == ACTION_USE) &&
+			   (Object::combine(obj1, obj2, WIRE, CLIP) ||
+				Object::combine(obj1, obj2, SPOOL, CLIP)) &&
+			   isSectionVisible(3)) {
+		_vm->renderMessage(kStringShipHold11);
+	} else if ((verb == ACTION_LOOK) && (obj1._id == VOLTMETER)) {
+		if (_gm->_state._powerOff)
+			_vm->renderMessage(kStringShipHold12);
+		else
+			_vm->renderMessage(kStringShipHold13);
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, LADDER, ROPE)) {
+		_vm->renderImage(13);
+		Room *r = _gm->_rooms[CABIN_R3];
+		_gm->_inventory.remove(*r->getObject(9));
+		getObject(3)->_click = 18;
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_ROPE)) {
+		if (!isSectionVisible(1))
+			_vm->renderMessage(kStringShipHold14);
+		else {
+			_vm->renderImage(_gm->invertSection(13));
+			_vm->renderImage(1);
+			if (isSectionVisible(7)) {
+				_vm->renderImage(10);
+				_vm->renderImage(11);
+			} else
+				_vm->renderImage(12);
+
+			Room *r = _gm->_rooms[OUTSIDE];
+			r->setSectionVisible(1, true);
+			r->getObject(1)->_click = 1;
+			getObject(3)->_click = 17;
+		}
+	} else if ((verb == ACTION_TAKE) && (obj1._id == GENERATOR_ROPE))
+		_vm->renderMessage(kStringShipHold15);
+	else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, OUTERHATCH, GENERATOR_WIRE) && isSectionVisible(1))
+		_vm->renderMessage(kStringShipHold16);
+	else
+		return false;
+
+	return true;
+}
+
+ShipOuterSpace::ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 4;
+	_id = OUTSIDE;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,GENERATOR,3);
+	_objectState[1] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+}
+
+
+// Arsano
+ArsanoRocks::ArsanoRocks(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 12;
+	_id = OUTSIDE;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRope,kStringDefaultDescription,NULLOBJECT,UNNECESSARY | EXIT,0,0,0,GENERATOR,12);
+	_objectState[1] = Object(_id, kStringStone,kStringDefaultDescription,STONE,NULLTYPE,1,1,0);
+	_objectState[2] = Object(_id, kStringStone,kStringDefaultDescription,NULLOBJECT,NULLTYPE,2,2,0);
+	_objectState[3] = Object(_id, kStringCaveOpening,kStringCaveOpeningDescription,NULLOBJECT,NULLTYPE,255,255,0,CAVE,1);
+}
+
+void ArsanoRocks::onEntrance() {
+	_gm->great(8);
+}
+
+bool ArsanoRocks::interact(Action verb, Object &obj1, Object &obj2) {
+	if (((verb == ACTION_PULL) || (verb == ACTION_PRESS)) &&
+		(obj1._id == STONE) && !isSectionVisible(3)) {
+		_vm->renderImage(1);
+		_gm->wait(2);
+		_vm->renderImage(2);
+		_gm->wait(2);
+		_vm->renderImage(3);
+		_vm->playSound(kAudioRocks);
+		obj1._click = 3;
+		getObject(3)->_click = 4;
+		getObject(3)->setProperty(EXIT);
+		return true;
+	}
+	return false;
+}
+
+ArsanoCave::ArsanoCave(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 12;
+	_id = CAVE;
+
+	_objectState[0] = Object(_id, kStringExit,kStringExitDescription,NULLOBJECT,EXIT,255,255,0,ROCKS,22);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,2);
+}
+
+ArsanoMeetup::ArsanoMeetup(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 37;
+	_id = MEETUP;
+	_shown[0] = kShownTrue;
+	_sign = 0;
+	_beacon = 0;
+
+	_objectState[0] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+	_objectState[1] = Object(_id, kStringSign,kStringSignDescription,MEETUP_SIGN,NULLTYPE,0,0,0);
+	_objectState[2] = Object(_id, kStringEntrance,kStringDefaultDescription,DOOR,EXIT,1,1,0,ENTRANCE,7);
+	_objectState[3] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,2,2,0);
+	_objectState[4] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIPS,COMBINABLE,3,3,0);
+	_objectState[5] = Object(_id, kStringSpaceshift,kStringDefaultDescription,SPACESHIP,COMBINABLE,4,4,0);
+}
+
+void ArsanoMeetup::onEntrance() {
+	if (isSectionVisible(7)) {
+		_gm->wait(3);
+		_vm->renderImage(6);
+		setSectionVisible(7, false);
+		_gm->wait(3);
+		_vm->renderImage(_gm->invertSection(6));
+	}
+	if (!(_gm->_state._greatFlag & 0x8000)) {
+		_vm->playSound(kAudioFoundLocation);
+		_gm->_state._greatFlag |= 0x8000;
+	}
+}
+
+void ArsanoMeetup::animation() {
+	_vm->renderImage(_gm->invertSection(1) + _beacon);
+	_beacon = (_beacon + 1) % 5;
+	_vm->renderImage(_beacon + 1);
+	_vm->renderImage(_beacon + 8);
+	if (isSectionVisible(_sign + 13))
+		_vm->renderImage(_gm->invertSection(13) + _sign);
+	else
+		_vm->renderImage(13 + _sign);
+
+	_sign = (_sign + 1) % 14;
+	_gm->setAnimationTimer(3);
+}
+
+bool ArsanoMeetup::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_WALK) &&
+		((obj1._id == SPACESHIPS) ||
+		 ((obj1._id == SPACESHIP) && !obj1.hasProperty(OPENED)))) {
+		_vm->renderMessage(kStringArsanoMeetup1);
+	} else if ((verb == ACTION_WALK) && (obj1._id == SPACESHIP))
+		_gm->changeRoom(GLIDER);
+	else if ((verb == ACTION_WALK) && (obj1._id == STAR))
+		_vm->renderMessage(kStringArsanoMeetup2);
+	else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
+		_vm->setCurrentImage(26);
+		_vm->renderImage(0);
+		_vm->paletteBrightness();
+		_gm->animationOff();
+		_gm->getInput();
+		_gm->animationOn();
+		g_system->fillScreen(kColorBlack);
+		_vm->renderRoom(*this);
+		_vm->paletteBrightness();
+	} else if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
+		_vm->renderImage(6);
+		_gm->wait(3);
+		_vm->renderImage(7);
+		setSectionVisible(6, false);
+		_gm->wait(3);
+
+		return false;
+	} else if ((verb == ACTION_LOOK) && (obj1._id == MEETUP_SIGN) && _gm->_state._language) {
+		if (_gm->_state._language == 2)
+			_vm->renderMessage(kStringArsanoMeetup3);
+
+		obj1._description = kStringSignDescription2;
+		if (_gm->_state._language == 1)
+			return false;
+
+		_gm->_state._language = 1;
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP)) {
+		getObject(5)->setProperty(OPENED);
+		_gm->changeRoom(GLIDER);
+	} else
+		return false;
+
+	return true;
+}
+
+ArsanoEntrance::ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 10;
+	_id = ENTRANCE;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringPorter,kStringPorterDescription,PORTER,TALK,0,0,0);
+	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
+	_objectState[2] = Object(_id, kStringSign,kStringSignDescription,KITCHEN_SIGN,NULLTYPE,2,2,0);
+	_objectState[3] = Object(_id, kStringChewingGum,kStringDefaultDescription,SCHNUCK,TAKE,255,255,10+128);
+	_objectState[4] = Object(_id, kStringGummyBears,kStringDefaultDescription,SCHNUCK,TAKE,255,255,11+128);
+	_objectState[5] = Object(_id, kStringChocolateBall,kStringDefaultDescription,SCHNUCK,TAKE,255,255,12+128);
+	_objectState[6] = Object(_id, kStringEgg,kStringDefaultDescription,EGG,TAKE,255,255,13+128);
+	_objectState[7] = Object(_id, kStringLiquorice,kStringDefaultDescription,SCHNUCK,TAKE,255,255,14+128);
+	_objectState[8] = Object(_id, kStringPill,kStringPillDescription,PILL,TAKE,255,255,0);
+	_objectState[9] = Object(_id, kStringSlot,kStringDefaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
+	_objectState[10] = Object(_id, kStringVendingMachine,kStringVendingMachineDescription,NULLOBJECT,NULLTYPE,5,5,0);
+	_objectState[11] = Object(_id, kStringToilet,kStringToiletDescription,ARSANO_BATHROOM,NULLTYPE,255,255,0);
+	_objectState[12] = Object(_id, kStringButton,kStringDefaultDescription,BATHROOM_BUTTON,PRESS,3,3,0);
+	_objectState[13] = Object(_id, kStringSign,kStringSignDescription,BATHROOM_SIGN,NULLTYPE,4,4,0);
+	_objectState[14] = Object(_id, kStringStaircase,kStringDefaultDescription,STAIRCASE,EXIT,8,8,0,REST,3);
+	_objectState[15] = Object(_id, kStringExit,kStringDefaultDescription,MEETUP_EXIT,EXIT,255,255,0,MEETUP,22);
+	_objectState[16] = Object(_id, kStringCoins,kStringCoinsDescription,COINS,TAKE|COMBINABLE,255,255,0);
+	_objectState[17] = Object(_id, kStringTabletPackage,kStringTabletPackageDescription,PILL_HULL,TAKE,255,255,0);
+
+	_dialog1[0] = kStringArsanoDialog7;
+	_dialog1[1] = kStringArsanoDialog1;
+	_dialog1[2] = kStringArsanoDialog8;
+	_dialog1[3] = kStringArsanoDialog9;
+	_dialog1[4] = kStringDialogSeparator;
+
+	_dialog2[0] = kStringArsanoDialog1;
+	_dialog2[1] = kStringArsanoDialog2;
+	_dialog2[2] = kStringArsanoDialog3;
+	_dialog2[3] = kStringArsanoDialog4;
+	_dialog2[4] = kStringDialogSeparator;
+
+	_dialog3[0] = kStringArsanoDialog5;
+	_dialog3[1] = kStringArsanoDialog6;
+
+	_eyewitness = 5;
+}
+
+void ArsanoEntrance::animation() {
+	if (!_vm->_screen->isMessageShown() && isSectionVisible(kMaxSection - 5)) {
+		_gm->animationOff(); // to avoid recursive call
+		_vm->playSound(kAudioSlideDoor);
+		_vm->renderImage(8);
+		setSectionVisible(9, false);
+		_gm->wait(2);
+		_vm->renderImage(7);
+		setSectionVisible(8, false);
+		_gm->wait(2);
+		_vm->renderImage(6);
+		setSectionVisible(7, false);
+		_gm->wait(2);
+		_vm->renderImage(5);
+		setSectionVisible(6, false);
+		_gm->wait(2);
+		_vm->renderImage(_gm->invertSection(5));
+		getObject(11)->_click = 255;
+		setSectionVisible(kMaxSection - 5, false);
+		_gm->animationOn();
+	}
+	if (isSectionVisible(2))
+		_vm->renderImage(_gm->invertSection(2));
+	else if (_eyewitness)
+		--_eyewitness;
+	else {
+		_eyewitness = 20;
+		_vm->renderImage(2);
+	}
+
+	_gm->setAnimationTimer(4);
+}
+
+bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+	static byte row1[6] = {1, 1, 1, 1, 1, 0};
+	static byte row2[6] = {1, 1, 1, 1, 1, 0};
+	static byte row3[6] = {1, 1, 0, 0, 0, 0};
+
+	if ((verb == ACTION_TALK) && (obj1._id == PORTER)) {
+		if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
+			_vm->renderMessage(kStringArsanoEntrance1);
+		else {
+			if (_gm->_state._language) {
+				int e;
+				do {
+					if (_gm->_state._shoes == 1) {
+						_dialog2[2] = kStringArsanoEntrance2;
+						addSentence(2, 2);
+					} else if (_gm->_state._shoes > 1)
+						removeSentence(2, 2);
+
+					switch (e = _gm->dialog(5, row2, _dialog2, 2)) {
+					case 0:
+						_gm->reply(kStringArsanoEntrance3, 1, _gm->invertSection(1));
+						_gm->reply(kStringArsanoEntrance4, 1, _gm->invertSection(1));
+						_gm->reply(kStringArsanoEntrance5, 1, _gm->invertSection(1));
+						removeSentence(1, 1);
+						break;
+					case 1:
+						_gm->reply(kStringArsanoEntrance6, 1, _gm->invertSection(1));
+						addSentence(1, 2);
+						break;
+					case 2:
+						if (_gm->_state._shoes == 1) {
+							_gm->reply(kStringArsanoEntrance7, 1, _gm->invertSection(1));
+							_gm->_state._shoes = 2;
+						} else {
+							_gm->reply(kStringArsanoEntrance8, 1, _gm->invertSection(1));
+							_gm->_state._shoes = 1;
+						}
+						break;
+					case 3:
+						_gm->reply(kStringArsanoEntrance9, 1, _gm->invertSection(1));
+					}
+				} while (e != 4);
+			} else if (_gm->dialog(5, row2, _dialog2, 0) != 4)
+				_gm->reply(kStringArsanoEntrance10, 1, _gm->invertSection(1));
+		}
+	} else if ((verb == ACTION_WALK) && (obj1._id == STAIRCASE) && (_gm->_state._shoes != 3)) {
+		_vm->renderImage(3);
+		_gm->wait(2);
+		_vm->renderImage(4);
+		setSectionVisible(3, false);
+		if (_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN))
+			_gm->reply(kStringDialogSeparator, 1, _gm->invertSection(1));
+		else if (_gm->_state._language)
+			_gm->reply(kStringArsanoEntrance11, 1, _gm->invertSection(1));
+		else
+			_gm->reply(kStringArsanoEntrance12, 1, _gm->invertSection(1));
+		_vm->renderImage(3);
+		setSectionVisible(4, false);
+		_gm->wait(2);
+		_vm->renderImage(_gm->invertSection(3));
+		if (!_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) {
+			if (_gm->_state._language) {
+				if (_gm->_state._shoes)
+					_gm->reply(kStringArsanoEntrance13, 1, _gm->invertSection(1));
+				else
+					_gm->reply(kStringArsanoEntrance14, 1, _gm->invertSection(1));
+				int e = 0;
+				while ((e < 3) && (!allSentencesRemoved(4, 1))) {
+					switch (e = _gm->dialog(5, row1, _dialog1, 1)) {
+					case 0:
+						_gm->reply(kStringArsanoEntrance15, 1, 1 + 128);
+						break;
+					case 1:
+						_gm->reply(kStringArsanoEntrance3, 1, 1 + 128);
+						_gm->reply(kStringArsanoEntrance4, 1, 1 + 128);
+						_gm->reply(kStringArsanoEntrance5, 1, 1 + 128);
+						removeSentence(0, 2);
+						break;
+					case 2:
+						_gm->reply(kStringArsanoEntrance7, 1, 1 + 128);
+						_gm->_state._shoes = 2;
+						break;
+					case 3:
+						_vm->renderImage(3);
+						_gm->wait(2);
+						_vm->renderImage(4);
+						setSectionVisible(3, false);
+						_gm->reply(kStringArsanoEntrance16, 1, 1 + 128);
+						_vm->renderImage(3);
+						setSectionVisible(4, false);
+						_gm->wait(2);
+						_vm->renderImage(_gm->invertSection(3));
+						break;
+					}
+					removeSentence(0, 1);
+				}
+			} else {
+				_gm->dialog(2, row3, _dialog3, 0);
+				_gm->reply(kStringArsanoEntrance10, 1, 1 + 128);
+			}
+		}
+	} else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
+		_vm->playSound(kAudioSlideDoor);
+		_vm->renderImage(5);
+		_gm->wait(2);
+		_vm->renderImage(6);
+		setSectionVisible(5, false);
+		_gm->wait(2);
+		_vm->renderImage(7);
+		setSectionVisible(6, false);
+		_gm->wait(2);
+		_vm->renderImage(8);
+		setSectionVisible(7, false);
+		_gm->wait(2);
+		_vm->renderImage(9);
+		setSectionVisible(8, false);
+		getObject(11)->_click = 9;
+	} else if ((verb == ACTION_WALK) && (obj1._id == ARSANO_BATHROOM)) {
+		if (_gm->_state._coins) {
+			if (_gm->_state._shoes == 2) {
+				_vm->renderMessage(kStringArsanoEntrance17);
+				_gm->_state._shoes = 3;
+				removeSentence(2, 2);
+				removeSentence(3, 2);
+			} else if (_gm->_state._shoes == 3) {
+				_vm->renderMessage(kStringArsanoEntrance18);
+				_gm->_state._shoes = 2;
+			} else
+				_vm->renderMessage(kStringArsanoEntrance19);
+		} else {
+			if (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN))
+				_vm->renderMessage(kStringArsanoEntrance20);
+			else {
+				_vm->renderMessage(kStringArsanoEntrance21);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->renderMessage(kStringArsanoEntrance22);
+				_gm->takeObject(*getObject(16));
+				_gm->_state._coins = 5;
+			}
+		}
+		// This shown object is an abuse in the original engine as it's not a real shown variable
+		// It's an internal (boolean) status
+		_shown[kMaxSection - 5] = kShownTrue;
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, COINS, CAR_SLOT)) {
+		if ((_gm->_state._coins < 5) && (getObject(7 - _gm->_state._coins)->_click == 7))
+			_vm->renderMessage(kStringArsanoEntrance23);
+		else {
+			_vm->renderImage(15 - _gm->_state._coins);
+			getObject(8 - _gm->_state._coins)->_click = 7;
+			--_gm->_state._coins;
+			if (_gm->_state._coins == 1)
+				getObject(16)->_name = kStringCoin;
+
+			if (_gm->_state._coins == 0) {
+				_gm->_inventory.remove(*getObject(16));
+				_gm->_state._coins = 255;
+			}
+		}
+	} else if ((verb == ACTION_LOOK) && (obj1._id == KITCHEN_SIGN) && _gm->_state._language) {
+		if (_gm->_state._language == 2)
+			_vm->renderMessage(kStringArsanoEntrance24);
+		obj1._description = kStringDoorDescription5;
+		if (_gm->_state._language == 1)
+			return false;
+		_gm->_state._language = 1;
+	} else if ((verb == ACTION_LOOK) && (obj1._id == BATHROOM_SIGN) && _gm->_state._language) {
+		if (_gm->_state._language == 2)
+			_vm->renderMessage(kStringArsanoEntrance25);
+		obj1._description = kStringDoorDescription6;
+		if (_gm->_state._language == 1)
+			return false;
+		_gm->_state._language = 1;
+	} else if ((verb == ACTION_WALK) && (obj1._id == MEETUP_EXIT)) {
+		if (!((_gm->_rooms[AIRLOCK]->getObject(4)->hasProperty(WORN)) &&
+			  (_gm->_rooms[AIRLOCK]->getObject(5)->hasProperty(WORN)) &&
+			  (_gm->_rooms[AIRLOCK]->getObject(6)->hasProperty(WORN)))) {
+			_vm->renderMessage(kStringArsanoEntrance26);
+			_gm->_rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
+			_gm->_rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
+			_gm->_rooms[AIRLOCK]->getObject(6)->setProperty(WORN);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+		}
+		return false;
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KNIFE, PORTER))
+		_vm->renderMessage(kStringArsanoEntrance27);
+	else
+		return false;
+
+	return true;
+}
+
+ArsanoRemaining::ArsanoRemaining(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 28;
+	_id = REST;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringStaircase,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,ENTRANCE,17);
+	_objectState[1] = Object(_id, kStringChair,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,ROGER,2);
+	_objectState[2] = Object(_id, kStringShoes,kStringShoesDescription,NULLOBJECT,NULLTYPE,2,2,0);
+
+	_chewing = kShownTrue;
+	_i = 0;
+}
+
+void ArsanoRemaining::animation() {
+	switch (_i) {
+	case  0:
+		_vm->renderImage(1);
+		_vm->renderImage(_gm->invertSection(4));
+		break;
+	case  1:
+		_vm->renderImage(_gm->invertSection(1));
+		_vm->renderImage(4);
+		break;
+	case  2:
+		_vm->renderImage(2);
+		_vm->renderImage(_gm->invertSection(4));
+		break;
+
+	case  3:
+		_vm->renderImage(7); // Dragon
+		_vm->renderImage(_gm->invertSection(2));
+		_vm->renderImage(4);
+		break;
+	case  4:
+		_vm->renderImage(8);
+		setSectionVisible(7, false);
+		_vm->renderImage(2);
+		_vm->renderImage(_gm->invertSection(4));
+		break;
+	case  5:
+		_vm->renderImage(_gm->invertSection(8));
+		_vm->renderImage(_gm->invertSection(2));
+		break;
+	case  6:
+		_vm->renderImage(3);
+		_vm->renderImage(2);
+		break;
+	case  7:
+		_vm->renderImage(_gm->invertSection(3));
+		_vm->renderImage(_gm->invertSection(2));
+		break;
+	case  8:
+		_vm->renderImage(3);
+		break;
+	case  9:
+		_vm->renderImage(14); // Card Player 1
+		_vm->renderImage(4);
+		_vm->renderImage(_gm->invertSection(3));
+		break;
+	case 10:
+		_vm->renderImage(15);
+		_vm->renderImage(14);
+		_vm->renderImage(_gm->invertSection(4));
+		_vm->renderImage(3);
+		break;
+	case 11:
+		_vm->renderImage(16);
+		setSectionVisible(15, false);
+		_vm->renderImage(4);
+		_vm->renderImage(_gm->invertSection(3));
+		break;
+	case 12:
+		_vm->renderImage(17);
+		setSectionVisible(16, false);
+		_vm->renderImage(_gm->invertSection(4));
+		_vm->renderImage(3);
+		break;
+	case 13:
+		_vm->renderImage(_gm->invertSection(17));
+		_vm->renderImage(4);
+		_vm->renderImage(_gm->invertSection(3));
+		break;
+	case 14:
+		_vm->renderImage(_gm->invertSection(4));
+		break;
+	case 15:
+		_vm->renderImage(6);
+		break;
+	case 16:
+		_vm->renderImage(18); // Card Player 2
+		_vm->renderImage(5);
+		break;
+	case 17:
+		_vm->renderImage(19);
+		setSectionVisible(18, false);
+		_vm->renderImage(_gm->invertSection(5));
+		break;
+	case 18:
+		_vm->renderImage(20);
+		setSectionVisible(19, false);
+		_vm->renderImage(5);
+		break;
+	case 19:
+		_vm->renderImage(21);
+		setSectionVisible(20, false);
+		_vm->renderImage(_gm->invertSection(5));
+		break;
+	case 20:
+		_vm->renderImage(_gm->invertSection(21));
+		_vm->renderImage(5);
+		break;
+	case 21:
+		_vm->renderImage(_gm->invertSection(5));
+		break;
+	case 22:
+		_vm->renderImage(5);
+		break;
+	case 23:
+		_vm->renderImage(10);
+		_chewing = false;
+		_vm->renderImage(_gm->invertSection(5));
+		break;
+	case 24:
+		_vm->renderImage(11);
+		setSectionVisible(10, false);
+		break;
+	case 25:
+		_vm->renderImage(12);
+		setSectionVisible(11, false);
+		break;
+	case 26:
+		_vm->renderImage(13);
+		setSectionVisible(12, false);
+		break;
+	case 27:
+		_vm->renderImage(12);
+		setSectionVisible(13, false);
+		break;
+	case 28:
+		_vm->renderImage(11);
+		setSectionVisible(12, false);
+		break;
+	case 29:
+		_vm->renderImage(10);
+		setSectionVisible(11, false);
+		break;
+	case 30:
+		_vm->renderImage(_gm->invertSection(10));
+		_chewing = true;
+		break;
+	case 31:
+		_vm->renderImage(22); // Card Player 3
+		break;
+	case 32:
+		_vm->renderImage(_gm->invertSection(22));
+		break;
+	case 33:
+		_vm->renderImage(_gm->invertSection(6));
+		break;
+	case 34:
+		_vm->renderImage(4);
+	}
+
+	_i = (_i + 1) % 35;
+	if (_chewing) {
+		if (isSectionVisible(9))
+			_vm->renderImage(_gm->invertSection(9));
+		else
+			_vm->renderImage(9);
+	}
+	_gm->setAnimationTimer(3);
+}
+
+ArsanoRoger::ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 29;
+	_id = ROGER;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,REST,19);
+	_objectState[1] = Object(_id, kStringFrogFace,kStringDefaultDescription,ROGER_W,TALK,0,0,0);
+	_objectState[2] = Object(_id, kStringScrible,kStringScribleDescription,NULLOBJECT,NULLTYPE,3,3,0);
+	_objectState[3] = Object(_id, kStringWallet,kStringDefaultDescription,WALLET,TAKE,1,1,4);
+	_objectState[4] = Object(_id, kStringMenu,kStringMenuDescription,NULLOBJECT,UNNECESSARY,2,2,0);
+	_objectState[5] = Object(_id, kStringCup,kStringCupDescription,CUP,UNNECESSARY,4,4,0);
+	_objectState[6] = Object(_id, kStringChessGame,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
+	_objectState[7] = Object(_id, kStringBill,kStringBillDescription,NULLOBJECT,TAKE|COMBINABLE,255,255,0);
+	_objectState[8] = Object(_id, kStringKeycard3,kStringDefaultDescription,KEYCARD_R,TAKE|COMBINABLE,255,255,0);
+
+	_dialog1[0] = kStringDialogArsanoRoger1;
+	_dialog1[1] = kStringDialogArsanoRoger2;
+	_dialog1[2] = kStringDialogArsanoRoger3;
+	_dialog1[3] = kStringDialogSeparator;
+
+	_eyewitness = 5;
+	_hands = 0;
+}
+
+void ArsanoRoger::onEntrance() {
+	if (!sentenceRemoved(0, 2)) {
+		_gm->say(kStringArsanoRoger1);
+		_gm->reply(kStringArsanoRoger2, 2, 2 + 128);
+		removeSentence(0, 2);
+	}
+}
+
+void ArsanoRoger::animation() {
+	if (isSectionVisible(1))
+		_vm->renderImage(_gm->invertSection(1));
+	else if (isSectionVisible(10)) {
+		_vm->renderImage(12);
+		setSectionVisible(10, false);
+		setSectionVisible(12, false);
+	} else if (_eyewitness) {
+		--_eyewitness;
+	} else {
+		_eyewitness = 20;
+		if (isSectionVisible(3))
+			_vm->renderImage(10);
+		else
+			_vm->renderImage(1);
+	}
+
+	if (isSectionVisible(3)) {
+		setSectionVisible(5 + _hands, false);
+		_hands = (_hands + 1) % 5;
+		_vm->renderImage(5 + _hands);
+	}
+	_gm->setAnimationTimer(4);
+}
+
+bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
+	static byte row1[6] = {1, 1, 1, 1, 0, 0};
+
+	if ((verb == ACTION_TAKE) && (obj1._id == WALLET)) {
+		if (isSectionVisible(3)) {
+			_gm->great(0);
+			return false;
+		}
+		_gm->reply(kStringArsanoRoger3, 2, 2 + 128);
+	} else if ((verb == ACTION_USE) && (obj1._id == CUP))
+		_vm->renderMessage(kStringArsanoRoger4);
+	else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
+		if (isSectionVisible(3))
+			_vm->renderMessage(kStringArsanoRoger5);
+		else {
+			switch (_gm->dialog(4, row1, _dialog1, 1)) {
+			case 0:
+				_gm->reply(kStringArsanoRoger6, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger7, 2, 2 + 128);
+				break;
+			case 1:
+				_gm->reply(kStringArsanoRoger8, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger9, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger10);
+				break;
+			case 2:
+				_gm->reply(kStringArsanoRoger11, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger12);
+				_gm->reply(kStringArsanoRoger13, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger14);
+				_gm->reply(kStringArsanoRoger15, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger16, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger17);
+				_gm->say(kStringArsanoRoger18);
+				_gm->reply(kStringArsanoRoger19, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger20);
+				_gm->say(kStringArsanoRoger21);
+				_gm->reply(kStringArsanoRoger22, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger23);
+				_gm->reply(kStringArsanoRoger24, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger25, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger26);
+				_gm->reply(kStringArsanoRoger27, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger28, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger29);
+				_gm->reply(kStringArsanoRoger30, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger31, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger32);
+				_gm->reply(kStringArsanoRoger33, 2, 2 + 128);
+				_gm->say(kStringArsanoRoger34);
+				_gm->reply(kStringArsanoRoger35, 2, 2 + 128);
+			}
+		}
+	} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, CHESS, ROGER_W)) ||
+			   ((verb == ACTION_GIVE) && (obj1._id == CHESS) && (obj2._id == ROGER_W))) {
+		_vm->renderImage(11);
+		_gm->great(0);
+		_gm->say(kStringArsanoRoger36);
+		_gm->reply(kStringArsanoRoger37, 2, 2 + 128);
+		_gm->say(kStringArsanoRoger38);
+		_vm->paletteFadeOut();
+		_gm->_inventory.remove(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess board
+		g_system->fillScreen(kColorBlack);
+		_vm->_screen->setGuiBrightness(255);
+		_vm->paletteBrightness();
+		_vm->renderMessage(kStringArsanoRoger39);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_vm->_screen->setGuiBrightness(0);
+		_vm->paletteBrightness();
+		_gm->_time += ticksToMsec(125000); // 2 hours
+		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
+		_gm->_state._eventTime = _gm->_time + ticksToMsec(4000);
+		_gm->_state._eventCallback = kSupernovaFn;
+		setSectionVisible(11, false);
+		setSectionVisible(1, false);
+		_vm->renderRoom(*this);
+		_vm->renderImage(3);
+		getObject(3)->_click = 5;
+		getObject(5)->_click = 6;
+		getObject(6)->_click = 7;
+		_vm->paletteFadeIn();
+		_vm->renderMessage(kStringArsanoRoger40);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+	} else
+		return false;
+
+	return true;
+}
+
+ArsanoGlider::ArsanoGlider(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 19;
+	_id = GLIDER;
+	_shown[0] = kShownTrue;
+	_sinus = 0;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,MEETUP,15);
+	_objectState[1] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON1,PRESS,0,0,0);
+	_objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON2,PRESS,1,1,0);
+	_objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON3,PRESS,2,2,0);
+	_objectState[4] = Object(_id, kStringButton,kStringDefaultDescription,GLIDER_BUTTON4,PRESS,3,3,0);
+	_objectState[5] = Object(_id, kStringKeycard,kStringDefaultDescription,GLIDER_KEYCARD,TAKE|COMBINABLE,255,255,0);
+	_objectState[6] = Object(_id, kStringSlot,kStringDefaultDescription,GLIDER_SLOT,COMBINABLE,4,4,0);
+	_objectState[7] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE,5,6,6);
+	_objectState[8] = Object(_id, kStringKeyboard,kStringDefaultDescription,GLIDER_BUTTONS,NULLTYPE,7,7,0);
+	_objectState[9] = Object(_id, kStringAnnouncement,kStringAnnouncementDescription,GLIDER_DISPLAY,NULLTYPE,8,8,0);
+	_objectState[10] = Object(_id, kStringInstruments,kStringAnnouncementDescription,GLIDER_INSTRUMENTS,NULLTYPE,9,9,0);
+}
+
+void ArsanoGlider::animation() {
+	if (isSectionVisible(8)) {
+		setSectionVisible(24 + _sinus, false);
+		_sinus = (_sinus + 1) % 14;
+		_vm->renderImage(24 + _sinus);
+	} else if (isSectionVisible(24 + _sinus))
+		_vm->renderImage(_gm->invertSection(24 + _sinus));
+
+	_gm->setAnimationTimer(2);
+}
+
+bool ArsanoGlider::interact(Action verb, Object &obj1, Object &obj2) {
+	static char l, r;
+	if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, GLIDER_SLOT)) {
+		_vm->renderImage(5);
+		_gm->wait(7);
+		_vm->renderImage(8);
+		getObject(5)->_click = 10;
+		_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
+	} else if (((verb == ACTION_TAKE) || (verb == ACTION_PULL)) &&
+			   (obj1._id == GLIDER_KEYCARD)) {
+		_vm->renderImage(_gm->invertSection(5));
+		_vm->renderImage(_gm->invertSection(8));
+		getObject(5)->_click = 255;
+		_gm->takeObject(*_gm->_rooms[ROGER]->getObject(8));
+		for (int i = 9; i <= 22; i++)
+			_vm->renderImage(_gm->invertSection(i));
+		l = r = 0;
+	} else if ((verb == ACTION_PRESS) &&
+			   (obj1._id >= GLIDER_BUTTON1) && (obj1._id <= GLIDER_BUTTON4)) {
+		int i = obj1._id - GLIDER_BUTTON1 + 1;
+		_vm->renderImage(i);
+		if (isSectionVisible(8)) {
+			l = 0;
+			r = 0;
+			for (int j = 1; j < 8; j++) {
+				if (isSectionVisible(j + 8))
+					l = j;
+				if (isSectionVisible(j + 15))
+					r = j;
+			}
+			switch (i) {
+			case 1:
+				if (l < 7) {
+					l++;
+					_vm->renderImage(l + 8);
+				}
+				break;
+			case 3:
+				if (r < 7) {
+					r++;
+					_vm->renderImage(r + 15);
+				}
+				break;
+			case 2:
+				if (l) {
+					_vm->renderImage(_gm->invertSection(l + 8));
+					l--;
+				}
+				break;
+			case 4:
+				if (r) {
+					_vm->renderImage(_gm->invertSection(r + 15));
+					r--;
+				}
+			}
+		}
+		_gm->wait(4);
+		_vm->renderImage(_gm->invertSection(i));
+	} else if ((verb == ACTION_USE) && (obj1._id == GLIDER_BUTTONS))
+		_vm->renderMessage(kStringArsanoGlider1);
+	else
+		return false;
+
+	return true;
+}
+
+ArsanoMeetup2::ArsanoMeetup2(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 38;
+	_id = MEETUP2;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRoger, kStringDefaultDescription, ROGER_W, TALK, 255, 255, 0);
+	_objectState[1] = Object(_id, kStringSpaceshift, kStringDefaultDescription, SPACESHIP, COMBINABLE, 255, 255, 0);
+	_objectState[2] = Object(_id, kStringCave, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CAVE, 22);
+
+	_dialog1[0] = kStringDialogArsanoMeetup2_1;
+	_dialog1[1] = kStringDialogArsanoMeetup2_2;
+	_dialog2[0] = kStringDialogArsanoMeetup2_3;
+	_dialog2[1] = kStringDialogArsanoMeetup2_4;
+	_dialog3[0] = kStringDialogArsanoMeetup2_5;
+	_dialog3[1] = kStringDialogArsanoMeetup2_6;
+	_dialog3[2] = kStringDialogArsanoMeetup2_7;
+	_dialog3[3] = kStringDialogArsanoMeetup2_8;
+	_dialog4[0] = kStringDialogArsanoMeetup2_9;
+	_dialog4[1] = kStringDialogArsanoMeetup2_10;
+	_dialog4[2] = kStringDialogArsanoMeetup2_11;
+}
+
+void ArsanoMeetup2::onEntrance() {
+	if (sentenceRemoved(0, 1)) {
+		if (sentenceRemoved(1, 1))
+			_vm->renderMessage(kStringArsanoMeetup2_2); // All spaceships have left the planet, except one ...
+		else
+			shipStart();
+	} else if (sentenceRemoved(1, 1))
+		_vm->renderMessage(kStringArsanoMeetup2_1); // All spaceships have left the planet
+
+	addAllSentences(1);
+}
+
+bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
+	static byte row1[6] = {1, 1, 0, 0, 0, 0};
+	static byte row2[6] = {1, 1, 0, 0, 0, 0};
+	static byte row3[6] = {1, 1, 1, 1, 0, 0};
+	static byte row4[6] = {2, 1, 0, 0, 0, 0};
+
+	if (((verb == ACTION_WALK) &&
+			((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
+			((verb == ACTION_TALK) && (obj1._id == ROGER_W))) {
+		_gm->changeRoom(INTRO);
+		_vm->setCurrentImage(30);
+		_vm->renderImage(0);
+		_vm->paletteBrightness();
+		bool found;
+		if (sentenceRemoved(0, 2) || sentenceRemoved(1, 2)) {
+			_gm->reply(kStringArsanoMeetup2_3, 1, 1 + 128);
+			found = !_gm->dialog(2, row4, _dialog4, 0);
+			if (!(found))
+				_gm->reply(kStringArsanoMeetup2_4, 1, 1 + 128);
+		} else {
+			_gm->reply(kStringArsanoMeetup2_5, 1, 1 + 128);
+			_gm->reply(kStringArsanoMeetup2_6, 1, 1 + 128);
+			found = !_gm->dialog(2, row1, _dialog1, 0);
+			removeSentence(0, 2);
+		}
+		if (found) {
+			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(3));
+			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(7));
+			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
+			_gm->reply(kStringArsanoMeetup2_7, 1, 1 + 128);
+			_gm->reply(kStringArsanoMeetup2_8, 1, 1 + 128);
+			bool flight = _gm->dialog(2, row2, _dialog2, 0);
+			if (flight) {
+				_gm->reply(kStringArsanoMeetup2_9, 1, 1 + 128);
+				_gm->dialog(4, row3, _dialog3, 0);
+				_gm->reply(kStringArsanoMeetup2_10, 1, 1 + 128);
+			} else
+				_gm->reply(kStringArsanoMeetup2_11, 1, 1 + 128);
+
+			_gm->changeRoom(MEETUP2);
+			_gm->_rooms[MEETUP2]->setSectionVisible(12, false);
+			_gm->_rooms[MEETUP2]->getObject(0)->_click = 255;
+			_gm->_rooms[MEETUP2]->getObject(1)->_click = 255;
+			_vm->renderRoom(*this);
+			_vm->paletteBrightness();
+			shipStart();
+			if (flight) {
+				_vm->setCurrentImage(13);
+				_vm->renderImage(0);
+				_vm->paletteBrightness();
+				_gm->wait(36);
+				for (int i = 1; i <= 13; i++) {
+					if (i > 1)
+						_vm->renderImage(_gm->invertSection(i - 1));
+					_vm->renderImage(i);
+					_gm->wait(2);
+				}
+				_vm->renderImage(_gm->invertSection(13));
+				_gm->wait(20);
+				_vm->setCurrentImage(14);
+				_vm->renderImage(0);
+				_vm->paletteBrightness();
+				_gm->wait(36);
+				for (int i = 1; i <= 13; i++) {
+					if (i > 1)
+						_vm->renderImage(_gm->invertSection(i - 1));
+					_vm->renderImage(i);
+					_gm->wait(2);
+				}
+				_vm->renderImage(_gm->invertSection(13));
+				_gm->wait(9);
+				_vm->playSound(kAudioCrash);
+				for (int i = 14; i <= 19; i++) {
+					_vm->renderImage(i);
+					_gm->wait(3);
+				}
+				_vm->paletteFadeOut();
+				_vm->setCurrentImage(11);
+				_vm->renderImage(0);
+				_vm->paletteFadeIn();
+				_gm->wait(18);
+				_vm->renderMessage(kStringArsanoMeetup2_12);
+				_gm->great(0);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->paletteFadeOut();
+				g_system->fillScreen(kColorBlack);
+				_gm->_state._dream = false;
+				if (!_vm->loadGame(kSleepAutosaveSlot))
+					_vm->errorTempSave(false);
+				_gm->loadTime();
+				_gm->_rooms[CAVE]->getObject(1)->_exitRoom = MEETUP3;
+				_gm->_state._dream = true;
+			}
+		} else {
+			_gm->changeRoom(MEETUP2);
+			_vm->renderRoom(*this);
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, KEYCARD_R, SPACESHIP))
+		_vm->renderMessage(kStringArsanoMeetup2_13);
+	else
+		return false;
+
+	return true;
+}
+
+void ArsanoMeetup2::shipStart() {
+	_gm->wait(12);
+	for (int i = 2; i <= 11; ++i) {
+		if (i >= 9)
+			_vm->renderImage(i - 1 + 128);
+		else
+			setSectionVisible(i - 1, false);
+		_vm->renderImage(i);
+		_gm->wait(2);
+	}
+	_vm->renderImage(11 + 128);
+}
+
+ArsanoMeetup3::ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 39;
+	_id = MEETUP3;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringUfo,kStringUfoDescription,UFO,EXIT,0,0,0,NULLROOM,3);
+	_objectState[1] = Object(_id, kStringStar,kStringDefaultDescription,STAR,NULLTYPE,1,1,0);
+	_objectState[2] = Object(_id, kStringCave,kStringDefaultDescription,NULLOBJECT,EXIT,255,255,0,CAVE,22);
+
+	_dialog2[0] = kStringArsanoDialog1;
+	_dialog2[1] = kStringDialogArsanoMeetup3_1;
+	_dialog2[2] = kStringDialogArsanoMeetup3_2;
+	_dialog2[3] = kStringDialogArsanoMeetup3_3;
+	_dialog3[0] = kStringDialogArsanoMeetup3_4;
+	_dialog3[1] = kStringDialogArsanoMeetup3_5;
+
+	_dialogsX[0] = kStringDialogX1;
+	_dialogsX[1] = kStringDialogX2;
+	_dialogsX[2] = kStringDialogX3;
+}
+
+bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
+	byte row2[6] = {1, 1, 1, 1, 0, 0};
+	byte row3[6] = {1, 1, 0, 0, 0, 0};
+	byte rowsX[6] = {1, 1, 1, 0, 0, 0};
+
+	if ((verb == ACTION_WALK) && (obj1._id == STAR))
+		_vm->renderMessage(kStringArsanoMeetup2);
+	else if ((verb == ACTION_LOOK) && (obj1._id == STAR)) {
+		_vm->setCurrentImage(26);
+		_vm->renderImage(0);
+		_vm->paletteBrightness();
+		_gm->getInput();
+		g_system->fillScreen(kColorBlack);
+		_vm->renderRoom(*this);
+	} else if ((verb == ACTION_WALK) && (obj1._id == UFO)) {
+		g_system->fillScreen(kColorBlack);
+		_vm->setCurrentImage(36);
+		_vm->renderImage(0);
+		_vm->paletteBrightness();
+		_gm->dialog(3, rowsX, _dialogsX, 0);
+		_vm->renderImage(1);
+		_gm->wait(3);
+		_vm->renderImage(2);
+		_gm->wait(3);
+		_vm->renderImage(3);
+		_gm->wait(6);
+		_vm->renderImage(4);
+		_vm->playSound(kAudioGunShot);
+
+		while (_vm->_sound->isPlaying())
+			_gm->wait(1);
+
+		_vm->renderImage(5);
+		_gm->wait(3);
+		_vm->renderImage(4);
+		_vm->playSound(kAudioGunShot);
+
+		while (_vm->_sound->isPlaying())
+			_gm->wait(1);
+
+		_vm->renderImage(5);
+		_vm->paletteFadeOut();
+		_gm->wait(12);
+		_vm->setCurrentImage(0);
+		_vm->renderImage(0);
+		_vm->paletteFadeIn();
+		_gm->wait(18);
+		_gm->reply(kStringArsanoMeetup3_1, 2, 2 + 128);
+		_gm->wait(10);
+		_gm->reply(kStringArsanoMeetup3_2, 1, 1 + 128);
+
+		do {
+			int i = _gm->dialog(4, row2, _dialog2, 2);
+			switch (i) {
+			case 0:
+				_gm->reply(kStringArsanoMeetup3_3, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup3_4, 1, 1 + 128);
+				break;
+			case 1:
+				_gm->reply(kStringArsanoMeetup3_5, 2, 2 + 128);
+				_gm->say(kStringArsanoMeetup3_6);
+				_gm->reply(kStringArsanoMeetup3_7, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_8, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_9, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_10, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_11, 2, 2 + 128);
+				if (_gm->dialog(2, row3, _dialog3, 0)) {
+					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
+					_gm->say(kStringArsanoMeetup3_13);
+				}
+				_gm->reply(kStringArsanoMeetup3_14, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_15, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_16, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_17, 2, 2 + 128);
+				if (_gm->dialog(2, row3, _dialog3, 0)) {
+					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
+					_gm->say(kStringArsanoMeetup3_13);
+				}
+				_gm->reply(kStringArsanoMeetup3_18, 2, 2 + 128);
+				break;
+			case 2:
+				_gm->reply(kStringArsanoMeetup3_19, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_20, 2, 2 + 128);
+				break;
+			case 3:
+				_gm->reply(kStringArsanoMeetup3_21, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup3_22, 1, 1 + 128);
+				_gm->say(kStringArsanoMeetup3_23);
+				_gm->reply(kStringArsanoMeetup3_24, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup3_25, 1, 1 + 128);
+			}
+			removeSentence(2, 2);
+		} while (!allSentencesRemoved(4, 2));
+		_gm->say(kStringArsanoMeetup3_26);
+		_gm->reply(kStringArsanoMeetup3_27, 1, 1 + 128);
+		_gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
+		_vm->paletteFadeOut();
+		// Remove all objects from the inventory except the Knife, Watch and Discman
+		bool has_knife = _gm->_rooms[INTRO]->getObject(1)->hasProperty(CARRIED);
+		bool has_watch = _gm->_rooms[INTRO]->getObject(2)->hasProperty(CARRIED);
+		bool has_discman = _gm->_rooms[INTRO]->getObject(3)->hasProperty(CARRIED);
+		_gm->_inventory.clear();
+		_gm->_inventoryScroll = 0;
+		if (has_knife)
+			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1));
+		if (has_watch)
+			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2));
+		if (has_discman)
+			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3));
+		_gm->changeRoom(CELL);
+		_gm->_state._dream = true;
+	} else
+		return false;
+
+	return true;
+}
+
+// Axacuss
+AxacussCell::AxacussCell(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 43;
+	_id = CELL;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[31] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,CELL_BUTTON,PRESS,1,1,0);
+	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
+	_objectState[2] = Object(_id, kStringTray,kStringTrayDescription,TRAY,UNNECESSARY,255,255,0);
+	_objectState[3] = Object(_id, kStringLamp,kStringLampDescription,NULLOBJECT,COMBINABLE,3,3,0);
+	_objectState[4] = Object(_id, kStringEyes,kStringEyesDescription,NULLOBJECT,NULLTYPE,4,4,0);
+	_objectState[5] = Object(_id, kStringWire,kStringDefaultDescription,CELL_WIRE,COMBINABLE|TAKE,6,6,0);
+	_objectState[6] = Object(_id, kStringSocket,kStringSocketDescription,SOCKET,COMBINABLE,5,5,0);
+	_objectState[7] = Object(_id, kStringMetalBlock,kStringMetalBlockDescription,MAGNET,TAKE|COMBINABLE,255,255,30);
+	_objectState[8] = Object(_id, kStringRobot,kStringRobotDescription,NULLOBJECT,NULLTYPE,255,255,0);
+	_objectState[9] = Object(_id, kStringTable,kStringTableDescription,CELL_TABLE,COMBINABLE,2,2,0);
+}
+
+void AxacussCell::onEntrance() {
+	if (_gm->_state._dream) {
+		_vm->renderMessage(kStringAxacussCell_1);
+		_gm->_time = ticksToMsec(500000);
+		_gm->_state._alarmOn = (_gm->_state._timeAlarm > _gm->_time);
+		_gm->_state._powerOff = false;
+		_gm->_state._dream = false;
+	}
+}
+
+void AxacussCell::animation() {
+	++_gm->_state._timeRobot;
+
+	if (_gm->_state._timeRobot == 299) {
+		_vm->renderImage(_gm->invertSection(31));
+		_vm->renderImage(28);
+		getObject(0)->_click = 255;
+		getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
+	} else if ((_gm->_state._timeRobot >= 301) && (_gm->_state._timeRobot <= 320)) {
+		_vm->renderImage(_gm->invertSection(329 - _gm->_state._timeRobot));
+		_vm->renderImage(328 - _gm->_state._timeRobot);
+	} else if (_gm->_state._timeRobot == 321) {
+		_vm->renderImage(31);
+		setSectionVisible(8, false);
+		getObject(0)->_click = 1;
+		getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
+	}
+
+	if (_gm->_state._timeRobot == 599) {
+		_vm->renderImage(_gm->invertSection(31));
+		_vm->renderImage(8);
+		getObject(0)->_click = 255;
+		getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
+	} else if ((_gm->_state._timeRobot >= 601) && (_gm->_state._timeRobot <= 620)) {
+		_vm->renderImage(_gm->_state._timeRobot - 593 + 128);
+		_vm->renderImage(_gm->_state._timeRobot - 592);
+	} else if (_gm->_state._timeRobot == 621) {
+		_vm->renderImage(31);
+		setSectionVisible(28, false);
+		getObject(0)->_click = 1;
+		getObject(1)->resetProperty(EXIT | OPENABLE | CLOSED);
+	} else if (_gm->_state._timeRobot == 700)
+		_gm->_state._timeRobot = 0;
+	else if (_gm->_state._timeRobot == 10002) {
+		_vm->renderImage(18 + 128);
+		_vm->renderImage(29);
+		_vm->renderImage(7);
+		getObject(2)->_click = 13;
+	} else if (_gm->_state._timeRobot == 10003) {
+		setSectionVisible(29, false);
+		_vm->renderImage(30);
+		getObject(8)->_click = 12;
+		getObject(7)->_click = 14;
+		_vm->playSound(kAudioRobotBreaks);
+	} else if (_gm->_state._timeRobot == 10010)
+		--_gm->_state._timeRobot;
+
+	if (_gm->_state._timeRobot == 312) {
+		_vm->renderImage(7);
+		getObject(2)->_click = 13;
+	} else if (_gm->_state._timeRobot == 610) {
+		setSectionVisible(7, false);
+		getObject(2)->_click = 255;
+	}
+
+	if ((isSectionVisible(6)) &&
+		((_gm->_state._timeRobot == 310) || (_gm->_state._timeRobot == 610))) {
+		_vm->playSound(kAudioRobotShock);
+		_gm->_state._timeRobot = 10000;
+	}
+
+	_gm->setAnimationTimer(3);
+}
+
+bool AxacussCell::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_PRESS) && (obj1._id == CELL_BUTTON))
+		_vm->renderMessage(kStringAxacussCell_2);
+	else if ((verb == ACTION_PULL) && (obj1._id == CELL_WIRE) &&
+			 !isSectionVisible(2) &&
+			 !isSectionVisible(3) &&
+			 !isSectionVisible(5)) {
+		if (isSectionVisible(1)) {
+			_vm->renderImage(_gm->invertSection(1));
+			_vm->renderImage(2);
+			getObject(5)->_click = 7;
+		} else if (isSectionVisible(4)) {
+			_vm->renderImage(_gm->invertSection(4));
+			_vm->renderImage(3);
+			getObject(5)->_click = 8;
+		} else if (isSectionVisible(6)) {
+			_vm->renderImage(_gm->invertSection(6));
+			_vm->renderImage(5);
+			getObject(5)->_click = 10;
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, SOCKET) &&
+			   !isSectionVisible(1) && !isSectionVisible(4) && !isSectionVisible(6)) {
+		if (isSectionVisible(2)) {
+			_vm->renderImage(_gm->invertSection(2));
+			_vm->renderImage(1);
+			getObject(5)->_click = 6;
+		} else if (isSectionVisible(3)) {
+			_vm->renderImage(_gm->invertSection(3));
+			_vm->renderImage(4);
+			getObject(5)->_click = 9;
+		} else if (isSectionVisible(5)) {
+			_vm->renderImage(_gm->invertSection(5));
+			_vm->renderImage(6);
+			getObject(5)->_click = 11;
+		} else {
+			_gm->_inventory.remove(*getObject(5));
+			_vm->renderImage(4);
+			getObject(5)->_click = 9;
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, KNIFE) &&
+			   ((isSectionVisible(1)) || (isSectionVisible(2)))) {
+		if (isSectionVisible(1))
+			_gm->shock();
+		else {
+			_vm->renderImage(_gm->invertSection(2));
+			_vm->renderImage(3);
+			getObject(5)->_click = 8;
+		}
+	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, CELL_WIRE, CELL_TABLE) &&
+			   !isSectionVisible(1) &&
+			   !isSectionVisible(2) &&
+			   !isSectionVisible(5) &&
+			   !isSectionVisible(6)) {
+		if (isSectionVisible(3)) {
+			_vm->renderImage(_gm->invertSection(3));
+			_vm->renderImage(5);
+			getObject(5)->_click = 10;
+		} else if (isSectionVisible(4)) {
+			_vm->renderImage(_gm->invertSection(4));
+			_vm->renderImage(6);
+			_gm->shock();
+		} else {
+			_gm->_inventory.remove(*getObject(5));
+			_vm->renderImage(5);
+			getObject(5)->_click = 10;
+		}
+	} else if ((verb == ACTION_TAKE) && (obj1._id == CELL_WIRE) && !(obj1.hasProperty(CARRIED))) {
+		if (isSectionVisible(3)) {
+			_vm->renderImage(_gm->invertSection(3));
+			_gm->takeObject(obj1);
+		} else if (isSectionVisible(5)) {
+			_vm->renderImage(_gm->invertSection(5));
+			_gm->takeObject(obj1);
+		} else
+			_vm->renderMessage(kStringAxacussCell_3);
+	} else if ((verb == ACTION_WALK) && (obj1._id == CELL_DOOR) && (obj1.hasProperty(OPENED))) {
+		if (isSectionVisible(30) || isSectionVisible(29))
+			return false;
+		_vm->playSound(kAudioGunShot);
+
+		while (_vm->_sound->isPlaying())
+			_gm->wait(1);
+
+		_vm->playSound(kAudioGunShot);
+		_vm->playSound(kAudioGunShot);
+		_gm->dead(kStringAxacussCell_4);
+	} else if ((verb == ACTION_USE) && (obj1._id == TRAY))
+		_vm->renderMessage(kStringAxacussCell_5);
+	else if ((verb == ACTION_TAKE) && (obj1._id == MAGNET)) {
+		if (isSectionVisible(6))
+			_gm->shock();
+		_gm->takeObject(obj1);
+		_vm->renderMessage(kStringOk);
+	} else
+		return false;
+
+	return true;
+}
+
+AxacussCorridor1::AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR1;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[21] = kShownTrue;
+	_shown[23] = kShownTrue;
+	_shown[25] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,GUARD3,2);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR2,22);
+}
+
+void AxacussCorridor1::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+
+AxacussCorridor2::AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR2;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[17] = kShownTrue;
+	_shown[21] = kShownTrue;
+	_shown[24] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR1,2);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR3,22);
+	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,CORRIDOR4,14);
+}
+
+void AxacussCorridor2::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+AxacussCorridor3::AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR3;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[19] = kShownTrue;
+	_shown[23] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR2,2);
+}
+
+void AxacussCorridor3::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+void AxacussCorridor4::onEntrance() {
+	_gm->great(4);
+	_gm->corridorOnEntrance();
+	if (_gm->_rooms[GUARD]->isSectionVisible(1))
+		_gm->busted(0);
+}
+
+AxacussCorridor4::AxacussCorridor4(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR4;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[9] = kShownTrue;
+	_shown[11] = kShownTrue;
+	_shown[15] = kShownTrue;
+	_shown[18] = kShownTrue;
+	_shown[20] = kShownTrue;
+	_shown[26] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,0,0,0,CORRIDOR2,10);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,1,1,0,GUARD,14);
+	_objectState[2] = Object(_id, kStringCellDoor,kStringCellDoorDescription,DOOR,EXIT|OPENABLE|OPENED|CLOSED,7,7,0,CELL,16);
+	_objectState[3] = Object(_id, kStringLaptop,kStringDefaultDescription,NEWSPAPER,TAKE,6,6,8);
+	_objectState[4] = Object(_id, kStringWristwatch,kStringDefaultDescription,WATCH,TAKE|COMBINABLE,255,255,8);
+	_objectState[5] = Object(_id, kStringTable,kStringDefaultDescription,TABLE,COMBINABLE,5,5,0);
+}
+
+void AxacussCorridor4::animation() {
+}
+
+bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_TAKE) && (obj1._id == NEWSPAPER)) {
+		setSectionVisible(9, false);
+		_gm->takeObject(obj1);
+		if (isSectionVisible(29))
+			_vm->renderImage(29);
+	} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, TABLE, WATCH)) ||
+			   ((verb == ACTION_GIVE) && (obj1._id == WATCH) && (obj2._id == TABLE))) {
+		if (obj1._id == WATCH)
+			_gm->_inventory.remove(obj1);
+		else
+			_gm->_inventory.remove(obj2);
+
+		_vm->renderImage(29);
+		getObject(4)->_click = 8;
+	} else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) && !obj1.hasProperty(CARRIED)) {
+		setSectionVisible(29, false);
+		getObject(4)->_click = 255;
+		_gm->takeObject(*_gm->_rooms[INTRO]->getObject(2));
+		if (isSectionVisible(9))
+			_vm->renderImage(9);
+	} else
+		return false;
+
+	return true;
+}
+
+AxacussCorridor5::AxacussCorridor5(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR5;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[12] = kShownTrue;
+	_shown[22] = kShownTrue;
+	_shown[23] = kShownTrue;
+	_shown[24] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,DOOR,EXIT,2,2,0,NULLROOM,2);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR6,22);
+
+	_dialog1[0] = kStringDialogAxacussCorridor5_1;
+	_dialog1[1] = kStringDialogAxacussCorridor5_2;
+	_dialog2[0] = kStringDialogAxacussCorridor5_3;
+	_dialog2[1] = kStringDialogAxacussCorridor5_4;
+	_dialog3[0] = kStringDialogAxacussCorridor5_5;
+	_dialog3[1] = kStringDialogAxacussCorridor5_6;
+	_dialog3[2] = kStringDialogAxacussCorridor5_7;
+	_dialog3[3] = kStringDialogAxacussCorridor5_7;
+
+	_rows[0] = 1;
+	_rows[1] = 1;
+	_rows[2] = 1;
+	_rows[3] = 1;
+	_rows[4] = 0;
+	_rows[5] = 0;
+}
+
+void AxacussCorridor5::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+bool AxacussCorridor5::handleMoneyDialog() {
+	if (_gm->dialog(2, _rows, _dialog2, 0) == 0) {
+		_gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
+		addAllSentences(2);
+		if (_gm->_state._money == 0) {
+			removeSentence(2, 2);
+			removeSentence(3, 2);
+		} else {
+			Common::String string = _vm->getGameString(kStringDialogAxacussCorridor5_7);
+			_vm->setGameString(kStringPlaceholder1, Common::String::format(string.c_str(), _gm->_state._money - 200));
+			_vm->setGameString(kStringPlaceholder2, Common::String::format(string.c_str(), _gm->_state._money));
+			_dialog3[2] = kStringPlaceholder1;
+			_dialog3[3] = kStringPlaceholder2;
+		}
+		switch (_gm->dialog(4, _rows, _dialog3, 2)) {
+		case 1:
+			_gm->wait(3);
+			_vm->renderImage(1);
+			_vm->playSound(kAudioVoiceHalt);
+			_vm->renderImage(_gm->invertSection(1));
+			_gm->wait(5);
+			_vm->renderImage(2);
+			_gm->wait(2);
+			_gm->shot(3, _gm->invertSection(3));
+			break;
+		case 2:
+			if (_gm->_state._money > 1100) {
+				stopInteract(_gm->_state._money - 200);
+				return true;
+			}
+			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
+			break;
+		case 3:
+			if (_gm->_state._money >= 900) {
+				stopInteract(_gm->_state._money);
+				return true;
+			}
+			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
+			break;
+		}
+	}
+	return false;
+}
+
+void AxacussCorridor5::stopInteract(int sum) {
+	_gm->reply(kStringAxacussCorridor5_7, 1, 1 + 128);
+	_gm->great(0);
+	_gm->changeRoom(ELEVATOR);
+	_gm->takeMoney(-sum);
+}
+
+bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_WALK) && (obj1._id == DOOR)) {
+		g_system->fillScreen(kColorBlack);
+		_vm->setCurrentImage(41);
+		_vm->renderImage(0);
+		_vm->paletteBrightness();
+		if (_gm->_guiEnabled) {
+			_gm->reply(kStringAxacussCorridor5_1, 1, 1 + 128);
+			if (handleMoneyDialog())
+				return true;
+		} else {
+			_gm->_guiEnabled = true;
+			_gm->reply(kStringAxacussCorridor5_2, 1, 1 + 128);
+			if (_gm->dialog(2, _rows, _dialog1, 0))
+				_gm->reply(kStringAxacussCorridor5_3, 1, 1 + 128);
+			else {
+				_gm->reply(kStringAxacussCorridor5_4, 1, 1 + 128);
+				if (handleMoneyDialog())
+					return true;
+			}
+		}
+		g_system->fillScreen(kColorBlack);
+		return true;
+	}
+	return false;
+}
+
+AxacussCorridor6::AxacussCorridor6(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR6;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[22] = kShownTrue;
+	_shown[24] = kShownTrue;
+	_shown[25] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR5,2);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,CORRIDOR7,22);
+	_objectState[2] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,OPENABLE|CLOSED,255,255,0,CORRIDOR8,13);
+}
+
+void AxacussCorridor6::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+bool AxacussCorridor6::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) &&
+			(obj1.hasProperty(OPENED))) {
+		_vm->renderImage(6);
+		setSectionVisible(7, false);
+		obj1.resetProperty(EXIT | OPENABLE | CLOSED);
+		_gm->_rooms[CORRIDOR8]->setSectionVisible(27, false);
+		_gm->_rooms[CORRIDOR8]->setSectionVisible(28, true);
+		_gm->_rooms[CORRIDOR8]->getObject(0)->disableProperty(OPENED);
+		_vm->playSound(kAudioDoorClose);
+	} else
+		return false;
+
+	return true;
+}
+
+AxacussCorridor7::AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR7;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[10] = kShownTrue;
+	_shown[21] = kShownTrue;
+	_shown[24] = kShownTrue;
+	_shown[25] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,CORRIDOR6,2);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,GUARD,22);
+}
+
+void AxacussCorridor7::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+AxacussCorridor8::AxacussCorridor8(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR8;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[15] = kShownTrue;
+	_shown[20] = kShownTrue;
+	_shown[22] = kShownTrue;
+	_shown[28] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,CORRIDOR6,10);
+	_objectState[1] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,3,3,0,BCORRIDOR,22);
+}
+
+void AxacussCorridor8::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+bool AxacussCorridor8::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
+		_vm->renderImage(27);
+		setSectionVisible(28, false);
+		obj1.setProperty(OPENED);
+		_gm->_rooms[CORRIDOR6]->setSectionVisible(6, false);
+		_gm->_rooms[CORRIDOR6]->setSectionVisible(7, true);
+		_gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | OPENED | OPENABLE);
+		_gm->_rooms[CORRIDOR6]->getObject(2)->_click = 4;
+		_vm->playSound(kAudioDoorOpen);
+	} else if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1._type & OPENED)) {
+		_vm->renderImage(28);
+		setSectionVisible(27, false);
+		obj1.disableProperty(OPENED);
+		_gm->_rooms[CORRIDOR6]->setSectionVisible(6, true);
+		_gm->_rooms[CORRIDOR6]->setSectionVisible(7, false);
+		_gm->_rooms[CORRIDOR6]->getObject(2)->resetProperty(EXIT | CLOSED | OPENABLE);
+		_vm->playSound(kAudioDoorClose);
+	} else
+		return false;
+
+	return true;
+}
+
+AxacussCorridor9::AxacussCorridor9(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = CORRIDOR9;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[19] = kShownTrue;
+	_shown[23] = kShownTrue;
+	_shown[28] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,2,2,0,BCORRIDOR,2);
+	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,DOOR,EXIT|OPENABLE,0,0,0,GUARD,10);
+}
+
+void AxacussCorridor9::onEntrance() {
+	_gm->corridorOnEntrance();
+}
+
+bool AxacussCorridor9::interact(Action verb, Object &obj1, Object &obj2) {
+	if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && (obj1.hasProperty(OPENED))) {
+		_vm->renderImage(28);
+		setSectionVisible(27, false);
+		obj1.disableProperty(OPENED);
+		_gm->_rooms[GUARD]->setSectionVisible(6, false);
+		_gm->_rooms[GUARD]->getObject(2)->disableProperty(OPENED);
+		_vm->playSound(kAudioDoorClose);
+	} else if ((verb == ACTION_OPEN) && (obj1._id == DOOR) && !obj1.hasProperty(OPENED)) {
+		_vm->renderImage(27);
+		setSectionVisible(28, false);
+		obj1.setProperty(OPENED);
+		_gm->_rooms[GUARD]->setSectionVisible(6, true);
+		_gm->_rooms[GUARD]->getObject(2)->setProperty(OPENED);
+		_vm->playSound(kAudioDoorOpen);
+		if (!_gm->_rooms[GUARD]->isSectionVisible(1))
+			_gm->busted(0);
+	} else
+		return false;
+
+	return true;
+}
+
+AxacussBcorridor::AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = BCORRIDOR;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR1,NULLTYPE,4,4,0);
+	_objectState[1] = Object(_id, kStringPillar,kStringDefaultDescription,PILLAR2,NULLTYPE,5,5,0);
+	_objectState[2] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,6,6,0,CORRIDOR8,2);
+	_objectState[3] = Object(_id, kStringExit,kStringDefaultDescription,NULLOBJECT,EXIT,7,7,0,CORRIDOR9,22);
+	_objectState[4] = Object(_id, kStringDoor,kStringDoorDescription1,DOOR1,EXIT|OPENABLE|CLOSED|OCCUPIED,0,0,1,OFFICE_L1,6);
+	_objectState[5] = Object(_id, kStringDoor,kStringDoorDescription2,DOOR2,EXIT|OPENABLE|CLOSED|OCCUPIED,1,1,2,OFFICE_L2,16);
+	_objectState[6] = Object(_id, kStringDoor,kStringDoorDescription3,DOOR3,EXIT|OPENABLE|OPENED,2,2,3,OFFICE_R1,8);
+	_objectState[7] = Object(_id, kStringDoor,kStringDoorDescription4,DOOR4,EXIT|OPENABLE|CLOSED|OCCUPIED,3,3,4,OFFICE_R2,18);
+}
+
+void AxacussBcorridor::onEntrance() {
+	_gm->corridorOnEntrance();
+	if (isSectionVisible(7))
+		_gm->busted(-1);
+}
+
+bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (obj1.hasProperty(EXIT) ||
+		((verb == ACTION_USE) && obj1.hasProperty(COMBINABLE) && obj2.hasProperty(EXIT))) {
+		_gm->_state._playerHidden = false;
+	}
+
+	if ((verb == ACTION_CLOSE) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4) && obj1.hasProperty(OPENED)) {
+		_vm->renderImage(_gm->invertSection(obj1._id - DOOR1 + 1));
+		_vm->playSound(kAudioDoorClose);
+		obj1.disableProperty(OPENED);
+		obj1.setProperty(CLOSED);
+		if (obj1.hasProperty(OCCUPIED)) {


Commit: d1edf0e467c48ec78866453a977e05657cf09f10
    https://github.com/scummvm/scummvm/commit/d1edf0e467c48ec78866453a977e05657cf09f10
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Reorder strings in devtools

Changed paths:
    devtools/create_supernova/create_supernova.h
    devtools/create_supernova/gametext.h
    devtools/create_supernova2/create_supernova2.h
    devtools/create_supernova2/gametext.h


diff --git a/devtools/create_supernova/create_supernova.h b/devtools/create_supernova/create_supernova.h
index 7447a7e..8304786 100644
--- a/devtools/create_supernova/create_supernova.h
+++ b/devtools/create_supernova/create_supernova.h
@@ -26,7 +26,7 @@
 #ifndef CREATE_SUPERNOVA_H
 #define CREATE_SUPERNOVA_H
 
-#define VERSION 1
+#define VERSION 2
 
 
 
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 1745395..1963d5e 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -59,6 +59,11 @@ const char *gameText[] = {
 	"Benutze ",     // kStringStatusCommandUse
 	"Rede mit ",    // kStringStatusCommandTalk
 	"Gib ",         // kStringStatusCommandGive
+	" an ", // kPhrasalVerbParticleGiveTo
+	" mit ", // kPhrasalVerbParticleUseWith
+	"Es ist nichts Besonderes daran.",       // kStringDefaultDescription
+	"|", // kStringDialogSeparator
+	"Gespr\204ch beenden", // kStringConversationEnd
 	// 20
 	"V2.02",            // kStringTitleVersion
 	"Teil 1:",          // kStringTitle1
@@ -81,7 +86,6 @@ const char *gameText[] = {
 	"^Rene Koch#",                           // kStringIntro12
 	"\233",                                  // kStringIntro13
 	"Hmm, er scheint kaputt zu sein.",       // kStringBroken
-	"Es ist nichts Besonderes daran.",       // kStringDefaultDescription
 	"Das mu\341t du erst nehmen.",              // kStringTakeMessage
 	// 40
 	"Keycard",                               // kStringKeycard
@@ -541,7 +545,6 @@ const char *gameText[] = {
 	"Wo soll ich die Schuhe ablegen?", // kStringArsanoDialog8
 	// 420
 	"Schwachsinn! Ich gehe jetzt nach oben!", // kStringArsanoDialog9
-	"|", // kStringDialogSeparator
 	"K\224nnten Sie mir ein Gericht empfehlen?", // kStringDialogArsanoRoger1
 	"Wie lange dauert es denn noch bis zur Supernova?", // kStringDialogArsanoRoger2
 	"Sie kommen mir irgendwie bekannt vor.", // kStringDialogArsanoRoger3
@@ -735,8 +738,6 @@ const char *gameText[] = {
 	"Es ist eine Art elektronische Zeitung.", // kStringGenericInteract_10
 	"Halt, hier ist ein interessanter Artikel.", // kStringGenericInteract_11
 	"Hmm, irgendwie komme|ich mir verarscht vor.", // kStringGenericInteract_12
-	" an ", // kPhrasalVerbParticleGiveTo
-	" mit ", // kPhrasalVerbParticleUseWith
 	// 585
 	"Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen der Alarmzeit.|Uhrzeit: %s   Alarmzeit: %s", // kStringGenericInteract_13
 	"Neue Alarmzeit (hh:mm) :", // kStringGenericInteract_14
@@ -775,7 +776,6 @@ const char *gameText[] = {
 	"Behalt es lieber!", // kStringGenericInteract_42
 	// 615
 	"Das geht nicht.", // kStringGenericInteract_43
-	"Gespr\204ch beenden", // kStringConversationEnd
 	"Du hast das komische Gef\201hl,|da\341 drau\341en etwas passiert,|und eilst zum Restaurant.", // kStringSupernova1
 	"Da! Die Supernova!", // kStringSupernova2
 	"Zwei Minuten sp\204ter ...", // kStringSupernova3
diff --git a/devtools/create_supernova2/create_supernova2.h b/devtools/create_supernova2/create_supernova2.h
index dadf3d0..a5b7ddb 100644
--- a/devtools/create_supernova2/create_supernova2.h
+++ b/devtools/create_supernova2/create_supernova2.h
@@ -26,7 +26,7 @@
 #ifndef CREATE_SUPERNOVA2_H
 #define CREATE_SUPERNOVA2_H
 
-#define VERSION 1
+#define VERSION 2
 
 
 
diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index 8fd05a76..f71c21b 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -48,7 +48,6 @@ const char *gameText[] = {
 "Rede",    //Talk
 "Gib",    //Give
 // 10
-"Gespr\204ch beenden",    //End of conversation
 "Gehe zu ",    //Go to 
 "Schau ",    //Look at 
 "Nimm ",    //Take 
@@ -63,6 +62,9 @@ const char *gameText[] = {
 "Gib ",    //Give 
 " an ",    // to 
 " mit ",    // with 
+"Es ist nichts Besonderes daran.",    //There's nothing special about it.
+"|", //Dialog separator
+"Gespr\204ch beenden",    //End of conversation
 "Laden",    //Load
 "Speichern",    //Save
 // 25
@@ -249,7 +251,6 @@ const char *gameText[] = {
 "Hmm, die Kugel sieht lose aus.",    //Hmm, the ball looks loose.
 "Auge",    //Eye
 "Irgendwas stimmt damit nicht.",    //Something is wrong with that.
-"Es ist nichts Besonderes daran.",    //There's nothing special about it.
 "Sieht nach Metall aus.",    //It looks like metal.
 // 180
 "Ein Taxi kommt angerauscht,|du steigst ein.",    //A taxi arrives, and you get in.
@@ -776,7 +777,6 @@ const char *gameText[] = {
 "Sieht gef\204hrlich aus!", //Looks dangerous
 "Das Auge ist schon offen.", //This Eye is already opened
 "Es gelingt dir, zu fliehen.", //You manage to escape
-"|", //Dialog separator
 NULL
 };
 


Commit: cefdf8220a782b90f30e43567786e081501d21d1
    https://github.com/scummvm/scummvm/commit/cefdf8220a782b90f30e43567786e081501d21d1
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA2: Delete supernova2, it's getting merged

Changed paths:
  R engines/supernova2/configure.engine
  R engines/supernova2/console.cpp
  R engines/supernova2/console.h
  R engines/supernova2/detection.cpp
  R engines/supernova2/graphics.cpp
  R engines/supernova2/graphics.h
  R engines/supernova2/imageid.h
  R engines/supernova2/module.mk
  R engines/supernova2/ms2_def.h
  R engines/supernova2/resman.cpp
  R engines/supernova2/resman.h
  R engines/supernova2/rooms.cpp
  R engines/supernova2/rooms.h
  R engines/supernova2/screen.cpp
  R engines/supernova2/screen.h
  R engines/supernova2/screenstatic.cpp
  R engines/supernova2/sound.cpp
  R engines/supernova2/sound.h
  R engines/supernova2/state.cpp
  R engines/supernova2/state.h
  R engines/supernova2/supernova2.cpp
  R engines/supernova2/supernova2.h


diff --git a/engines/supernova2/configure.engine b/engines/supernova2/configure.engine
deleted file mode 100644
index c935a04..0000000
--- a/engines/supernova2/configure.engine
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is included from the main "configure" script
-# add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
-add_engine supernova2 "Mission Supernova 2" no
diff --git a/engines/supernova2/console.cpp b/engines/supernova2/console.cpp
deleted file mode 100644
index d6e805f..0000000
--- a/engines/supernova2/console.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "gui/debugger.h"
-
-#include "supernova2/supernova2.h"
-#include "supernova2/state.h"
-#include "supernova2/console.h"
-
-namespace Supernova2 {
-
-Console::Console(Supernova2Engine *vm, GameManager *gm)
-{
-	_vm = vm;
-	_gm = gm;
-}
-
-}
diff --git a/engines/supernova2/console.h b/engines/supernova2/console.h
deleted file mode 100644
index fd7cfe0..0000000
--- a/engines/supernova2/console.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA2_CONSOLE_H
-#define SUPERNOVA2_CONSOLE_H
-
-#include "gui/debugger.h"
-
-namespace Supernova2 {
-
-class Supernova2Engine;
-class GameManager;
-
-enum {
-	kDebugGeneral = 1 << 0
-};
-
-class Console : public GUI::Debugger {
-public:
-	Console(Supernova2::Supernova2Engine *vm, Supernova2::GameManager *gm);
-	virtual ~Console() {}
-
-private:
-	Supernova2Engine *_vm;
-	GameManager *_gm;
-};
-
-}
-
-#endif
diff --git a/engines/supernova2/detection.cpp b/engines/supernova2/detection.cpp
deleted file mode 100644
index ecc2d9c..0000000
--- a/engines/supernova2/detection.cpp
+++ /dev/null
@@ -1,212 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "base/plugins.h"
-#include "common/file.h"
-#include "common/savefile.h"
-#include "common/system.h"
-#include "graphics/thumbnail.h"
-#include "engines/advancedDetector.h"
-
-#include "supernova2/supernova2.h"
-
-static const PlainGameDescriptor supernova2Game[] = {
-	{"msn2", "Mission Supernova 2"},
-	{nullptr, nullptr}
-};
-
-namespace Supernova2 {
-static const ADGameDescription gameDescriptions[] = {
-	// Mission Supernova 2
-	{
-		"msn2",
-		nullptr,
-		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
-		Common::DE_DEU,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-	{
-		"msn2",
-		nullptr,
-		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
-		Common::EN_ANY,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-
-	AD_TABLE_END_MARKER
-};
-}
-
-class Supernova2MetaEngine: public AdvancedMetaEngine {
-public:
-	Supernova2MetaEngine() : AdvancedMetaEngine(Supernova2::gameDescriptions, sizeof(ADGameDescription), supernova2Game) {
-//		_singleId = "supernova";
-	}
-
-	virtual const char *getName() const {
-		return "Mission Supernova 2";
-	}
-
-	virtual const char *getOriginalCopyright() const {
-		return "Mission Supernova 2(c) 1994 Thomas and Steffen Dingel";
-	}
-
-	virtual bool hasFeature(MetaEngineFeature f) const;
-	virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
-	virtual SaveStateList listSaves(const char *target) const;
-	virtual void removeSaveState(const char *target, int slot) const;
-	virtual int getMaximumSaveSlot() const {
-		return 99;
-	}
-	virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const;
-};
-
-bool Supernova2MetaEngine::hasFeature(MetaEngineFeature f) const {
-	switch (f) {
-	case kSupportsLoadingDuringStartup:
-		// fallthrough
-	case kSupportsListSaves:
-		// fallthrough
-	case kSupportsDeleteSave:
-		// fallthrough
-	case kSavesSupportMetaInfo:
-		// fallthrough
-	case kSavesSupportThumbnail:
-		// fallthrough
-	case kSavesSupportCreationDate:
-		// fallthrough
-	case kSavesSupportPlayTime:
-		return true;
-	default:
-		return false;
-	}
-}
-
-bool Supernova2MetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
-	if (desc) {
-		*engine = new Supernova2::Supernova2Engine(syst);
-	}
-
-	return desc != nullptr;
-}
-
-SaveStateList Supernova2MetaEngine::listSaves(const char *target) const {
-	Common::StringArray filenames;
-	Common::String pattern("ms2_save.###");
-
-	filenames = g_system->getSavefileManager()->listSavefiles(pattern);
-
-	SaveStateList saveFileList;
-	for (Common::StringArray::const_iterator file = filenames.begin();
-		 file != filenames.end(); ++file) {
-		int saveSlot = atoi(file->c_str() + file->size() - 3);
-		if (saveSlot >= 0 && saveSlot <= getMaximumSaveSlot()) {
-			Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(*file);
-			if (savefile) {
-				uint saveHeader = savefile->readUint32LE();
-				if (saveHeader == SAVEGAME_HEADER) {
-					byte saveVersion = savefile->readByte();
-					if (saveVersion <= SAVEGAME_VERSION) {
-						int saveFileDescSize = savefile->readSint16LE();
-						char* saveFileDesc = new char[saveFileDescSize];
-						savefile->read(saveFileDesc, saveFileDescSize);
-						saveFileList.push_back(SaveStateDescriptor(saveSlot, saveFileDesc));
-						delete [] saveFileDesc;
-					}
-				}
-				delete savefile;
-			}
-		}
-	}
-
-	Common::sort(saveFileList.begin(), saveFileList.end(), SaveStateDescriptorSlotComparator());
-	return saveFileList;
-}
-
-void Supernova2MetaEngine::removeSaveState(const char *target, int slot) const {
-	Common::String filename = Common::String::format("ms2_save.%03d", slot);
-	g_system->getSavefileManager()->removeSavefile(filename);
-}
-
-SaveStateDescriptor Supernova2MetaEngine::querySaveMetaInfos(const char *target, int slot) const {
-	Common::String fileName = Common::String::format("ms2_save.%03d", slot);
-	Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(fileName);
-
-	if (savefile) {
-		uint saveHeader = savefile->readUint32LE();
-		if (saveHeader != SAVEGAME_HEADER) {
-			delete savefile;
-			return SaveStateDescriptor();
-		}
-		byte saveVersion = savefile->readByte();
-		if (saveVersion > SAVEGAME_VERSION){
-			delete savefile;
-			return SaveStateDescriptor();
-		}
-
-		int descriptionSize = savefile->readSint16LE();
-		char* description = new char[descriptionSize];
-		savefile->read(description, descriptionSize);
-		SaveStateDescriptor desc(slot, description);
-		delete [] description;
-
-		uint32 saveDate = savefile->readUint32LE();
-		int day = (saveDate >> 24) & 0xFF;
-		int month = (saveDate >> 16) & 0xFF;
-		int year = saveDate & 0xFFFF;
-		desc.setSaveDate(year, month, day);
-
-		uint16 saveTime = savefile->readUint16LE();
-		int hour = (saveTime >> 8) & 0xFF;
-		int minutes = saveTime & 0xFF;
-		desc.setSaveTime(hour, minutes);
-
-		uint32 playTime =savefile->readUint32LE();
-		desc.setPlayTime(playTime * 1000);
-
-		if (Graphics::checkThumbnailHeader(*savefile)) {
-			Graphics::Surface *thumbnail;
-			if (!Graphics::loadThumbnail(*savefile, thumbnail)) {
-				delete savefile;
-				return SaveStateDescriptor();
-			}
-			desc.setThumbnail(thumbnail);
-		}
-
-		delete savefile;
-
-		return desc;
-	}
-
-	return SaveStateDescriptor();
-}
-
-
-#if PLUGIN_ENABLED_DYNAMIC(SUPERNOVA2)
-REGISTER_PLUGIN_DYNAMIC(SUPERNOVA2, PLUGIN_TYPE_ENGINE, Supernova2MetaEngine);
-#else
-REGISTER_PLUGIN_STATIC(SUPERNOVA2, PLUGIN_TYPE_ENGINE, Supernova2MetaEngine);
-#endif
diff --git a/engines/supernova2/graphics.cpp b/engines/supernova2/graphics.cpp
deleted file mode 100644
index 0021534..0000000
--- a/engines/supernova2/graphics.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/algorithm.h"
-#include "common/file.h"
-#include "common/stream.h"
-#include "common/system.h"
-#include "common/config-manager.h"
-#include "graphics/palette.h"
-#include "graphics/surface.h"
-
-#include "supernova2/graphics.h"
-#include "supernova2/ms2_def.h"
-#include "supernova2/screen.h"
-#include "supernova2/supernova2.h"
-
-namespace Supernova2 {
-
-MS2Image::MS2Image() {
-	_palette = nullptr;
-	_encodedImage = nullptr;
-	_filenumber = -1;
-	_pitch = 0;
-	_numSections = 0;
-	_numClickFields = 0;
-
-	for (int i = 0; i < kMaxSections; ++i) {
-		_section[i].x1 = 0;
-		_section[i].x2 = 0;
-		_section[i].y1 = 0;
-		_section[i].y2 = 0;
-		_section[i].next = 0;
-		_section[i].addressLow = 0xFFFF;
-		_section[i].addressHigh = 0xFF;
-	}
-
-	for (int i = 0; i < kMaxClickFields; ++i) {
-		_clickField[i].x1 = 0;
-		_clickField[i].x2 = 0;
-		_clickField[i].y1 = 0;
-		_clickField[i].y2 = 0;
-		_clickField[i].next = 0;
-	}
-}
-
-MS2Image::~MS2Image() {
-	destroy();
-}
-
-bool MS2Image::init(int filenumber) {
-	Common::File file;
-	if (!file.open(Common::String::format("ms2_data.%03d", filenumber))) {
-		warning("Image data file ms2_data.%03d could not be read!", filenumber);
-		return false;
-	}
-
-	_filenumber = filenumber;
-	loadStream(file);
-
-	return true;
-}
-
-bool MS2Image::loadFromEngineDataFile() {
-	Common::String name;
-	if (_filenumber == 28)
-		name = "IMG1";
-	else
-		return false;
-
-	Common::String cur_lang = ConfMan.get("language");
-
-	// Note: we don't print any warning or errors here if we cannot find the file
-	// or the format is not as expected. We will get those warning when reading the
-	// strings anyway (actually the engine will even refuse to start).
-	Common::File f;
-	if (!f.open(SUPERNOVA2_DAT))
-		return false;
-
-	char id[5], lang[5];
-	id[4] = lang[4] = '\0';
-	f.read(id, 3);
-	if (strncmp(id, "MS2", 3) != 0)
-		return false;
-	int version = f.readByte();
-	if (version != SUPERNOVA2_DAT_VERSION)
-		return false;
-
-	while (!f.eos()) {
-		f.read(id, 4);
-		f.read(lang, 4);
-		uint32 size = f.readUint32LE();
-		if (f.eos())
-			break;
-		if (name == id && cur_lang == lang) {
-			return f.read(_encodedImage, size) == size;
-		} else
-			f.skip(size);
-	}
-
-	return false;
-}
-
-bool MS2Image::loadStream(Common::SeekableReadStream &stream) {
-	destroy();
-
-	uint size = 0;
-	size  = (stream.readUint16LE() + 0xF) >> 4;
-	size |= (stream.readUint16LE() & 0xF) << 12;
-	size += 0x70;    // zus_paragraph
-	size *= 16;      // a paragraph is 16 bytes
-	_encodedImage = new byte[size];
-
-	_palette = new byte[717];
-	g_system->getPaletteManager()->grabPalette(_palette, 16, 239);
-
-	byte pal_diff;
-	byte flag = stream.readByte();
-	if (flag == 0) {
-		pal_diff = 0;
-		_palette[141] = 0xE0;
-		_palette[142] = 0xE0;
-		_palette[143] = 0xE0;
-	} else {
-		pal_diff = 1;
-		for (int i = flag * 3; i != 0; --i) {
-			_palette[717 - i] = stream.readByte() << 2;
-		}
-	}
-
-	_numSections = stream.readByte();
-	for (uint i = 0; i < kMaxSections; ++i) {
-		_section[i].addressHigh = 0xff;
-		_section[i].addressLow = 0xffff;
-		_section[i].x2 = 0;
-		_section[i].next = 0;
-	}
-	for (int i = 0; i < _numSections; ++i) {
-		_section[i].x1 = stream.readUint16LE();
-		_section[i].x2 = stream.readUint16LE();
-		_section[i].y1 = stream.readByte();
-		_section[i].y2 = stream.readByte();
-		_section[i].next = stream.readByte();
-		_section[i].addressLow = stream.readUint16LE();
-		_section[i].addressHigh = stream.readByte();
-	}
-
-	_numClickFields = stream.readByte();
-	for (int i = 0; i < _numClickFields; ++i) {
-		_clickField[i].x1 = stream.readUint16LE();
-		_clickField[i].x2 = stream.readUint16LE();
-		_clickField[i].y1 = stream.readByte();
-		_clickField[i].y2 = stream.readByte();
-		_clickField[i].next = stream.readByte();
-	}
-	for (int i = _numClickFields; i < kMaxClickFields; ++i) {
-		_clickField[i].x1 = 0;
-		_clickField[i].x2 = 0;
-		_clickField[i].y1 = 0;
-		_clickField[i].y2 = 0;
-		_clickField[i].next = 0;
-	}
-
-	// Images may be in the engine data file. So first try to read
-	// it from there.
-	if (!loadFromEngineDataFile()) {
-		// Load the image from the stream
-		byte zwCodes[256] = {0};
-		byte numRepeat = stream.readByte();
-		byte numZw = stream.readByte();
-		stream.read(zwCodes, numZw);
-		numZw += numRepeat;
-
-		byte input = 0;
-		uint i = 0;
-
-		while (stream.read(&input, 1)) {
-			if (input < numRepeat) {
-				++input;
-				byte value = stream.readByte();
-				for (--value; input > 0; --input) {
-					_encodedImage[i++] = value;
-				}
-			} else if (input < numZw) {
-				input = zwCodes[input - numRepeat];
-				--input;
-				_encodedImage[i++] = input;
-				_encodedImage[i++] = input;
-			} else {
-				input -= pal_diff;
-				_encodedImage[i++] = input;
-			}
-		}
-	}
-
-	loadSections();
-
-	return true;
-}
-
-bool MS2Image::loadSections() {
-	bool isPoster = _filenumber == 38;
-	bool isCypheredText = _filenumber == 28 && ConfMan.get("language") == "en";
-	int imageWidth = isPoster || isCypheredText ? 640 : 320;
-	int imageHeight = isPoster || isCypheredText ? 480 : 200;
-	_pitch = imageWidth;
-
-	for (int section = 0; section < _numSections; ++section) {
-		Graphics::Surface *surface = new Graphics::Surface;
-		_sectionSurfaces.push_back(surface);
-		if (isPoster) {
-			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
-			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
-			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
-				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
-			}
-		} else if (isCypheredText) {
-			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
-			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
-			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
-				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite44 : kColorBlack;
-			}
-		} else {
-
-			uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;
-			if (offset == kInvalidAddress || _section[section].x2 == 0) {
-				return false;
-			}
-			int width = _section[section].x2 - _section[section].x1 + 1;
-			int height = _section[section].y2 - _section[section].y1 + 1;
-			surface->create(width, height, g_system->getScreenFormat());
-			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
-			Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels);
-		}
-	}
-
-	return true;
-}
-
-void MS2Image::destroy() {
-	if (_palette) {
-		delete[] _palette;
-		_palette = nullptr;
-	}
-	if (_encodedImage) {
-		delete[] _encodedImage;
-		_encodedImage = nullptr;
-	}
-	for (Common::Array<Graphics::Surface *>::iterator it = _sectionSurfaces.begin();
-		 it != _sectionSurfaces.end(); ++it) {
-		(*it)->free();
-	}
-}
-
-}
diff --git a/engines/supernova2/graphics.h b/engines/supernova2/graphics.h
deleted file mode 100644
index 4559900..0000000
--- a/engines/supernova2/graphics.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA2_GRAPHICS_H
-#define SUPERNOVA2_GRAPHICS_H
-
-#include "common/scummsys.h"
-#include "image/image_decoder.h"
-
-namespace Common {
-class SeekableReadStream;
-}
-
-namespace Graphics {
-struct Surface;
-}
-
-namespace Supernova2 {
-
-class MS2Image : public Image::ImageDecoder {
-public:
-	MS2Image();
-	virtual ~MS2Image();
-
-	virtual void destroy();
-	virtual bool loadStream(Common::SeekableReadStream &stream);
-	virtual const Graphics::Surface *getSurface() const { return _sectionSurfaces[0]; }
-	virtual const byte *getPalette() const { return _palette; }
-
-	bool init(int filenumber);
-
-	static const int kMaxSections = 50;
-	static const int kMaxClickFields = 80;
-	static const uint32 kInvalidAddress = 0x00FFFFFF;
-
-	int _filenumber;
-	int _pitch;
-	int _numSections;
-	int _numClickFields;
-	Common::Array<Graphics::Surface *> _sectionSurfaces;
-	byte *_palette;
-	byte *_encodedImage;
-
-	struct Section {
-		int16  x1;
-		int16  x2;
-		byte   y1;
-		byte   y2;
-		byte   next;
-		uint16 addressLow;
-		byte   addressHigh;
-	} _section[kMaxSections];
-
-	struct ClickField {
-		int16  x1;
-		int16  x2;
-		byte   y1;
-		byte   y2;
-		byte   next;
-	} _clickField[kMaxClickFields];
-
-private:
-	bool loadFromEngineDataFile();
-	bool loadSections();
-};
-
-}
-#endif
diff --git a/engines/supernova2/imageid.h b/engines/supernova2/imageid.h
deleted file mode 100644
index 6a284e0..0000000
--- a/engines/supernova2/imageid.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#ifndef SUPERNOVA2_IMAGEID_H
-#define SUPERNOVA2_IMAGEID_H
-
-namespace Supernova2 {
-
-enum ImageId {
-};
-
-}
-
-#endif
diff --git a/engines/supernova2/module.mk b/engines/supernova2/module.mk
deleted file mode 100644
index 7135c9c..0000000
--- a/engines/supernova2/module.mk
+++ /dev/null
@@ -1,23 +0,0 @@
-MODULE := engines/supernova2
-
-MODULE_OBJS := \
-	detection.o \
-	state.o \
-	graphics.o \
-	resman.o \
-	rooms.o \
-	screen.o \
-	console.o \
-	sound.o \
-	supernova2.o
-
-MODULE_DIRS += \
-	engines/supernova2
-
-# This module can be built as a plugin
-ifeq ($(ENABLE_SUPERNOVA2), DYNAMIC_PLUGIN)
-PLUGIN := 1
-endif
-
-# Include common rules
-include $(srcdir)/rules.mk
diff --git a/engines/supernova2/ms2_def.h b/engines/supernova2/ms2_def.h
deleted file mode 100644
index c51d72d..0000000
--- a/engines/supernova2/ms2_def.h
+++ /dev/null
@@ -1,329 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA2_MS2_DEF_H
-#define SUPERNOVA2_MS2_DEF_H
-
-#include "common/scummsys.h"
-
-namespace Supernova2 {
-
-const int kTextSpeed[] = {19, 14, 10, 7, 4};
-const int kMsecPerTick = 55;
-
-const int kMaxSection = 40;
-const int kMaxDialog = 2;
-const int kMaxObject = 30;
-const int kMaxCarry = 30;
-
-const int kSleepAutosaveSlot = 999;
-
-const byte kShownFalse = 0;
-const byte kShownTrue = 1;
-
-enum MessagePosition {
-	kMessageNormal,
-	kMessageLeft,
-	kMessageRight,
-	kMessageCenter,
-	kMessageTop
-};
-
-enum ObjectType {
-	NULLTYPE    =      0,
-	TAKE        =      1,
-	OPENABLE    =      2,
-	OPENED      =      4,
-	CLOSED      =      8,
-	EXIT        =     16,
-	PRESS       =     32,
-	COMBINABLE  =     64,
-	CARRIED     =    128,
-	UNNECESSARY =    256,
-	WORN        =    512,
-	TALK        =   1024,
-	OCCUPIED    =   2048,
-	CAUGHT      =   4096
-};
-typedef uint16 ObjectTypes;
-
-enum Action {
-	ACTION_WALK,
-	ACTION_LOOK,
-	ACTION_TAKE,
-	ACTION_OPEN,
-	ACTION_CLOSE,
-	ACTION_PRESS,
-	ACTION_PULL,
-	ACTION_USE,
-	ACTION_TALK,
-	ACTION_GIVE
-};
-
-enum RoomId {
-	INTRO,AIRPORT,TAXISTAND,STREET,GAMES,CABIN,KIOSK,
-	CULTURE_PALACE,CHECKOUT,CITY1,CITY2,ELEVATOR,APARTMENT,SHIP,
-
-	PYRAMID,PYR_ENTRANCE,UPSTAIRS1,DOWNSTAIRS1,
-	BOTTOM_RIGHT_DOOR,BOTTOM_LEFT_DOOR,UPSTAIRS2,DOWNSTAIRS2,
-	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
-	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO_F,TOMATO_N,
-	MONSTER_F,MONSTER1_N,MONSTER2_N,UPSTAIRS3,DOWNSTAIRS3,
-	LCORRIDOR1,LCORRIDOR2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
-	BST_DOOR,HALL,COFFIN_ROOM,MASK,
-
-	MUSEUM,MUS_ENTRANCE,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
-	MUS9,MUS10,MUS11,MUS_ROUND,
-	MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,
-	NUMROOMS,NULLROOM
-};
-
-enum ObjectId {
-	INVALIDOBJECT = -1,
-	NULLOBJECT = 0,
-	TAXI=1,WALLET,TRANSMITTER,KNIFE,ROD,OCCUPIED_CABIN,MONEY,
-	SLOT1,CHAIR,CORRIDOR,G_RIGHT,G_LEFT,PYRA_ENTRANCE,DOOR,BUTTON,
-	PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7,
-	PART8,PART9,PART10,PART11,PART12,PART13,PART14,PART15,
-	TKNIFE,ROPE,NOTE,MOUTH,
-	HOLE1,HOLE2,HOLE3,HOLE4,HOLE5,HOLE6,HOLE7,HOLE8,HOLE9,HOLE10,
-	HOLE11,HOLE12,HOLE13,HOLE14,HOLE15,HOLE16,HOLE17,HOLE18,HOLE19,HOLE20,
-	HOLE21,HOLE22,HOLE23,HOLE24,HOLE25,SIGN,
-	SLOT,HOLE,STONES,
-	BST1,BST2,BST3,BST4,BST5,BST6,BST7,BST8,
-	BST9,BST10,BST11,BST12,BST13,BST14,BST15,BST16,
-	COFFIN,SUN,MONSTER,EYE,EYE1,EYE2,L_BALL,R_BALL,
-	PRIZE,REAR_STREET,
-	BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXICON,PLANT,SNAKE,
-	CUP,JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
-	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
-	SCRIBBLE1,SCRIBBLE2,BELL,KEYPAD,DOOR_L,DOOR_R,ID_CARD,
-	MAGNET,UNDER_BED,KEY,HATCH,CABINET,DISCMAN,
-	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
-	ENCRYPTED_DOOR,ALARM_SYSTEM,MUS_STREET,BIG_DOOR,MUSIC_SYSTEM,
-	HANDLE,SWITCH,DOOR_SWITCH,SUIT,CABLE,RCABLE,
-	MUSCARD,HEAD, DISPLAY
-};
-
-enum StringId {
-	kNoString = -1,
-kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
-kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
-kStringConversationEnd, kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen,
-kStringStatusCommandClose, kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk,
-kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kString23, kString24,
-kString25, kString26, kString27, kStringTextSpeed, kStringLeaveGame,
-kString30, kString31, kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3,
-kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8,
-kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
-kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
-kStringOutro1, kStringOutro2, kStringOutro3, kStringOutro4, kStringOutro5,
-kStringShout1, kStringShout2, kStringShout3, kStringShout4, kStringShout5,
-kStringShout6, kStringShout7, kStringShout8, kStringShout9, kStringShout10,
-kStringShout11, kStringShout12, kStringShout13, kStringShout14, kStringShout15,
-kStringMuseum8, kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15,
-kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14,
-kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
-kStringMuseum23, kStringMuseum24, kStringMuseum17, kStringMuseum18, kStringMuseum19,
-kStringMuseum20, kStringMuseum21, kStringMuseum22, kStringDinosaur, kStringDinosaurDescription,
-kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
-kStringMainEntrance, kStringCorridor, kStringDinosaurDescription2, kStringDinosaurHead, kStringDinosaurHeadDescription,
-kStringAlarmSystem, kStringSuctionCup, kStringWall, kStringOpening, kStringLetter,
-kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
-kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
-kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
-kStringPyramid12, kStringPyramid13, kStringPyramid14, kStringPyramid15, kStringPyramid17,
-kStringPyramid18, kStringPyramid19, kStringDirection1, kStringDirection2, kStringDirection3,
-kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
-kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
-kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
-kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
-kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
-kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
-kStringOpeningDescription3, kStringStones, kStringPlate, kStringCoffin, kStringExit,
-kStringCreepy, kStringToothbrush, kStringToothbrushDescription1, kStringToothpaste, kStringBall,
-kStringBallDescription, kStringEye, kStringEyeDescription, kStringDefaultDescription, kStringLooksMetal,
-kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
-kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
-kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD,
-kStringChipEmpty, kStringListeningToCD, kStringNoChip, kStringTipsy, kStringXa,
-kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
-kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
-kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
-kStringOnlyShop, kStringCabinOccupiedSay, kStringTakeMoney, kStringAlreadyPaid, kStringNoMoney,
-kStringPay10Xa, kStringWillPassOut, kStringRest, kStringCypher, kStringWillTakeIt,
-kStringTooExpensive, kStringWouldBuy, kStringMeHorstHummel, kStringHaveMusicChip, kStringGreatMask,
-kStringThreeYears, kStringStrongDrink, kStringMusicDevice, kStringArtusToothbrush, kStringSellInBulk,
-kStringRarityBooks, kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words, kStringNotSale,
-kStringGaveOne, kStringExcited, kStringFromGame, kStringRobust, kStringCheapSwill,
-kStringStickers, kStringDishes, kStringUgly, kStringSellsWell, kStringThatCosts,
-kStringTakeALook, kStringNonsense, kStringImSorry, kStringGoodEvening, kStringHello,
-kStringScaredMe, kStringHowSo, kStringDisguise, kStringWhatDisguise, kStringStopPretending,
-kStringYouDisguised, kStringIAmHorstHummel, kStringGiveItUp, kStringGestures, kStringMovesDifferently,
-kStringHeIsRobot, kStringYouAreCrazy, kStringYouIdiot, kStringShutUp, kStringKnife,
-kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription, kStringSuctionCupDescription,
-kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard,
-kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kStringVehicle,
-kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWalletDescription, kStringDevice,
-kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription,
-kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost, kStringRailing,
-kStringPoster, kStringPosterDescription, kStringCabin, kStringCabinFree, kStringCabinOccupied,
-kStringFeet, kStringFeetDescription, kStringHood, kStringHoodDescription, kString400Xa,
-kString10Xa, kStringSlotDescription1, kStringSlotDescription2, kStringChair, kStringChairDescription,
-kStringScribble, kStringFace, kStringFaceDescription, kStringBooks, kStringDictionary,
-kStringPlant, kStringMask, kStringSnake, kStringCup, kStringJoystick,
-kStringToothbrushDescription, kStringMusic, kStringMusicDescription, kStringBottle, kStringBottleDescription,
-kStringBox, kStringSeller, kStringWhat, kStringNotInformed, kStringHorstHummel,
-kStringNiceWeather, kStringTellTicket, kStringHereIsXa, kString500Xa, kString1000Xa,
-kString5000Xa, kString10000Xa, kStringThankYou, kStringWhatYouOffer, kStringHello2,
-kStringWhatYouWant, kStringWhoAreYou, kStringHorstHummel2, kStringNeverHeard, kStringYouDontKnow,
-kStringImOnTV, kStringIDontKnow, kStringFunny, kStringAha, kStringICan,
-kStringFromWhom, kStringCost, kStringAsYouSay, kStringGetCard, kStringOnlyParticipation,
-kStringWhatForIt, kStringMakeOffer, kStringGoodOffer, kStringGiveCard, kStringIdiot,
-kStringCheckout1, kStringCheckout2, kStringCheckout3, kStringYes, kStringNo,
-kStringCheckout4, kStringCheckout5, kStringCheckout6, kStringCheckout7, kStringCheckout8,
-kStringCheckout9, kStringCheckout10, kStringCheckout11, kStringCheckout12, kStringCheckout13,
-kStringCheckout14, kStringCheckout15, kStringCheckout16, kStringCheckout17, kStringCheckout18,
-kStringCheckout19, kStringCheckout20, kStringCheckout21, kStringCheckout22, kStringCheckout23,
-kStringCheckout24, kStringCheckout25, kStringCheckout26, kStringCheckout27, kStringCheckout28,
-kStringCheckout29, kStringCheckout30, kStringCheckout31, kStringCheckout32, kStringCheckout33,
-kStringCheckout34, kStringCheckout35, kStringCheckout36, kStringCheckout37, kStringCheckout38,
-kStringCheckout39, kStringCheckout40, kStringCheckout41, kStringCheckout42, kStringCheckout43,
-kStringCheckout44, kStringCheckout45, kStringCheckout46, kStringCheckout47, kStringCheckout48,
-kStringCheckout49, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon,
-kStringIWillProof, kStringIWillPerform, kStringAppearance32, kStringAppearance1, kStringAppearance2,
-kStringAppearance3, kStringAppearance4, kStringAppearance5, kStringAppearance6, kStringAppearance7,
-kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11, kStringAppearance12,
-kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17,
-kStringAppearance18, kStringAppearance19, kStringAppearance20, kStringAppearance21, kStringAppearance22,
-kStringAppearance23, kStringAppearance24, kStringAppearance25, kStringAppearance26, kStringAppearance27,
-kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kStringElevator1,
-kStringElevator2, kStringElevator3, kStringElevator4, kStringElevator5, kStringElevator6,
-kStringElevator7, kStringElevator8, kStringElevator9, kStringElevator10, kStringElevator11,
-kStringElevator12, kStringElevator13, kStringElevator14, kStringElevator15, kStringElevator16,
-kStringElevator17, kStringElevator18, kStringElevator19, kStringElevator20, kStringElevator21,
-kStringElevator22, kStringElevator23, kStringElevator24, kStringElevator25, kStringElevator26,
-kStringElevator27, kStringElevator28, kStringElevator29, kStringElevator30, kStringElevator31,
-kStringElevator32, kStringElevator33, kStringElevator34, kStringElevator35, kStringElevator36,
-kStringElevator37, kStringElevator38, kStringElevator39, kStringElevator40, kStringElevator41,
-kStringElevator42, kStringElevator43, kStringElevator44, kStringElevator45, kStringElevator46,
-kStringElevator47, kStringElevator48, kStringElevator49, kStringElevator50, kStringElevator51,
-kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStringElevator56,
-kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
-kStringElevator62, kStringElevator63, kStringElevator64, kStringElevator65, kStringApartment1,
-kStringApartment2, kStringApartment3, kStringApartment4, kStringApartment5, kStringApartment6,
-kStringApartment7, kStringApartment8, kStringShip0, kStringShip1, kStringShip2,
-kStringShip3, kStringShip4, kStringShip5, kStringShip6, kStringShip7,
-kStringShip8, kStringShip9, kStringShip10, kStringShip11, kStringShip12,
-kStringShip13, kStringShip14, kStringShip15, kStringShip16, kStringShip17,
-kStringShip18, kStringShip19, kStringFascinating, kStringTaxis, kStringTaxisDescription,
-kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
-kStringSign3Description, kStringSign4Description, kStringBell, kStringDisplay, kStringKeypad,
-kStringKeypadDescription, kStringChip, kStringChipDescription, kStringHatch, kStringHatchDescription,
-kStringMusicSystem, kStringMusicSystemDescription, kStringSpeakers, kStringSpeakersDescription, kStringPencils,
-kStringPencilsDescription, kStringMetalBlocks, kStringMetalBlocksDescription, kStringImage, kStringImageDescription,
-kStringCabinet, kStringCabinetDescription, kStringElevator, kStringUnderBed, kStringUnderBedDescription,
-kStringKey, kStringKeyDescription, kStringSwitch, kStringHandle, kStringHatch2,
-kStringSpaceSuit, kStringSpaceSuitDescription, kStringCable, kStringCableDescription1, kStringCableDescription2,
-kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
-kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
-kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
-kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
-kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14, 
-kStringMonsterDescription, kStringPyramid16, kStringMuseum11, kStringDialogSeparator
-};
-
-ObjectType operator|(ObjectType a, ObjectType b);
-ObjectType operator&(ObjectType a, ObjectType b);
-ObjectType operator^(ObjectType a, ObjectType b);
-ObjectType &operator|=(ObjectType &a, ObjectType b);
-ObjectType &operator&=(ObjectType &a, ObjectType b);
-ObjectType &operator^=(ObjectType &a, ObjectType b);
-
-struct Object {
-	Object()
-		: _name(kNoString)
-		, _description(kStringDefaultDescription)
-		, _id(INVALIDOBJECT)
-		, _roomId(NULLROOM)
-		, _type(NULLTYPE)
-		, _click(0)
-		, _click2(0)
-		, _section(0)
-		, _exitRoom(NULLROOM)
-		, _direction(0)
-	{}
-	Object(byte roomId, StringId name, StringId description, ObjectId id, ObjectType type,
-		   byte click, byte click2, byte section = 0, RoomId exitRoom = NULLROOM, byte direction = 0)
-		: _name(name)
-		, _description(description)
-		, _id(id)
-		, _roomId(roomId)
-		, _type(type)
-		, _click(click)
-		, _click2(click2)
-		, _section(section)
-		, _exitRoom(exitRoom)
-		, _direction(direction)
-	{}
-
-	void resetProperty(ObjectType type = NULLTYPE) {
-		_type = type;
-	}
-
-	void setProperty(ObjectType type) {
-		_type |= type;
-	}
-
-	void disableProperty(ObjectType type) {
-		_type &= ~type;
-	}
-
-	bool hasProperty(ObjectType type) const {
-		return _type & type;
-	}
-
-	static bool combine(Object &obj1, Object &obj2, ObjectId id1, ObjectId id2) {
-		if (obj1.hasProperty(COMBINABLE))
-			return (((obj1._id == id1) && (obj2._id == id2)) ||
-					((obj1._id == id2) && (obj2._id == id1)));
-		else
-			return false;
-	}
-
-	byte _roomId;
-	StringId _name;
-	StringId _description;
-	ObjectId _id;
-	ObjectTypes _type;
-	byte _click;
-	byte _click2;
-	byte _section;
-	RoomId _exitRoom;
-	byte _direction;
-};
-
-#define ticksToMsec(x) (x * kMsecPerTick)
-
-}
-
-#endif // SUPERNOVA2_MS2_DEF_H
diff --git a/engines/supernova2/resman.cpp b/engines/supernova2/resman.cpp
deleted file mode 100644
index 0cde229..0000000
--- a/engines/supernova2/resman.cpp
+++ /dev/null
@@ -1,446 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#include "audio/audiostream.h"
-#include "audio/decoders/raw.h"
-#include "audio/mixer.h"
-#include "audio/mods/protracker.h"
-#include "common/memstream.h"
-#include "common/system.h"
-#include "graphics/cursorman.h"
-#include "graphics/palette.h"
-
-#include "supernova2/graphics.h"
-#include "supernova2/resman.h"
-#include "supernova2/screen.h"
-#include "supernova2/supernova2.h"
-
-namespace Supernova2 {
-
-struct AudioInfo {
-	int _filenumber;
-	int _offsetStart;
-	int _offsetEnd;
-};
-
-static Common::MemoryReadStream *convertToMod(const char *filename, int version = 2);
-
-static const AudioInfo audioInfo[kAudioNumSamples] = {
-	{55,     18230,    -1},
-	{47,     0,     16010},
-	{47,     16010, 17020},
-	{49,     8010,     -1},
-	{49,     0,      8010},
-	{53,     30020,    -1},
-	{55,     7010,  17020},
-	{55,     0,      7010},
-	{53,     5010,  30020},
-	{55,     18230,    -1},
-	{55,     17020, 18230},
-	{53,     0,      5010},
-	{47,     17020,    -1},
-	{51,     9020,     -1},
-	{51,     0,      6010},
-	{50,     0,        -1},
-	{51,     6010,   9020},
-	{54,     0,        -1},
-	{48,     0,        -1}
-};
-
-static const byte mouseNormal[64] = {
-	0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
-	0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
-	0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
-	0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
-
-	0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
-	0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
-	0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
-	0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
-};
-
-static const byte mouseWait[64] = {
-	0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
-	0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
-	0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
-	0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
-
-	0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
-	0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
-	0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
-	0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
-};
-
-
-ResourceManager::ResourceManager()
-	: _audioRate(11931) {
-	initSoundFiles();
-	initGraphics();
-}
-
-void ResourceManager::initSoundFiles() {
-	// Sound
-	// Note:
-	//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
-	//     where SS SS (LE uint16) is the size of the sound sample + 2
-	//   - samples end with a footer of 4 bytes: 00 00
-	// Skip those in the buffer
-	Common::File file;
-
-	for (int i = 0; i < kAudioNumSamples; ++i) {
-		if (!file.open(Common::String::format("ms2_data.%03d", audioInfo[i]._filenumber))) {
-			error("File %s could not be read!", file.getName());
-		}
-
-		int length = 0;
-		byte *buffer = nullptr;
-
-		if (audioInfo[i]._offsetEnd == -1) {
-			file.seek(0, SEEK_END);
-			length = file.pos() - audioInfo[i]._offsetStart - 10;
-		} else {
-			length = audioInfo[i]._offsetEnd - audioInfo[i]._offsetStart - 10;
-		}
-		buffer = new byte[length];
-		file.seek(audioInfo[i]._offsetStart + 6);
-		file.read(buffer, length);
-		file.close();
-
-		byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
-		_soundSamples[i].reset(Audio::makeRawStream(buffer, length, _audioRate,
-													streamFlag, DisposeAfterUse::YES));
-	}
-	initSiren();
-
-	_musicIntroBuffer.reset(convertToMod("ms2_data.052"));
-	_musicMadMonkeysBuffer.reset(convertToMod("ms2_data.056"));
-}
-
-void ResourceManager::initGraphics() {
-	Screen::initPalette();
-	initCursorGraphics();
-	initImages();
-}
-
-void ResourceManager::initCursorGraphics() {
-	const uint16 *bufferNormal = reinterpret_cast<const uint16 *>(mouseNormal);
-	const uint16 *bufferWait = reinterpret_cast<const uint16 *>(mouseWait);
-	for (uint i = 0; i < sizeof(mouseNormal) / 4; ++i) {
-		for (uint bit = 0; bit < 16; ++bit) {
-			uint mask = 0x8000 >> bit;
-			uint bitIndex = i * 16 + bit;
-
-			_cursorNormal[bitIndex] = (READ_LE_UINT16(bufferNormal + i) & mask) ?
-										 kColorCursorTransparent : kColorBlack;
-			if (READ_LE_UINT16(bufferNormal + i + 16) & mask)
-				_cursorNormal[bitIndex] = kColorLightRed;
-
-			_cursorWait[bitIndex] = (READ_LE_UINT16(bufferWait + i) & mask) ?
-									   kColorCursorTransparent : kColorBlack;
-			if (READ_LE_UINT16(bufferWait + i + 16) & mask)
-				_cursorWait[bitIndex] = kColorLightRed;
-		}
-	}
-}
-
-void ResourceManager::initImages() {
-	for (int i = 0; i < kNumImageFiles; ++i) {
-		if (!_images[i].init(i))
-			error("Failed reading image file ms2_data.%03d", i);
-	}
-}
-
-Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
-	Audio::SeekableAudioStream *stream = _soundSamples[index].get();
-	stream->rewind();
-
-	return stream;
-}
-
-Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
-	switch (index) {
-	case kMusicIntro:
-		_musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get()));
-		return _musicIntro.get();
-	case kMusicMadMonkeys:
-		_musicMadMonkeys.reset(Audio::makeProtrackerStream(_musicMadMonkeysBuffer.get()));
-		return _musicMadMonkeys.get();
-	default:
-		error("Invalid music constant in playAudio()");
-	}
-}
-
-Audio::AudioStream *ResourceManager::getSirenStream() {
-	return _sirenStream.get();
-}
-
-MS2Image *ResourceManager::getImage(int filenumber) {
-	if (filenumber < 47)
-		return &_images[filenumber];
-	else
-		return nullptr;
-}
-
-// Generate a tone which minimal length is the length and ends at the end
-// of sine period
-// NOTE: Size of the SineTable has to be the same as audioRate and a multiple of 4
-byte *ResourceManager::generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table) {
-	int i = 0;
-
-	// Make sure length is a multiple of audioRate / frequency to end on a full sine wave and not in the middle.
-	// Also the length we have is a minimum length, so only increase it.
-	int r = 1 + (length - 1) * frequency / audioRate;
-	length = (1 + 2 * r * audioRate / frequency) / 2;
-	for(; i < length; i++) {
-		buffer[i] = (byte)
-			((table.at((i * frequency) % audioRate) * 127) + 127);
-	}
-	return buffer + length;
-}
-
-// Tones with frequencies between 1500 Hz and 1800 Hz, frequencies go up and down
-// with a step of 10 Hz.
-void ResourceManager::initSiren() {
-	int audioRate = 44000;
-	int length = audioRate / 90; // minimal length of each tone
-
-	// * 60 for the minimal length, another 20 * length as a spare, for longer tones
-	byte *buffer = new byte[length * 80]; 
-	byte *pBuffer = buffer;
-	Common::SineTable table(audioRate);
-
-	for (int i = 0; i < 30; i++)
-		pBuffer = generateTone(pBuffer, 1800 - i * 10, length, audioRate, table);
-
-	for (int i = 0; i < 30; i++)
-		pBuffer = generateTone(pBuffer, 1500 + i * 10, length, audioRate, table);
-
-	byte streamFlag = Audio::FLAG_UNSIGNED;
-
-	_sirenStream.reset(Audio::makeLoopingAudioStream(
-			Audio::makeRawStream(buffer, pBuffer - buffer, audioRate,
-									streamFlag, DisposeAfterUse::YES), 0));
-}
-
-static Common::MemoryReadStream *convertToMod(const char *filename, int version) {
-	// MS2 format
-	struct {
-		uint16 seg;
-		uint16 start;
-		uint16 end;
-		uint16 loopStart;
-		uint16 loopEnd;
-		char volume;
-		char dummy[5];
-	} instr2[22];
-	int nbInstr2; // 22 for version1, 15 for version 2
-	int16 songLength;
-	char arrangement[128];
-	int16 patternNumber;
-	int32 note2[28][64][4];
-
-	nbInstr2 = ((version == 1) ? 22 : 15);
-
-	Common::File msnFile;
-	msnFile.open(filename);
-	if (!msnFile.isOpen()) {
-		warning("Data file '%s' not found", msnFile.getName());
-		return nullptr;
-	}
-
-	for (int i = 0 ; i < nbInstr2 ; ++i) {
-		instr2[i].seg = msnFile.readUint16LE();
-		instr2[i].start = msnFile.readUint16LE();
-		instr2[i].end = msnFile.readUint16LE();
-		instr2[i].loopStart = msnFile.readUint16LE();
-		instr2[i].loopEnd = msnFile.readUint16LE();
-		instr2[i].volume = msnFile.readByte();
-		msnFile.read(instr2[i].dummy, 5);
-	}
-	songLength = msnFile.readSint16LE();
-	msnFile.read(arrangement, 128);
-	patternNumber = msnFile.readSint16LE();
-	for (int p = 0 ; p < patternNumber ; ++p) {
-		for (int n = 0 ; n < 64 ; ++n) {
-			for (int k = 0 ; k < 4 ; ++k) {
-				note2[p][n][k] = msnFile.readSint32LE();
-			}
-		}
-	}
-
-	// MOD format 
-	struct {
-		char iname[22];
-		uint16 length;
-		char finetune;
-		char volume;
-		uint16 loopStart;
-		uint16 loopLength;
-	} instr[31];
-	int32 note[28][64][4];
-
-	// We can't recover some MOD effects since several of them are mapped to 0.
-	// Assume the MSN effect of value 0 is Arpeggio (MOD effect of value 0).
-	const char invConvEff[8] = {0, 1, 2, 3, 10, 12, 13 ,15};
-
-	// Reminder from convertToMsn
-	// 31 30 29 28 27 26 25 24 - 23 22 21 20 19 18 17 16 - 15 14 13 12 11 10 09 08 - 07 06 05 04 03 02 01 00
-	//  h  h  h  h  g  g  g  g    f  f  f  f  e  e  e  e    d  d  d  d  c  c  c  c    b  b  b  b  a  a  a  a
-	//
-	// MSN:
-	//  hhhh             (4 bits) Cleared to 0
-	//  dddd c           (5 bits) Sample index   | after mapping through convInstr
-	//        ccc        (3 bits) Effect type    | after mapping through convEff
-	//  bbbb aaaa        (8 bits) Effect value   | unmodified
-	//  gggg ffff eeee  (12 bits) Sample period  | unmodified
-	//
-	// MS2:
-	//  hhhh             (4 bits) Cleared to 0
-	//  dddd             (4 bits) Sample index   | after mapping through convInstr
-	//  cccc             (4 bits) Effect type    | unmodified
-	//  bbbb aaaa        (8 bits) Effect value   | unmodified
-	//  gggg ffff eeee  (12 bits) Sample period  | transformed (0xE000 / p) - 256
-	//
-	// MOD:
-	//  hhhh dddd        (8 bits) Sample index
-	//  cccc             (4 bits) Effect type for this channel/division
-	//  bbbb aaaa        (8 bits) Effect value
-	//  gggg ffff eeee  (12 bits) Sample period
-
-	// Can we recover the instruments mapping? I don't think so as part of the original instrument index is cleared.
-	// And it doesn't really matter as long as we are consistent.
-	// However we need to make sure 31 (or 15 in MS2) is mapped to 0 in MOD.
-	// We just add 1 to all other values, and this means a 1 <-> 1 mapping for the instruments
-	for (int p = 0; p < patternNumber; ++p) {
-		for (int n = 0; n < 64; ++n) {
-			for (int k = 0; k < 4; ++k) {
-				int32* l = &(note[p][n][k]);
-				*l = note2[p][n][k];
-				int32 i = 0;
-				if (nbInstr2 == 22) { // version 1
-					i = ((*l & 0xF800) >> 11);
-					int32 e = ((*l & 0x0700) >> 8);
-					int32 e1 = invConvEff[e];
-					*l &= 0x0FFF00FF;
-					*l |= (e1 << 8);
-				} else { // version 2
-					int32 h = (*l >> 16);
-					i = ((*l & 0xF000) >> 12);
-					*l &= 0x00000FFF;
-					if (h)
-						h = 0xE000 / (h + 256);
-					*l |= (h << 16);
-					if (i == 15)
-						i = 31;
-				}
-
-				// Add back index in note
-				if (i != 31) {
-					++i;
-					*l |= ((i & 0x0F) << 12);
-					*l |= ((i & 0xF0) << 24);
-				}
-			}
-		}
-	}
-
-	for (int i = 0; i < 31; ++i) {
-		// iname is not stored in the mod file. Just set it to 'instrument#'
-		// finetune is not stored either. Assume 0.
-		memset(instr[i].iname, 0, 22);
-		sprintf(instr[i].iname, "instrument%d", i+1);
-		instr[i].length = 0;
-		instr[i].finetune = 0;
-		instr[i].volume = 0;
-		instr[i].loopStart = 0;
-		instr[i].loopLength = 0;
-
-		if (i < nbInstr2) {
-			instr[i].length = ((instr2[i].end - instr2[i].start) >> 1);
-			instr[i].loopStart = ((instr2[i].loopStart - instr2[i].start) >> 1);
-			instr[i].loopLength = (( instr2[i].loopEnd - instr2[i].loopStart) >> 1);
-			instr[i].volume = instr2[i].volume;
-		}
-	}
-
-	// The ciaaSpeed is kind of useless and not present in the MSN file.
-	// Traditionally 0x78 in SoundTracker. Was used in NoiseTracker as a restart point.
-	// ProTracker uses 0x7F. FastTracker uses it as a restart point, whereas ScreamTracker 3 uses 0x7F like ProTracker.
-	// You can use this to roughly detect which tracker made a MOD, and detection gets more accurate for more obscure MOD types.
-	char ciaaSpeed = 0x7F;
-
-	// The mark cannot be recovered either. Since we have 4 channels and 31 instrument it can be either ID='M.K.' or ID='4CHN'.
-	// Assume 'M.K.'
-	const char mark[4] = { 'M', '.', 'K', '.' };
-
-	Common::MemoryWriteStreamDynamic buffer(DisposeAfterUse::NO);
-
-	buffer.write(msnFile.getName(), 19);
-	buffer.writeByte(0);
-
-	for (int i = 0 ; i < 31 ; ++i) {
-		buffer.write(instr[i].iname, 22);
-		buffer.writeUint16BE(instr[i].length);
-		buffer.writeByte(instr[i].finetune);
-		buffer.writeByte(instr[i].volume);
-		buffer.writeUint16BE(instr[i].loopStart);
-		buffer.writeUint16BE(instr[i].loopLength);
-	}
-	buffer.writeByte((char)songLength);
-	buffer.writeByte(ciaaSpeed);
-	buffer.write(arrangement, 128);
-	buffer.write(mark, 4);
-
-	for (int p = 0 ; p < patternNumber ; ++p) {
-		for (int n = 0 ; n < 64 ; ++n) {
-			for (int k = 0 ; k < 4 ; ++k) {
-//				buffer.writeUint32BE(*((uint32*)(note[p][n]+k)));
-				buffer.writeSint32BE(note[p][n][k]);
-			}
-		}
-	}
-
-	uint nb;
-	char buf[4096];
-	while ((nb = msnFile.read(buf, 4096)) > 0)
-		buffer.write(buf, nb);
-
-	return new Common::MemoryReadStream(buffer.getData(), buffer.size(), DisposeAfterUse::YES);
-}
-
-int ResourceManager::getAudioRate() {
-	return _audioRate;
-}
-
-const byte *ResourceManager::getCursor(CursorId id) const {
-	switch (id) {
-	case kCursorNormal:
-		return _cursorNormal;
-	case kCursorWait:
-		return _cursorWait;
-	default:
-		return nullptr;
-	}
-}
-
-
-}
diff --git a/engines/supernova2/resman.h b/engines/supernova2/resman.h
deleted file mode 100644
index d3fa460..0000000
--- a/engines/supernova2/resman.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#ifndef SUPERNOVA2_RESOURCES_H
-#define SUPERNOVA2_RESOURCES_H
-
-#include "audio/audiostream.h"
-#include "common/ptr.h"
-#include "common/sinetables.h"
-
-#include "supernova2/graphics.h"
-#include "supernova2/sound.h"
-
-
-namespace Common {
-class MemoryReadStream;
-class SineTable;
-}
-
-namespace Supernova2 {
-
-class ResourceManager {
-public:
-	enum CursorId {
-		kCursorNormal,
-		kCursorWait
-	};
-
-public:
-	static const int kNumImageFiles = 47;
-
-public:
-	ResourceManager();
-
-	Audio::SeekableAudioStream *getSoundStream(AudioId index);
-	Audio::AudioStream *getSoundStream(MusicId index);
-	Audio::AudioStream *getSirenStream();
-	MS2Image *getImage(int filenumber);
-	const byte *getCursor(CursorId id) const;
-	int getAudioRate();
-
-private:
-	void initSoundFiles();
-	void initGraphics();
-	void initCursorGraphics();
-	void initImages();
-	void initSiren();
-	byte *generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table);
-
-private:
-	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
-	Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
-	Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer;
-	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
-	Common::ScopedPtr<Audio::AudioStream> _sirenStream;
-	Common::ScopedPtr<Audio::AudioStream> _musicMadMonkeys;
-	int _audioRate;
-	MS2Image _images[kNumImageFiles];
-	byte _cursorNormal[256];
-	byte _cursorWait[256];
-};
-
-}
-
-#endif
diff --git a/engines/supernova2/rooms.cpp b/engines/supernova2/rooms.cpp
deleted file mode 100644
index 1bec610..0000000
--- a/engines/supernova2/rooms.cpp
+++ /dev/null
@@ -1,4915 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/system.h"
-#include "common/config-manager.h"
-#include "graphics/palette.h"
-#include "graphics/cursorman.h"
-
-#include "supernova2/screen.h"
-#include "supernova2/supernova2.h"
-#include "supernova2/state.h"
-#include "supernova2/rooms.h"
-#include "supernova2/graphics.h"
-
-namespace Supernova2 {
-
-Room::Room() {
-	_seen = false;
-	_fileNumber = 0;
-	_id = NULLROOM;
-	_vm = nullptr;
-	_gm = nullptr;
-
-	for (int i = 0; i < kMaxSection; ++i)
-		_shown[i] = kShownFalse;
-	for (int i = 0; i < kMaxDialog; ++i)
-		_sentenceRemoved[i] = 0;
-}
-
-Room::~Room() {
-}
-
-bool Room::serialize(Common::WriteStream *out) {
-	if (out->err())
-		return false;
-
-	out->writeSint32LE(_id);
-	for (int i = 0; i < kMaxSection; ++i)
-		out->writeByte(_shown[i]);
-	for (int i = 0; i < kMaxDialog ; ++i)
-		out->writeByte(_sentenceRemoved[i]);
-
-	int numObjects = 0;
-	while ((numObjects < kMaxObject) && (_objectState[numObjects]._id != INVALIDOBJECT))
-		++numObjects;
-	out->writeSint32LE(numObjects);
-
-	for (int i = 0; i < numObjects; ++i) {
-		out->writeSint32LE(_objectState[i]._name);
-		out->writeSint32LE(_objectState[i]._description);
-		out->writeByte(_objectState[i]._roomId);
-		out->writeSint32LE(_objectState[i]._id);
-		out->writeSint32LE(_objectState[i]._type);
-		out->writeByte(_objectState[i]._click);
-		out->writeByte(_objectState[i]._click2);
-		out->writeByte(_objectState[i]._section);
-		out->writeSint32LE(_objectState[i]._exitRoom);
-		out->writeByte(_objectState[i]._direction);
-	}
-
-	out->writeByte(_seen);
-
-	return !out->err();
-}
-
-bool Room::deserialize(Common::ReadStream *in, int version) {
-	if (in->err())
-		return false;
-
-	in->readSint32LE();
-
-	for (int i = 0; i < kMaxSection; ++i)
-		_shown[i] = in->readByte();
-
-	// Prior to version 3, _sentenceRemoved was part of _shown (the last two values)
-	// But on the other hand dialog was not implemented anyway, so we don't even try to
-	// recover it.
-	for (int i = 0; i < kMaxDialog ; ++i)
-		_sentenceRemoved[i] = version < 3 ? 0 : in->readByte();
-
-	int numObjects = in->readSint32LE();
-	for (int i = 0; i < numObjects; ++i) {
-		_objectState[i]._name = static_cast<StringId>(in->readSint32LE());
-		_objectState[i]._description = static_cast<StringId>(in->readSint32LE());
-		_objectState[i]._roomId = in->readByte();
-		_objectState[i]._id = static_cast<ObjectId>(in->readSint32LE());
-		_objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
-		_objectState[i]._click = in->readByte();
-		_objectState[i]._click2 = in->readByte();
-		_objectState[i]._section = in->readByte();
-		_objectState[i]._exitRoom = static_cast<RoomId>(in->readSint32LE());
-		_objectState[i]._direction = in->readByte();
-	}
-
-	_seen = in->readByte();
-
-	return !in->err();
-}
-
-bool Room::hasSeen() {
-	return _seen;
-}
-void Room::setRoomSeen(bool seen) {
-	_seen = seen;
-}
-
-int Room::getFileNumber() const {
-	return _fileNumber;
-}
-RoomId Room::getId() const {
-	return _id;
-}
-
-void Room::setSectionVisible(uint section, bool visible) {
-	if (section < kMaxSection)
-		_shown[section] = visible ? kShownTrue : kShownFalse;
-	else
-		_shown[section - 128] = visible ? kShownFalse : kShownTrue;
-}
-
-bool Room::isSectionVisible(uint index) const {
-	return _shown[index] == kShownTrue;
-}
-
-void Room::removeSentenceByMask(int mask, int number) {
-	if (number > 0) {
-		_sentenceRemoved[number - 1] |= mask;
-	}
-}
-
-void Room::removeSentence(int sentence, int number) {
-	if (number > 0)
-		_sentenceRemoved[number - 1] |= (1 << sentence);
-}
-
-void Room::addSentence(int sentence, int number) {
-	if (number > 0)
-		_sentenceRemoved[number - 1] &= ~(1 << sentence);
-}
-
-void Room::addAllSentences(int number) {
-	if (number > 0)
-		_sentenceRemoved[number - 1] = 0;
-}
-
-bool Room::sentenceRemoved(int sentence, int number) {
-	if (number <= 0)
-		return false;
-	return (_sentenceRemoved[number - 1] & (1 << sentence));
-}
-
-bool Room::allSentencesRemoved(int maxSentence, int number) {
-	if (number <= 0)
-		return false;
-	for (int i = 0, flag = 1 ; i < maxSentence ; ++i, flag <<= 1)
-		if (!(_sentenceRemoved[number - 1] & flag))
-			return false;
-	return true;
-}
-
-Object *Room::getObject(uint index) {
-	return &_objectState[index];
-}
-
-void Room::animation() {
-}
-
-void Room::onEntrance() {
-}
-
-bool Room::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Intro::Intro(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = -1;
-	_id = INTRO;
-
-	_objectState[0] = Object(_id, kStringKnife, kStringKnifeDescription, KNIFE, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
-	_objectState[1] = Object(_id, kStringMoney, kStringDefaultDescription, MONEY, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
-	_objectState[2] = Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
-	_objectState[3] = Object(_id, kStringSuctionCup, kStringSuctionCupDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
-	_objectState[4] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
-	_objectState[5] = Object(_id, kStringSpecialCard, kStringSpecialCardDescription, SP_KEYCARD, TAKE | COMBINABLE, 255, 255, 0);
-	_objectState[6] = Object(_id, kStringAlarmCracker, kStringAlarmCrackerDescription, ALARM_CRACKER, TAKE | COMBINABLE, 255, 255, 0);
-	_objectState[7] = Object(_id, kStringDinosaurHead, kStringDefaultDescription, NULLOBJECT, TAKE, 255, 255, 0);
-	_objectState[8] = Object(_id, kStringKeycard, kStringDefaultDescription, MUSCARD, TAKE, 255, 255, 0);
-
-	_introText = 
-		_vm->getGameString(kStringIntro1) + '\0' + 
-		_vm->getGameString(kStringIntro2) + '\0' + 
-		_vm->getGameString(kStringIntro3) + '\0' + 
-		_vm->getGameString(kStringIntro4) + '\0' + 
-		_vm->getGameString(kStringIntro5) + '\0' + 
-		"^Matthias Neef#" + '\0' +
-		"^Sascha Otterbach#" + '\0' +
-		"^Thomas Mazzoni#" + '\0' +
-		"^Matthias Klein#" + '\0' +
-		"^Gerrit Rothmaier#" + '\0' +
-		"^Thomas Hassler#" + '\0' +
-		"^Rene Kach#" + '\0' +
-		'\233' + '\0';
-}
-
-void Intro::onEntrance() {
-	_gm->_guiEnabled = false;
-	_vm->_allowSaveGame = false;
-	_vm->_allowLoadGame = false;
-
-	titleScreen();
-	if (!(thoughts1() && tvDialogue() && thoughts2()))
-		_gm->_rooms[AIRPORT]->setRoomSeen(true);
-	_vm->paletteFadeOut();
-
-	for (int i = 0; i < 3; ++i)
-		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
-
-	_gm->changeRoom(AIRPORT);
-	_gm->_guiEnabled = true;
-	_vm->_allowSaveGame = true;
-	_vm->_allowLoadGame = true;
-}
-
-void Intro::titleScreen() {
-	CursorMan.showMouse(false);
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->_screen->setViewportBrightness(0);
-	_vm->_screen->setGuiBrightness(0);
-	_vm->paletteBrightness();
-	_vm->setCurrentImage(1);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_gm->wait(15);
-	_vm->renderImage(1);
-	_gm->wait(15);
-	_vm->renderImage(2);
-	const Common::String title1 = "V1.02";
-	_vm->_screen->renderText(title1, 295, 190, 3);
-
-	_vm->playSound(kMusicIntro);
-	Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
-	while (!_vm->shouldQuit()) {
-		_gm->updateEvents();
-		marquee.renderCharacter();
-		if (_gm->_mouseClicked || _gm->_keyPressed)
-			break;
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	_vm->stopSound();
-	_vm->paletteFadeOut();
-	CursorMan.showMouse(true);
-}
-
-bool Intro::displayThoughtMessage(StringId id) {
-	Common::KeyCode key = Common::KEYCODE_INVALID;
-	const Common::String& text = _vm->getGameString(id);
-	_vm->renderMessage(text, kMessageNormal);
-	if (_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10, key)) {
-		_vm->removeMessage();
-		return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
-	}
-	_vm->removeMessage();
-	return true;
-}
-
-bool Intro::thoughts1() {
-	if(_vm->shouldQuit())
-		return false;
-
-	_vm->setCurrentImage(41);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-
-	if(!displayThoughtMessage(kStringIntro6))
-		return false;
-
-	if(!displayThoughtMessage(kStringIntro7))
-		return false;
-
-	if(!displayThoughtMessage(kStringIntro8))
-		return false;
-
-	_vm->paletteFadeOut();
-	return true;
-}
-
-bool Intro::thoughts2() {
-	if(_vm->shouldQuit())
-		return false;
-
-	_vm->setCurrentImage(41);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-
-	if(!displayThoughtMessage(kStringIntro9))
-		return false;
-
-	if(!displayThoughtMessage(kStringIntro10))
-		return false;
-
-	if(!displayThoughtMessage(kStringIntro11))
-		return false;
-
-	_vm->paletteFadeOut();
-
-	_vm->setCurrentImage(2);
-	_vm->renderImage(0);
-	_vm->renderImage(1);
-	_vm->paletteFadeIn();
-
-	for (int i = 0; i < 35; i++)
-	{
-		_vm->renderImage((i % 3) + 2);
-		_gm->wait(3);
-	}
-	_vm->paletteFadeOut();
-
-	_vm->setCurrentImage(41);
-	_vm->renderImage(0);
-	_vm->renderImage(1);
-	_vm->paletteFadeIn();
-
-	if(!displayThoughtMessage(kStringIntro12))
-		return false;
-
-	if(!displayThoughtMessage(kStringIntro13))
-		return false;
-
-	if(!displayThoughtMessage(kStringIntro14))
-		return false;
-
-	_vm->paletteFadeOut();
-	return true;
-}
-
-bool Intro::tvDialogue() {
-	if(_vm->shouldQuit())
-		return false;
-
-	_vm->setCurrentImage(39);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_gm->wait(50);
-	_vm->setCurrentImage(40);
-	_vm->renderImage(0);
-	for (int i = 1; i < 11; i++)
-	{
-		_gm->wait(3);
-		_vm->renderImage(i);
-	}
-	_vm->playSound(kAudioIntroDing);
-	_gm->wait(30);
-	_vm->renderImage(11);
-	_vm->playSound(kAudioIntroDing);
-	_gm->wait(60);
-
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->setCurrentImage(42);
-	_vm->renderImage(0);
-
-	if(!_gm->talk(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
-		return false;
-
-	_vm->renderImage(4);
-	_gm->wait(3);
-	_vm->renderImage(6);
-
-	if(!_gm->talk(8, 6, 7, kMessageLeft, kStringIntroTV2))
-		return false;
-	debug("%d", _vm->shouldQuit());
-
-	_vm->renderImage(10);
-
-	if(!_gm->talkRest(8, 6, _gm->_restTime))
-		return false;
-
-	_vm->removeMessage();
-
-	if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV3))
-		return false;
-
-	if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV4))
-		return false;
-
-	_vm->renderImage(10 + 128);
-	_gm->wait(3);
-	_vm->renderImage(5);
-	_gm->wait(3);
-	_vm->renderImage(7);
-
-	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV5))
-		return false;
-
-	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV6))
-		return false;
-
-	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV7))
-		return false;
-
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
-		return false;
-
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
-		return false;
-
-	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV10))
-		return false;
-
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
-		return false;
-
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
-		return false;
-
-	if(!_gm->talk(9, 7, 8, kMessageCenter, kStringIntroTV13))
-		return false;
-
-	_vm->renderImage(4);
-
-	if(!_gm->talkRest(9, 7, 1))
-		return false;
-
-	_vm->renderImage(4 + 128);
-
-	if(!_gm->talkRest(9, 7, 3))
-		return false;
-
-	_vm->renderImage(4);
-
-	if(!_gm->talkRest(9, 7, 1))
-		return false;
-
-	_vm->renderImage(6);
-
-	if(!_gm->talkRest(9, 7, _gm->_restTime - 5))
-		return false;
-
-	_vm->removeMessage();
-
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
-		return false;
-
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
-		return false;
-
-	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV16))
-		return false;
-
-	return true;
-}
-
-Airport::Airport(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 2;
-	_id = AIRPORT;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSpaceship, kStringSpaceshipDescription, NULLOBJECT, NULLTYPE, 0, 0, 0, NULLROOM, 0);
-	_objectState[1] = Object(_id, kStringVehicles, kStringVehiclesDescription, NULLOBJECT, EXIT, 1, 1, 0, TAXISTAND, 8);
-}
-
-void Airport::onEntrance() {
-	if (hasSeen() == false) {
-		_vm->renderMessage(kStringAirportEntrance);
-	}
-	setRoomSeen(true);
-}
-
-TaxiStand::TaxiStand(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 3;
-	_id = TAXISTAND;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[7] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringVehicle, kStringVehicleDescription, TAXI, NULLTYPE, 2, 2, 0, NULLROOM, 11);
-	_objectState[1] = Object(_id, kStringVehicle, kStringVehicleDescription, NULLOBJECT, NULLTYPE, 1, 1, 0);
-	_objectState[2] = Object(_id, kStringEntrance, kStringEntranceDescription, DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, NULLROOM, 1);
-	_objectState[3] = Object(_id, kStringWallet, kStringWalletDescription, WALLET, TAKE, 0, 0, 7 + 128);
-	_objectState[4] = Object(_id, kStringDevice, kStringDeviceDescription, TRANSMITTER, TAKE | PRESS, 255, 255, 0);
-	_objectState[5] = Object(_id, kStringIdCard, kStringIdCardDescription, ID_CARD, TAKE | COMBINABLE, 255, 255, 0);
-	_objectState[6] = Object(_id, kStringAirport, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, AIRPORT, 22);
-}
-
-void TaxiStand::onEntrance() {
-	setRoomSeen(true);
-}
-
-void TaxiStand::animation() {
-	if (isSectionVisible(4)) {
-		setSectionVisible(1, kShownFalse);
-		setSectionVisible(2, kShownFalse);
-		setSectionVisible(3, kShownFalse);
-		setSectionVisible(4, kShownFalse);
-	}
-	else if (isSectionVisible(3))
-		setSectionVisible(4, kShownTrue);
-	else if (isSectionVisible(2))
-		setSectionVisible(3, kShownTrue);
-	else if (isSectionVisible(1))
-		setSectionVisible(2, kShownTrue);
-	else
-		setSectionVisible(1, kShownTrue);
-	_gm->setAnimationTimer(7);
-}
-
-bool TaxiStand::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_WALK && obj1._id == TAXI && isSectionVisible(6))
-		_gm->taxi();
-	else if ((verb == ACTION_WALK || verb == ACTION_OPEN) && obj1._id == DOOR)
-		_vm->renderMessage(obj1._description);
-	else 
-		return false;
-	return true;
-}
-
-Street::Street(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 5;
-	_id = STREET;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, GAMES, 10);
-	_objectState[1] = Object(_id, kStringStaircase, kStringStaircaseDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
-	_objectState[2] = Object(_id, kStringBusinessStreet, kStringBusinessStreetDescription, REAR_STREET, EXIT, 3, 3, 0, KIOSK, 3);
-	_objectState[3] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 7, 7, 22);
-	_objectState[4] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 6, 6, 0);
-	_objectState[5] = Object(_id, kStringPost, kStringLooksMetal, NULLOBJECT, NULLTYPE, 4, 4, 0);
-	_objectState[6] = Object(_id, kStringRailing, kStringLooksMetal, NULLOBJECT, NULLTYPE, 5, 5, 0);
-}
-
-void Street::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Street::animation() {
-	static int ltab[36] = {
-		8, 9 + 128, 10, 11 + 128, 6, 12, 13 + 128, 9, 14, 15 + 128, 19,
-		16, 17 + 128, 9 + 128, 18, 19 + 128, 6 + 128, 20, 21 + 128,
-		8 + 128, 9, 10 + 128, 11, 6, 12 + 128, 13, 14 + 128, 15, 19,
-		16 + 128, 17, 18 + 128, 19 + 128, 6 + 128, 20 + 128, 21
-	};
-
-	static int i, banks, light;
-
-	if (isSectionVisible(7))
-		setSectionVisible(7, kShownFalse);
-	else
-		setSectionVisible(7, kShownTrue);
-
-	if (++i == 4) {
-		i = 0;
-		switch (banks) {
-		case 0:
-			setSectionVisible(1, kShownTrue);
-			break;
-		case 1:
-			setSectionVisible(2, kShownTrue);
-			break;
-		case 2:
-			setSectionVisible(3, kShownTrue);
-			break;
-		case 3:
-			setSectionVisible(4, kShownTrue);
-			break;
-		case 4:
-			setSectionVisible(5, kShownTrue);
-			break;
-		case 5:
-			// fall through
-		case 7:
-			// fall through
-		case 9:
-			setSectionVisible(1, kShownFalse);
-			setSectionVisible(2, kShownFalse);
-			setSectionVisible(3, kShownFalse);
-			setSectionVisible(4, kShownFalse);
-			setSectionVisible(5, kShownFalse);
-			break;
-		case 6:
-			// fall through
-		case 8:
-			setSectionVisible(1, kShownTrue);
-			setSectionVisible(2, kShownTrue);
-			setSectionVisible(3, kShownTrue);
-			setSectionVisible(4, kShownTrue);
-			setSectionVisible(5, kShownTrue);
-			break;
-		}
-		banks++;
-		if (banks == 10) banks = 0;
-	}
-	setSectionVisible(ltab[light], kShownTrue);
-	light++;
-	if (light == 36)
-		light = 0;
-	_gm->setAnimationTimer(2);
-}
-
-bool Street::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_USE && Object::combine(obj1, obj2, KNIFE, ROD)) {
-		if (getObject(3)->_type & CARRIED)
-			_vm->renderMessage(kStringAlreadyHavePole);
-		else {
-			_vm->renderMessage(kStringSawPole);
-			_gm->takeObject(*getObject(3));
-			_vm->playSound(kAudioSuccess);
-		}
-	} else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
-		Common::String text = _vm->getGameString(kStringOnlyShop);
-		_vm->renderMessage(text);
-		_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
-		_vm->removeMessage();
-		return false;
-	} else 
-		return false;
-	return true;
-}
-
-Games::Games(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 6;
-	_id = GAMES;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringPoster, kStringPosterDescription, POSTER, UNNECESSARY, 3, 3, 0);
-	_objectState[1] = Object(_id, kStringCabin, kStringCabinFree, NULLOBJECT, EXIT, 1, 1, 0, CABIN, 9);
-	_objectState[2] = Object(_id, kStringCabin, kStringCabinOccupied, OCCUPIED_CABIN, NULLTYPE, 0, 0, 0);
-	_objectState[3] = Object(_id, kStringFeet, kStringFeetDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
-	_objectState[4] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
-}
-
-void Games::onEntrance() {
-	setRoomSeen(true);
-}
-
-bool Games::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_WALK && obj1._id == OCCUPIED_CABIN) {
-		_vm->renderMessage(kStringCabinOccupiedSay);
-	} else if (verb == ACTION_LOOK && obj1._id == POSTER) {
-		_gm->_state._taxiPossibility &= ~4; // add culture palace
-		return false;
-	} else 
-		return false;
-	return true;
-}
-
-Cabin::Cabin(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 7;
-	_id = CABIN;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, GAMES, 22);
-	_objectState[1] = Object(_id, kStringHood, kStringHoodDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
-	_objectState[2] = Object(_id, kString400Xa, kStringDefaultDescription, PRIZE, TAKE, 255, 255, 2 + 180);
-	_objectState[3] = Object(_id, kString10Xa, kStringDefaultDescription, BACK_MONEY, TAKE, 255, 255, 2 + 128);
-	_objectState[4] = Object(_id, kStringSlot, kStringSlotDescription1, SLOT1, COMBINABLE, 2, 2, 0);
-	_objectState[5] = Object(_id, kStringSlot, kStringSlotDescription2, NULLOBJECT, COMBINABLE, 3, 3, 0);
-	_objectState[6] = Object(_id, kStringChair, kStringChairDescription, CHAIR, NULLTYPE, 4, 4, 0);
-	_objectState[7] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE1, NULLTYPE, 5, 5, 0);
-	_objectState[8] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE2, NULLTYPE, 6, 6, 0);
-	_objectState[9] = Object(_id, kStringFace, kStringFaceDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
-	_objectState[10] = Object(_id, kStringSign, kStringDefaultDescription, SIGN, UNNECESSARY, 1, 1, 0);
-}
-
-void Cabin::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Cabin::animation() {
-	if (_shown[kMaxSection - 1]) {
-		if (isSectionVisible(1))
-			_vm->renderImage(1 + 128);
-		else
-			_vm->renderImage(1);
-	}
-	_gm->setAnimationTimer(4);
-}
-
-bool Cabin::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_USE && Object::combine(obj1, obj2, MONEY, SLOT1)) {
-		if (isSectionVisible(2))
-			_vm->renderMessage(kStringTakeMoney);
-		else if (_shown[kMaxSection - 1])
-			_vm->renderMessage(kStringAlreadyPaid);
-		else if (_gm->_state._money < 10)
-			_vm->renderMessage(kStringNoMoney);
-		else {
-			_vm->renderMessage(kStringPay10Xa);
-			_gm->takeMoney(-10);
-			_shown[kMaxSection - 1] = true;
-		}
-	} else if (verb == ACTION_USE && obj1._id == CHAIR) {
-		if (_shown[kMaxSection - 1]) {
-			if (_shown[kMaxSection - 2]) {
-				_vm->paletteFadeOut();
-				_vm->setCurrentImage(31);
-				_vm->renderImage(0);
-				_vm->paletteFadeIn();
-				_shown[kMaxSection - 1] = true;
-				_gm->getInput();
-				_vm->paletteFadeOut();
-				_vm->setCurrentImage(7);
-				_vm->renderImage(0);
-				setSectionVisible(1, kShownFalse);
-				_shown[kMaxSection - 1] = false;
-				_vm->renderRoom(*this);
-				_vm->renderImage(2);
-				_gm->drawGUI();
-				_vm->paletteFadeIn();
-				getObject(3)->_click = 8;
-			} else {
-				_gm->_state._tipsy = false;
-				_vm->paletteFadeOut();
-				_vm->_system->fillScreen(kColorBlack);
-				_vm->_screen->setViewportBrightness(255);
-				Common::String text = _vm->getGameString(kStringWillPassOut);
-				_vm->renderMessage(text);
-				_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
-				_vm->removeMessage();
-				_vm->paletteFadeOut();
-				_vm->saveGame(kSleepAutosaveSlot, "autosave");
-				_gm->_inventory.clear();
-				_gm->changeRoom(PYRAMID);
-				_gm->drawGUI();
-			}
-		} else
-			_vm->renderMessage(kStringRest);
-	} else if (verb == ACTION_TAKE && obj1._id == PRIZE) {
-		_vm->renderImage(2 + 128);
-		obj1._click = 255;
-		_gm->takeMoney(400);
-	} else if (verb == ACTION_TAKE && obj1._id == BACK_MONEY) {
-		_vm->renderImage(2 + 128);
-		obj1._click = 255;
-		_gm->takeMoney(10);
-	} else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE1) {
-		_vm->renderMessage(kStringCypher);
-	} else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE2) {
-		_gm->animationOff();
-		_vm->setCurrentImage(28);
-		_vm->renderImage(0);
-		_gm->getInput();
-		_vm->setCurrentImage(7);
-		_vm->renderRoom(*this);
-		_gm->drawGUI();
-		_gm->_state._addressKnown = true;
-		_gm->animationOn();
-	} else if (verb == ACTION_LOOK && obj1._id == SIGN) {
-		_gm->animationOff();
-		_vm->setCurrentImage(38);
-		_vm->renderImage(0);
-		_gm->getInput();
-		_vm->setCurrentImage(7);
-		_vm->renderRoom(*this);
-		_gm->drawGUI();
-		_gm->animationOn();
-	} else 
-		return false;
-	return true;
-}
-
-Kiosk::Kiosk(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 19;
-	_id = KIOSK;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
-	_objectState[1] = Object(_id, kStringBooks, kStringDefaultDescription, BOOKS, UNNECESSARY, 0, 0, 0);
-	_objectState[2] = Object(_id, kStringDictionary, kStringDefaultDescription, LEXICON, UNNECESSARY, 1, 1, 0);
-	_objectState[3] = Object(_id, kStringPlant, kStringDefaultDescription, PLANT, UNNECESSARY, 2, 2, 0);
-	_objectState[4] = Object(_id, kStringMask, kStringDefaultDescription, BMASK, UNNECESSARY, 4, 4, 2 + 128);
-	_objectState[5] = Object(_id, kStringSnake, kStringDefaultDescription, SNAKE, UNNECESSARY, 3, 3, 0);
-	_objectState[6] = Object(_id, kStringCup, kStringDefaultDescription, CUP, UNNECESSARY, 5, 5, 0);
-	_objectState[7] = Object(_id, kStringJoystick, kStringDefaultDescription, JOYSTICK, UNNECESSARY, 6, 6, 0);
-	_objectState[8] = Object(_id, kStringToothbrush, kStringToothbrushDescription, TOOTHBRUSH, TAKE, 7, 7, 5 + 128);
-	_objectState[9] = Object(_id, kStringMusic, kStringMusicDescription, PLAYER, TAKE | COMBINABLE, 8, 8, 4 + 128);
-	_objectState[10] = Object(_id, kStringBottle, kStringBottleDescription, BOTTLE, TAKE, 9, 9, 3 + 128);
-	_objectState[11] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE1, UNNECESSARY, 10, 10, 0);
-	_objectState[12] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE2, UNNECESSARY, 11, 11, 0);
-	_objectState[13] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE3, UNNECESSARY, 12, 12, 0);
-	_objectState[14] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE4, UNNECESSARY, 13, 13, 0);
-	_objectState[15] = Object(_id, kStringBox, kStringDefaultDescription, BOX, UNNECESSARY, 14, 14, 0);
-	_objectState[16] = Object(_id, kStringFace, kStringDefaultDescription, FACES, UNNECESSARY, 15, 15, 0);
-	_objectState[17] = Object(_id, kStringSeller, kStringDefaultDescription, SELLER, TALK, 16, 16, 0);
-}
-
-void Kiosk::onEntrance() {
-	static StringId dialEntry[2] = {
-		kStringGoodEvening,
-		kStringHello
-	};
-
-	if (!hasSeen()) {
-		_gm->dialog(2, _gm->_dials, dialEntry, 0);
-		_vm->renderImage(6);
-		_vm->playSound(kAudioKiosk);
-		_gm->wait(8);
-		_vm->renderImage(6 + 128);
-		_gm->reply(kStringScaredMe, 1, 1 +128);
-		_gm->say(kStringHowSo);
-		_gm->reply(kStringDisguise, 1, 1 +128);
-		_gm->say(kStringWhatDisguise);
-		_gm->reply(kStringStopPretending, 1, 1 +128);
-		_gm->reply(kStringYouDisguised, 1, 1 +128);
-		_gm->say(kStringIAmHorstHummel);
-		_gm->reply(kStringGiveItUp, 1, 1 +128);
-		_gm->reply(kStringGestures, 1, 1 +128);
-		_gm->reply(kStringMovesDifferently, 1, 1 +128);
-		_gm->say(kStringHeIsRobot);
-		_gm->reply(kStringYouAreCrazy, 1, 1 +128);
-		_gm->say(kStringYouIdiot);
-		_gm->reply(kStringShutUp, 1, 1 +128);
-		_gm->drawGUI();
-		setRoomSeen(true);
-	}
-}
-
-void Kiosk::animation() {
-}
-
-bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
-	static StringId dialPrice[2] = {
-		kStringWillTakeIt,
-		kStringTooExpensive
-	};
-	static StringId dialSay[3] = {
-		kStringWouldBuy,
-		kStringMeHorstHummel,
-		kStringHaveMusicChip
-	};
-	static StringId dialSeller[16][3] = {
-		{kStringGreatMask, kStringThreeYears, kNoString},
-		{kStringStrongDrink, kNoString, kNoString},
-		{kStringMusicDevice, kNoString, kNoString},
-		{kStringArtusToothbrush, kStringSellInBulk, kNoString},
-		{kStringRarityBooks, kNoString, kNoString},
-		{kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words},
-		{kStringNotSale, kNoString, kNoString},
-		{kStringGaveOne, kStringExcited, kNoString},
-		{kStringFromGame, kNoString, kNoString},
-		{kStringRobust, kNoString, kNoString},
-		{kStringCheapSwill, kNoString, kNoString},
-		{kStringCheapSwill, kNoString, kNoString},
-		{kStringCheapSwill, kNoString, kNoString},
-		{kStringCheapSwill, kNoString, kNoString},
-		{kStringStickers, kNoString, kNoString},
-		{kStringDishes, kStringUgly, kStringSellsWell}
-	};
-
-	if (verb == ACTION_TAKE && !(obj1._type & CARRIED) &&
-		obj1._id >= BOTTLE && obj1._id <= TOOTHBRUSH) {
-		int price = 0;
-		switch (obj1._id) {
-		case BOTTLE:
-			price = 30;
-			break;
-		case PLAYER:
-			price = 50;
-			break;
-		case TOOTHBRUSH:
-			price = 5;
-			break;
-		default:
-			break;
-		}
-		Common::String format = _vm->getGameString(kStringThatCosts);
-		Common::String cost = Common::String::format(format.c_str(), price);
-		_vm->renderMessage(cost, kMessageTop);
-		_gm->reply(cost.c_str(), 1, 1 +128);
-
-		if (_gm->_state._money < price)
-			_gm->say(dialPrice[1]);
-		else if (_gm->dialog(2, _gm->_dials, dialPrice, 0) == 0) {
-			_gm->takeObject(obj1);
-			_gm->takeMoney(-price);
-		}
-		_gm->drawGUI();
-	} else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
-		for(int i = 0; i < 3; i++) {
-			_gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + 128);
-		}
-	} else if (verb == ACTION_TALK && obj1._id >= SELLER) {
-		int i = 2;
-		if (getObject(9)->_type & CARRIED)
-			i++;
-		switch (_gm->dialog(i, _gm->_dials, dialSay, 0)) {
-		case 0:
-			_gm->reply(kStringTakeALook, 1, 1 + 128);
-			break;
-		case 1:
-			_gm->reply(kStringNonsense, 1, 1 + 128);
-			break;
-		case 2:
-			_gm->reply(kStringImSorry, 1, 1 + 128);
-			break;
-		}
-		_gm->drawGUI();
-	} else 
-		return false;
-	return true;
-}
-
-CulturePalace::CulturePalace(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 20;
-	_id = CULTURE_PALACE;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, CHECKOUT, 6);
-	_objectState[1] = Object(_id, kStringCulturePalace, kStringFascinating, NULLOBJECT, NULLTYPE, 0, 0, 0);
-	_objectState[2] = Object(_id, kStringTaxis, kStringTaxisDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
-	_objectState[3] = Object(_id, kStringAxacussan, kStringDefaultDescription, AXACUSSER, TALK, 4, 4, 0);
-	_objectState[4] = Object(_id, kStringParticipationCard, kStringDefaultDescription, CARD, TAKE, 255, 255, 0);
-}
-
-void CulturePalace::onEntrance() {
-	setRoomSeen(true);
-}
-
-void CulturePalace::animation() {
-	static int i;
-	if (isSectionVisible(4))
-		setSectionVisible(4, kShownFalse);
-	else
-		setSectionVisible(4, kShownTrue);
-	i--;
-	if (i <= 0) {
-		if (isSectionVisible(3)) {
-			setSectionVisible(3, kShownFalse);
-			i = 4;
-		} else {
-			setSectionVisible(3, kShownTrue);
-			i = 10;
-		}
-	}
-	_gm->setAnimationTimer(2);
-}
-
-void CulturePalace::notEnoughMoney() {
-	_gm->reply(kStringWhat, 2, 1);
-	_gm->reply(kStringNotInformed, 2, 1);
-	_vm->renderImage(1 + 128);
-	setSectionVisible(2, kShownFalse);
-}
-
-bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
-	static StringId dial1[3] = {
-		kStringHorstHummel,
-		kStringNiceWeather,
-		kStringTellTicket,
-	};
-	static byte dials1[] = {1, 1, 2};
-
-	static StringId dial2[2] = {
-		kStringHereIsXa,
-		kStringYouAreCrazy
-	};
-	static StringId dial3[4] = {
-		kString500Xa,
-		kString1000Xa,
-		kString5000Xa,
-		kString10000Xa
-	};
-
-	int e;
-	if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
-		if (_shown[kMaxSection - 3]) {
-			_vm->renderImage(1);
-			_gm->reply(kStringThankYou, 2, 1);
-		} else if (_shown[kMaxSection - 2]) {
-			_vm->renderImage(1);
-			_gm->reply(kStringWhatYouOffer, 2, 1);
-		} else {
-			_gm->say(kStringHello2);
-			_vm->renderImage(1);
-			_gm->reply(kStringWhatYouWant, 2, 1);
-			addSentence(1, 1);
-			switch (_gm->dialog(3, dials1, dial1, 1)) {
-			case 0:
-				_gm->reply(kStringWhoAreYou, 2, 1);
-				_gm->say(kStringHorstHummel2);
-				_gm->reply(kStringNeverHeard, 2, 1);
-				_gm->say(kStringYouDontKnow);
-				_gm->say(kStringImOnTV);
-				_gm->reply(kStringIDontKnow, 2, 1);
-				_gm->say(kStringFunny);
-				break;
-			case 1:
-				_gm->reply(kStringAha, 2, 1);
-				break;
-			case 2:
-				_gm->reply(kStringICan, 2, 1);
-				_gm->say(kStringFromWhom);
-				_gm->reply(kStringCost, 2, 1);
-				if(!_gm->_state._money)
-					addSentence(2, 1);
-				else if (_gm->dialog(2, _gm->_dials, dial2, 0)) {
-					_gm->reply(kStringAsYouSay, 2, 1);
-					addSentence(2, 1);
-				} else {
-					_gm->takeMoney(-1);
-					_gm->reply(kStringGetCard, 2, 1);
-					_gm->reply(kStringOnlyParticipation, 2, 1);
-					_gm->say(kStringWhatForIt);
-					_gm->reply(kStringMakeOffer, 2, 1);
-					_shown[kMaxSection - 2] = true;
-				}
-				break;
-			}
-		}
-		_vm->renderImage(1 + 128);
-		setSectionVisible(2, kShownFalse);
-		_gm->drawGUI();
-	}
-	else if (verb == ACTION_GIVE && obj2._id == AXACUSSER && _shown[kMaxSection - 2]) {
-		_vm->renderImage(1);
-		if (obj1._id != MONEY)
-			notEnoughMoney();
-		else {
-			if (_gm->_state._money >= 10000) {
-				if ((e = _gm->dialog(4, _gm->_dials, dial3, 0)) >= 2) {
-					_gm->reply(kStringGoodOffer, 2, 1);
-					_vm->playSound(kAudioSuccess);
-					_gm->reply(kStringGiveCard, 2, 1);
-					if (e == 2)
-						_gm->takeMoney(-5000);
-					else
-						_gm->takeMoney(-10000);
-					_gm->takeObject(*getObject(4));
-					_vm->renderImage(1 + 128);
-					setSectionVisible(2, false);
-					_gm->reply(kStringIdiot, 0, 0);
-					_shown[kMaxSection - 2] = false;
-					_shown[kMaxSection - 3] = true;
-					_gm->_rooms[CHECKOUT]->addSentence(1,1);
-					_gm->drawGUI();
-				} else {
-					notEnoughMoney();
-					_gm->drawGUI();
-				}
-			} else 
-				notEnoughMoney();
-		}
-	} else 
-		return false;
-	return true;
-}
-
-Checkout::Checkout(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 21;
-	_id = CHECKOUT;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, KP_ENTRANCE, EXIT, 0, 0, 0, NULLROOM, 3);
-	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CULTURE_PALACE, 22);
-	_objectState[2] = Object(_id, kStringAxacussian, kStringDefaultDescription, AXACUSSER, TALK, 1, 1, 0);
-}
-
-void Checkout::onEntrance() {
-	if (!_shown[kMaxSection - 3]) {
-		_shown[kMaxSection - 3] = true;
-		_gm->reply(kStringAtMusicContest, 1, 1 + 128);
-		_gm->say(kStringNoImitation);
-		_gm->reply(kStringGoodJoke, 1, 1 + 128);
-		_gm->say(kStringIAmHorstHummel);
-		_gm->reply(kStringCommon, 1, 1 + 128);
-		_gm->say(kStringIWillProof);
-		_gm->say(kStringIWillPerform);
-		_gm->drawGUI();
-	}
-	setRoomSeen(true);
-}
-
-void Checkout::animation() {
-}
-
-bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
-	static StringId dialCheckout1[3] = {
-		kStringCheckout1,
-		kStringCheckout2,
-		kStringCheckout3
-	};
-	static StringId dialCheckout2[2] = {
-		kStringYes,
-		kStringNo
-	};
-	static StringId dialStage1[3] = {
-		kStringCheckout4,
-		kStringCheckout5,
-		kStringCheckout6
-	};
-	static StringId dialStage2[2] = {
-		kStringCheckout7,
-		kStringCheckout8
-	};
-	static StringId dialStage3[3] = {
-		kStringCheckout9,
-		kStringCheckout10,
-		kStringCheckout11
-	};
-	static StringId dialStage4[3] = {
-		kStringCheckout12,
-		kStringCheckout13
-	};
-	if (verb == ACTION_WALK && obj1._id == KP_ENTRANCE) {
-		if (_shown[kMaxSection - 4]) {
-			_vm->renderImage(2);
-			_gm->reply(kStringCheckout14, 0, 0);
-			_vm->renderImage(2 + 128);
-		} else if (_shown[kMaxSection - 2] == 0) {
-			_vm->renderImage(2);
-			_gm->reply(kStringCheckout15, 0, 0);
-			_vm->renderImage(2 + 128);
-			if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
-				_gm->say(kStringCheckout16);
-				_gm->reply(kStringCheckout17, 0, 0);
-			} else
-				_gm->say(kStringCheckout18);
-			_gm->drawGUI();
-		} else if (_shown[kMaxSection - 2] == 1) {
-			_gm->reply(kStringCheckout19, 1, 1 + 128);
-		} else {
-			if (_gm->_state._tipsy) {
-				_vm->setCurrentImage(22);
-				_vm->renderImage(0);
-				if (_shown[kMaxSection - 5] && _gm->_state._admission >= 2)
-					appearance();
-				else {
-					_gm->dialog(3, _gm->_dials, dialStage1, 0);
-					_gm->dialog(2, _gm->_dials, dialStage2, 0);
-					_vm->renderMessage(kStringCheckout20, 100, 70);
-					_gm->waitOnInput(_gm->_messageDuration);
-					_vm->removeMessage();
-					_vm->renderMessage(kStringCheckout21, 200, 40);
-					_gm->waitOnInput(_gm->_messageDuration);
-					_vm->removeMessage();
-					_gm->say(kStringCheckout22);
-					_gm->dialog(3, _gm->_dials, dialStage3, 0);
-					_vm->renderMessage(kStringCheckout23, 120, 70);
-					_gm->waitOnInput(_gm->_messageDuration);
-					_vm->removeMessage();
-					_gm->say(kStringCheckout24);
-					_vm->renderMessage(kStringCheckout25, 40, 100);
-					_gm->waitOnInput(_gm->_messageDuration);
-					_vm->removeMessage();
-					_gm->dialog(2, _gm->_dials, dialStage4, 0);
-					_vm->playSound(kAudioStage1);
-					while(_vm->_sound->isPlaying())
-						_gm->wait(1);
-					_vm->playSound(kAudioStage1);
-					while(_vm->_sound->isPlaying())
-						_gm->wait(1);
-					_vm->playSound(kAudioStage2);
-					while(_vm->_sound->isPlaying())
-						_gm->wait(1);
-					_vm->playSound(kAudioStage2);
-					_vm->renderMessage(kStringCheckout26, 250, 80);
-					while(_vm->_sound->isPlaying())
-						_gm->wait(1);
-					_vm->playSound(kAudioStage1);
-					while(_vm->_sound->isPlaying())
-						_gm->wait(1);
-					_vm->removeMessage();
-					_vm->playSound(kAudioStage2);
-					_vm->renderMessage(kStringCheckout27, 140, 60);
-					while(_vm->_sound->isPlaying())
-						_gm->wait(1);
-					_vm->playSound(kAudioStage2);
-					while(_vm->_sound->isPlaying())
-						_gm->wait(1);
-					_gm->wait(2);
-					_vm->removeMessage();
-					_vm->playSound(kAudioStage2);
-					_vm->renderMessage(kStringCheckout26, 180, 50);
-					_gm->waitOnInput(_gm->_messageDuration);
-					_vm->removeMessage();
-					_vm->renderMessage(kStringCheckout28, 50, 110);
-					_gm->waitOnInput(_gm->_messageDuration);
-					_vm->removeMessage();
-					_gm->say(kStringCheckout29);
-					_vm->renderRoom(*this);
-					if (_shown[kMaxSection - 5])
-						_vm->renderMessage(kStringCheckout30);
-					else
-						_vm->renderMessage(kStringCheckout31);
-					_shown[kMaxSection - 4] = true;
-					_gm->drawGUI();
-				}
-			} else {
-				_vm->renderMessage(kStringCheckout32);
-				_gm->waitOnInput(_gm->_messageDuration);
-				_vm->removeMessage();
-				_vm->renderMessage(kStringCheckout33);
-			}
-		}
-	} else if (verb == ACTION_GIVE && obj1._id == CHIP && obj2._id == AXACUSSER &&
-			_shown[kMaxSection - 2] == 1) {
-		_gm->_inventory.remove(obj1);
-		_shown[kMaxSection - 5] = true;
-		_gm->reply(kStringCheckout37, 1, 1 + 128);
-		_shown[kMaxSection - 2] = 2;
-		_gm->drawGUI();
-	} else if (verb == ACTION_GIVE && obj1._id == CARD && obj2._id == AXACUSSER) {
-		_gm->_inventory.remove(*_gm->_rooms[CULTURE_PALACE]->getObject(4));
-		_gm->reply(kStringCheckout34, 1, 1 + 128);
-		_gm->reply(kStringCheckout35, 1, 1 + 128);
-		if (_gm->dialog(2, _gm->_dials, dialCheckout2, 0) == 1) {
-			_gm->reply(kStringCheckout36, 1, 1 + 128);
-			_shown[kMaxSection - 2] = 1;
-		} else {
-			_gm->reply(kStringCheckout37, 1, 1 + 128);
-			_shown[kMaxSection - 2] = 2;
-		}
-		_gm->drawGUI();
-	} else if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
-		if (_shown[kMaxSection - 4]) {
-			_gm->say(kStringCheckout38);
-			_gm->reply(kStringCheckout39, 1, 1 + 128);
-			_gm->drawGUI();
-		} else {
-			switch (_shown[kMaxSection - 2]) {
-			case 0:
-				addSentence(2, 1);
-				switch (_gm->dialog(3, _gm->_dials, dialCheckout1, 1)) {
-				case 0:
-					_gm->reply(kStringCheckout40, 1, 1 + 128);
-					_gm->say(kStringNo);
-					_gm->reply(kStringCheckout41, 1, 1 + 128);
-					_gm->say(kStringCheckout42);
-					break;
-				case 1:
-					_gm->reply(kStringCheckout43, 1, 1 + 128);
-					if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
-						_gm->say(kStringCheckout44);
-						return interact(ACTION_GIVE,
-								*_gm->_rooms[CULTURE_PALACE]->getObject(4),
-								*_gm->_rooms[CHECKOUT]->getObject(2));
-					} else {
-						_gm->say(kStringNo);
-						_gm->reply(kStringCheckout45, 1, 1 + 128);
-						_gm->say(kStringCheckout46);
-					}
-					break;
-				case 2:
-					_gm->reply(kStringCheckout47, 1, 1 + 128);
-					break;
-				}
-				_gm->drawGUI();
-				break;
-			case 1:
-				_gm->reply(kStringCheckout48, 1, 1 + 128);
-				break;
-			case 2:
-				_gm->reply(kStringCheckout49, 1, 1 + 128);
-				break;
-			}
-		}
-	} else 
-		return false;
-	return true;
-}
-
-void Checkout::shouting() {
-	static int i = 0;
-	switch(i)
-	{
-	case  50:
-		_vm->renderMessage(kStringShout1, 100, 60);
-		break;
-	case 130:
-		_vm->renderMessage(kStringShout2, 50, 90);
-		break;
-	case 200:
-		_vm->renderMessage(kStringShout3, 200, 80);
-		break;
-	case 300:
-		_vm->renderMessage(kStringShout4, 70, 30);
-		break;
-	case 400:
-		_vm->renderMessage(kStringShout5, 190, 90);
-		break;
-	case 450:
-		_vm->renderMessage(kStringShout6, 160, 60);
-		break;
-	case 500:
-		_vm->renderMessage(kStringShout7, 180, 70);
-		break;
-	case 530:
-		_vm->renderMessage(kStringShout8, 50, 20);
-		break;
-	case 610:
-		_vm->renderMessage(kStringShout9, 230, 50);
-		break;
-	case 650:
-		_vm->renderMessage(kStringShout10, 100, 90);
-		break;
-	case 720:
-		_vm->renderMessage(kStringShout11, 176, 65);
-		break;
-	case 800:
-		_vm->renderMessage(kStringShout12, 60, 20);
-		break;
-	case 850:
-		_vm->renderMessage(kStringShout13, 160, 40);
-		break;
-	case 930:
-		_vm->renderMessage(kStringShout14, 60, 95);
-		break;
-	case 1000:
-		_vm->renderMessage(kStringShout15, 100, 65);
-		break;
-	case  70:
-			  // fall through
-	case 150:
-			  // fall through
-	case 220:
-			  // fall through
-	case 320:
-			  // fall through
-	case 420:
-			  // fall through
-	case 470:
-			  // fall through
-	case 520:
-			  // fall through
-	case 550:
-			  // fall through
-	case 630:
-			  // fall through
-	case 680:
-			  // fall through
-	case 740:
-			  // fall through
-	case 820:
-			  // fall through
-	case 870:
-			  // fall through
-	case 950:
-			  // fall through
-	case 1020:
-		_vm->removeMessage();
-		break;
-	default: {} //do nothing
-	}
-	i++;
-}
-
-void Checkout::appearance() {
-	_vm->_allowSaveGame = false;
-	_vm->_allowLoadGame = false;
-	int xp = 0;
-	CursorMan.showMouse(false);
-	_vm->playSound(kMusicMadMonkeys);
-	Common::KeyCode k = Common::KEYCODE_INVALID;
-	while(_vm->_sound->isPlaying()) {
-		if (_gm->waitOnInput(1, k))
-			break;
-		shouting();
-	}
-	_vm->_sound->stop();
-	_vm->removeMessage();
-	CursorMan.showMouse(true);
-	_vm->removeMessage();
-	_vm->playSound(kAudioAppearance1);
-	while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
-		_gm->wait(1);
-	_vm->paletteFadeOut();
-
-	_vm->setCurrentImage(39);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_gm->wait(50);
-	_vm->setCurrentImage(40);
-	_vm->renderImage(0);
-	for (int i = 1; i < 11; i++) {
-		_gm->wait(3);
-		_vm->renderImage(i);
-	}
-	_vm->playSound(kAudioAppearance2);
-	_gm->wait(30);
-	_vm->renderImage(11);
-	_vm->playSound(kAudioAppearance2);
-	_gm->wait(60);
-
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->setCurrentImage(42);
-	_vm->renderImage(0);
-	_vm->renderImage(11);
-	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance1);
-	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance2);
-	_vm->renderImage(4);
-	_gm->wait(3);
-	_vm->renderImage(6);
-	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance3);
-	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance4);
-	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance5);
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance6);
-	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance7);
-	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance8);
-	_gm->talk(12, 13, 4, kMessageCenter, kStringAppearance9);
-	_vm->renderImage(4);
-	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(4 + 128);
-	_gm->talkRest(12, 13, 4);
-	_vm->renderImage(4);
-	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(6);
-	_gm->talkRest(12, 13, _gm->_restTime + 6);
-	_vm->removeMessage();
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance10);
-	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance11);
-	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance12);
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance13);
-	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance14);
-	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance15);
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance16);
-	_gm->talk(12, 13, 2, kMessageCenter, kStringAppearance17);
-	_vm->renderImage(4);
-	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(4 + 128);
-	_gm->talkRest(12, 13, 4);
-	_vm->renderImage(4);
-	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(6);
-	_gm->talkRest(12, 13, _gm->_restTime + 6);
-	_vm->removeMessage();
-	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance18);
-	_gm->talk(12, 13, 1, kMessageCenter, kStringAppearance19);
-	_vm->renderImage(4);
-	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(4 + 128);
-	_gm->talkRest(12, 13, 4);
-	_vm->renderImage(4);
-	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(6);
-	_gm->talkRest(12, 13, _gm->_restTime + 6);
-	_vm->removeMessage();
-	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance20);
-	_gm->talk(12, 13, 1, kMessageCenter, kStringAppearance21);
-	_vm->renderImage(17);
-	_gm->wait(2);
-	_vm->renderImage(18);
-	_gm->wait(2);
-	_vm->renderImage(19);
-	_gm->wait(2);
-	_vm->renderImage(20);
-	_gm->wait(3);
-	_vm->renderImage(21);
-	_vm->renderImage(19);
-	_gm->wait(1);
-	_vm->renderImage(21+128);
-	_vm->renderImage(22);
-	_vm->renderImage(18);
-	_gm->wait(1);
-	_vm->renderImage(22+128);
-	_vm->renderImage(23);
-	_gm->wait(1);
-	_vm->renderImage(23+128);
-	_vm->renderImage(24);
-	_vm->renderImage(17);
-	_gm->wait(1);
-	_vm->renderImage(24+128);
-	_vm->renderImage(25);
-	_gm->wait(1);
-	_vm->renderImage(25+128);
-	_vm->renderImage(32);
-	_vm->renderImage(11);
-	_vm->renderImage(26);
-	_vm->playSound(kAudioAppearance3);
-	_gm->wait(2);
-	_vm->renderImage(32+128);
-	_vm->renderImage(33);
-	_vm->renderImage(27);
-	_gm->wait(2);
-	_vm->renderImage(33+128);
-	_vm->renderImage(34);
-	_vm->renderImage(28);
-	_gm->wait(2);
-	_vm->renderImage(29);
-	_gm->wait(2);
-	_vm->renderImage(30);
-	_gm->wait(2);
-	_vm->renderImage(31);
-	_gm->wait(2);
-	_gm->wait(50);
-	_vm->paletteFadeOut();
-
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->_screen->setViewportBrightness(255);
-	_vm->_screen->setGuiBrightness(255);
-	_vm->paletteBrightness();
-	_vm->renderMessage(kStringAppearance22);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance23);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance24);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance25);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance26);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance27);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->_screen->setViewportBrightness(0);
-	_vm->_screen->setGuiBrightness(0);
-	_vm->paletteBrightness();
-	_vm->setCurrentImage(44);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-
-	MS2Image *image = _vm->_screen->getCurrentImage();
-
-	int i = 0;
-	do {
-		_vm->renderImage(1);
-		_gm->wait(1);
-		_vm->renderImage(1 + 128);
-		image->_section[1].x1 += xp;
-		image->_section[1].x2 += xp;
-		image->_section[1].y1 -= 2;
-		image->_section[1].y2 -= 2;
-		i++;
-		if (i == 6) {
-			i = 0;
-			xp++;
-		}
-	} while (image->_section[1].y1 < 200);
-	_vm->paletteFadeOut();
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->_screen->setViewportBrightness(255);
-	_vm->_screen->setGuiBrightness(255);
-	_vm->paletteBrightness();
-	_vm->renderMessage(kStringAppearance28);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance29);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance30);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringAppearance31);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_gm->changeRoom(SHIP);
-	_gm->_state._dark = true;
-	_vm->_screen->setViewportBrightness(1);
-	_vm->paletteBrightness();
-	_gm->drawGUI();
-	_vm->_allowSaveGame = true;
-	_vm->_allowLoadGame = true;
-}
-
-City1::City1(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 23;
-	_id = CITY1;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSign, kStringSign1Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
-	_objectState[1] = Object(_id, kStringSign, kStringSign2Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR, 10);
-	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR, 14);
-}
-
-void City1::onEntrance() {
-	setRoomSeen(true);
-}
-
-void City1::animation() {
-}
-
-bool City1::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
-		_objectState[0]._click = 255;
-	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
-		_objectState[0]._click = 2;
-	} else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
-		_objectState[1]._click = 255;
-	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
-		_objectState[1]._click = 3;
-	} else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
-		_gm->_state._elevatorNumber = 1;
-	} else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
-		_gm->_state._elevatorNumber = 2;
-	}
-	_gm->_rooms[ELEVATOR]->getObject(5)->_exitRoom = CITY1;
-	_gm->_state._elevatorE = 0;
-	return false;
-}
-
-City2::City2(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 23;
-	_id = CITY2;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSign, kStringSign3Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
-	_objectState[1] = Object(_id, kStringSign, kStringSign4Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR, 10);
-	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR, 14);
-}
-
-void City2::onEntrance() {
-	setRoomSeen(true);
-}
-
-void City2::animation() {
-}
-
-bool City2::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
-		_objectState[0]._click = 255;
-	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
-		_objectState[0]._click = 2;
-	} else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
-		_objectState[1]._click = 255;
-	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
-		_objectState[1]._click = 3;
-	} else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
-		_gm->_state._elevatorNumber = 3;
-	} else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
-		_gm->_state._elevatorNumber = 4;
-	}
-	_gm->_rooms[ELEVATOR]->getObject(5)->_exitRoom = CITY2;
-	_gm->_state._elevatorE = 0;
-	return false;
-}
-
-Elevator::Elevator(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 24;
-	_id = ELEVATOR;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSlot, kStringDefaultDescription, SLOT, COMBINABLE, 0, 0, 0);
-	_objectState[1] = Object(_id, kStringBell, kStringDefaultDescription, BELL, PRESS, 1, 1, 0);
-	_objectState[2] = Object(_id, kStringDisplay, kStringDefaultDescription, DISPLAY, NULLTYPE, 2, 2, 0);
-	_objectState[3] = Object(_id, kStringKeypad, kStringKeypadDescription, KEYPAD, PRESS, 3, 3, 0);
-	_objectState[4] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | CLOSED, 4, 4, 0, APARTMENT, 3);
-	_objectState[5] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED | CLOSED, 255, 255, 0, CITY1, 22);
-}
-
-void Elevator::onEntrance() {
-	if (_gm->_state._elevatorE)
-		_objectState[5]._type &= ~OPENED;
-	else
-		_objectState[5]._type |= OPENED;
-}
-
-void Elevator::animation() {
-}
-
-bool Elevator::interact(Action verb, Object &obj1, Object &obj2) {
-	static StringId dialLuke1[4] = {
-		kStringElevator2,
-		kStringElevator3,
-		kStringElevator4,
-		kStringElevator5
-	};
-	static byte dialsLuke1[3] = {2,1,1};
-	static StringId dialBoss1[2] = {
-		kStringElevator6,
-		kStringElevator7
-	};
-	Common::String input;
-
-	if (verb == ACTION_LOOK && obj1._id == DISPLAY) {
-		Common::String format = _vm->getGameString(kStringElevator1);
-		Common::String display = 
-			Common::String::format(format.c_str(), _gm->_state._elevatorE);
-		_vm->renderMessage(display);
-	} else if (verb == ACTION_PRESS && obj1._id == BELL) {
-		_vm->renderImage(8);
-		_vm->playSound(kAudioElevatorBell);
-		while(_vm->_sound->isPlaying())
-			_gm->wait(1);
-		_vm->renderImage(8 + 128);
-		if (_gm->_state._elevatorNumber == 4 && _gm->_state._elevatorE == 4 && !_gm->_state._toMuseum) {
-			_gm->wait(18);
-			_vm->renderImage(1);
-			_gm->wait(3);
-			_vm->renderImage(2);
-			setSectionVisible(1, kShownFalse);
-			_gm->wait(3);
-			_vm->renderImage(3);
-			setSectionVisible(2, kShownFalse);
-			_gm->reply(kStringWhatYouWant, 4, 3);
-			switch (_gm->dialog(3, dialsLuke1, dialLuke1, 1)) {
-			case 0:
-				_gm->reply(kStringElevator11, 4, 3);
-				_vm->renderImage(2);
-				setSectionVisible(3, kShownFalse);
-				_gm->wait(3);
-				_vm->renderImage(1);
-				setSectionVisible(2, kShownFalse);
-				_gm->wait(3);
-				_vm->renderImage(1 + 128);
-				_vm->renderMessage(kStringElevator12);
-				_gm->waitOnInput(_gm->_messageDuration);
-				_vm->removeMessage();
-				_vm->renderImage(1);
-				_gm->wait(3);
-				_vm->renderImage(2);
-				setSectionVisible(1, kShownFalse);
-				_gm->wait(3);
-				_vm->renderImage(3);
-				setSectionVisible(2, kShownFalse);
-				_gm->reply(kStringElevator13, 4, 3);
-				setSectionVisible(3, kShownFalse);
-				setSectionVisible(4, kShownFalse);
-				_vm->paletteFadeOut();
-				_vm->_system->fillScreen(kColorBlack);
-				_vm->_screen->setViewportBrightness(255);
-				_vm->renderMessage(kStringElevator14);
-				_gm->waitOnInput(_gm->_messageDuration);
-				_vm->removeMessage();
-				_vm->_screen->setViewportBrightness(0);
-				_vm->setCurrentImage(26);
-				_vm->renderImage(0);
-				_vm->paletteFadeIn();
-				_gm->reply(kStringElevator15, 1, 1 + 128);
-				_gm->say(kStringYes);
-				_gm->reply(kStringElevator16, 1, 1 + 128);
-				_gm->reply(kStringElevator17, 1, 1 + 128);
-				if (_gm->dialog(2, _gm->_dials, dialBoss1, 0)) {
-					_gm->reply(kStringElevator18, 1, 1 + 128);
-					_gm->reply(kStringElevator19, 1, 1 + 128);
-					_gm->say(kStringElevator20);
-				}
-				_gm->reply(kStringElevator21, 1, 1 + 128);
-				_gm->reply(kStringElevator22, 1, 1 + 128);
-				_gm->reply(kStringElevator23, 1, 1 + 128);
-				_gm->reply(kStringElevator24, 1, 1 + 128);
-				_gm->reply(kStringElevator25, 1, 1 + 128);
-				_gm->reply(kStringElevator26, 1, 1 + 128);
-				_gm->reply(kStringElevator27, 1, 1 + 128);
-				_gm->reply(kStringElevator28, 1, 1 + 128);
-				jobDescription();
-				return true;
-			case 1:
-				_gm->reply(kStringElevator59, 4, 3);
-				_vm->renderImage(2);
-				setSectionVisible(3, kShownFalse);
-				setSectionVisible(4, kShownFalse);
-				_gm->wait(3);
-				_vm->renderImage(1);
-				setSectionVisible(2, kShownFalse);
-				_vm->renderImage(1 + 128);
-				break;
-			case 2:
-				_gm->reply(kStringElevator60, 4, 3);
-				_vm->renderImage(2);
-				setSectionVisible(3, kShownFalse);
-				setSectionVisible(4, kShownFalse);
-				_gm->wait(3);
-				_vm->renderImage(1);
-				setSectionVisible(2, kShownFalse);
-				_vm->renderImage(1 + 128);
-				break;
-			}
-			_gm->drawGUI();
-		} else
-			_vm->renderMessage(kStringElevator61);
-	} else if ((verb == ACTION_USE || verb == ACTION_PRESS) && obj1._id == KEYPAD) {
-		_vm->renderMessage(kStringElevator62);
-		do {
-			_gm->edit(input, 237, 66, 2);
-		} while ((_gm->_key.keycode != Common::KEYCODE_RETURN) && 
-				 (_gm->_key.keycode != Common::KEYCODE_ESCAPE) && !_vm->shouldQuit());
-		_vm->removeMessage();
-		if (_gm->_key.keycode == Common::KEYCODE_RETURN && input[0] != 0) {
-			for (unsigned i = 0; i < input.size(); i++) {
-				if (input[i] < '0' || input[i] > '9') {
-					_vm->renderMessage(kStringElevator63);
-					return true;
-				}
-			}
-			int64 number = input.asUint64();
-			if (number > 60)
-				_vm->renderMessage(kStringElevator63);
-			else if (number != _gm->_state._elevatorE) {
-				if (isSectionVisible(6)) {
-					_vm->renderImage(6 + 128);
-					_objectState[4]._type &= ~OPENED;
-					_vm->playSound(kAudioElevator1);
-				}
-				_vm->renderMessage(kStringElevator64);
-				_gm->_state._elevatorE = number;
-				if (number)
-					_objectState[5]._type &= ~OPENED;
-				else
-					_objectState[5]._type |= OPENED;
-			}
-		}
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ID_CARD, SLOT)) {
-		if (_gm->_state._elevatorNumber == 1 && _gm->_state._elevatorE == 32) {
-			_vm->renderImage(6);
-			_objectState[4]._type |= OPENED;
-			_vm->playSound(kAudioTaxiOpen);
-		} else
-			_vm->renderMessage(kStringElevator65);
-	} else
-		return false;
-	return true;
-}
-
-void Elevator::jobDescription() {
-	static StringId dialBoss2[3] = {
-		kStringElevator8,
-		kStringElevator9,
-		kStringElevator10
-	};
-	byte dialsBoss2[4] = {1,1,1,1};
-
-	_gm->reply(kStringElevator29, 1, 1 + 128);
-	_gm->reply(kStringElevator30, 1, 1 + 128);
-	_gm->reply(kStringElevator31, 1, 1 + 128);
-	_gm->reply(kStringElevator32, 1, 1 + 128);
-	_vm->setCurrentImage(30);
-	_vm->renderImage(0);
-	_gm->waitOnInput(72);
-	_gm->reply(kStringElevator33, 0, 0);
-	_gm->reply(kStringElevator34, 0, 0);
-	_gm->reply(kStringElevator35, 0, 0);
-	_gm->reply(kStringElevator36, 0, 0);
-	_gm->reply(kStringElevator37, 0, 0);
-	_gm->reply(kStringElevator38, 0, 0);
-	_gm->reply(kStringElevator39, 0, 0);
-	_gm->reply(kStringElevator40, 0, 0);
-	_gm->reply(kStringElevator41, 0, 0);
-	_gm->reply(kStringElevator42, 0, 0);
-	_gm->reply(kStringElevator43, 0, 0);
-	_gm->reply(kStringElevator44, 0, 0);
-	_gm->reply(kStringElevator45, 0, 0);
-	_gm->reply(kStringElevator46, 0, 0);
-	_gm->reply(kStringElevator47, 0, 0);
-	_gm->reply(kStringElevator48, 0, 0);
-	_vm->setCurrentImage(26);
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->renderImage(0);
-	_gm->reply(kStringElevator49, 1, 1 + 128);
-	int e;
-	do {
-		addSentence(0, 2);
-		switch (e = _gm->dialog(4, dialsBoss2, dialBoss2, 2)) {
-		case 0:
-			_gm->reply(kStringElevator50, 1, 1 + 128);
-			jobDescription();
-			return;
-		case 1:
-			_gm->reply(kStringElevator51, 1, 1 + 128);
-			break;
-		case 2:
-			_gm->reply(kStringElevator52, 1, 1 + 128);
-			break;
-		}
-		if (e == 1 || e == 2)
-			_gm->reply(kStringElevator53, 1, 1 + 128);
-	} while (e != 3);
-	_gm->reply(kStringElevator54, 1, 1 + 128);
-	_vm->paletteFadeOut();
-	_vm->_system->fillScreen(kColorBlack);
-	_vm->_screen->setViewportBrightness(255);
-	_vm->renderMessage(kStringElevator55);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->_screen->setViewportBrightness(0);
-	_gm->_state._tipsy = false;
-	_gm->_state._toMuseum = true;
-	_vm->saveGame(kSleepAutosaveSlot, "autosave");
-	_gm->_inventory.clear();
-	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(3));
-	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(5));
-	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(6));
-	_gm->takeObject(*_gm->_rooms[INTRO]->getObject(8));
-	_vm->setCurrentImage(29);
-	_gm->changeRoom(MUSEUM);
-	_vm->renderImage(0);
-	_vm->paletteFadeIn();
-	_vm->renderMessage(kStringElevator56);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringElevator57);
-	_gm->waitOnInput(_gm->_messageDuration);
-	_vm->removeMessage();
-	_vm->renderMessage(kStringElevator58);
-	_gm->drawGUI();
-
-	// 21:72:72
-	_gm->_state._startTime = g_system->getMillis() - 130363200;
-}
-
-Apartment::Apartment(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 25;
-	_id = APARTMENT;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringChip, kStringChipDescription, CHIP, TAKE | COMBINABLE, 255, 255, 1);
-	_objectState[1] = Object(_id, kStringHatch, kStringHatchDescription, HATCH, OPENABLE | CLOSED | COMBINABLE, 0, 1, 1);
-	_objectState[2] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0);
-	_objectState[3] = Object(_id, kStringMusicSystem, kStringMusicSystemDescription, MUSIC_SYSTEM, COMBINABLE, 4, 4, 0);
-	_objectState[4] = Object(_id, kStringSpeakers, kStringSpeakersDescription, NULLOBJECT, NULLTYPE, 5, 5, 0);
-	_objectState[5] = Object(_id, kStringPencils, kStringPencilsDescription, NULLOBJECT, UNNECESSARY, 6, 6, 0);
-	_objectState[6] = Object(_id, kStringMetalBlocks, kStringMetalBlocksDescription, MAGNET, TAKE | COMBINABLE, 10, 10, 3 + 128);
-	_objectState[7] = Object(_id, kStringImage, kStringImageDescription, NULLOBJECT, UNNECESSARY, 7, 7, 0);
-	_objectState[8] = Object(_id, kStringCabinet, kStringCabinetDescription, CABINET, OPENABLE | CLOSED, 8, 8, 0);
-	_objectState[9] = Object(_id, kStringChair, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
-	_objectState[10] = Object(_id, kStringElevator, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, ELEVATOR, 22);
-	_objectState[11] = Object(_id, kStringUnderBed, kStringUnderBedDescription, UNDER_BED, NULLTYPE, 11, 11, 0);
-	_objectState[12] = Object(_id, kStringKey, kStringKeyDescription, KEY, TAKE | COMBINABLE, 255, 255, 0);
-}
-
-void Apartment::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Apartment::animation() {
-}
-
-bool Apartment::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_USE && Object::combine(obj1, obj2, ROD, UNDER_BED)) {
-		if (_objectState[12]._type & CARRIED)
-			_vm->renderMessage(kStringApartment1);
-		else if (_shown[kMaxSection - 1]) {
-			_vm->renderMessage(kStringApartment2);
-			_gm->takeObject(_objectState[12]);
-			_vm->playSound(kAudioSuccess);
-		} else {
-			_vm->renderMessage(kStringApartment3);
-			_gm->waitOnInput(_gm->_messageDuration);
-			_vm->removeMessage();
-			_vm->renderMessage(kStringApartment4);
-		}
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, HATCH)) {
-		if (_objectState[1]._type & OPENED)
-			_vm->renderMessage(kStringApartment5);
-		else {
-			_vm->renderImage(1);
-			_vm->playSound(kAudioTaxiOpen);
-			_objectState[1]._type |= OPENED;
-			_objectState[1]._click = 1;
-			if (!(_objectState[0]._type & CARRIED)) {
-				_vm->renderImage(2);
-				_objectState[0]._click = 2;
-			}
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == HATCH && obj1._type & OPENED) {
-		_vm->renderImage(1 + 128);
-		setSectionVisible(2, false);
-		_vm->playSound(kAudioElevator1);
-		obj1._type &= ~OPENED;
-		obj1._click = 0;
-		if (!(_objectState[0]._type & CARRIED))
-			_objectState[0]._click = 255;
-	} else if (verb == ACTION_TAKE && obj1._id == CHIP && !(obj1._type & CARRIED)) {
-		setSectionVisible(2, kShownFalse);
-		return false;
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, CABINET)) {
-		_vm->renderMessage(kStringApartment6);
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CHIP, MUSIC_SYSTEM)) {
-		_vm->renderMessage(kStringApartment7);
-	} else if (verb == ACTION_PRESS && obj1._id == MUSIC_SYSTEM) {
-		_vm->renderMessage(kStringApartment8);
-	} else
-		return false;
-	return true;
-}
-
-Ship::Ship(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 45;
-	_id = SHIP;
-	_shown[0] = kShownTrue;
-	_shown[8] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSwitch, kStringDefaultDescription, SWITCH, PRESS | COMBINABLE, 0, 0, 0);
-	_objectState[1] = Object(_id, kStringHandle, kStringDefaultDescription, HANDLE, NULLTYPE, 255, 255, 0);
-	_objectState[2] = Object(_id, kStringHatch2, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0, SHIP, 19);
-	_objectState[3] = Object(_id, kStringSwitch, kStringDefaultDescription, DOOR_SWITCH, PRESS | COMBINABLE, 255, 255, 0);
-	_objectState[4] = Object(_id, kStringSpaceSuit, kStringSpaceSuitDescription, SUIT, TAKE, 255, 255, 1);
-	_objectState[5] = Object(_id, kStringCable, kStringCableDescription1, RCABLE, COMBINABLE, 255, 255, 0);
-	_objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + 128);
-
-	_outroText = 
-		_vm->getGameString(kStringIntro1) + '\0' + 
-		_vm->getGameString(kStringIntro2) + '\0' + 
-		_vm->getGameString(kStringIntro3) + '\0' + 
-		_vm->getGameString(kStringIntro4) + '\0' + 
-		_vm->getGameString(kStringIntro5) + '\0' + 
-		"^Matthias Neef#" + '\0' +
-		"^Sascha Otterbach#" + '\0' +
-		"^Thomas Mazzoni#" + '\0' +
-		"^Matthias Klein#" + '\0' +
-		"^Gerrit Rothmaier#" + '\0' +
-		"^Thomas Hassler#" + '\0' +
-		"^Rene Kach#" + '\0' +
-		'\233' + '\0';
-	Common::String waitString = "##################";
-	_outroText2 = 
-		waitString + '\0' +
-		_vm->getGameString(kStringOutro1) + '\0' + 
-		_vm->getGameString(kStringOutro2) + '\0' + 
-		_vm->getGameString(kStringOutro3) + '\0' + 
-		_vm->getGameString(kStringOutro4) + '\0' + 
-		_vm->getGameString(kStringOutro5) + '\0' + 
-		'\233' + '\0';
-}
-
-void Ship::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Ship::animation() {
-}
-
-bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_PRESS && obj1._id == SWITCH) {
-		if (_gm->_state._dark) {
-			_gm->_state._dark = false;
-			_vm->_screen->setViewportBrightness(255);
-			_objectState[1]._click = 1;
-			_objectState[2]._click = 2;
-			_objectState[3]._click = 3;
-			_objectState[5]._click = 4;
-			_objectState[6]._click = 5;
-			_objectState[2]._type = EXIT | OPENABLE | CLOSED;
-			_gm->drawMapExits();
-		}
-	} else if (verb == ACTION_PRESS && obj1._id == DOOR_SWITCH &&
-			!isSectionVisible(7)) {
-		_vm->renderImage(3);
-		_gm->wait(2);
-		_vm->renderImage(6);
-		_vm->playSound(kAudioShip1);
-		while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
-			_gm->wait(1);
-		_vm->renderImage(6 + 128);
-		_vm->renderImage(7);
-		_objectState[3]._description = kStringShip1;
-		_objectState[2]._description = kStringShip2;
-	} else if (verb == ACTION_PULL && obj1._id == HANDLE) {
-		_vm->renderImage(2);
-		_vm->playSound(kAudioTaxiOpen);
-		obj1._click = 255;
-		_objectState[4]._click = 9;
-	} else if (verb == ACTION_TAKE && obj1._id == SUIT && !(obj1._type & CARRIED)) {
-		setSectionVisible(2, kShownFalse);
-		_gm->takeObject(obj1);
-	} else if (verb == ACTION_USE && obj1._id == SUIT) {
-		if (!(obj1._type & CARRIED)) {
-			setSectionVisible(2, kShownFalse);
-			_gm->takeObject(obj1);
-		}
-		if ((_shown[kMaxSection - 1] = !_shown[kMaxSection - 1]))
-			_vm->renderMessage(kStringShip3);
-		else
-			_vm->renderMessage(kStringShip4);
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, RCABLE)) {
-		_objectState[6]._description = kStringDefaultDescription;
-		if (_objectState[6]._click == 5)
-			_vm->renderImage(8 + 128);
-		if (_objectState[6]._type & CARRIED)
-			_gm->_inventory.remove(_objectState[6]);
-		if (isSectionVisible(11) || isSectionVisible(10))
-			_vm->renderMessage(kStringShip5);
-		else if (isSectionVisible(9)) {
-			_vm->renderImage(9 + 128);
-			_vm->renderImage(11);
-			if (!_shown[kMaxSection - 1])
-				kill();
-			_objectState[6]._click = 8;
-			_gm->wait(2);
-			_vm->renderImage(4);
-			_vm->playSound(kAudioShip2);
-			_gm->wait(3);
-			_vm->renderImage(5);
-			_objectState[2]._type |= OPENED;
-			_objectState[2]._description = kStringDefaultDescription;
-		} else {
-			_vm->renderImage(10);
-			if (!_shown[kMaxSection - 1])
-				kill();
-			_objectState[6]._click = 7;
-		}
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, DOOR_SWITCH) && isSectionVisible(7)) {
-		_objectState[6]._description = kStringDefaultDescription;
-		if (_objectState[6]._click == 5)
-			_vm->renderImage(8 + 128);
-		if (_objectState[6]._type & CARRIED)
-			_gm->_inventory.remove(_objectState[6]);
-		if (isSectionVisible(11) || isSectionVisible(9))
-			_vm->renderMessage(kStringShip5);
-		else if (isSectionVisible(10)) {
-			_vm->renderImage(10 + 128);
-			_vm->renderImage(11);
-			if (!_shown[kMaxSection - 1])
-				kill();
-			_objectState[6]._click = 8;
-			_gm->wait(2);
-			_vm->renderImage(4);
-			_vm->playSound(kAudioShip2);
-			_gm->wait(3);
-			_vm->renderImage(5);
-			_objectState[2]._type |= OPENED;
-			_objectState[2]._description = kStringDefaultDescription;
-		} else {
-			_vm->renderImage(9);
-			_objectState[6]._click = 6;
-		}
-	} else if (verb == ACTION_TAKE && obj1._id == CABLE && obj1._type & CARRIED) {
-		if (isSectionVisible(8)) {
-			obj1._description = kStringDefaultDescription;
-			_gm->takeObject(obj1);
-		} else
-			_vm->renderMessage(kStringShip6);
-	} else if (verb == ACTION_WALK && obj1._type == (EXIT | OPENABLE | CLOSED | OPENED)) {
-		_vm->setCurrentImage(46);
-		_vm->renderImage(0);
-		_gm->wait(16);
-		_vm->renderMessage(kStringShip7, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_gm->reply(kStringShip8, 1, 1 + 128);
-		_vm->renderMessage(kStringShip9, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_gm->reply(kStringShip10, 1, 1 + 128);
-		_gm->reply(kStringShip11, 1, 1 + 128);
-		_gm->reply(kStringShip12, 1, 1 + 128);
-		_gm->reply(kStringShip13, 1, 1 + 128);
-		_vm->renderMessage(kStringShip14, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_gm->reply(kStringShip15, 1, 1 + 128);
-		_vm->renderMessage(kStringShip16, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_gm->reply(kStringAha, 1, 1 + 128);
-		_gm->reply(kStringShip17, 1, 1 + 128);
-		_vm->renderMessage(kStringShip18, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_gm->reply(kStringShip19, 1, 1 + 128);
-		_gm->wait(16);
-		CursorMan.showMouse(false);
-		_vm->renderImage(2);
-		for (int i = 3; i < 12; i++) {
-			_vm->renderImage(i);
-			if (i == 9)
-				_vm->playSound(kAudioShip3);
-			_gm->wait(2);
-			_vm->renderImage(i + 128);
-		}
-		_vm->renderImage(12);
-		_gm->wait(18);
-		// TODO some palette stuff
-		outro();
-	} else
-		return false;
-	return true;
-}
-
-void Ship::outro() {
-	_vm->_screen->paletteFadeOut(100);
-	_vm->renderImage(13);
-	// Because the screen is partialy faded out, the original values (63, 20, 20)
-	// should be multiplied by 2.55, but are multiplied by 3.5, because the color
-	// looks closer to the original
-	byte palette[768];
-	_vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
-	palette[282] = 220;
-	palette[283] = 70;
-	palette[284] = 70;
-	// Restore marquee colors
-	for (int i = 0; i < 3; i++) {
-		palette[kColorPurple * 3 + i] *= 2.5;
-		palette[kColorLightYellow * 3 + i] *= 2.5;
-	}
-	_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
-	_vm->playSound(kMusicMadMonkeys);
-	_vm->renderBox(0, 190, 320, 10, kColorBlack);
-	Marquee marquee(_vm->_screen, Marquee::kMarqueeOutro, _outroText.c_str());
-	for(int i = 0; i < 2; i++) {
-		while (!_vm->shouldQuit()) {
-			_gm->updateEvents();
-			
-			if (!marquee.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
-				break;
-			g_system->updateScreen();
-			g_system->delayMillis(_vm->_delay);
-		}
-		marquee.reset();
-	}
-	Marquee marquee2(_vm->_screen, Marquee::kMarqueeOutro, _outroText2.c_str());
-	while (!_vm->shouldQuit()) {
-		_gm->updateEvents();
-		
-		if (!marquee2.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
-			break;
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	// TODO: End with some end of music
-	int volume;
-	do {
-		volume = _vm->_sound->getVolume() - 10;
-		_vm->_sound->setVolume(volume);
-		_gm->waitOnInput(1);
-	} while (volume > 10 && !_vm->shouldQuit());
-	Common::Event event;
-	event.type = Common::EVENT_RTL;
-	_vm->getEventManager()->pushEvent(event);
-}
-
-void Ship::kill() {
-	_vm->playSound(kAudioShipDeath);
-	while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
-		_gm->wait(1);
-	_gm->dead(kStringShip0);
-}
-
-Pyramid::Pyramid(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 8;
-	_id = PYRAMID;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + 128);
-	_objectState[1] = Object(_id, kStringSign, kStringSignDescription, SIGN, COMBINABLE, 25, 25, 0);
-	_objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 7);
-	_objectState[3] = Object(_id, kStringPyramid, kStringPyramidDescription, NULLOBJECT, NULLTYPE, 26, 26, 0);
-	_objectState[4] = Object(_id, kStringSun, kStringSunDescription, SUN, NULLTYPE, 28, 28, 0);
-	_objectState[5] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE1, COMBINABLE, 0, 0, 0);
-	_objectState[6] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE2, COMBINABLE, 1, 0, 0);
-	_objectState[7] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE3, COMBINABLE, 2, 0, 0);
-	_objectState[8] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE4, COMBINABLE, 3, 0, 0);
-	_objectState[9] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE5, COMBINABLE, 4, 0, 0);
-	_objectState[10] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE6, COMBINABLE, 5, 0, 0);
-	_objectState[11] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE7, COMBINABLE, 6, 0, 0);
-	_objectState[12] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE8, COMBINABLE, 7, 0, 0);
-	_objectState[13] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE9, COMBINABLE, 8, 0, 0);
-	_objectState[14] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE10, COMBINABLE, 9, 0, 0);
-	_objectState[15] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE11, COMBINABLE, 10, 0, 0);
-	_objectState[16] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE12, COMBINABLE, 11, 0, 0);
-	_objectState[17] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE13, COMBINABLE, 12, 0, 0);
-	_objectState[18] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE14, COMBINABLE, 13, 0, 0);
-	_objectState[19] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE15, COMBINABLE, 14, 0, 0);
-	_objectState[20] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE16, COMBINABLE, 15, 0, 0);
-	_objectState[21] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE17, COMBINABLE, 16, 0, 0);
-	_objectState[22] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE18, COMBINABLE, 17, 0, 0);
-	_objectState[23] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE19, COMBINABLE, 18, 0, 0);
-	_objectState[24] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE20, COMBINABLE, 19, 0, 0);
-	_objectState[25] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE21, COMBINABLE, 20, 0, 0);
-	_objectState[26] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE22, COMBINABLE, 21, 0, 0);
-	_objectState[27] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE23, COMBINABLE, 22, 0, 0);
-	_objectState[28] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE24, COMBINABLE, 23, 0, 0);
-	_objectState[29] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE25, COMBINABLE, 24, 0, 0);
-}
-
-void Pyramid::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Pyramid::animation() {
-}
-
-bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
-	Object *rope, *hole;
-	rope = hole = nullptr;
-
-	if (obj1._id == ROPE)
-		rope = &obj1;
-	if (obj2._id == ROPE)
-		rope = &obj2;
-	if (obj1._id >= HOLE1 && obj1._id <= HOLE25)
-		hole = &obj1;
-	if (obj2._id >= HOLE1 && obj2._id <= HOLE25)
-		hole = &obj2;
-
-	if (verb == ACTION_WALK && obj1._id == PYRA_ENTRANCE) {
-		_gm->_state._eventCallback = kPyramidEndFn;
-		_gm->_state._eventTime = g_system->getMillis() + 3600000; //hour
-		_gm->_state._pyraS = 4;
-		_gm->_state._pyraZ = 10;
-		_gm->_state._pyraDirection = 0;
-		_gm->passageConstruction();
-		return false;
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, SIGN)) {
-		if (rope->_type & CARRIED) {
-			_vm->renderImage(1);
-			_gm->_inventory.remove(*rope);
-			_objectState[0]._click = 29;
-		} else
-			_vm->renderMessage(kStringPyramid1);
-	} else if (verb == ACTION_USE && hole != nullptr && rope != nullptr) {
-		if (rope->_type & CARRIED)
-			_vm->renderMessage(kStringPyramid2);
-		else {
-			int number = hole->_id - HOLE1;
-			int start = number / 5 * 5 + 2;
-			for (int i = 1; i <= 26; i++)
-				_vm->renderImage(i + 128);
-			for (int i = start; i <= start + number % 5; i++)
-				_vm->renderImage(i);
-			_objectState[0]._click = 30;
-			if (number == 18) {
-				_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownTrue);
-				_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 5;
-				_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = EXIT;
-			} else {
-				_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
-				_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
-				_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
-			}
-		}
-	} else if (verb == ACTION_PULL && rope != nullptr && !(rope->_type & CARRIED) &&
-			!isSectionVisible(1)) {
-		for (int i = 2; i <= 26; i++)
-			_vm->renderImage(i + 128);
-		_vm->renderImage(1);
-		_objectState[0]._click = 29;
-		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
-		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
-		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
-	} else if (verb == ACTION_TAKE && rope != nullptr && !(rope->_type & CARRIED)) {
-		for (int i = 2; i <= 26; i++)
-			_vm->renderImage(i + 128);
-		_gm->takeObject(*rope);
-		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
-		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
-		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
-	} else if (verb == ACTION_WALK && obj1._id == SUN) {
-		_vm->renderMessage(kStringPyramid3);
-	} else
-		return false;
-	return true;
-}
-
-PyrEntrance::PyrEntrance(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 9;
-	_id = PYR_ENTRANCE;
-	_shown[0] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[8] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringSign, kStringSign5Description, SIGN, NULLTYPE, 255, 255, 0);
-	_objectState[1] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[2] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[3] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void PyrEntrance::onEntrance() {
-	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
-		_gm->setAnimationTimer(1);
-		_waitTime = g_system->getMillis() + 60000;
-	}
-}
-
-void PyrEntrance::animation() {
-	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
-		if (g_system->getMillis() >= _waitTime) { // around 1 minute
-			_vm->renderMessage(kStringPyramid4);
-			_gm->waitOnInput(_gm->_messageDuration);
-			_vm->removeMessage();
-			_gm->_state._pyraZ++;
-			_gm->_state._pyraDirection = 0;
-			_gm->changeRoom(FLOORDOOR);
-			_vm->setCurrentImage(14);
-			_vm->renderRoom(*_gm->_rooms[FLOORDOOR]);
-			_gm->drawMapExits();
-			_gm->wait(3);
-			_vm->renderImage(5);
-			_gm->wait(3);
-			_vm->renderImage(6);
-			_gm->_rooms[FLOORDOOR]->setSectionVisible(5, kShownFalse);
-			_gm->wait(3);
-			_vm->renderImage(7);
-			_gm->_rooms[FLOORDOOR]->setSectionVisible(6, kShownFalse);
-			_gm->wait(3);
-			_vm->renderImage(8);
-			_gm->_rooms[FLOORDOOR]->setSectionVisible(7, kShownFalse);
-			_gm->wait(3);
-			_vm->renderImage(9);
-			_gm->_rooms[FLOORDOOR]->setSectionVisible(8, kShownFalse);
-			_vm->playSound(kAudioShip3);
-			_gm->screenShake();
-			_gm->_rooms[FLOORDOOR]->setSectionVisible(kMaxSection - 1, kShownTrue);
-		} else {
-			_gm->setAnimationTimer(1);
-		}
-	} else
-		_gm->setAnimationTimer(kMaxTimerValue);
-}
-
-bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
-	static RoomEntry roomTab[29] = {
-		{2, 8, 6, 0, FLOORDOOR},
-		{0, 8, 4, 2, FLOORDOOR_U},
-		{0, 4, 11, 2, PYRAMID},
-		{0, 0, 2, 1, UPSTAIRS1},
-		{1, 1, 2, 3, DOWNSTAIRS1},
-		{0, 5, 8, 3, BOTTOM_RIGHT_DOOR},
-		{0, 4, 8, 1, BOTTOM_LEFT_DOOR},
-		{1, 5, 8, 3, UPPER_DOOR},
-		{1, 4, 8, 1, UPPER_DOOR},
-		{0, 4, 8, 0, UPSTAIRS2},
-		{1, 4, 7, 2, DOWNSTAIRS2},
-		{1, 6, 6, 2, PUZZLE_FRONT},
-		{1, 6, 7, 0, PUZZLE_BEHIND},
-		{0, 3, 6, 0, FORMULA1_N},
-		{0, 3, 7, 0, FORMULA1_F},
-		{0, 4, 6, 0, FORMULA2_N},
-		{0, 4, 7, 0, FORMULA2_F},
-		{0, 8, 9, 2, TOMATO_N},
-		{0, 8, 8, 2, TOMATO_F},
-		{1, 4, 2, 0, MONSTER_F},
-		{1, 10, 8, 0, MONSTER_F},
-		{1, 4, 1, 0, MONSTER1_N},
-		{1, 10, 7, 0, MONSTER2_N},
-		{0, 2, 4, 2, DOWNSTAIRS3},
-		{1, 2, 5, 0, UPSTAIRS3},
-		{1, 2, 5, 3, LCORRIDOR1},
-		{1, 1, 5, 1, LCORRIDOR2},
-		{1, 1, 5, 3, HOLE_ROOM},
-		{0, 7, 4, 0, BST_DOOR}
-	};
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (_gm->_rooms[FLOORDOOR]->isSectionVisible(kMaxSection - 1))
-		roomTab[0]._e = 1;
-	else
-		roomTab[0]._e = 2;
-	for (int i = 0; i < 29; i++) {
-		if (_gm->_state._pyraE == roomTab[i]._e &&
-			_gm->_state._pyraS == roomTab[i]._s &&
-			_gm->_state._pyraZ == roomTab[i]._z &&
-			_gm->_state._pyraDirection == roomTab[i]._r) {
-			_gm->changeRoom(roomTab[i]._exitRoom);
-			_gm->_newRoom = true;
-			return true;
-		}
-	}
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Upstairs1::Upstairs1(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 10;
-	_id = UPSTAIRS1;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[2] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void Upstairs1::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Upstairs1::animation() {
-}
-
-bool Upstairs1::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR) {
-		if (_gm->_state._pyraE)
-			_gm->_state._pyraE = 0;
-		else
-			_gm->_state._pyraE = 1;
-	}
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Downstairs1::Downstairs1(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 10;
-	_id = DOWNSTAIRS1;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[3] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
-}
-
-void Downstairs1::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Downstairs1::animation() {
-}
-
-bool Downstairs1::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR) {
-		if (_gm->_state._pyraE)
-			_gm->_state._pyraE = 0;
-		else
-			_gm->_state._pyraE = 1;
-	}
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-BottomRightDoor::BottomRightDoor(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 12;
-	_id = BOTTOM_RIGHT_DOOR;
-	_shown[0] = kShownTrue;
-	_shown[19] = kShownTrue;
-	_shown[23] = kShownTrue;
-	_shown[29] = kShownTrue;
-	_shown[30] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
-	_objectState[3] = Object(_id, kStringButton, kStringDefaultDescription, BUTTON, PRESS, 19, 19, 0);
-}
-
-void BottomRightDoor::onEntrance() {
-	setRoomSeen(true);
-}
-
-void BottomRightDoor::animation() {
-}
-
-bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_PRESS && obj1._id == BUTTON) {
-		if (isSectionVisible(22)) {
-			_vm->renderImage(21);
-			setSectionVisible(22, kShownFalse);
-			_gm->wait(2);
-			_vm->renderImage(20);
-			setSectionVisible(21, kShownFalse);
-			_gm->wait(2);
-			_vm->renderImage(19);
-			setSectionVisible(20, kShownFalse);
-			_objectState[2]._type = EXIT | OPENABLE | CLOSED;
-			_objectState[2]._id = DOOR;
-			_objectState[2]._description = kStringMassive;
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownFalse);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownFalse);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownFalse);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownTrue);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownFalse);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownFalse);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownFalse);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = DOOR;
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringMassive;
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownTrue);
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownTrue);
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownFalse);
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownFalse);
-			_gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT;
-			_gm->_rooms[UPPER_DOOR]->getObject(2)->_id = CORRIDOR;
-			_gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringDefaultDescription;
-		} else {
-			_vm->renderImage(20);
-			setSectionVisible(19, kShownFalse);
-			_gm->wait(2);
-			_vm->renderImage(21);
-			_gm->wait(2);
-			_vm->renderImage(22);
-			_objectState[2]._type = EXIT;
-			_objectState[2]._id = CORRIDOR;
-			_objectState[2]._description = kStringDefaultDescription;
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownTrue);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownTrue);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownTrue);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownFalse);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownTrue);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownTrue);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownTrue);
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT;
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = CORRIDOR;
-			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringDefaultDescription;
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownFalse);
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownFalse);
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownTrue);
-			_gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownTrue);
-			_gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
-			_gm->_rooms[UPPER_DOOR]->getObject(2)->_id = DOOR;
-			_gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringMassive;
-		}
-		_vm->playSound(kAudioShip3);
-		_gm->screenShake();
-	} else
-		return false;
-	return true;
-}
-
-BottomLeftDoor::BottomLeftDoor(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 12;
-	_id = BOTTOM_LEFT_DOOR;
-	_shown[0] = kShownTrue;
-	_shown[19] = kShownTrue;
-	_shown[29] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void BottomLeftDoor::onEntrance() {
-	setRoomSeen(true);
-}
-
-void BottomLeftDoor::animation() {
-}
-
-bool BottomLeftDoor::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		if (verb == ACTION_WALK && obj1._id == G_LEFT)
-			_gm->changeRoom(UPSTAIRS2);
-		else
-			_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else
-		return false;
-	return true;
-}
-
-Upstairs2::Upstairs2(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 10;
-	_id = UPSTAIRS2;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void Upstairs2::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Upstairs2::animation() {
-}
-
-bool Upstairs2::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR) {
-		if (_gm->_state._pyraE)
-			_gm->_state._pyraE = 0;
-		else
-			_gm->_state._pyraE = 1;
-	}
-	if (obj1._id == G_RIGHT)
-		_gm->changeRoom(BOTTOM_LEFT_DOOR);
-	else
-		_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Downstairs2::Downstairs2(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 10;
-	_id = DOWNSTAIRS2;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[3] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
-}
-
-void Downstairs2::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Downstairs2::animation() {
-}
-
-bool Downstairs2::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR) {
-		if (_gm->_state._pyraE)
-			_gm->_state._pyraE = 0;
-		else
-			_gm->_state._pyraE = 1;
-	}
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-	return true;
-}
-
-UpperDoor::UpperDoor(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 12;
-	_id = UPPER_DOOR;
-	_shown[0] = kShownTrue;
-	_shown[26] = kShownTrue;
-	_shown[27] = kShownTrue;
-	_shown[30] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void UpperDoor::onEntrance() {
-	setRoomSeen(true);
-}
-
-void UpperDoor::animation() {
-}
-
-bool UpperDoor::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-PuzzleFront::PuzzleFront(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 12;
-	_id = PUZZLE_FRONT;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[7] = kShownTrue;
-	_shown[8] = kShownTrue;
-	_shown[9] = kShownTrue;
-	_shown[10] = kShownTrue;
-	_shown[11] = kShownTrue;
-	_shown[12] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[15] = kShownTrue;
-	_shown[30] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 255, 255, 0, PYR_ENTRANCE, 2);
-	_objectState[3] = Object(_id, kStringPiece, kStringDefaultDescription, PART0, PRESS, 3, 3, 0);
-	_objectState[4] = Object(_id, kStringPiece, kStringDefaultDescription, PART1, PRESS, 4, 4, 0);
-	_objectState[5] = Object(_id, kStringPiece, kStringDefaultDescription, PART2, PRESS, 5, 5, 0);
-	_objectState[6] = Object(_id, kStringPiece, kStringDefaultDescription, PART3, PRESS, 6, 6, 0);
-	_objectState[7] = Object(_id, kStringPiece, kStringDefaultDescription, PART4, PRESS, 7, 7, 0);
-	_objectState[8] = Object(_id, kStringPiece, kStringDefaultDescription, PART5, PRESS, 8, 8, 0);
-	_objectState[9] = Object(_id, kStringPiece, kStringDefaultDescription, PART6, PRESS, 9, 9, 0);
-	_objectState[10] = Object(_id, kStringPiece, kStringDefaultDescription, PART7, PRESS, 10, 10, 0);
-	_objectState[11] = Object(_id, kStringPiece, kStringDefaultDescription, PART8, PRESS, 11, 11, 0);
-	_objectState[12] = Object(_id, kStringPiece, kStringDefaultDescription, PART9, PRESS, 12, 12, 0);
-	_objectState[13] = Object(_id, kStringPiece, kStringDefaultDescription, PART10, PRESS, 13, 13, 0);
-	_objectState[14] = Object(_id, kStringPiece, kStringDefaultDescription, PART11, PRESS, 14, 14, 0);
-	_objectState[15] = Object(_id, kStringPiece, kStringDefaultDescription, PART12, PRESS, 15, 15, 0);
-	_objectState[16] = Object(_id, kStringPiece, kStringDefaultDescription, PART13, PRESS, 16, 16, 0);
-	_objectState[17] = Object(_id, kStringPiece, kStringDefaultDescription, PART14, PRESS, 17, 17, 0);
-	_objectState[18] = Object(_id, kStringPiece, kStringDefaultDescription, PART15, PRESS, 18, 18, 0);
-}
-
-void PuzzleFront::onEntrance() {
-	setRoomSeen(true);
-}
-
-void PuzzleFront::animation() {
-}
-
-bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
-	MS2Image *image = _vm->_screen->getCurrentImage();
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_PRESS && obj1._id >= PART0 && obj1._id <= PART15) {
-		int pos = obj1._id - PART0;
-		int newPos = 0;
-		if (pos > 3  && _gm->_puzzleField[pos - 4] == 255)
-			newPos = pos - 4;
-		else if (pos < 12 && _gm->_puzzleField[pos + 4] == 255)
-			newPos = pos + 4;
-		else if ((pos % 4) > 0 && _gm->_puzzleField[pos - 1] == 255)
-			newPos = pos - 1;
-		else if ((pos % 4) < 3 && _gm->_puzzleField[pos + 1] == 255)
-			newPos = pos + 1;
-		else {
-			_vm->renderMessage(kStringPyramid5);
-			return true;
-		}
-		int a = _gm->_puzzleField[pos] + 1;
-		_vm->renderImage(a + 128);
-		image->_section[a].x1 = 95 + (newPos % 4) * 33;
-		image->_section[a].x2 = image->_section[a].x1 + 31;
-		image->_section[a].y1 = 24 + (newPos / 4) * 25;
-		image->_section[a].y2 = image->_section[a].y1 + 23;
-		_vm->renderImage(a);
-		_vm->playSound(kAudioTaxiOpen);
-		_gm->_state._puzzleTab[a - 1] = newPos;
-		_gm->_puzzleField[pos] = 255;
-		_gm->_puzzleField[newPos] = a - 1;
-		_objectState[pos + 3]._click = 255;
-		_objectState[newPos + 3]._click = newPos + 3;
-		for (int i = 0; i < 15; i++)
-			if (_gm->_state._puzzleTab[i] != i)
-				return true;
-		
-		_gm->wait(2);
-		_vm->renderImage(16);
-		for (int i = 1; i < 16; i++)
-			setSectionVisible(i, kShownFalse);
-		_gm->wait(2);
-		_vm->renderImage(17);
-		_gm->wait(2);
-		_vm->renderImage(18);
-		_objectState[2]._type = EXIT;
-		_objectState[2]._id = CORRIDOR;
-		_objectState[2]._description = kStringDefaultDescription;
-		_objectState[2]._click = 0;
-		
-		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(31, kShownFalse);
-		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(26, kShownTrue);
-		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(27, kShownTrue);
-		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(29, kShownTrue);
-		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_type = EXIT;
-		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_id = CORRIDOR;
-		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_description = kStringDefaultDescription;
-		_vm->playSound(kAudioShip3);
-		_gm->screenShake();
-	} else
-		return false;
-	return true;
-}
-
-PuzzleBehind::PuzzleBehind(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 12;
-	_id = PUZZLE_BEHIND;
-	_shown[0] = kShownTrue;
-	_shown[29] = kShownTrue;
-	_shown[31] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void PuzzleBehind::onEntrance() {
-	setRoomSeen(true);
-}
-
-void PuzzleBehind::animation() {
-}
-
-bool PuzzleBehind::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Formula1F::Formula1F(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 14;
-	_id = FORMULA1_F;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 1, 1, 0, PYR_ENTRANCE, 2);
-}
-
-void Formula1F::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Formula1F::animation() {
-}
-
-bool Formula1F::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR)
-		_gm->changeRoom(FORMULA1_N);
-	else
-		_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Formula1N::Formula1N(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 13;
-	_id = FORMULA1_N;
-	_shown[0] = kShownTrue;
-	_shown[5] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
-}
-
-void Formula1N::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Formula1N::animation() {
-}
-
-bool Formula1N::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Formula2F::Formula2F(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 14;
-	_id = FORMULA2_F;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 2, 2, 0, PYR_ENTRANCE, 2);
-}
-
-void Formula2F::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Formula2F::animation() {
-}
-
-bool Formula2F::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR)
-		_gm->changeRoom(FORMULA2_N);
-	else
-		_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Formula2N::Formula2N(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 13;
-	_id = FORMULA2_N;
-	_shown[0] = kShownTrue;
-	_shown[6] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
-}
-
-void Formula2N::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Formula2N::animation() {
-}
-
-bool Formula2N::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-TomatoF::TomatoF(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 14;
-	_id = TOMATO_F;
-	_shown[0] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringTomato, kStringFunnyDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
-}
-
-void TomatoF::onEntrance() {
-	setRoomSeen(true);
-}
-
-void TomatoF::animation() {
-}
-
-bool TomatoF::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR)
-		_gm->changeRoom(TOMATO_N);
-	else
-		_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-TomatoN::TomatoN(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 13;
-	_id = TOMATO_N;
-	_shown[0] = kShownTrue;
-	_shown[7] = kShownTrue;
-	_shown[8] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringKnife1, kStringKnife1Description, TKNIFE, TAKE | COMBINABLE, 5, 5, 7);
-	_objectState[3] = Object(_id, kStringTomato, kStringFunnyDescription, NULLOBJECT, UNNECESSARY, 4, 4, 0);
-}
-
-void TomatoN::onEntrance() {
-	setRoomSeen(true);
-}
-
-void TomatoN::animation() {
-}
-
-bool TomatoN::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_TAKE && obj1._id == TKNIFE) {
-		_gm->takeObject(obj1);
-		setSectionVisible(8, kShownFalse);
-	} else
-		return false;
-	return true;
-}
-
-MonsterF::MonsterF(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 14;
-	_id = MONSTER_F;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[14] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringMonster, kStringMonsterDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void MonsterF::onEntrance() {
-	setRoomSeen(true);
-}
-
-void MonsterF::animation() {
-}
-
-bool MonsterF::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR) {
-		if (_gm->_state._pyraS == 4)
-			_gm->changeRoom(MONSTER1_N);
-		else
-			_gm->changeRoom(MONSTER2_N);
-	} else
-		_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Monster1N::Monster1N(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 13;
-	_id = MONSTER1_N;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringRope, kStringRopeDescription, ROPE, TAKE | COMBINABLE, 255, 255, 2);
-	_objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
-	_objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
-	_objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
-}
-
-void Monster1N::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Monster1N::animation() {
-}
-
-bool Monster1N::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
-		if (obj1._type & OPENED)
-			_vm->renderMessage(kStringGenericInteract8);
-		else {
-			obj1._type |= OPENED;
-			if (isSectionVisible(kMaxSection - 1))
-				_vm->renderImage(2);
-			else {
-				_objectState[2]._click = 1;
-				_vm->renderImage(4);
-				setSectionVisible(2, kShownFalse);
-			}
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
-		if (obj1._type & OPENED) {
-			_vm->renderImage(1);
-			setSectionVisible(2, kShownFalse);
-			obj1._type &= ~OPENED;
-			_vm->playSound(kAudioElevator1);
-		} else
-			_vm->renderMessage(kStringGenericInteract11);
-	} else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
-		_gm->takeObject(obj1);
-		setSectionVisible(3, kShownFalse);
-		setSectionVisible(4, kShownFalse);
-		setSectionVisible(kMaxSection - 1, kShownTrue);
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
-		_vm->renderMessage(kStringPyramid6);
-	} else
-		return false;
-	return true;
-}
-
-Monster2N::Monster2N(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 13;
-	_id = MONSTER2_N;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringNote, kStringNoteDescription, NOTE, TAKE | COMBINABLE, 255, 255, 2);
-	_objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
-	_objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
-	_objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
-}
-
-void Monster2N::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Monster2N::animation() {
-}
-
-bool Monster2N::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
-		if (obj1._type & OPENED)
-			_vm->renderMessage(kStringGenericInteract8);
-		else {
-			obj1._type |= OPENED;
-			if (isSectionVisible(kMaxSection - 1))
-				_vm->renderImage(2);
-			else {
-				_objectState[2]._click = 1;
-				_vm->renderImage(3);
-				setSectionVisible(2, kShownFalse);
-			}
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
-		if (obj1._type & OPENED) {
-			_vm->renderImage(1);
-			setSectionVisible(2, kShownFalse);
-			obj1._type &= ~OPENED;
-			_vm->playSound(kAudioElevator1);
-		} else
-			_vm->renderMessage(kStringGenericInteract11);
-	} else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
-		_gm->takeObject(obj1);
-		setSectionVisible(3, kShownFalse);
-		setSectionVisible(4, kShownFalse);
-		setSectionVisible(kMaxSection - 1, kShownTrue);
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
-		_vm->renderMessage(kStringPyramid6);
-	} else
-		return false;
-	return true;
-}
-
-Upstairs3::Upstairs3(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 10;
-	_id = UPSTAIRS3;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
-}
-
-void Upstairs3::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Upstairs3::animation() {
-}
-
-bool Upstairs3::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR) {
-		if (_gm->_state._pyraE)
-			_gm->_state._pyraE = 0;
-		else
-			_gm->_state._pyraE = 1;
-	}
-	if (obj1._id == G_LEFT)
-		_gm->changeRoom(LCORRIDOR1);
-	else
-		_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-Downstairs3::Downstairs3(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 10;
-	_id = DOWNSTAIRS3;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
-}
-
-void Downstairs3::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Downstairs3::animation() {
-}
-
-bool Downstairs3::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == CORRIDOR) {
-		if (_gm->_state._pyraE)
-			_gm->_state._pyraE = 0;
-		else
-			_gm->_state._pyraE = 1;
-	}
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-LCorridor1::LCorridor1(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 9;
-	_id = LCORRIDOR1;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[17] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
-}
-
-void LCorridor1::onEntrance() {
-	setRoomSeen(true);
-}
-
-void LCorridor1::animation() {
-}
-
-bool LCorridor1::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	if (obj1._id == G_RIGHT)
-		_gm->changeRoom(UPSTAIRS3);
-	else if (obj1._id == CORRIDOR)
-		_gm->changeRoom(HOLE_ROOM);
-	else
-		_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-LCorridor2::LCorridor2(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 9;
-	_id = LCORRIDOR2;
-	_shown[0] = kShownTrue;
-	_shown[17] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
-}
-
-void LCorridor2::onEntrance() {
-	setRoomSeen(true);
-}
-
-void LCorridor2::animation() {
-}
-
-bool LCorridor2::interact(Action verb, Object &obj1, Object &obj2) {
-	if (!_gm->move(verb, obj1))
-		return false;
-	_gm->passageConstruction();
-	_gm->_newRoom = true;
-	return true;
-}
-
-HoleRoom::HoleRoom(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 9;
-	_id = HOLE_ROOM;
-	_shown[0] = kShownTrue;
-	_shown[8] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 255, 255, 0);
-	_objectState[3] = Object(_id, kStringOpening, kStringOpeningDescription1, HOLE, EXIT, 3, 3, 0, IN_HOLE, 12);
-	_objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription2, NULLOBJECT, NULLTYPE, 4, 4, 0);
-}
-
-void HoleRoom::onEntrance() {
-	setRoomSeen(true);
-}
-
-void HoleRoom::animation() {
-}
-
-bool HoleRoom::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_USE && 
-			   (Object::combine(obj1, obj2, ROPE, G_RIGHT) || 
-				Object::combine(obj1, obj2, ROPE, G_LEFT))) {
-		_vm->renderMessage(kStringPyramid7);
-	} else if (verb == ACTION_USE && 
-			   (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) || 
-				Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
-		_vm->renderMessage(kStringPyramid8);
-	} else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
-		_vm->renderMessage(kStringPyramid9);
-	} else if (verb == ACTION_WALK && obj1._id == HOLE && !isSectionVisible(16)) {
-		_vm->renderMessage(kStringPyramid10);
-	} else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(16)) {
-		_gm->changeRoom(IN_HOLE);
-		_gm->_newRoom = true;
-	} else
-		return false;
-	return true;
-}
-
-InHole::InHole(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 11;
-	_id = IN_HOLE;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, EXIT, 0, 0, 0, HOLE_ROOM, 2);
-	_objectState[1] = Object(_id, kStringNote, kStringNoteDescription1, NULLOBJECT, TAKE, 255, 255, 1 + 128);
-	_objectState[2] = Object(_id, kStringSlot, kStringSlotDescription3, SLOT, COMBINABLE, 1, 1, 0);
-}
-
-void InHole::onEntrance() {
-	setRoomSeen(true);
-}
-
-void InHole::animation() {
-}
-
-bool InHole::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, SLOT)) {
-		if (isSectionVisible(kMaxSection - 1))
-			_vm->renderMessage(kStringPyramid11);
-		else {
-			_vm->renderImage(1);
-			_objectState[1]._click = 2;
-			setSectionVisible(kMaxSection - 1, kShownTrue);
-		}
-	} else if (verb == ACTION_TAKE && obj1._id == ROPE) {
-		_vm->renderMessage(kStringPyramid9);
-	} else if (verb == ACTION_USE && obj1._id == ROPE) {
-		_gm->changeRoom(HOLE_ROOM);
-		_gm->_newRoom = true;
-	} else
-		return false;
-	return true;
-}
-
-Floordoor::Floordoor(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 14;
-	_id = FLOORDOOR;
-	_shown[0] = kShownTrue;
-	_shown[14] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringKnife1, kStringDefaultDescription, TKNIFE, TAKE | COMBINABLE, 255, 255, 9);
-	_objectState[3] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE, 255, 255, 11+128);
-	_objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription3, HOLE, EXIT, 4, 4, 0, FLOORDOOR_U, 12);
-	_objectState[5] = Object(_id, kStringStones, kStringDefaultDescription, STONES, COMBINABLE, 5, 5, 0);
-}
-
-void Floordoor::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Floordoor::animation() {
-}
-
-bool Floordoor::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_WALK && obj1._id == HOLE) {
-		if (isSectionVisible(11)) {
-			_gm->_state._pyraZ = 4;
-			_gm->_state._pyraDirection = 2;
-			_gm->_state._pyraE = 0;
-			return false;
-		} else
-			_vm->renderMessage(kStringPyramid12);
-	} else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(11)) {
-		_gm->_state._pyraZ = 4;
-		_gm->_state._pyraDirection = 2;
-		_gm->_state._pyraE = 0 ;
-		_gm->changeRoom(FLOORDOOR_U);
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, STONES)) {
-		_vm->renderImage(10);
-		if (obj1._id == TKNIFE)
-			_gm->_inventory.remove(obj1);
-		else
-			_gm->_inventory.remove(obj2);
-		_objectState[2]._click = 6;
-	} else if (verb == ACTION_USE && 
-			   (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) ||
-				Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
-		_vm->renderMessage(kStringPyramid8);
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, TKNIFE) &&
-					isSectionVisible(10)) {
-		_vm->renderImage(11);
-		setSectionVisible(10, kShownFalse);
-		if (obj1._id == ROPE)
-			_gm->_inventory.remove(obj1);
-		else
-			_gm->_inventory.remove(obj2);
-		_objectState[2]._click = 255;
-		_objectState[3]._click = 7;
-		_objectState[3]._type &= ~COMBINABLE;
-	} else if (verb == ACTION_USE && 
-			   (Object::combine(obj1, obj2, ROPE, G_RIGHT) ||
-				Object::combine(obj1, obj2, ROPE, G_LEFT)  ||
-				Object::combine(obj1, obj2, ROPE, STONES))) {
-		_vm->renderMessage(kStringPyramid7);
-	} else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
-		_gm->takeObject(obj1);
-		obj1._type |= COMBINABLE;
-		_vm->renderImage(9);
-		_vm->renderImage(10);
-		_objectState[2]._click = 6;
-	} else if (verb == ACTION_TAKE && obj1._id == TKNIFE && !(obj1._type & CARRIED)) {
-		_gm->takeObject(obj1);
-		setSectionVisible(10, kShownFalse);
-	} else
-		return false;
-	return true;
-}
-
-FloordoorU::FloordoorU(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 14;
-	_id = FLOORDOOR_U;
-	_shown[0] = kShownTrue;
-	_shown[12] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 10, 10, 0, FLOORDOOR, 2);
-	_objectState[3] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE, EXIT, 8, 8, 0, FLOORDOOR, 2);
-	_objectState[4] = Object(_id, kStringPlate, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
-}
-
-void FloordoorU::onEntrance() {
-	setRoomSeen(true);
-}
-
-void FloordoorU::animation() {
-}
-
-bool FloordoorU::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_WALK && obj1._id == HOLE) {
-		_gm->_state._pyraZ = 6;
-		_gm->_state._pyraDirection = 0;
-		_gm->_state._pyraE = 1;
-		return false;
-	} else if (verb == ACTION_USE && obj1._id == ROPE) {
-		_gm->_state._pyraZ = 6;
-		_gm->_state._pyraDirection = 0;
-		_gm->_state._pyraE = 1;
-		_gm->changeRoom(FLOORDOOR);
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_TAKE && obj1._id == ROPE) {
-		_vm->renderMessage(kStringPyramid9);
-	} else
-		return false;
-	return true;
-}
-
-BstDoor::BstDoor(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 15;
-	_id = BST_DOOR;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 18, 18, 0, PYR_ENTRANCE, 14);
-	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 17, 17, 0, PYR_ENTRANCE, 10);
-	_objectState[2] = Object(_id, kStringLetter, kStringDefaultDescription, BST1, PRESS, 0, 0, 0);
-	_objectState[3] = Object(_id, kStringLetter, kStringDefaultDescription, BST2, PRESS, 1, 0, 0);
-	_objectState[4] = Object(_id, kStringLetter, kStringDefaultDescription, BST3, PRESS, 2, 0, 0);
-	_objectState[5] = Object(_id, kStringLetter, kStringDefaultDescription, BST4, PRESS, 3, 0, 0);
-	_objectState[6] = Object(_id, kStringLetter, kStringDefaultDescription, BST5, PRESS, 4, 0, 0);
-	_objectState[7] = Object(_id, kStringLetter, kStringDefaultDescription, BST6, PRESS, 5, 0, 0);
-	_objectState[8] = Object(_id, kStringLetter, kStringDefaultDescription, BST7, PRESS, 6, 0, 0);
-	_objectState[9] = Object(_id, kStringLetter, kStringDefaultDescription, BST8, PRESS, 7, 0, 0);
-	_objectState[10] = Object(_id, kStringLetter, kStringDefaultDescription, BST9, PRESS, 8, 0, 0);
-	_objectState[11] = Object(_id, kStringLetter, kStringDefaultDescription, BST10, PRESS, 9, 0, 0);
-	_objectState[12] = Object(_id, kStringLetter, kStringDefaultDescription, BST11, PRESS, 10, 0, 0);
-	_objectState[13] = Object(_id, kStringLetter, kStringDefaultDescription, BST12, PRESS, 11, 0, 0);
-	_objectState[14] = Object(_id, kStringLetter, kStringDefaultDescription, BST13, PRESS, 12, 0, 0);
-	_objectState[15] = Object(_id, kStringLetter, kStringDefaultDescription, BST14, PRESS, 13, 0, 0);
-	_objectState[16] = Object(_id, kStringLetter, kStringDefaultDescription, BST15, PRESS, 14, 0, 0);
-	_objectState[17] = Object(_id, kStringLetter, kStringDefaultDescription, BST16, PRESS, 15, 0, 0);
-	_objectState[18] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 16, 16, 0, HALL, 2);
-
-	char germanPassword[16] =  {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0};
-	char englishPassword[16] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
-	if (ConfMan.get("language") == "en")
-		for (int i = 0; i < 16; i++)
-			_password[i] = englishPassword[i];
-	else
-		for (int i = 0; i < 16; i++)
-			_password[i] = germanPassword[i];
-}
-
-void BstDoor::onEntrance() {
-	if (ConfMan.get("language") == "en")
-		_vm->_screen->renderMessage("You are almost there", kMessageNormal, 105, 130);
-}
-
-void BstDoor::animation() {
-}
-
-bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
-	if (_gm->move(verb, obj1)) {
-		_gm->passageConstruction();
-		_gm->_newRoom = true;
-	} else if (verb == ACTION_PRESS && obj1._id >= BST1 && obj1._id <= BST16) {
-		int number = obj1._id - (BST1 - 1);
-		if (isSectionVisible(number))
-			_vm->renderImage(number + 128);
-		else
-			_vm->renderImage(number);
-		_vm->playSound(kAudioTaxiOpen);
-		for (number = 1; number <= 16; number++) {
-			if (isSectionVisible(number) != _password[number - 1])
-				return true;
-		}
-		_gm->wait(2);
-		_vm->renderImage(17);
-		for (number = 1; number <= 16; number++) {
-			setSectionVisible(number, kShownFalse);
-			_objectState[number + 1]._click = 255;
-		}
-		_gm->wait(2);
-		_vm->renderImage(18);
-		_gm->wait(2);
-		_vm->renderImage(19);
-		_objectState[18]._type = EXIT;
-		_objectState[18]._description = kStringDefaultDescription;
-		_vm->playSound(kAudioShip3);
-		_gm->screenShake();
-	} else
-		return false;
-	return true;
-}
-
-Hall::Hall(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 16;
-	_id = HALL;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringCoffin, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, COFFIN_ROOM, 2);
-	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, CORRIDOR, EXIT, 255, 255, 0, PYR_ENTRANCE, 22);
-}
-
-void Hall::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Hall::animation() {
-}
-
-bool Hall::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_WALK && obj1._id == CORRIDOR) {
-		_gm->_state._pyraDirection = 2;
-		_gm->passageConstruction();
-	}
-	return false;
-}
-
-CoffinRoom::CoffinRoom(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 17;
-	_id = COFFIN_ROOM;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL, 22);
-	_objectState[1] = Object(_id, kStringCoffin, kStringCreepy, COFFIN, NULLTYPE, 0, 0, 0);
-	_objectState[2] = Object(_id, kStringToothbrush, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 1, 1, 0);
-	_objectState[3] = Object(_id, kStringToothpaste, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 2, 2, 0);
-	_objectState[4] = Object(_id, kStringBall, kStringBallDescription, L_BALL, NULLTYPE, 3, 3, 0);
-	_objectState[5] = Object(_id, kStringBall, kStringBallDescription, R_BALL, NULLTYPE, 4, 4, 0);
-}
-
-void CoffinRoom::onEntrance() {
-	setRoomSeen(true);
-}
-
-void CoffinRoom::animation() {
-}
-
-bool CoffinRoom::interact(Action verb, Object &obj1, Object &obj2) {
-	char change;
-	if (verb == ACTION_OPEN && obj1._id == COFFIN && !isSectionVisible(1)) {
-		_vm->renderMessage(kStringPyramid13);
-	} else if (verb == ACTION_PRESS && (obj1._id == L_BALL || obj1._id == R_BALL)) {
-		if (obj1._id == L_BALL) {
-			if ((change = !isSectionVisible(2))) {
-				_vm->renderImage(2);
-				_vm->playSound(kAudioTaxiOpen);
-			} else
-				_vm->renderMessage(kStringPyramid14);
-		} else {
-			if ((change = !isSectionVisible(3))) {
-				_vm->renderImage(3);
-				_vm->playSound(kAudioTaxiOpen);
-			} else
-				_vm->renderMessage(kStringPyramid14);
-		} if (change) {
-			if (isSectionVisible(2) && isSectionVisible(3)) {
-				_vm->playSound(kAudioShip2);
-				_vm->renderImage(4);
-				_gm->wait(4);
-				_vm->renderImage(5);
-				_gm->wait(4);
-				_vm->renderImage(5);
-				_gm->wait(4);
-				_vm->renderImage(5);
-				_gm->wait(4);
-				_vm->renderImage(1);
-				setSectionVisible(4, kShownFalse);
-				setSectionVisible(5, kShownFalse);
-				setSectionVisible(6, kShownFalse);
-				setSectionVisible(7, kShownFalse);
-			}
-			else
-				_vm->renderMessage(kStringPyramid15);
-		}
-	} else if (verb == ACTION_LOOK && obj1._id == COFFIN && isSectionVisible(1)) {
-		_gm->changeRoom(MASK);
-		_gm->_newRoom = true;
-	} else
-		return false;
-	return true;
-}
-
-Mask::Mask(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 18;
-	_id = MASK;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, COFFIN_ROOM, 22);
-	_objectState[1] = Object(_id, kStringEye, kStringEyeDescription, EYE1, NULLTYPE, 0, 0, 0);
-	_objectState[2] = Object(_id, kStringEye, kStringEyeDescription, EYE2, NULLTYPE, 1, 1, 0);
-	_objectState[3] = Object(_id, kStringMouth, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
-}
-
-void Mask::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Mask::animation() {
-}
-
-bool Mask::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_OPEN && (obj1._id == EYE1 || obj1._id == EYE2)) {
-		if (obj1._type & OPENED)
-			_vm->renderMessage(kStringPyramid16);
-		else
-			_vm->renderImage(obj1._id - EYE1 + 1);
-		if (isSectionVisible(1) && isSectionVisible(2)) {
-			_gm->reply(kStringPyramid17, 3, 3 + 128);
-			_gm->reply(kStringPyramid18, 3, 3 + 128);
-			_gm->reply(kStringPyramid19, 3, 3 + 128);
-			_vm->playSound(kAudioAppearance1);
-			while(_vm->_sound->isPlaying())
-				_gm->wait(1);
-			_vm->paletteFadeOut();
-			_vm->loadGame(kSleepAutosaveSlot);
-			_gm->changeRoom(CABIN);
-			_gm->setAnimationTimer(1);
-			_gm->_newRoom = true;
-			_gm->drawGUI();
-			_gm->_rooms[CABIN]->setSectionVisible(2, kShownTrue);
-			_gm->_rooms[CABIN]->setSectionVisible(kMaxSection - 1, kShownFalse);
-			_gm->_rooms[CABIN]->setSectionVisible(kMaxSection - 2, kShownTrue);
-			_gm->_rooms[CABIN]->setSectionVisible(1, kShownFalse);
-			_gm->_rooms[CABIN]->getObject(2)->_click = 8;
-			_gm->_state._eventTime = kMaxTimerValue;
-		}
-		return true;
-	}
-	return false;
-}
-
-Museum::Museum(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 29;
-	_id = MUSEUM;
-	_shown[0] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDinosaur, kStringDinosaurDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
-	_objectState[1] = Object(_id, kStringEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 1, 1, 0, NULLROOM, 0);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_ENTRANCE, 9);
-	_objectState[3] = Object(_id, kStringRoad, kStringDefaultDescription, MUS_STREET, EXIT, 3, 3, 0);
-}
-
-void Museum::onEntrance() {
-	_gm->setAnimationTimer(1);
-	if (_gm->_state._alarmCracked && !_gm->_state._alarmOn) {
-		_gm->_state._eventTime = kMaxTimerValue;
-		_gm->_state._alarmOn = false;
-		_gm->_state._haste = false;
-		_vm->renderMessage(kStringMuseum1);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_gm->_state._sirenOn = false;
-		_vm->stopSound();
-		_vm->paletteFadeOut();
-		_vm->_system->fillScreen(kColorBlack);
-		_vm->_screen->setViewportBrightness(255);
-		_vm->renderMessage(kStringMuseum2);
-		_gm->waitOnInput(_gm->_messageDuration);
-		_vm->removeMessage();
-		_vm->_screen->setViewportBrightness(0);
-		_vm->setCurrentImage(26);
-		bool hasDinosaurHead = false;
-		if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
-			hasDinosaurHead = true;
-		_vm->loadGame(kSleepAutosaveSlot);
-		_vm->renderImage(0);
-		_vm->paletteFadeIn();
-		if (hasDinosaurHead) {
-			_gm->reply(kStringMuseum3, 1, 1 + 128);
-			_gm->reply(kStringMuseum4, 1, 1 + 128);
-			_gm->takeMoney(30000);
-			_vm->playSound(kAudioAppearance1);
-		} else {
-			_gm->reply(kStringMuseum5, 1, 1 + 128);
-			_gm->say(kStringMuseum23);
-			_gm->reply(kStringMuseum24, 1, 1 + 128);
-		}
-		_vm->paletteFadeOut();
-		_gm->changeRoom(CITY2);
-		_gm->_newRoom = true;
-		_gm->drawGUI();
-	}
-}
-
-void Museum::animation() {
-}
-
-bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_WALK && obj1._id == MUS_STREET) {
-		if (!_gm->_state._alarmOn && 
-				!(_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)) {
-			_vm->renderMessage(kStringMuseum10);
-		} else {
-			_gm->_state._eventTime = kMaxTimerValue;
-			if (_gm->_state._alarmOn) {
-				_vm->renderMessage(kStringMuseum11);
-				if (_gm->_state._sirenOn) {
-					_vm->stopSound();
-					_gm->_state._sirenOn = false;
-				}
-			} else 
-				_vm->renderMessage(kStringMuseum12);
-			_gm->waitOnInput(_gm->_messageDuration);
-			_vm->removeMessage();
-			_vm->paletteFadeOut();
-			_vm->_system->fillScreen(kColorBlack);
-			_vm->_screen->setViewportBrightness(255);
-			_vm->_screen->setGuiBrightness(255);
-			_vm->_screen->paletteBrightness();
-			_vm->renderMessage(kStringMuseum13);
-			_gm->waitOnInput(_gm->_messageDuration);
-			_vm->removeMessage();
-			_vm->_screen->setViewportBrightness(0);
-			_vm->_screen->setGuiBrightness(0);
-			_vm->_screen->paletteBrightness();
-			bool hasDinosaurHead = false;
-			if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
-				hasDinosaurHead = true;
-			_vm->loadGame(kSleepAutosaveSlot);
-			if (_gm->_state._money >= 8)
-				_gm->takeMoney(-8);
-			if (hasDinosaurHead)
-				_gm->takeObject(*_gm->_rooms[INTRO]->getObject(7));
-			_gm->changeRoom(CULTURE_PALACE);
-			_gm->_newRoom = true;
-			_gm->_state._alarmOn = false;
-			_gm->_state._haste = false;
-			_gm->drawGUI();
-		}
-	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, DOOR) &&
-			!(_objectState[2]._type & OPENED)) {
-		if (_gm->crackDoor(20)) {
-			_vm->renderImage(1);
-			_objectState[2]._type = EXIT | OPENABLE | OPENED;
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == DOOR && (obj1._type & OPENED)) {
-		_vm->renderImage(1 + 128);
-		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
-		_vm->playSound(kAudioElevator1);
-	} else if (verb == ACTION_USE &&
-					Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
-		_vm->renderMessage(kStringMuseum14);
-	} else if (verb == ACTION_WALK && obj1._id == DOOR) {
-		_gm->_state._haste = true;
-		return false;
-	} else
-		return false;
-	return true;
-}
-
-MusEntrance::MusEntrance(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 32;
-	_id = MUS_ENTRANCE;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED, 1, 1, 2, MUSEUM, 23);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS11, 2);
-}
-
-void MusEntrance::onEntrance() {
-	setRoomSeen(true);
-}
-
-void MusEntrance::animation() {
-}
-
-bool MusEntrance::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_OPEN && obj1._id == DOOR)
-		_gm->_rooms[MUS11]->getObject(2)->_type |= OPENED;
-	else if (verb == ACTION_CLOSE && obj1._id == DOOR)
-		_gm->_rooms[MUS11]->getObject(2)->_type &= ~OPENED;
-	else if (verb == ACTION_USE && 
-				Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
-				!(_objectState[0]._type & OPENED)) {
-		if (_gm->crackDoor(20)) {
-			_vm->renderImage(2);
-			_objectState[0]._type = EXIT | OPENABLE | OPENED;
-			_vm->playSound(kAudioTaxiOpen);
-		}
-		return true;
-	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
-			(obj1._type & OPENED)) {
-		_vm->renderImage(2 + 128);
-		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
-		_vm->playSound(kAudioElevator1);
-		return true;
-	}
-	return false;
-}
-
-Mus1::Mus1(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 35;
-	_id = MUS1;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[15] = kShownTrue;
-	_shown[26] = kShownTrue;
-	_shown[27] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS2, 22);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 4, 4, 11, MUS8, 9);
-}
-
-void Mus1::onEntrance() {
-	_gm->securityEntrance();
-	setRoomSeen(true);
-}
-
-void Mus1::animation() {
-}
-
-bool Mus1::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	return false;
-}
-
-Mus2::Mus2(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 35;
-	_id = MUS2;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[22] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS1, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS3, 22);
-}
-
-void Mus2::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus2::animation() {
-}
-
-bool Mus2::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	return false;
-}
-
-Mus3::Mus3(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 35;
-	_id = MUS3;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[23] = kShownTrue;
-	_shown[28] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS2, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 5, 5, 12, MUS10, 19);
-}
-
-void Mus3::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus3::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus3::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	return false;
-}
-
-Mus4::Mus4(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 35;
-	_id = MUS4;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[20] = kShownTrue;
-	_shown[21] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS5, 22);
-	_objectState[1] = Object(_id, kStringCamera, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
-
-}
-
-void Mus4::onEntrance() {
-	setRoomSeen(true);
-}
-
-void Mus4::animation() {
-}
-
-bool Mus4::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	return false;
-}
-
-Mus5::Mus5(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 35;
-	_id = MUS5;
-	_shown[0] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[24] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 8, MUS6, 22);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 2, 2, 9, MUS9, 5);
-
-}
-
-void Mus5::onEntrance() {
-	_gm->securityEntrance();
-	setRoomSeen(true);
-}
-
-void Mus5::animation() {
-}
-
-bool Mus5::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
-			!(_objectState[1]._type & OPENED)) {
-		if (_gm->crackDoor(50)) {
-			_vm->renderImage(8);
-			_objectState[1]._type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS6]->setSectionVisible(7, kShownTrue);
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
-				(obj1._type & OPENED)) {
-		_vm->renderImage(8 + 128);
-		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS6]->setSectionVisible(7, kShownFalse);
-		_vm->playSound(kAudioElevator1);
-	} else
-		return false;
-	return true;
-}
-
-Mus6::Mus6(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 35;
-	_id = MUS6;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[19] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 7, MUS5, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS7, 22);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 6, 6, 0);
-}
-
-void Mus6::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus6::animation() {
-}
-
-bool Mus6::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
-			!(_objectState[0]._type & OPENED)) {
-		if (_gm->crackDoor(50)) {
-			_vm->renderImage(7);
-			_objectState[0]._type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS5]->setSectionVisible(8, kShownTrue);
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
-				(obj1._type & OPENED)) {
-		_vm->renderImage(7 + 128);
-		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS5]->setSectionVisible(8, kShownFalse);
-		_vm->playSound(kAudioElevator1);
-	} else if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR))
-		_vm->renderMessage(kStringMuseum14);
-	else
-		return false;
-	return true;
-}
-
-Mus7::Mus7(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 35;
-	_id = MUS7;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[16] = kShownTrue;
-	_shown[25] = kShownTrue;
-	_shown[28] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS6, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 3, 3, 10, MUS11, 15);
-}
-
-void Mus7::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus7::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus7::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	return false;
-}
-
-Mus8::Mus8(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 34;
-	_id = MUS8;
-	_shown[0] = kShownTrue;
-	_shown[12] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS1, 10);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 2, MUS9, 14);
-}
-
-void Mus8::onEntrance() {
-	_gm->securityEntrance();
-	setRoomSeen(true);
-}
-
-void Mus8::animation() {
-}
-
-bool Mus8::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
-			!(_objectState[1]._type & OPENED)) {
-		if (_gm->crackDoor(50)) {
-			_vm->renderImage(2);
-			_objectState[1]._type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS9]->setSectionVisible(1, kShownTrue);
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
-				(obj1._type & OPENED)) {
-		_vm->renderImage(2 + 128);
-		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS9]->setSectionVisible(1, kShownFalse);
-		_vm->playSound(kAudioElevator1);
-	} else
-		return false;
-	return true;
-}
-
-Mus9::Mus9(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 34;
-	_id = MUS9;
-	_shown[0] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[10] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 1, MUS8, 10);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS5, 14);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, MUS_ROUND, 21);
-}
-
-void Mus9::onEntrance() {
-	_gm->securityEntrance();
-	setRoomSeen(true);
-}
-
-void Mus9::animation() {
-}
-
-bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
-			!(_objectState[0]._type & OPENED)) {
-		if (_gm->crackDoor(50)) {
-			_vm->renderImage(1);
-			_objectState[0]._type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS8]->setSectionVisible(2, kShownTrue);
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
-				(obj1._type & OPENED)) {
-		_vm->renderImage(1 + 128);
-		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS8]->setSectionVisible(2, kShownFalse);
-		_vm->playSound(kAudioElevator1);
-	} else if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, SP_KEYCARD, SMALL_DOOR) &&
-			!(_objectState[2]._type & OPENED)) {
-		if (_gm->crackDoor(50)) {
-			_vm->renderImage(6);
-			setSectionVisible(5, kShownFalse);
-			_objectState[2]._type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR && 
-				(obj1._type & OPENED)) {
-		_vm->renderImage(5);
-		setSectionVisible(6, kShownFalse);
-		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
-		_vm->playSound(kAudioElevator1);
-	} else
-		return false;
-	return true;
-}
-
-Mus10::Mus10(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 34;
-	_id = MUS10;
-	_shown[0] = kShownTrue;
-	_shown[11] = kShownTrue;
-	_shown[13] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS3, 10);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS11, 14);
-	_objectState[2] = Object(_id, kStringMainEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 4, 4, 0);
-}
-
-void Mus10::onEntrance() {
-	_gm->securityEntrance();
-	setRoomSeen(true);
-}
-
-void Mus10::animation() {
-}
-
-bool Mus10::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
-		_vm->renderMessage(kStringMuseum14);
-		return true;
-	}
-	return false;
-}
-
-Mus11::Mus11(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 34;
-	_id = MUS11;
-	_shown[0] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[9] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS10, 10);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS7, 14);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE, 2, 2, 0, MUS_ENTRANCE, 21);
-}
-
-void Mus11::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus11::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus11::interact(Action verb, Object &obj1, Object &obj2) {
-	_gm->museumDoorInteract(verb, obj1, obj2);
-	if (verb == ACTION_OPEN && obj1._id == SMALL_DOOR && !(obj1._type & OPENED)) {
-		obj1._type |= OPENED;
-		_vm->renderImage(4);
-		setSectionVisible(3, kShownFalse);
-		_vm->playSound(kAudioTaxiOpen);
-	} else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR &&
-			(obj1._type & OPENED)) {
-		obj1._type &= ~OPENED;
-		_vm->renderImage(3);
-		setSectionVisible(4, kShownFalse);
-		_vm->playSound(kAudioElevator1);
-	} else
-		return false;
-	return true;
-}
-
-MusRound::MusRound(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 33;
-	_id = MUS_ROUND;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED | COMBINABLE, 0, 0, 1, MUS9, 2);
-	_objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, MUS13, 10);
-	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 2, 2, 0, MUS12, 14);
-	_objectState[3] = Object(_id, kStringDinosaur, kStringDinosaurDescription2, NULLOBJECT, NULLTYPE, 3, 3, 0);
-	_objectState[4] = Object(_id, kStringDinosaurHead, kStringDinosaurHeadDescription, HEAD, TAKE, 4, 4, 2);
-}
-
-void MusRound::onEntrance() {
-	setRoomSeen(true);
-}
-
-void MusRound::animation() {
-}
-
-bool MusRound::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
-			!(_objectState[0]._type & OPENED)) {
-		if (_gm->crackDoor(50)) {
-			_vm->renderImage(1);
-			_objectState[0]._type = EXIT | OPENABLE | OPENED;
-			_gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | OPENED;
-			_vm->playSound(kAudioTaxiOpen);
-		}
-	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
-				(obj1._type & OPENED)) {
-		_vm->renderImage(1 + 128);
-		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
-		_gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
-		_vm->playSound(kAudioElevator1);
-	} else if (verb == ACTION_TAKE && obj1._id == HEAD && !(obj1._type & CARRIED)) {
-		_gm->takeObject(obj1);
-		_vm->playSound(kAudioSuccess);
-	} else
-		return false;
-	return true;
-}
-
-Mus12::Mus12(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 37;
-	_id = MUS12;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[13] = kShownTrue;
-	_shown[17] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, MUS_ROUND, 10);
-}
-
-void Mus12::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus12::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus12::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus13::Mus13(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 37;
-	_id = MUS13;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[14] = kShownTrue;
-	_shown[16] = kShownTrue;
-	_objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 7, 7, 0, MUS_ROUND, 14);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 0, 0, 7, MUS14, 10);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS15, 16);
-}
-
-void Mus13::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus13::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus13::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus14::Mus14(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 37;
-	_id = MUS14;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[8] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 8, MUS13, 14);
-}
-
-void Mus14::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus14::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus14::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus15::Mus15(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 36;
-	_id = MUS15;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[8] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS13, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS16, 22);
-}
-
-void Mus15::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus15::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus15::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus16::Mus16(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 36;
-	_id = MUS16;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[10] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS15, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS17, 22);
-}
-
-void Mus16::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus16::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus16::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus17::Mus17(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 37;
-	_id = MUS17;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[9] = kShownTrue;
-	_shown[17] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 2, 2, 9, MUS16, 6);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 8, MUS21, 14);
-	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS18, 16);
-	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 4, 4, 11, MUS20, 8);
-}
-
-void Mus17::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus17::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus17::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus18::Mus18(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 36;
-	_id = MUS18;
-	_shown[0] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[11] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS17, 2);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS19, 22);
-}
-
-void Mus18::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus18::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus18::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus19::Mus19(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 37;
-	_id = MUS19;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[11] = kShownTrue;
-	_shown[15] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 4, 4, 11, MUS18, 8);
-}
-
-void Mus19::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus19::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus19::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus20::Mus20(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 36;
-	_id = MUS20;
-	_shown[0] = kShownTrue;
-	_shown[1] = kShownTrue;
-	_shown[4] = kShownTrue;
-	_shown[7] = kShownTrue;
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 4, MUS17, 22);
-}
-
-void Mus20::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus20::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus20::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus21::Mus21(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 37;
-	_id = MUS21;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[6] = kShownTrue;
-	_shown[7] = kShownTrue;
-	_shown[18] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 7, MUS17, 10);
-	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS22, 16);
-}
-
-void Mus21::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus21::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus21::interact(Action verb, Object &obj1, Object &obj2) {
-	return false;
-}
-
-Mus22::Mus22(Supernova2Engine *vm, GameManager *gm) {
-	_vm = vm;
-	_gm = gm;
-
-	_fileNumber = 36;
-	_id = MUS22;
-	_shown[0] = kShownTrue;
-	_shown[2] = kShownTrue;
-	_shown[3] = kShownTrue;
-	_shown[5] = kShownTrue;
-	_shown[9] = kShownTrue;
-
-	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS21, 2);
-	_objectState[1] = Object(_id, kStringAlarmSystem, kStringDefaultDescription, ALARM_SYSTEM, COMBINABLE, 2, 2, 0);
-	_objectState[2] = Object(_id, kStringSuctionCup, kStringDefaultDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
-	_objectState[3] = Object(_id, kStringWall, kStringDefaultDescription, WALL, COMBINABLE, 4, 4, 0);
-}
-
-void Mus22::onEntrance() {
-	_gm->pressureAlarmEntrance();
-}
-
-void Mus22::animation() {
-	_gm->pressureAlarmCount();
-}
-
-bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
-	if (verb == ACTION_USE && Object::combine(obj1, obj2, SUCTION_CUP, WALL)) {
-		if (isSectionVisible(6))
-			_vm->renderMessage(kStringMuseum17);
-		else {
-			_vm->renderImage(6);
-			_vm->renderMessage(kStringMuseum18);
-			_objectState[2]._click = 3;
-			if (obj1._id == SUCTION_CUP)
-				_gm->_inventory.remove(obj1);
-			else
-				_gm->_inventory.remove(obj2);
-		}
-	} else if (verb == ACTION_TAKE && obj1._id == SUCTION_CUP &&
-			!(obj1._type & CARRIED)) {
-		_vm->renderImage(2);
-		setSectionVisible(6, kShownFalse);
-		_vm->renderImage(5);
-		_gm->takeObject(obj1);
-		_vm->renderMessage(kStringMuseum19);
-	} else if (verb == ACTION_USE &&
-			Object::combine(obj1, obj2, ALARM_CRACKER, ALARM_SYSTEM)) {
-		if (_gm->_state._alarmCracked)
-			_vm->renderMessage(kStringMuseum20);
-		else {
-			_vm->renderMessage(kStringMuseum21);
-			_gm->crack(20);
-			if (!_gm->_state._alarmOn) {
-				_vm->renderMessage(kStringMuseum22);
-				_vm->playSound(kAudioSuccess);
-				_gm->_state._alarmCracked = true;
-			}
-		}
-	} else
-		return false;
-	return true;
-}
-
-}
diff --git a/engines/supernova2/rooms.h b/engines/supernova2/rooms.h
deleted file mode 100644
index 46a86ed..0000000
--- a/engines/supernova2/rooms.h
+++ /dev/null
@@ -1,812 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA2_ROOMS_H
-#define SUPERNOVA2_ROOMS_H
-
-#include "common/str.h"
-
-#include "supernova2/ms2_def.h"
-
-namespace Common {
-class ReadStream;
-class WriteStream;
-}
-
-namespace Supernova2 {
-
-class GameManager;
-class Supernova2Engine;
-
-struct RoomEntry {
-	int _e;
-	int _s;
-	int _z;
-	int _r;
-	RoomId _exitRoom;
-};
-
-class Room {
-public:
-	Room();
-
-	bool hasSeen();
-	void setRoomSeen(bool seen);
-	int getFileNumber() const;
-	RoomId getId() const;
-	void setSectionVisible(uint section, bool visible);
-	bool isSectionVisible(uint index) const;
-	void removeSentence(int sentence, int number);
-	void removeSentenceByMask(int mask, int number);
-	void addSentence(int sentence, int number);
-	void addAllSentences(int number);
-	bool sentenceRemoved(int sentence, int number);
-	bool allSentencesRemoved(int maxSentence, int number);
-	Object *getObject(uint index);
-
-	virtual ~Room();
-	virtual void animation();
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	virtual bool serialize(Common::WriteStream *out);
-	virtual bool deserialize(Common::ReadStream *in, int version);
-
-protected:
-	int _fileNumber;
-	char _shown[kMaxSection];
-	byte _sentenceRemoved[kMaxDialog];
-	Object _objectState[kMaxObject];
-	RoomId _id;
-	Supernova2Engine *_vm;
-	GameManager *_gm;
-
-private:
-	bool _seen;
-};
-
-class Intro : public Room {
-public:
-	Intro(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-
-private:
-	void titleScreen();
-	bool tvSay(int mod1, int mod2, int rest, MessagePosition pos, StringId id);
-	bool tvRest(int mod1, int mod2, int rest);
-	bool displayThoughtMessage(StringId id);
-	bool thoughts1();
-	bool tvDialogue();
-	bool thoughts2();
-
-	Common::String _introText;
-};
-
-class Airport : public Room {
-public:
-	Airport(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-
-private:
-};
-
-class TaxiStand : public Room {
-public:
-	TaxiStand(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Street : public Room {
-public:
-	Street(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Games : public Room {
-public:
-	Games(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Cabin : public Room {
-public:
-	Cabin(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	bool _paid;
-};
-
-class Kiosk : public Room {
-public:
-	Kiosk(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class CulturePalace : public Room {
-public:
-	CulturePalace(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	void notEnoughMoney();
-};
-
-class Checkout : public Room {
-public:
-	Checkout(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	void appearance();
-	void shouting();
-};
-
-class City1 : public Room {
-public:
-	City1(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class City2 : public Room {
-public:
-	City2(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Elevator : public Room {
-public:
-	Elevator(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	void jobDescription();
-};
-
-class Apartment : public Room {
-public:
-	Apartment(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Ship : public Room {
-public:
-	Ship(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-	Common::String _outroText;
-	Common::String _outroText2;
-
-private:
-	void kill();
-	void outro();
-};
-
-class Pyramid : public Room {
-public:
-	Pyramid(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class PyrEntrance : public Room {
-public:
-	PyrEntrance(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	uint32 _waitTime;
-};
-
-class Upstairs1 : public Room {
-public:
-	Upstairs1(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Downstairs1 : public Room {
-public:
-	Downstairs1(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class BottomRightDoor : public Room {
-public:
-	BottomRightDoor(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class BottomLeftDoor : public Room {
-public:
-	BottomLeftDoor(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Upstairs2 : public Room {
-public:
-	Upstairs2(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Downstairs2 : public Room {
-public:
-	Downstairs2(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class UpperDoor : public Room {
-public:
-	UpperDoor(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class PuzzleFront : public Room {
-public:
-	PuzzleFront(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class PuzzleBehind : public Room {
-public:
-	PuzzleBehind(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Formula1F : public Room {
-public:
-	Formula1F(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Formula1N : public Room {
-public:
-	Formula1N(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Formula2F : public Room {
-public:
-	Formula2F(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Formula2N : public Room {
-public:
-	Formula2N(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class TomatoF : public Room {
-public:
-	TomatoF(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class TomatoN : public Room {
-public:
-	TomatoN(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class MonsterF : public Room {
-public:
-	MonsterF(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Monster1N : public Room {
-public:
-	Monster1N(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Monster2N : public Room {
-public:
-	Monster2N(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Upstairs3 : public Room {
-public:
-	Upstairs3(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Downstairs3 : public Room {
-public:
-	Downstairs3(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class LCorridor1 : public Room {
-public:
-	LCorridor1(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class LCorridor2 : public Room {
-public:
-	LCorridor2(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class HoleRoom : public Room {
-public:
-	HoleRoom(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class InHole : public Room {
-public:
-	InHole(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Floordoor : public Room {
-public:
-	Floordoor(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class FloordoorU : public Room {
-public:
-	FloordoorU(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class BstDoor : public Room {
-public:
-	BstDoor(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	char _password[16];
-};
-
-class Hall : public Room {
-public:
-	Hall(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class CoffinRoom : public Room {
-public:
-	CoffinRoom(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mask : public Room {
-public:
-	Mask(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Museum : public Room {
-public:
-	Museum(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class MusEntrance : public Room {
-public:
-	MusEntrance(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus1 : public Room {
-public:
-	Mus1(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus2 : public Room {
-public:
-	Mus2(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus3 : public Room {
-public:
-	Mus3(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus4 : public Room {
-public:
-	Mus4(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus5 : public Room {
-public:
-	Mus5(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus6 : public Room {
-public:
-	Mus6(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus7 : public Room {
-public:
-	Mus7(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus8 : public Room {
-public:
-	Mus8(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus9 : public Room {
-public:
-	Mus9(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus10 : public Room {
-public:
-	Mus10(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus11 : public Room {
-public:
-	Mus11(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class MusRound : public Room {
-public:
-	MusRound(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus12 : public Room {
-public:
-	Mus12(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus13 : public Room {
-public:
-	Mus13(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus14 : public Room {
-public:
-	Mus14(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus15 : public Room {
-public:
-	Mus15(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus16 : public Room {
-public:
-	Mus16(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus17 : public Room {
-public:
-	Mus17(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus18 : public Room {
-public:
-	Mus18(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus19 : public Room {
-public:
-	Mus19(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus20 : public Room {
-public:
-	Mus20(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus21 : public Room {
-public:
-	Mus21(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-class Mus22 : public Room {
-public:
-	Mus22(Supernova2Engine *vm, GameManager *gm);
-	virtual void onEntrance();
-	virtual void animation();
-	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-};
-
-}
-#endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova2/screen.cpp b/engines/supernova2/screen.cpp
deleted file mode 100644
index fd2eabe..0000000
--- a/engines/supernova2/screen.cpp
+++ /dev/null
@@ -1,642 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#include "common/str.h"
-#include "common/system.h"
-#include "common/config-manager.h"
-#include "engines/util.h"
-#include "graphics/cursorman.h"
-#include "graphics/palette.h"
-#include "graphics/surface.h"
-
-#include "supernova2/imageid.h"
-#include "supernova2/state.h"
-#include "supernova2/screen.h"
-#include "supernova2/supernova2.h"
-
-#include "supernova2/screenstatic.cpp"
-
-namespace Supernova2 {
-
-ScreenBuffer::ScreenBuffer()
-	: _x(0)
-	, _y(0)
-	, _width(0)
-	, _height(0)
-	, _pixels(nullptr) {
-}
-
-ScreenBufferStack::ScreenBufferStack()
-	: _last(_buffer) {
-}
-
-void ScreenBufferStack::push(int x, int y, int width, int height) {
-	if (_last == ARRAYEND(_buffer))
-		return;
-
-	Graphics::Surface *screenSurface = g_system->lockScreen();
-
-	if (x < 0) {
-		width += x;
-		x = 0;
-	}
-
-	if (x + width > screenSurface->w)
-		width = screenSurface->w - x;
-
-	if (y < 0) {
-		height += y;
-		y = 0;
-	}
-
-	if (y + height > screenSurface->h)
-		height = screenSurface->h - y;
-
-	_last->_pixels = new byte[width * height];
-	byte *pixels = _last->_pixels;
-	const byte *screen = static_cast<const byte *>(screenSurface->getBasePtr(x, y));
-	for (int i = 0; i < height; ++i) {
-		Common::copy(screen, screen + width, pixels);
-		screen += screenSurface->pitch;
-		pixels += width;
-	}
-	g_system->unlockScreen();
-
-	_last->_x = x;
-	_last->_y = y;
-	_last->_width = width;
-	_last->_height = height;
-
-	++_last;
-}
-
-void ScreenBufferStack::restore() {
-	if (_last == _buffer)
-		return;
-
-	--_last;
-	g_system->lockScreen()->copyRectToSurface(_last->_pixels, _last->_width, _last->_x,
-											  _last->_y, _last->_width, _last->_height);
-	g_system->unlockScreen();
-
-	delete[] _last->_pixels;
-}
-
-Marquee::Marquee(Screen *screen, MarqueeId id, const char *text)
-	: _text(text)
-	, _textBegin(text)
-	, _delay(0)
-	, _color(kColorPurple)
-	, _loop(false)
-	, _screen(screen) {
-	if (id == kMarqueeIntro) {
-		_y = 191;
-		_loop = true;
-	} else if (id == kMarqueeOutro) {
-		_y = 191;
-	}
-
-	_textWidth = Screen::textWidth(_text);
-	_x = kScreenWidth / 2 - _textWidth / 2;
-	_screen->_textCursorX = _x;
-	_screen->_textCursorY = _y;
-	_screen->_textColor = _color;
-}
-
-void Marquee::clearText() {
-	_screen->renderBox(_x, _y - 1, _textWidth + 1, 9, kColorBlack);
-}
-
-void Marquee::reset() {
-	_text = _textBegin;
-	clearText();
-	_textWidth = Screen::textWidth(_text);
-	_x = kScreenWidth / 2 - _textWidth / 2;
-	_screen->_textCursorX = _x;
-}
-
-bool Marquee::renderCharacter() {
-	if (_delay != 0) {
-		_delay--;
-		return true;
-	}
-
-	switch (*_text) {
-	case '\233':
-		if (_loop) {
-			_loop = false;
-			_text = _textBegin;
-			clearText();
-			_textWidth = Screen::textWidth(_text);
-			_x = kScreenWidth / 2 - _textWidth / 2;
-			_screen->_textCursorX = _x;
-		}
-		else
-			return false;
-		break;
-	case '\0':
-		clearText();
-		_text++;
-		_textWidth = Screen::textWidth(_text);
-		_x = kScreenWidth / 2 - _textWidth / 2;
-		_screen->_textCursorX = _x;
-		_color = kColorBlue;
-		_screen->_textColor = kColorPurple;
-		break;
-	case '^':
-		_color = kColorLightYellow;
-		_screen->_textColor = _color;
-		_text++;
-		break;
-	case '#':
-		_delay = 50;
-		_text++;
-		break;
-	default:
-		_screen->renderText((uint16)*_text++);
-		_delay = 1;
-		break;
-	}
-	return true;
-}
-
-Screen::Screen(Supernova2Engine *vm, ResourceManager *resMan)
-	: _vm(vm)
-	, _resMan(resMan)
-	, _currentImage(nullptr)
-	, _viewportBrightness(255)
-	, _guiBrightness(255)
-	, _screenWidth(320)
-	, _screenHeight(200)
-	, _textColor(kColorBlack)
-	, _textCursorX(0)
-	, _textCursorY(0)
-	, _messageShown(false) {
-
-	changeCursor(ResourceManager::kCursorNormal);
-}
-
-int Screen::getGuiBrightness() const {
-	return _guiBrightness;
-}
-
-void Screen::setViewportBrightness(int brightness) {
-	_viewportBrightness = brightness;
-}
-
-int Screen::getViewportBrightness() const {
-	return _viewportBrightness;
-}
-
-void Screen::setGuiBrightness(int brightness) {
-	_guiBrightness = brightness;
-}
-
-MS2Image *Screen::getCurrentImage() {
-	return _currentImage;
-}
-
-const Screen::ImageInfo *Screen::getImageInfo(ImageId id) const {
-	return &imageInfo[(int)id];
-}
-
-bool Screen::isMessageShown() const {
-	return _messageShown;
-}
-
-Common::Point Screen::getTextCursorPos() {
-	return Common::Point(_textCursorX, _textCursorY);
-}
-
-void Screen::setTextCursorPos(int x, int y) {
-	_textCursorX = x;
-	_textCursorY = y;
-}
-
-byte Screen::getTextCursorColor() {
-	return _textColor;
-}
-
-void Screen::setTextCursorColor(byte color) {
-	_textColor = color;
-}
-
-void Screen::renderMessage(StringId stringId, MessagePosition position,
-						   Common::String var1, Common::String var2) {
-	Common::String text = _vm->getGameString(stringId);
-
-	if (!var1.empty()) {
-		if (!var2.empty())
-			text = Common::String::format(text.c_str(), var1.c_str(), var2.c_str());
-		else
-			text = Common::String::format(text.c_str(), var1.c_str());
-	}
-
-	renderMessage(text, position);
-}
-
-void Screen::renderMessage(const Common::String &text, MessagePosition position) {
-	if (!text.empty())
-		renderMessage(text.c_str(), position);
-}
-
-void Screen::renderText(const uint16 character) {
-	char text[2];
-	text[0] = character & 0xFF;
-	text[1] = 0;
-	renderText(text, _textCursorX, _textCursorY, _textColor);
-}
-
-void Screen::renderText(const char *text) {
-	renderText(text, _textCursorX, _textCursorY, _textColor);
-}
-
-void Screen::renderText(StringId stringId) {
-	renderText(_vm->getGameString(stringId));
-}
-
-void Screen::renderText(const Common::String &text) {
-	if (!text.empty())
-		renderText(text.c_str());
-}
-
-void Screen::renderText(const GuiElement &guiElement) {
-	renderText(guiElement.getText(), guiElement.getTextPos().x,
-			   guiElement.getTextPos().y, guiElement.getTextColor());
-}
-
-void Screen::renderText(const uint16 character, int x, int y, byte color) {
-	char text[2];
-	text[0] = character & 0xFF;
-	text[1] = 0;
-	renderText(text, x, y, color);
-}
-
-void Screen::renderText(const char *text, int x, int y, byte color) {
-	Graphics::Surface *screen = _vm->_system->lockScreen();
-	byte *cursor = static_cast<byte *>(screen->getBasePtr(x, y));
-	const byte *basePtr = cursor;
-
-	byte c;
-	while ((c = *text++) != '\0') {
-		if (c < 32) {
-			continue;
-		} else if (c == 225) {
-			c = 128;
-		}
-
-		for (uint i = 0; i < 5; ++i) {
-			if (font[c - 32][i] == 0xff) {
-				break;
-			}
-
-			byte *ascentLine = cursor;
-			for (byte j = font[c - 32][i]; j != 0; j >>= 1) {
-				if (j & 1) {
-					*cursor = color;
-				}
-				cursor += kScreenWidth;
-			}
-			cursor = ++ascentLine;
-		}
-		++cursor;
-	}
-	_vm->_system->unlockScreen();
-
-	uint numChars = cursor - basePtr;
-	uint absPosition = y * kScreenWidth + x + numChars;
-	_textCursorX = absPosition % kScreenWidth;
-	_textCursorY = absPosition / kScreenWidth;
-	_textColor = color;
-}
-
-void Screen::renderText(const Common::String &text, int x, int y, byte color) {
-	if (!text.empty())
-		renderText(text.c_str(), x, y, color);
-}
-
-void Screen::renderText(StringId stringId, int x, int y, byte color) {
-	renderText(_vm->getGameString(stringId), x, y, color);
-}
-
-void Screen::renderImageSection(const MS2Image *image, int section, bool invert) {
-	// Note: inverting means we are removing the section. So we should get the rect for that
-	// section but draw the background (section 0) instead.
-	if (section > image->_numSections - 1)
-		return;
-
-	Common::Rect sectionRect(image->_section[section].x1,
-							 image->_section[section].y1,
-							 image->_section[section].x2 + 1,
-							 image->_section[section].y2 + 1);
-	if (image->_filenumber == 38 ||
-			(image->_filenumber == 28 && ConfMan.get("language") == "en")) {
-		sectionRect.setWidth(640);
-		sectionRect.setHeight(480);
-		if (_screenWidth != 640) {
-			_screenWidth = 640;
-			_screenHeight = 480;
-			initGraphics(_screenWidth, _screenHeight);
-		}
-	} else {
-		if (_screenWidth != 320) {
-			_screenWidth = 320;
-			_screenHeight = 200;
-			initGraphics(_screenWidth, _screenHeight);
-		}
-	}
-
-	uint offset = 0;
-	int pitch = sectionRect.width();
-	if (invert) {
-		pitch = image->_pitch;
-		offset = image->_section[section].y1 * pitch +
-				 image->_section[section].x1;
-		section = 0;
-	}
-
-	void *pixels = image->_sectionSurfaces[section]->getPixels();
-	_vm->_system->copyRectToScreen(static_cast<const byte *>(pixels) + offset,
-								   pitch, sectionRect.left, sectionRect.top,
-								   sectionRect.width(), sectionRect.height());
-}
-
-void Screen::renderImage(ImageId id, bool removeImage) {
-	ImageInfo info = imageInfo[id];
-	const MS2Image *image = _resMan->getImage(info.filenumber);
-
-	if (_currentImage != image)
-		setCurrentImage(info.filenumber);
-
-	do {
-		renderImageSection(image, info.section, removeImage);
-		info.section = image->_section[info.section].next;
-	} while (info.section != 0);
-}
-
-void Screen::renderImage(int section) {
-	bool removeImage = false;
-	if (section > 128) {
-		removeImage = true;
-		section -= 128;
-	}
-
-	if (!_currentImage || section >= kMaxSection)
-		return;
-
-	do {
-		renderImageSection(_currentImage, section, removeImage);
-		section = _currentImage->_section[section].next;
-	} while (section != 0);
-}
-
-bool Screen::setCurrentImage(int filenumber) {
-	_currentImage = _resMan->getImage(filenumber);
-	_vm->_system->getPaletteManager()->setPalette(_currentImage->getPalette(), 16, 239);
-	paletteBrightness();
-
-	return true;
-}
-
-void Screen::saveScreen(int x, int y, int width, int height) {
-	_screenBuffer.push(x, y, width, height);
-}
-
-void Screen::saveScreen(const GuiElement &guiElement) {
-	saveScreen(guiElement.left, guiElement.top, guiElement.width(), guiElement.height());
-}
-
-void Screen::restoreScreen() {
-	_screenBuffer.restore();
-}
-
-void Screen::renderRoom(Room &room) {
-	if (room.getId() == INTRO)
-		return;
-
-	if (setCurrentImage(room.getFileNumber())) {
-		for (int i = 0; i < _currentImage->_numSections; ++i) {
-			int section = i;
-			if (room.isSectionVisible(section)) {
-				do {
-					renderImageSection(_currentImage, section, false);
-					section = _currentImage->_section[section].next;
-				} while (section != 0);
-			}
-		}
-	}
-}
-
-int Screen::textWidth(const uint16 key) {
-	char text[2];
-	text[0] = key & 0xFF;
-	text[1] = 0;
-	return textWidth(text);
-}
-
-int Screen::textWidth(const char *text) {
-	int charWidth = 0;
-	while (*text != '\0') {
-		byte c = *text++;
-		if (c < 32) {
-			continue;
-		} else if (c == 225) {
-			c = 35;
-		}
-
-		for (uint i = 0; i < 5; ++i) {
-			if (font[c - 32][i] == 0xff) {
-				break;
-			}
-			++charWidth;
-		}
-		++charWidth;
-	}
-
-	return charWidth;
-}
-
-int Screen::textWidth(const Common::String &text) {
-	return Screen::textWidth(text.c_str());
-}
-
-void Screen::renderMessage(const char *text, MessagePosition position, int positionX, int positionY) {
-	Common::String t(text);
-	char *row[20];
-	Common::String::iterator p = t.begin();
-	uint numRows = 0;
-	int rowWidthMax = 0;
-	int x = 0;
-	int y = 0;
-	byte textColor = 0;
-
-	while (*p != '\0') {
-		row[numRows] = p;
-		++numRows;
-		while ((*p != '\0') && (*p != '|')) {
-			++p;
-		}
-		if (*p == '|') {
-			*p = '\0';
-			++p;
-		}
-	}
-	for (uint i = 0; i < numRows; ++i) {
-		int rowWidth = textWidth(row[i]);
-		if (rowWidth > rowWidthMax)
-			rowWidthMax = rowWidth;
-	}
-
-	switch (position) {
-	case kMessageNormal:
-		x = 160 - rowWidthMax / 2;
-		textColor = kColorWhite99;
-		break;
-	case kMessageTop:
-		x = 160 - rowWidthMax / 2;
-		textColor = kColorLightYellow;
-		break;
-	case kMessageCenter:
-		x = 160 - rowWidthMax / 2;
-		textColor = kColorLightRed;
-		break;
-	case kMessageLeft:
-		x = 3;
-		textColor = kColorLightYellow;
-		break;
-	case kMessageRight:
-		x = 317 - rowWidthMax;
-		textColor = kColorLightGreen;
-		break;
-	}
-
-	if (position == kMessageNormal) {
-		y = 70 - ((numRows * 9) / 2);
-	} else if (position == kMessageTop) {
-		y = 5;
-	} else {
-		y = 142;
-	}
-
-	if (positionX != -1 && positionY != -1) {
-		x = positionX;
-		y = positionY;
-	}
-
-	int message_columns = x - 3;
-	int message_rows = y - 3;
-	int message_width = rowWidthMax + 6;
-	int message_height = numRows * 9 + 5;
-	saveScreen(message_columns, message_rows, message_width, message_height);
-	renderBox(message_columns, message_rows, message_width, message_height, kColorWhite25);
-	for (uint i = 0; i < numRows; ++i) {
-		renderText(row[i], x, y, textColor);
-		y += 9;
-	}
-
-	_messageShown = true;
-}
-
-void Screen::removeMessage() {
-	if (_messageShown) {
-		restoreScreen();
-		_messageShown = false;
-	}
-}
-
-void Screen::renderBox(int x, int y, int width, int height, byte color) {
-	Graphics::Surface *screen = _vm->_system->lockScreen();
-	screen->fillRect(Common::Rect(x, y, x + width, y + height), color);
-	_vm->_system->unlockScreen();
-}
-
-void Screen::renderBox(const GuiElement &guiElement) {
-	renderBox(guiElement.left, guiElement.top, guiElement.width(),
-			  guiElement.height(), guiElement.getBackgroundColor());
-}
-
-void Screen::initPalette() {
-	g_system->getPaletteManager()->setPalette(initVGAPalette, 0, 256);
-}
-
-void Screen::paletteBrightness() {
-	byte palette[768];
-
-	_vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
-	for (uint i = 0; i < 48; ++i) {
-		palette[i] = (initVGAPalette[i] * _guiBrightness) >> 8;
-	}
-	for (uint i = 0; i < 717; ++i) {
-		const byte *imagePalette;
-		if (_currentImage && _currentImage->getPalette()) {
-			imagePalette = _currentImage->getPalette();
-		} else {
-			imagePalette = palette + 48;
-		}
-		palette[i + 48] = (imagePalette[i] * _viewportBrightness) >> 8;
-	}
-	_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
-}
-
-void Screen::paletteFadeOut(int minBrightness) {
-	while (_guiBrightness > minBrightness + 10) {
-		_guiBrightness -= 10;
-		if (_viewportBrightness > _guiBrightness)
-			_viewportBrightness = _guiBrightness;
-		paletteBrightness();
-		_vm->_system->updateScreen();
-		_vm->_system->delayMillis(_vm->_delay);
-	}
-	_guiBrightness = minBrightness;
-	_viewportBrightness = minBrightness;
-	paletteBrightness();
-	_vm->_system->updateScreen();
-}
-
-void Screen::paletteFadeIn(int maxViewportBrightness) {
-	while (_guiBrightness < 245) {
-		if (_viewportBrightness < maxViewportBrightness)
-			_viewportBrightness += 10;
-		_guiBrightness += 10;
-		paletteBrightness();
-		_vm->_system->updateScreen();
-		_vm->_system->delayMillis(_vm->_delay);
-	}
-	_guiBrightness = 255;
-	_viewportBrightness = maxViewportBrightness;
-	paletteBrightness();
-	_vm->_system->updateScreen();
-}
-
-void Screen::setColor63(byte value) {
-	byte color[3] = {value, value, value};
-	_vm->_system->getPaletteManager()->setPalette(color, 63, 1);
-}
-
-void Screen::changeCursor(ResourceManager::CursorId id) {
-	CursorMan.replaceCursor(_resMan->getCursor(id),
-							16, 16, 0, 0, kColorCursorTransparent);
-	CursorMan.replaceCursorPalette(initVGAPalette, 0, 16);
-	CursorMan.showMouse(true);
-}
-
-}
diff --git a/engines/supernova2/screen.h b/engines/supernova2/screen.h
deleted file mode 100644
index 21d5cf6..0000000
--- a/engines/supernova2/screen.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#ifndef SUPERNOVA2_SCREEN_H
-#define SUPERNOVA2_SCREEN_H
-
-#include "common/array.h"
-#include "common/rect.h"
-#include "common/scummsys.h"
-
-#include "supernova2/imageid.h"
-#include "supernova2/ms2_def.h"
-#include "supernova2/resman.h"
-
-namespace Supernova2 {
-
-class Supernova2Engine;
-class GameManager;
-class ResourceManager;
-class GuiElement;
-class Room;
-class MS2Image;
-class Screen;
-
-const int kScreenWidth  = 320;
-const int kScreenHeight = 200;
-const int kFontWidth = 4;
-const int kFontHeight = 8;
-
-enum Color {
-	kColorBlack       =  0,
-	kColorWhite25     =  1,
-	kColorWhite35     =  2,
-	kColorWhite44     =  3,
-	kColorWhite99     =  4,
-	kColorDarkGreen   =  5,
-	kColorGreen       =  6,
-	kColorDarkRed     =  7,
-	kColorRed         =  8,
-	kColorDarkBlue    =  9,
-	kColorBlue        = 10,
-	kColorWhite63     = 11,
-	kColorLightBlue   = 12,
-	kColorLightGreen  = 13,
-	kColorLightYellow = 14,
-	kColorLightRed    = 15,
-	kColorPurple	  = 35,
-	kColorCursorTransparent = kColorWhite25
-};
-
-class ScreenBuffer {
-	friend class ScreenBufferStack;
-
-public:
-	ScreenBuffer();
-
-private:
-	byte *_pixels;
-	int _x;
-	int _y;
-	int _width;
-	int _height;
-};
-
-class ScreenBufferStack {
-public:
-	ScreenBufferStack();
-
-	void push(int x, int y, int width, int height);
-	void restore();
-
-private:
-	ScreenBuffer _buffer[8];
-	ScreenBuffer *_last;
-};
-
-class Marquee {
-public:
-	enum MarqueeId {
-		kMarqueeIntro,
-		kMarqueeOutro
-	};
-
-	Marquee(Screen *screen, MarqueeId id, const char *text);
-
-	bool renderCharacter();
-	void reset();
-
-private:
-	void clearText();
-
-	Screen *_screen;
-	const char *const _textBegin;
-	const char *_text;
-	bool _loop;
-	int _delay;
-	int _color;
-	int _x;
-	int _y;
-	int _textWidth;
-};
-
-class Screen {
-	friend class Marquee;
-
-public:
-	struct ImageInfo {
-		int filenumber;
-		int section;
-	};
-
-public:
-	static void initPalette();
-	static int textWidth(const uint16 key);
-	static int textWidth(const char *text);
-	static int textWidth(const Common::String &text);
-
-public:
-	Screen(Supernova2Engine *vm, ResourceManager *resMan);
-
-	int getViewportBrightness() const;
-	void setViewportBrightness(int brightness);
-	int getGuiBrightness() const;
-	void setGuiBrightness(int brightness);
-	MS2Image *getCurrentImage();
-	const ImageInfo *getImageInfo(ImageId id) const;
-	bool isMessageShown() const;
-	void paletteFadeIn(int maxViewportBrightness);
-	void paletteFadeOut(int minBrightness);
-	void paletteBrightness();
-	void renderImage(ImageId id, bool removeImage = false);
-	void renderImage(int section);
-	bool setCurrentImage(int filenumber);
-	void saveScreen(int x, int y, int width, int height);
-	void saveScreen(const GuiElement &guiElement);
-	void restoreScreen();
-	void renderRoom(Room &room);
-	void renderMessage(const char *text, MessagePosition position = kMessageNormal, int positionX = -1, int positionY = -1);
-	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
-	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
-					   Common::String var1 = "", Common::String var2 = "");
-	void removeMessage();
-	void renderText(const uint16 character);
-	void renderText(const char *text);
-	void renderText(const Common::String &text);
-	void renderText(StringId stringId);
-	void renderText(const uint16 character, int x, int y, byte color);
-	void renderText(const char *text, int x, int y, byte color);
-	void renderText(const Common::String &text, int x, int y, byte color);
-	void renderText(StringId stringId, int x, int y, byte color);
-	void renderText(const GuiElement &guiElement);
-	void renderBox(int x, int y, int width, int height, byte color);
-	void renderBox(const GuiElement &guiElement);
-	void setColor63(byte value);
-	Common::Point getTextCursorPos();
-	void setTextCursorPos(int x, int y);
-	byte getTextCursorColor();
-	void setTextCursorColor(byte color);
-	void update();
-	void changeCursor(ResourceManager::CursorId);
-
-private:
-	void renderImageSection(const MS2Image *image, int section, bool invert);
-
-private:
-	Supernova2Engine *_vm;
-	ResourceManager *_resMan;
-	MS2Image *_currentImage;
-	ScreenBufferStack _screenBuffer;
-	int _screenWidth;
-	int _screenHeight;
-	int  _textCursorX;
-	int  _textCursorY;
-	int  _textColor;
-	byte _viewportBrightness;
-	byte _guiBrightness;
-	bool _messageShown;
-};
-
-}
-
-#endif
diff --git a/engines/supernova2/screenstatic.cpp b/engines/supernova2/screenstatic.cpp
deleted file mode 100644
index b325f50..0000000
--- a/engines/supernova2/screenstatic.cpp
+++ /dev/null
@@ -1,542 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-namespace Supernova2 {
-
-static const Screen::ImageInfo imageInfo[] = {
-	{ 0,  0}, { 0,  1}, { 0,  2},
-	{ 1,  0},
-	{ 2,  0},
-	{ 3,  0}, { 3,  1}, { 3,  2}, { 3,  3}, { 3,  4}, { 3,  5},
-	{ 3,  6}, { 3,  7}, { 3,  8}, { 3,  9}, { 3, 10}, { 3, 11},
-	{ 4,  0}, { 4,  1}, { 4,  2}, { 4,  3},
-	{ 5,  0}, { 5,  1}, { 5,  2}, { 5,  3}, { 5,  4}, { 5,  5},
-	{ 5,  6}, { 5,  7}, { 5,  8}, { 5,  9},
-	{ 6,  0}, { 6,  1}, { 6,  2}, { 6,  3}, { 6,  4}, { 6,  5},
-	{ 6,  6}, { 6,  7}, { 6,  8}, { 6,  9}, { 6, 10}, { 6, 11},
-	{ 6, 12}, { 6, 13}, { 6, 14}, { 6, 15}, { 6, 16}, { 6, 17},
-	{ 6, 18}, { 6, 19}, { 6, 20}, { 6, 21},
-	{ 7,  0}, { 7,  1}, { 7,  2}, { 7,  3}, { 7,  4}, { 7,  5},
-	{ 7,  6}, { 7,  7}, { 7,  8}, { 7,  9}, { 7, 10}, { 7, 11},
-	{ 7, 12}, { 7, 13}, { 7, 14}, { 7, 15}, { 7, 16}, { 7, 17},
-	{ 7, 18}, { 7, 19}, { 7, 20}, { 7, 21}, { 7, 22},
-	{ 8,  0}, { 8,  1}, { 8,  2}, { 8,  3}, { 8,  4}, { 8,  5},
-	{ 8,  6}, { 8,  7}, { 8,  8}, { 8,  9}, { 8, 10}, { 8, 11},
-	{ 8, 12},
-	{ 9,  0}, { 9,  1}, { 9,  2}, { 9,  3}, { 9,  4}, { 9,  5},
-	{ 9,  6}, { 9,  7}, { 9,  8}, { 9,  9}, { 9, 10}, { 9, 11},
-	{ 9, 12}, { 9, 13}, { 9, 14}, { 9, 15}, { 9, 16}, { 9, 17},
-	{ 9, 18}, { 9, 19}, { 9, 20}, { 9, 21}, { 9, 22}, { 9, 23},
-	{10,  0}, {10,  1}, {10,  2}, {10,  3}, {10,  4}, {10,  5},
-	{10,  6}, {10,  7}, {10,  8}, {10,  9}, {10, 10}, {10, 11},
-	{10, 12}, {10, 13}, {10, 14}, {10, 15}, {10, 16},
-	{11,  0},
-	{12,  0}, {12,  1}, {12,  2}, {12,  3},
-	{13,  0}, {13,  1}, {13,  2}, {13,  3}, {13,  4}, {13,  5},
-	{13,  6}, {13,  7}, {13,  8}, {13,  9}, {13, 10}, {13, 11},
-	{13, 12}, {13, 13},
-	{14,  0}, {14,  1}, {14,  2}, {14,  3}, {14,  4}, {14,  5},
-	{14,  6}, {14,  7}, {14,  8}, {14,  9}, {14, 10}, {14, 11},
-	{14, 12}, {14, 13}, {14, 14}, {14, 15}, {14, 16}, {14, 17},
-	{14, 18}, {14, 19},
-	{15,  0}, {15,  1}, {15,  2}, {15,  3}, {15,  4}, {15,  5},
-	{16,  0}, {16,  1}, {16,  2}, {16,  3}, {16,  4}, {16,  5},
-	{16,  6}, {16,  7}, {16,  8}, {16,  9}, {16, 10}, {16, 11},
-	{16, 12}, {16, 13}, {16, 14}, {16, 15}, {16, 16}, {16, 17},
-	{16, 18}, {16, 19}, {16, 20}, {16, 21}, {16, 22}, {16, 23},
-	{16, 24}, {16, 25}, {16, 26}, {16, 27}, {16, 28}, {16, 29},
-	{16, 30}, {16, 31}, {16, 32}, {16, 33},
-	{17,  0}, {17,  1}, {17,  2}, {17,  3}, {17,  4}, {17,  5},
-	{17,  6}, {17,  7}, {17,  8}, {17,  9}, {17, 10}, {17, 11},
-	{17, 12}, {17, 13}, {17, 14}, {17, 15},
-	{18,  0}, {18,  1}, {18,  2}, {18,  3}, {18,  4}, {18,  5},
-	{18,  6}, {18,  7}, {18,  8}, {18,  9}, {18, 10}, {18, 11},
-	{18, 12}, {18, 13}, {18, 14}, {18, 15}, {18, 16}, {18, 17},
-	{18, 18}, {18, 19}, {18, 20}, {18, 21},
-	{19,  0}, {19,  1}, {19,  2}, {19,  3}, {19,  4}, {19,  5},
-	{19,  6}, {19,  7}, {19,  8}, {19,  9}, {19, 10}, {19, 11},
-	{19, 12}, {19, 13}, {19, 14}, {19, 15}, {19, 16}, {19, 17},
-	{19, 18}, {19, 19}, {19, 20}, {19, 21}, {19, 22}, {19, 23},
-	{19, 24}, {19, 25}, {19, 26}, {19, 27}, {19, 28}, {19, 29},
-	{19, 30}, {19, 31}, {19, 32}, {19, 33}, {19, 34}, {19, 35},
-	{19, 36}, {19, 37}, {19, 38}, {19, 39}, {19, 40},
-	{20,  0},
-	{21,  0}, {21,  1}, {21,  2}, {21,  3}, {21,  4}, {21,  5},
-	{21,  6}, {21,  7}, {21,  8}, {21,  9}, {21, 10}, {21, 11},
-	{21, 12}, {21, 13}, {21, 14}, {21, 15}, {21, 16}, {21, 17},
-	{21, 18}, {21, 19}, {21, 20}, {21, 21}, {21, 22}, {21, 23},
-	{21, 24}, {21, 25}, {21, 26}, {21, 27}, {21, 28}, {21, 29},
-	{21, 30}, {21, 31}, {21, 32}, {21, 33}, {21, 34}, {21, 35},
-	{21, 36}, {21, 37}, {21, 38},
-	{22,  0}, {22,  1}, {22,  2}, {22,  3}, {22,  4}, {22,  5},
-	{22,  6}, {22,  7}, {22,  8}, {22,  9}, {22, 10}, {22, 11},
-	{22, 12}, {22, 13}, {22, 14}, {22, 15}, {22, 16}, {22, 17},
-	{22, 18},
-	{23,  0},
-	{24,  0}, {24,  1}, {24,  2}, {24,  3}, {24,  4}, {24,  5},
-	{24,  6}, {24,  7}, {24,  8},
-	{25,  0}, {25,  1}, {25,  2}, {25,  3}, {25,  4}, {25,  5},
-	{25,  6}, {25,  7}, {25,  8}, {25,  9}, {25, 10}, {25, 11},
-	{25, 12}, {25, 13}, {25, 14}, {25, 15}, {25, 16}, {25, 17},
-	{25, 18},
-	{26,  0},
-	{27,  0},
-	{28,  0}, {28,  1}, {28,  2}, {28,  3}, {28,  4}, {28,  5},
-	{28,  6}, {28,  7}, {28,  8}, {28,  9}, {28, 10}, {28, 11},
-	{28, 12}, {28, 13}, {28, 14}, {28, 15}, {28, 16}, {28, 17},
-	{28, 18}, {28, 19}, {28, 20}, {28, 21}, {28, 22},
-	{29,  0}, {29,  1}, {29,  2}, {29,  3}, {29,  4}, {29,  5},
-	{29,  6}, {29,  7}, {29,  8}, {29,  9}, {29, 10}, {29, 11},
-	{29, 12}, {29, 13},
-	{30,  0}, {30,  1},
-	{31,  0}, {31,  1}, {31,  2}, {31,  3}, {31,  4}, {31,  5},
-	{31,  6},
-	{32,  0}, {32,  1}, {32,  2}, {32,  3},
-	{33,  0}, {33,  1}, {33,  2}, {33,  3}, {33,  4}, {33,  5},
-	{34,  0}, {34,  1}, {34,  2}, {34,  3}, {34,  4}, {34,  5},
-	{34,  6}, {34,  7}, {34,  8}, {34,  9}, {34, 10}, {34, 11},
-	{34, 12}, {34, 13}, {34, 14}, {34, 15}, {34, 16}, {34, 17},
-	{35,  0}, {35,  1}, {35,  2}, {35,  3}, {35,  4}, {35,  5},
-	{35,  6}, {35,  7}, {35,  8}, {35,  9}, {35, 10}, {35, 11},
-	{35, 12}, {35, 13}, {35, 14}, {35, 15}, {35, 16}, {35, 17},
-	{35, 18}, {35, 19}, {35, 20}, {35, 21},
-	{36,  0}, {36,  1}, {36,  2}, {36,  3}, {36,  4}, {36,  5},
-	{37,  0}, {37,  1}, {37,  2}, {37,  3}, {37,  4}, {37,  5},
-	{37,  6}, {37,  7}, {37,  8}, {37,  9}, {37, 10}, {37, 11},
-	{37, 12}, {37, 13}, {37, 14}, {37, 15}, {37, 16}, {37, 17},
-	{37, 18}, {37, 19}, {37, 20}, {37, 21}, {37, 22}, {37, 23},
-	{37, 24}, {37, 25}, {37, 26},
-	{38,  0}, {38,  1}, {38,  2}, {38,  3}, {38,  4}, {38,  5},
-	{38,  6}, {38,  7}, {38,  8}, {38,  9}, {38, 10}, {38, 11},
-	{38, 12},
-	{39,  0},
-	{40,  0}, {40,  1}, {40,  2}, {40,  3}, {40,  4}, {40,  5},
-	{40,  6}, {40,  7},
-	{41,  0}, {41,  1}, {41,  2}, {41,  3},
-	{42,  0}, {42,  1}, {42,  2}, {42,  3}, {42,  4}, {42,  5},
-	{42,  6}, {42,  7},	{42,  8}, {42,  9}, {42, 10}, {42, 11},
-	{43,  0}, {43,  1}, {43,  2}, {43,  3}, {43,  4}, {43,  5},
-	{43,  6}, {43,  7}, {43,  8}, {43,  9}, {43, 10}, {43, 11},
-	{43, 12}, {43, 13}, {43, 14}, {43, 15}, {43, 16}, {43, 17},
-	{43, 18}, {43, 19}, {43, 20}, {43, 21}, {43, 22}, {43, 23},
-	{43, 24}, {43, 25}, {43, 26}, {43, 27}, {43, 28}, {43, 29},
-	{43, 30}, {43, 31},
-	{55,  0}
-};
-
-// Default palette
-static const byte initVGAPalette[768] = {
-	0x00, 0x00, 0x00,
-	0x40, 0x40, 0x40,
-	0x58, 0x58, 0x58,
-	0x70, 0x70, 0x70,
-	0xfc, 0xfc, 0xfc,
-	0x00, 0xd0, 0x00,
-	0x00, 0xfc, 0x00,
-	0xd8, 0x00, 0x00,
-	0xfc, 0x00, 0x00,
-	0x00, 0x00, 0x78,
-	0x00, 0x00, 0xb0,
-	0xa0, 0xa0, 0xa0,
-	0x50, 0xc8, 0xfc,
-	0x28, 0xfc, 0x28,
-	0xf0, 0xf0, 0x00,
-	0xfc, 0x28, 0x28,
-	0x00, 0x00, 0x00,
-	0x14, 0x14, 0x14,
-	0x20, 0x20, 0x20,
-	0x2c, 0x2c, 0x2c,
-	0x38, 0x38, 0x38,
-	0x44, 0x44, 0x44,
-	0x50, 0x50, 0x50,
-	0x60, 0x60, 0x60,
-	0x70, 0x70, 0x70,
-	0x80, 0x80, 0x80,
-	0x90, 0x90, 0x90,
-	0xa0, 0xa0, 0xa0,
-	0xb4, 0xb4, 0xb4,
-	0xc8, 0xc8, 0xc8,
-	0xe0, 0xe0, 0xe0,
-	0xfc, 0xfc, 0xfc,
-	0x00, 0x00, 0xfc,
-	0x40, 0x00, 0xfc,
-	0x7c, 0x00, 0xfc,
-	0xbc, 0x00, 0xfc,
-	0xfc, 0x00, 0xfc,
-	0xfc, 0x00, 0xbc,
-	0xfc, 0x00, 0x7c,
-	0xfc, 0x00, 0x40,
-	0xfc, 0x00, 0x00,
-	0xfc, 0x40, 0x00,
-	0xfc, 0x7c, 0x00,
-	0xfc, 0xbc, 0x00,
-	0xfc, 0xfc, 0x00,
-	0xbc, 0xfc, 0x00,
-	0x7c, 0xfc, 0x00,
-	0x40, 0xfc, 0x00,
-	0x00, 0xfc, 0x00,
-	0x00, 0xfc, 0x40,
-	0x00, 0xfc, 0x7c,
-	0x00, 0xfc, 0xbc,
-	0x00, 0xfc, 0xfc,
-	0x00, 0xbc, 0xfc,
-	0x00, 0x7c, 0xfc,
-	0x00, 0x40, 0xfc,
-	0x7c, 0x7c, 0xfc,
-	0x9c, 0x7c, 0xfc,
-	0xbc, 0x7c, 0xfc,
-	0xdc, 0x7c, 0xfc,
-	0xfc, 0x7c, 0xfc,
-	0xfc, 0x7c, 0xdc,
-	0xfc, 0x7c, 0xbc,
-	0xfc, 0x7c, 0x9c,
-	0xfc, 0x7c, 0x7c,
-	0xfc, 0x9c, 0x7c,
-	0xfc, 0xbc, 0x7c,
-	0xfc, 0xdc, 0x7c,
-	0xfc, 0xfc, 0x7c,
-	0xdc, 0xfc, 0x7c,
-	0xbc, 0xfc, 0x7c,
-	0x9c, 0xfc, 0x7c,
-	0x7c, 0xfc, 0x7c,
-	0x7c, 0xfc, 0x9c,
-	0x7c, 0xfc, 0xbc,
-	0x7c, 0xfc, 0xdc,
-	0x7c, 0xfc, 0xfc,
-	0x7c, 0xdc, 0xfc,
-	0x7c, 0xbc, 0xfc,
-	0x7c, 0x9c, 0xfc,
-	0xb4, 0xb4, 0xfc,
-	0xc4, 0xb4, 0xfc,
-	0xd8, 0xb4, 0xfc,
-	0xe8, 0xb4, 0xfc,
-	0xfc, 0xb4, 0xfc,
-	0xfc, 0xb4, 0xe8,
-	0xfc, 0xb4, 0xd8,
-	0xfc, 0xb4, 0xc4,
-	0xfc, 0xb4, 0xb4,
-	0xfc, 0xc4, 0xb4,
-	0xfc, 0xd8, 0xb4,
-	0xfc, 0xe8, 0xb4,
-	0xfc, 0xfc, 0xb4,
-	0xe8, 0xfc, 0xb4,
-	0xd8, 0xfc, 0xb4,
-	0xc4, 0xfc, 0xb4,
-	0xb4, 0xfc, 0xb4,
-	0xb4, 0xfc, 0xc4,
-	0xb4, 0xfc, 0xd8,
-	0xb4, 0xfc, 0xe8,
-	0xb4, 0xfc, 0xfc,
-	0xb4, 0xe8, 0xfc,
-	0xb4, 0xd8, 0xfc,
-	0xb4, 0xc4, 0xfc,
-	0x00, 0x00, 0x70,
-	0x1c, 0x00, 0x70,
-	0x38, 0x00, 0x70,
-	0x54, 0x00, 0x70,
-	0x70, 0x00, 0x70,
-	0x70, 0x00, 0x54,
-	0x70, 0x00, 0x38,
-	0x70, 0x00, 0x1c,
-	0x70, 0x00, 0x00,
-	0x70, 0x1c, 0x00,
-	0x70, 0x38, 0x00,
-	0x70, 0x54, 0x00,
-	0x70, 0x70, 0x00,
-	0x54, 0x70, 0x00,
-	0x38, 0x70, 0x00,
-	0x1c, 0x70, 0x00,
-	0x00, 0x70, 0x00,
-	0x00, 0x70, 0x1c,
-	0x00, 0x70, 0x38,
-	0x00, 0x70, 0x54,
-	0x00, 0x70, 0x70,
-	0x00, 0x54, 0x70,
-	0x00, 0x38, 0x70,
-	0x00, 0x1c, 0x70,
-	0x38, 0x38, 0x70,
-	0x44, 0x38, 0x70,
-	0x54, 0x38, 0x70,
-	0x60, 0x38, 0x70,
-	0x70, 0x38, 0x70,
-	0x70, 0x38, 0x60,
-	0x70, 0x38, 0x54,
-	0x70, 0x38, 0x44,
-	0x70, 0x38, 0x38,
-	0x70, 0x44, 0x38,
-	0x70, 0x54, 0x38,
-	0x70, 0x60, 0x38,
-	0x70, 0x70, 0x38,
-	0x60, 0x70, 0x38,
-	0x54, 0x70, 0x38,
-	0x44, 0x70, 0x38,
-	0x38, 0x70, 0x38,
-	0x38, 0x70, 0x44,
-	0x38, 0x70, 0x54,
-	0x38, 0x70, 0x60,
-	0x38, 0x70, 0x70,
-	0x38, 0x60, 0x70,
-	0x38, 0x54, 0x70,
-	0x38, 0x44, 0x70,
-	0x50, 0x50, 0x70,
-	0x58, 0x50, 0x70,
-	0x60, 0x50, 0x70,
-	0x68, 0x50, 0x70,
-	0x70, 0x50, 0x70,
-	0x70, 0x50, 0x68,
-	0x70, 0x50, 0x60,
-	0x70, 0x50, 0x58,
-	0x70, 0x50, 0x50,
-	0x70, 0x58, 0x50,
-	0x70, 0x60, 0x50,
-	0x70, 0x68, 0x50,
-	0x70, 0x70, 0x50,
-	0x68, 0x70, 0x50,
-	0x60, 0x70, 0x50,
-	0x58, 0x70, 0x50,
-	0x50, 0x70, 0x50,
-	0x50, 0x70, 0x58,
-	0x50, 0x70, 0x60,
-	0x50, 0x70, 0x68,
-	0x50, 0x70, 0x70,
-	0x50, 0x68, 0x70,
-	0x50, 0x60, 0x70,
-	0x50, 0x58, 0x70,
-	0x00, 0x00, 0x40,
-	0x10, 0x00, 0x40,
-	0x20, 0x00, 0x40,
-	0x30, 0x00, 0x40,
-	0x40, 0x00, 0x40,
-	0x40, 0x00, 0x30,
-	0x40, 0x00, 0x20,
-	0x40, 0x00, 0x10,
-	0x40, 0x00, 0x00,
-	0x40, 0x10, 0x00,
-	0x40, 0x20, 0x00,
-	0x40, 0x30, 0x00,
-	0x40, 0x40, 0x00,
-	0x30, 0x40, 0x00,
-	0x20, 0x40, 0x00,
-	0x10, 0x40, 0x00,
-	0x00, 0x40, 0x00,
-	0x00, 0x40, 0x10,
-	0x00, 0x40, 0x20,
-	0x00, 0x40, 0x30,
-	0x00, 0x40, 0x40,
-	0x00, 0x30, 0x40,
-	0x00, 0x20, 0x40,
-	0x00, 0x10, 0x40,
-	0x20, 0x20, 0x40,
-	0x28, 0x20, 0x40,
-	0x30, 0x20, 0x40,
-	0x38, 0x20, 0x40,
-	0x40, 0x20, 0x40,
-	0x40, 0x20, 0x38,
-	0x40, 0x20, 0x30,
-	0x40, 0x20, 0x28,
-	0x40, 0x20, 0x20,
-	0x40, 0x28, 0x20,
-	0x40, 0x30, 0x20,
-	0x40, 0x38, 0x20,
-	0x40, 0x40, 0x20,
-	0x38, 0x40, 0x20,
-	0x30, 0x40, 0x20,
-	0x28, 0x40, 0x20,
-	0x20, 0x40, 0x20,
-	0x20, 0x40, 0x28,
-	0x20, 0x40, 0x30,
-	0x20, 0x40, 0x38,
-	0x20, 0x40, 0x40,
-	0x20, 0x38, 0x40,
-	0x20, 0x30, 0x40,
-	0x20, 0x28, 0x40,
-	0x2c, 0x2c, 0x40,
-	0x30, 0x2c, 0x40,
-	0x34, 0x2c, 0x40,
-	0x3c, 0x2c, 0x40,
-	0x40, 0x2c, 0x40,
-	0x40, 0x2c, 0x3c,
-	0x40, 0x2c, 0x34,
-	0x40, 0x2c, 0x30,
-	0x40, 0x2c, 0x2c,
-	0x40, 0x30, 0x2c,
-	0x40, 0x34, 0x2c,
-	0x40, 0x3c, 0x2c,
-	0x40, 0x40, 0x2c,
-	0x3c, 0x40, 0x2c,
-	0x34, 0x40, 0x2c,
-	0x30, 0x40, 0x2c,
-	0x2c, 0x40, 0x2c,
-	0x2c, 0x40, 0x30,
-	0x2c, 0x40, 0x34,
-	0x2c, 0x40, 0x3c,
-	0x2c, 0x40, 0x40,
-	0x2c, 0x3c, 0x40,
-	0x2c, 0x34, 0x40,
-	0x2c, 0x30, 0x40,
-	0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00,
-	0x00, 0x00, 0x00
-};
-
-static const byte font[][5] = {
-	{0x00,0x00,0x00,0xff,0x00},
-	{0x5f,0xff,0x00,0x00,0x00},
-	{0x03,0x00,0x03,0xff,0x00},
-	{0x14,0x7f,0x14,0x7f,0x14},
-	{0x24,0x2a,0x7f,0x2a,0x12},
-	{0x61,0x10,0x08,0x04,0x43},
-	{0x38,0x4e,0x59,0x26,0x50},
-	{0x03,0xff,0x00,0x00,0x00},
-	{0x3e,0x41,0xff,0x00,0x00},
-	{0x41,0x3e,0xff,0x00,0x00},
-	{0x10,0x54,0x38,0x54,0x10},
-	{0x10,0x10,0x7c,0x10,0x10},
-	{0x80,0x40,0xff,0x00,0x00},
-	{0x10,0x10,0x10,0x10,0x10},
-	{0x40,0xff,0x00,0x00,0x00},
-	{0x60,0x10,0x08,0x04,0x03},
-
-	{0x3e,0x41,0x41,0x41,0x3e}, /* digits */
-	{0x04,0x02,0x7f,0xff,0x00},
-	{0x42,0x61,0x51,0x49,0x46},
-	{0x22,0x41,0x49,0x49,0x36},
-	{0x18,0x14,0x12,0x7f,0x10},
-	{0x27,0x45,0x45,0x45,0x39},
-	{0x3e,0x49,0x49,0x49,0x32},
-	{0x01,0x61,0x19,0x07,0x01},
-	{0x36,0x49,0x49,0x49,0x36},
-	{0x26,0x49,0x49,0x49,0x3e},
-
-	{0x44,0xff,0x00,0x00,0x00},
-	{0x80,0x44,0xff,0x00,0x00},
-	{0x10,0x28,0x44,0xff,0x00},
-	{0x28,0x28,0x28,0x28,0x28},
-	{0x44,0x28,0x10,0xff,0x00},
-	{0x02,0x01,0x51,0x09,0x06},
-	{0x3e,0x41,0x5d,0x5d,0x1e},
-
-	{0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
-	{0x7f,0x49,0x49,0x49,0x36},
-	{0x3e,0x41,0x41,0x41,0x22},
-	{0x7f,0x41,0x41,0x22,0x1c},
-	{0x7f,0x49,0x49,0x49,0xff},
-	{0x7f,0x09,0x09,0x09,0xff},
-	{0x3e,0x41,0x41,0x49,0x3a},
-	{0x7f,0x08,0x08,0x08,0x7f},
-	{0x41,0x7f,0x41,0xff,0x00},
-	{0x20,0x40,0x40,0x3f,0xff},
-	{0x7f,0x08,0x14,0x22,0x41},
-	{0x7f,0x40,0x40,0x40,0xff},
-	{0x7f,0x02,0x04,0x02,0x7f},
-	{0x7f,0x02,0x0c,0x10,0x7f},
-	{0x3e,0x41,0x41,0x41,0x3e},
-	{0x7f,0x09,0x09,0x09,0x06},
-	{0x3e,0x41,0x51,0x21,0x5e},
-	{0x7f,0x09,0x19,0x29,0x46},
-	{0x26,0x49,0x49,0x49,0x32},
-	{0x01,0x01,0x7f,0x01,0x01},
-	{0x3f,0x40,0x40,0x40,0x3f},
-	{0x07,0x18,0x60,0x18,0x07},
-	{0x1f,0x60,0x18,0x60,0x1f},
-	{0x63,0x14,0x08,0x14,0x63},
-	{0x03,0x04,0x78,0x04,0x03},
-	{0x61,0x51,0x49,0x45,0x43},
-
-	{0x7f,0x41,0x41,0xff,0x00},
-	{0x03,0x04,0x08,0x10,0x60},
-	{0x41,0x41,0x7f,0xff,0x00},
-	{0x02,0x01,0x02,0xff,0x00},
-	{0x80,0x80,0x80,0x80,0x80},
-	{0x01,0x02,0xff,0x00,0x00},
-
-	{0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
-	{0x7f,0x44,0x44,0x44,0x38},
-	{0x38,0x44,0x44,0x44,0x44},
-	{0x38,0x44,0x44,0x44,0x7f},
-	{0x38,0x54,0x54,0x54,0x58},
-	{0x04,0x7e,0x05,0x01,0xff},
-	{0x98,0xa4,0xa4,0xa4,0x7c},
-	{0x7f,0x04,0x04,0x04,0x78},
-	{0x7d,0xff,0x00,0x00,0x00},
-	{0x80,0x80,0x7d,0xff,0x00},
-	{0x7f,0x10,0x28,0x44,0xff},
-	{0x7f,0xff,0x00,0x00,0x00},
-	{0x7c,0x04,0x7c,0x04,0x78},
-	{0x7c,0x04,0x04,0x04,0x78},
-	{0x38,0x44,0x44,0x44,0x38},
-	{0xfc,0x24,0x24,0x24,0x18},
-	{0x18,0x24,0x24,0x24,0xfc},
-	{0x7c,0x08,0x04,0x04,0xff},
-	{0x48,0x54,0x54,0x54,0x24},
-	{0x04,0x3e,0x44,0x40,0xff},
-	{0x7c,0x40,0x40,0x40,0x3c},
-	{0x0c,0x30,0x40,0x30,0x0c},
-	{0x3c,0x40,0x3c,0x40,0x3c},
-	{0x44,0x28,0x10,0x28,0x44},
-	{0x9c,0xa0,0xa0,0xa0,0x7c},
-	{0x44,0x64,0x54,0x4c,0x44},
-
-	{0x08,0x36,0x41,0xff,0x00},
-	{0x77,0xff,0x00,0x00,0x00},
-	{0x41,0x36,0x08,0xff,0x00},
-	{0x02,0x01,0x02,0x01,0xff},
-	{0xff,0x00,0x00,0x00,0x00},
-
-	{0xfe,0x49,0x49,0x4e,0x30}, /* sharp S */
-
-	{0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
-
-	{0x04,0x06,0x7f,0x06,0x04}, /* arrows */
-	{0x20,0x60,0xfe,0x60,0x20},
-
-	{0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0x79,0x14,0x12,0x14,0x79},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0x38,0x45,0x44,0x45,0x38},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0xff,0x00,0x00,0x00,0x00},
-	{0x3d,0x42,0x42,0x42,0x3d},
-	{0x3d,0x40,0x40,0x40,0x3d},
-};
-
-}
diff --git a/engines/supernova2/sound.cpp b/engines/supernova2/sound.cpp
deleted file mode 100644
index d16873d..0000000
--- a/engines/supernova2/sound.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
-*
-* ScummVM is the legal property of its developers, whose names
-* are too numerous to list here. Please refer to the COPYRIGHT
-* file distributed with this source distribution.
-*
-* This program is free software; you can redistribute it and/or
-* modify it under the terms of the GNU General Public License
-* as published by the Free Software Foundation; either version 2
-* of the License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*
-*/
-
-#include "audio/audiostream.h"
-#include "audio/mixer.h"
-#include "audio/decoders/raw.h"
-#include "audio/mods/protracker.h"
-#include "common/system.h"
-
-#include "supernova2/resman.h"
-#include "supernova2/sound.h"
-#include "supernova2/supernova2.h"
-
-namespace Supernova2 {
-
-Sound::Sound(Audio::Mixer *mixer, ResourceManager *resMan)
-	: _mixer(mixer)
-	, _resMan(resMan) {
-}
-
-void Sound::play(AudioId index) {
-	Audio::AudioStream *stream = _resMan->getSoundStream(index);
-
-	stop();
-	_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, stream,
-					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
-}
-
-void Sound::play(MusicId index) {
-	Audio::AudioStream *stream = _resMan->getSoundStream(index);
-
-	stop();
-	_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, stream,
-					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
-}
-
-void Sound::playSiren() {
-	Audio::AudioStream *stream = _resMan->getSirenStream();
-
-	stop();
-	_mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, stream,
-					   -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO);
-}
-
-bool Sound::isPlaying() {
-	return _mixer->isSoundHandleActive(_soundHandle);
-}
-
-void Sound::stop() {
-	if (_mixer->isSoundHandleActive(_soundHandle))
-		_mixer->stopHandle(_soundHandle);
-}
-
-int Sound::getVolume() {
-	return _mixer->getChannelVolume(_soundHandle);
-}
-
-void Sound::setVolume(int volume) {
-	_mixer->setChannelVolume(_soundHandle, volume);
-}
-
-}
diff --git a/engines/supernova2/sound.h b/engines/supernova2/sound.h
deleted file mode 100644
index 13ea4dd..0000000
--- a/engines/supernova2/sound.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef SUPERNOVA2_SOUND_H
-#define SUPERNOVA2_SOUND_H
-
-#include "audio/mixer.h"
-
-namespace Supernova2 {
-
-class Supernova2Engine;
-class ResourceManager;
-
-enum AudioId {
-	kAudioIntroDing,
-	kAudioSuccess,
-	kAudioTaxiOpen,
-	kAudioTaxiLeaving,
-	kAudioTaxiArriving,
-	kAudioKiosk,
-	kAudioStage1,
-	kAudioStage2,
-	kAudioAppearance1,
-	kAudioAppearance2,
-	kAudioAppearance3,
-	kAudioElevatorBell,
-	kAudioElevator1,
-	kAudioShip1,
-	kAudioShip2,
-	kAudioShip3,
-	kAudioShipDeath,
-	kAudioDeath,
-	kAudioCaught,
-	kAudioNumSamples
-};
-
-enum MusicId {
-	kMusicIntro = 52,
-	kMusicMadMonkeys = 56
-};
-
-class Sound {
-public:
-
-public:
-	Sound(Audio::Mixer *mixer, ResourceManager *resMan);
-
-	void play(AudioId index);
-	void play(MusicId index);
-	void playSiren();
-	void setVolume(int volume);
-	int getVolume();
-	void stop();
-	bool isPlaying();
-private:
-	Audio::Mixer *_mixer;
-	ResourceManager *_resMan;
-	Audio::SoundHandle _soundHandle;
-};
-
-}
-
-#endif
diff --git a/engines/supernova2/state.cpp b/engines/supernova2/state.cpp
deleted file mode 100644
index 67aa172..0000000
--- a/engines/supernova2/state.cpp
+++ /dev/null
@@ -1,2305 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "common/system.h"
-#include "graphics/cursorman.h"
-#include "graphics/palette.h"
-#include "gui/message.h"
-
-#include "supernova2/screen.h"
-#include "supernova2/supernova2.h"
-#include "supernova2/state.h"
-
-namespace Supernova2 {
-
-bool GameManager::serialize(Common::WriteStream *out) {
-	if (out->err())
-		return false;
-
-	// GameState
-	out->writeSint16LE(_state._money);
-	out->writeSint32LE(_state._startTime - g_system->getMillis());
-	out->writeByte(_state._addressKnown);
-	out->writeByte(_state._poleMagnet);
-	out->writeByte(_state._admission);
-	out->writeByte(_state._tipsy);
-	out->writeByte(_state._dark);
-	out->writeByte(_state._elevatorE);
-	out->writeByte(_state._elevatorNumber);
-	out->writeByte(_state._toMuseum);
-	out->writeSint16LE(_state._pyraE);
-	out->writeByte(_state._pyraS);
-	out->writeByte(_state._pyraZ);
-	out->writeByte(_state._alarmOn);
-	out->writeByte(_state._alarmCracked);
-	out->writeByte(_state._haste);
-	out->writeByte(_state._pressureCounter);
-	out->writeByte(_state._sirenOn);
-	out->writeSint16LE(_state._pyraDirection);
-	out->writeUint32LE(_state._eventTime - g_system->getMillis());
-	out->writeSint32LE(_state._eventCallback);
-	out->writeByte(_state._taxiPossibility);
-	for (int i = 0; i < 15; i++) {
-		out->writeSint16LE(_state._puzzleTab[i]);
-	}
-
-	// Inventory
-	out->writeSint32LE(_inventory.getSize());
-	out->writeSint32LE(_inventoryScroll);
-	for (int i = 0; i < _inventory.getSize(); ++i) {
-		Object *objectStateBegin = _rooms[_inventory.get(i)->_roomId]->getObject(0);
-		byte objectIndex = _inventory.get(i) - objectStateBegin;
-		out->writeSint32LE(_inventory.get(i)->_roomId);
-		out->writeSint32LE(objectIndex);
-	}
-
-	// Rooms
-	out->writeByte(_lastRoom->getId());
-	out->writeByte(_currentRoom->getId());
-	for (int i = 0; i < NUMROOMS; ++i) {
-		_rooms[i]->serialize(out);
-	}
-
-	return !out->err();
-}
-
-
-bool GameManager::deserialize(Common::ReadStream *in, int version) {
-	if (in->err())
-		return false;
-
-	// GameState
-	_state._money = in->readSint16LE();
-	_state._startTime = in->readSint32LE() + g_system->getMillis();
-	_state._addressKnown = in->readByte();
-	_state._poleMagnet = in->readByte();
-	_state._admission = in->readByte();
-	_state._tipsy = in->readByte();
-	_state._dark = in->readByte();
-	_state._elevatorE = in->readByte();
-	_state._elevatorNumber = in->readByte();
-	_state._toMuseum = in->readByte();
-	_state._pyraE = in->readSint16LE();
-	_state._pyraS = in->readByte();
-	_state._pyraZ = in->readByte();
-	_state._alarmOn = in->readByte();
-	_state._alarmCracked = in->readByte();
-	_state._haste = in->readByte();
-	_state._pressureCounter = in->readByte();
-	_state._sirenOn = in->readByte();
-	_state._pyraDirection = in->readSint16LE();
-	_state._eventTime = in->readUint32LE() + g_system->getMillis();
-	_state._eventCallback = (EventFunction)in->readSint32LE();
-	_state._taxiPossibility = in->readByte();
-	for (int i = 0; i < 15; i++)
-		_state._puzzleTab[i] = in->readSint16LE();
-	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
-
-	_oldTime = g_system->getMillis();
-
-	// Inventory
-	int inventorySize = in->readSint32LE();
-	_inventoryScroll = in->readSint32LE();
-	_inventory.clear();
-	for (int i = 0; i < inventorySize; ++i) {
-		RoomId objectRoom = static_cast<RoomId>(in->readSint32LE());
-		int objectIndex = in->readSint32LE();
-		_inventory.add(*_rooms[objectRoom]->getObject(objectIndex));
-	}
-
-	// Rooms
-	RoomId lastRoomId = static_cast<RoomId>(in->readByte());
-	RoomId curRoomId = static_cast<RoomId>(in->readByte());
-	for (int i = 0; i < NUMROOMS; ++i) {
-		_rooms[i]->deserialize(in, version);
-	}
-	delete _rooms[BST_DOOR];
-	_rooms[BST_DOOR] = new BstDoor(_vm, this);
-	_lastRoom = _rooms[lastRoomId];
-	changeRoom(curRoomId);
-
-	// Some additional variables
-	_state._previousRoom = _rooms[INTRO];
-	_guiEnabled = true;
-	_animationEnabled = true;
-
-	return !in->err();
-}
-
-void Inventory::add(Object &obj) {
-	if (_numObjects < kMaxCarry) {
-		_inventory[_numObjects++] = &obj;
-		obj.setProperty(CARRIED);
-	}
-
-	if (getSize() > _inventoryScroll + 8) {
-		_inventoryScroll = getSize() - 8;
-		_inventoryScroll += _inventoryScroll % 2;
-	}
-}
-
-void Inventory::remove(Object &obj) {
-	for (int i = 0; i < _numObjects; ++i) {
-		if (_inventory[i] == &obj) {
-			if (_inventoryScroll >= 2 && getSize() % 2)
-				_inventoryScroll -= 2;
-
-			--_numObjects;
-			while (i < _numObjects) {
-				_inventory[i] = _inventory[i + 1];
-				++i;
-			}
-			obj.disableProperty(CARRIED);
-		}
-	}
-}
-
-void Inventory::clear() {
-	for (int i = 0; i < _numObjects; ++i)
-		_inventory[i]->disableProperty(CARRIED);
-	_numObjects = 0;
-	_inventoryScroll = 0;
-}
-
-Object *Inventory::get(int index) const {
-	if (index < _numObjects)
-		return _inventory[index];
-
-	return _nullObject;
-}
-
-Object *Inventory::get(ObjectId id) const {
-	for (int i = 0; i < _numObjects; ++i) {
-		if (_inventory[i]->_id == id)
-			return _inventory[i];
-	}
-
-	return _nullObject;
-}
-
-
-GuiElement::GuiElement()
-	: _isHighlighted(false)
-	, _bgColorNormal(kColorWhite25)
-	, _bgColorHighlighted(kColorWhite44)
-	, _bgColor(kColorWhite25)
-	, _textColorNormal(kColorGreen)
-	, _textColorHighlighted(kColorLightGreen)
-	, _textColor(kColorGreen)
-{
-	memset(_text, 0, sizeof(_text));
-}
-
-void GuiElement::setText(const char *text) {
-	strncpy(_text, text, sizeof(_text) - 1);
-}
-
-void GuiElement::setTextPosition(int x, int y) {
-	_textPosition = Common::Point(x, y);
-}
-
-void GuiElement::setSize(int x1, int y1, int x2, int y2) {
-	this->left = x1;
-	this->top = y1;
-	this->right = x2;
-	this->bottom = y2;
-
-	_textPosition = Common::Point(x1 + 1, y1 + 1);
-}
-
-void GuiElement::setColor(int bgColor, int textColor, int bgColorHighlighted, int textColorHightlighted) {
-	_bgColor = bgColor;
-	_textColor = textColor;
-	_bgColorNormal = bgColor;
-	_textColorNormal = textColor;
-	_bgColorHighlighted = bgColorHighlighted;
-	_textColorHighlighted = textColorHightlighted;
-}
-
-void GuiElement::setHighlight(bool isHighlighted_) {
-	if (isHighlighted_) {
-		_bgColor = _bgColorHighlighted;
-		_textColor = _textColorHighlighted;
-	} else {
-		_bgColor = _bgColorNormal;
-		_textColor = _textColorNormal;
-	}
-}
-
-StringId GameManager::guiCommands[] = {
-	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
-	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
-};
-
-StringId GameManager::guiStatusCommands[] = {
-	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
-	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
-};
-
-GameManager::GameManager(Supernova2Engine *vm, Sound *sound)
-	: _inventory(&_nullObject, _inventoryScroll)
-	, _vm(vm)
-    , _sound(sound)
-    , _mouseClickType(Common::EVENT_INVALID) {
-	initRooms();
-	changeRoom(INTRO);
-	initState();
-	initGui();
-}
-
-GameManager::~GameManager() {
-	destroyRooms();
-}
-
-void GameManager::destroyRooms() {
-	delete _rooms[INTRO];
-	delete _rooms[AIRPORT];
-	delete _rooms[TAXISTAND];
-	delete _rooms[STREET];
-	delete _rooms[GAMES];
-	delete _rooms[CABIN];
-	delete _rooms[KIOSK];
-	delete _rooms[CULTURE_PALACE];
-	delete _rooms[CHECKOUT];
-	delete _rooms[CITY1];
-	delete _rooms[CITY2];
-	delete _rooms[ELEVATOR];
-	delete _rooms[APARTMENT];
-	delete _rooms[SHIP];
-	delete _rooms[PYRAMID];
-	delete _rooms[PYR_ENTRANCE];
-	delete _rooms[UPSTAIRS1];
-	delete _rooms[DOWNSTAIRS1];
-	delete _rooms[BOTTOM_RIGHT_DOOR];
-	delete _rooms[BOTTOM_LEFT_DOOR];
-	delete _rooms[UPSTAIRS2];
-	delete _rooms[DOWNSTAIRS2];
-	delete _rooms[UPPER_DOOR];
-	delete _rooms[PUZZLE_FRONT];
-	delete _rooms[PUZZLE_BEHIND];
-	delete _rooms[FORMULA1_F];
-	delete _rooms[FORMULA1_N];
-	delete _rooms[FORMULA2_F];
-	delete _rooms[FORMULA2_N];
-	delete _rooms[TOMATO_F];
-	delete _rooms[TOMATO_N];
-	delete _rooms[MONSTER_F];
-	delete _rooms[MONSTER1_N];
-	delete _rooms[MONSTER2_N];
-	delete _rooms[UPSTAIRS3];
-	delete _rooms[DOWNSTAIRS3];
-	delete _rooms[LCORRIDOR1];
-	delete _rooms[LCORRIDOR2];
-	delete _rooms[HOLE_ROOM];
-	delete _rooms[IN_HOLE];
-	delete _rooms[FLOORDOOR];
-	delete _rooms[FLOORDOOR_U];
-	delete _rooms[BST_DOOR];
-	delete _rooms[HALL];
-	delete _rooms[COFFIN_ROOM];
-	delete _rooms[MASK];
-	delete _rooms[MUSEUM];
-	delete _rooms[MUS_ENTRANCE];
-	delete _rooms[MUS1];
-	delete _rooms[MUS2];
-	delete _rooms[MUS3];
-	delete _rooms[MUS4];
-	delete _rooms[MUS5];
-	delete _rooms[MUS6];
-	delete _rooms[MUS7];
-	delete _rooms[MUS8];
-	delete _rooms[MUS9];
-	delete _rooms[MUS10];
-	delete _rooms[MUS11];
-	delete _rooms[MUS_ROUND];
-	delete _rooms[MUS12];
-	delete _rooms[MUS13];
-	delete _rooms[MUS14];
-	delete _rooms[MUS15];
-	delete _rooms[MUS16];
-	delete _rooms[MUS17];
-	delete _rooms[MUS18];
-	delete _rooms[MUS19];
-	delete _rooms[MUS20];
-	delete _rooms[MUS21];
-	delete _rooms[MUS22];
-}
-
-void GameManager::initState() {
-	_currentInputObject = &_nullObject;
-	_inputObject[0] = &_nullObject;
-	_inputObject[1] = &_nullObject;
-	_inputVerb = ACTION_WALK;
-	_processInput = false;
-	_guiEnabled = true;
-	_animationEnabled = true;
-	_roomBrightness = 255;
-	_mouseClicked = false;
-	_keyPressed = false;
-	_mouseX = -1;
-	_mouseY = -1;
-	_mouseField = -1;
-	_inventoryScroll = 0;
-	_restTime = 0;
-	_oldTime = g_system->getMillis();
-	_timerPaused = 0;
-	_timePaused = false;
-	_messageDuration = 0;
-	_animationTimer = 0;
-	_mapOn = false;
-	_steps = false;
-	_cracking = false;
-	_alarmBefore = false;
-	RoomId startSecurityTab[10] = {MUS6, MUS7, MUS11, MUS10, MUS3, MUS2, MUS1, MUS8, MUS9, MUS5};
-	for (int i = 0; i < 10; i++)
-		_securityTab[i] = startSecurityTab[i];
-
-	_currentSentence = -1;
-	for (int i = 0 ; i < 6 ; ++i) {
-		_sentenceNumber[i] = -1;
-		_texts[i] = kNoString;
-		_rows[i] = 0;
-		_rowsStart[i] = 0;
-		_dials[i] = 1;
-	}
-
-	_prevImgId = 0;
-
-	_state._money = 20;
-	_state._startTime = 0;
-	_state._addressKnown = false;
-	_state._previousRoom = _currentRoom;
-	_state._poleMagnet = false;
-	_state._admission = 0;
-	_state._tipsy = false;
-	_state._dark = false;
-	_state._elevatorE = 0;
-	_state._elevatorNumber = 0;
-	_state._toMuseum = false;
-	_state._pyraE = 0;
-	_state._pyraS = 4;
-	_state._pyraZ = 10;
-	_state._alarmOn = false;
-	_state._alarmCracked = false;
-	_state._haste = false;
-	_state._pressureCounter = 0;
-	_state._sirenOn = false;
-	_state._pyraDirection = 0;
-	_state._eventTime = kMaxTimerValue;
-	_state._eventCallback = kNoFn;
-	_state._taxiPossibility = 4;
-	int16 startPuzzleTab[15] = {12, 3, 14, 1, 11, 0, 2, 13, 9, 5, 4, 10, 7, 6, 8};
-	for (int i = 0; i < 15; i++)
-		_state._puzzleTab[i] = startPuzzleTab[i];
-}
-
-void GameManager::initRooms() {
-	_rooms[INTRO] = new Intro(_vm, this);
-	_rooms[AIRPORT] = new Airport(_vm, this);
-	_rooms[TAXISTAND] = new TaxiStand(_vm, this);
-	_rooms[STREET] = new Street(_vm, this);
-	_rooms[GAMES] = new Games(_vm, this);
-	_rooms[CABIN] = new Cabin(_vm, this);
-	_rooms[KIOSK] = new Kiosk(_vm, this);
-	_rooms[CULTURE_PALACE] = new CulturePalace(_vm, this);
-	_rooms[CHECKOUT] = new Checkout(_vm, this);
-	_rooms[CITY1] = new City1(_vm, this);
-	_rooms[CITY2] = new City2(_vm, this);
-	_rooms[ELEVATOR] = new Elevator(_vm, this);
-	_rooms[APARTMENT] = new Apartment(_vm, this);
-	_rooms[SHIP] = new Ship(_vm, this);
-	_rooms[PYRAMID] = new Pyramid(_vm, this);
-	_rooms[PYR_ENTRANCE] = new PyrEntrance(_vm, this);
-	_rooms[UPSTAIRS1] = new Upstairs1(_vm, this);
-	_rooms[DOWNSTAIRS1] = new Downstairs1(_vm, this);
-	_rooms[BOTTOM_RIGHT_DOOR] = new BottomRightDoor(_vm, this);
-	_rooms[BOTTOM_LEFT_DOOR] = new BottomLeftDoor(_vm, this);
-	_rooms[UPSTAIRS2] = new Upstairs2(_vm, this);
-	_rooms[DOWNSTAIRS2] = new Downstairs2(_vm, this);
-	_rooms[UPPER_DOOR] = new UpperDoor(_vm, this);
-	_rooms[PUZZLE_FRONT] = new PuzzleFront(_vm, this);
-	_rooms[PUZZLE_BEHIND] = new PuzzleBehind(_vm, this);
-	_rooms[FORMULA1_F] = new Formula1F(_vm, this);
-	_rooms[FORMULA1_N] = new Formula1N(_vm, this);
-	_rooms[FORMULA2_F] = new Formula2F(_vm, this);
-	_rooms[FORMULA2_N] = new Formula2N(_vm, this);
-	_rooms[TOMATO_F] = new TomatoF(_vm, this);
-	_rooms[TOMATO_N] = new TomatoN(_vm, this);
-	_rooms[MONSTER_F] = new MonsterF(_vm, this);
-	_rooms[MONSTER1_N] = new Monster1N(_vm, this);
-	_rooms[MONSTER2_N] = new Monster2N(_vm, this);
-	_rooms[UPSTAIRS3] = new Upstairs3(_vm, this);
-	_rooms[DOWNSTAIRS3] = new Downstairs3(_vm, this);
-	_rooms[LCORRIDOR1] = new LCorridor1(_vm, this);
-	_rooms[LCORRIDOR2] = new LCorridor2(_vm, this);
-	_rooms[HOLE_ROOM] = new HoleRoom(_vm, this);
-	_rooms[IN_HOLE] = new InHole(_vm, this);
-	_rooms[FLOORDOOR] = new Floordoor(_vm, this);
-	_rooms[FLOORDOOR_U] = new FloordoorU(_vm, this);
-	_rooms[BST_DOOR] = new BstDoor(_vm, this);
-	_rooms[HALL] = new Hall(_vm, this);
-	_rooms[COFFIN_ROOM] = new CoffinRoom(_vm, this);
-	_rooms[MASK] = new Mask(_vm, this);
-	_rooms[MUSEUM] = new Museum(_vm, this);
-	_rooms[MUS_ENTRANCE] = new MusEntrance(_vm, this);
-	_rooms[MUS1] = new Mus1(_vm, this);
-	_rooms[MUS2] = new Mus2(_vm, this);
-	_rooms[MUS3] = new Mus3(_vm, this);
-	_rooms[MUS4] = new Mus4(_vm, this);
-	_rooms[MUS5] = new Mus5(_vm, this);
-	_rooms[MUS6] = new Mus6(_vm, this);
-	_rooms[MUS7] = new Mus7(_vm, this);
-	_rooms[MUS8] = new Mus8(_vm, this);
-	_rooms[MUS9] = new Mus9(_vm, this);
-	_rooms[MUS10] = new Mus10(_vm, this);
-	_rooms[MUS11] = new Mus11(_vm, this);
-	_rooms[MUS_ROUND] = new MusRound(_vm, this);
-	_rooms[MUS12] = new Mus12(_vm, this);
-	_rooms[MUS13] = new Mus13(_vm, this);
-	_rooms[MUS14] = new Mus14(_vm, this);
-	_rooms[MUS15] = new Mus15(_vm, this);
-	_rooms[MUS16] = new Mus16(_vm, this);
-	_rooms[MUS17] = new Mus17(_vm, this);
-	_rooms[MUS18] = new Mus18(_vm, this);
-	_rooms[MUS19] = new Mus19(_vm, this);
-	_rooms[MUS20] = new Mus20(_vm, this);
-	_rooms[MUS21] = new Mus21(_vm, this);
-	_rooms[MUS22] = new Mus22(_vm, this);
-}
-
-void GameManager::initGui() {
-	int cmdCount = ARRAYSIZE(_guiCommandButton);
-	int cmdAvailableSpace = 320 - (cmdCount - 1) * 2;
-	for (int i = 0; i < cmdCount; ++i) {
-		const Common::String &text = _vm->getGameString(guiCommands[i]);
-		cmdAvailableSpace -= Screen::textWidth(text);
-	}
-
-	int commandButtonX = 0;
-	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
-		const Common::String &text = _vm->getGameString(guiCommands[i]);
-		int width;
-		if (i < cmdCount - 1) {
-			int space = cmdAvailableSpace / (cmdCount - i);
-			cmdAvailableSpace -= space;
-			width = Screen::textWidth(text) + space;
-		} else
-			width = 320 - commandButtonX;
-
-		_guiCommandButton[i].setSize(commandButtonX, 150, commandButtonX + width, 159);
-		_guiCommandButton[i].setText(text.c_str());
-		_guiCommandButton[i].setColor(kColorWhite25, kColorDarkGreen, kColorWhite44, kColorGreen);
-		commandButtonX += width + 2;
-	}
-
-	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
-		int inventoryX = 136 * (i % 2);
-		int inventoryY = 161 + 10 * (i / 2);
-
-		_guiInventory[i].setSize(inventoryX, inventoryY, inventoryX + 135, inventoryY + 9);
-		_guiInventory[i].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
-	}
-	_guiInventoryArrow[0].setSize(272, 161, 279, 180);
-	_guiInventoryArrow[0].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
-	_guiInventoryArrow[0].setText("\x82");
-	_guiInventoryArrow[0].setTextPosition(273, 166);
-	_guiInventoryArrow[1].setSize(272, 181, 279, 200);
-	_guiInventoryArrow[1].setColor(kColorWhite25, kColorDarkRed, kColorWhite35, kColorRed);
-	_guiInventoryArrow[1].setText("\x83");
-	_guiInventoryArrow[1].setTextPosition(273, 186);
-}
-
-void GameManager::updateEvents() {
-	handleTime();
-	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
-		_currentRoom->animation();
-
-	if (_state._eventCallback != kNoFn && g_system->getMillis() >= _state._eventTime) {
-		_vm->_allowLoadGame = false;
-		_vm->_allowSaveGame = false;
-		_state._eventTime = kMaxTimerValue;
-		EventFunction fn = _state._eventCallback;
-		_state._eventCallback = kNoFn;
-		switch (fn) {
-		case kNoFn:
-			break;
-		case kSoberFn:
-			sober();
-			break;
-		case kPyramidEndFn:
-			pyramidEnd();
-			break;
-		case kCaughtFn:
-			caught();
-			break;
-		}
-		_vm->_allowLoadGame = true;
-		_vm->_allowSaveGame = true;
-		return;
-	}
-
-	_mouseClicked = false;
-	_keyPressed = false;
-	Common::Event event;
-	while (g_system->getEventManager()->pollEvent(event)) {
-		switch (event.type) {
-		case Common::EVENT_KEYDOWN:
-			_keyPressed = true;
-			processInput(event.kbd);
-			break;
-		case Common::EVENT_LBUTTONUP:
-			// fallthrough
-		case Common::EVENT_RBUTTONUP:
-			_mouseClicked = true;
-			// fallthrough
-		case Common::EVENT_MOUSEMOVE:
-			_mouseClickType = event.type;
-			_mouseX = event.mouse.x;
-			_mouseY = event.mouse.y;
-			if (_guiEnabled)
-				processInput();
-			break;
-		default:
-			break;
-		}
-	}
-}
-void GameManager::processInput(Common::KeyState &state) {
-	_key = state;
-
-	switch (state.keycode) {
-	case Common::KEYCODE_F1:
-		// help
-		break;
-	case Common::KEYCODE_F2:
-		// show game doc
-		break;
-	case Common::KEYCODE_F3:
-		// show game info
-		break;
-	case Common::KEYCODE_F4:
-		_vm->setTextSpeed();
-		break;
-	case Common::KEYCODE_F5:
-		// load/save
-		break;
-	case Common::KEYCODE_x:
-		if (state.flags & Common::KBD_ALT) {
-			if (_vm->quitGameDialog())
-				_vm->quitGame();
-		}
-		break;
-	case Common::KEYCODE_d:
-		if (state.flags & Common::KBD_CTRL)
-			_vm->_console->attach();
-		break;
-	default:
-		break;
-	}
-}
-
-void GameManager::resetInputState() {
-	setObjectNull(_inputObject[0]);
-	setObjectNull(_inputObject[1]);
-	_inputVerb = ACTION_WALK;
-	_processInput = false;
-	_mouseClicked = false;
-	_keyPressed = false;
-	_key.reset();
-	_mouseClickType = Common::EVENT_MOUSEMOVE;
-
-	processInput();
-}
-
-
-void GameManager::processInput() {
-	enum {
-		onNone,
-		onObject,
-		onCmdButton,
-		onInventory,
-		onInventoryArrowUp,
-		onInventoryArrowDown
-	} mouseLocation;
-
-	if (_mouseField >= 0 && _mouseField < 256)
-		mouseLocation = onObject;
-	else if (_mouseField >= 256 && _mouseField < 512)
-		mouseLocation = onCmdButton;
-	else if (_mouseField >= 512 && _mouseField < 768)
-		mouseLocation = onInventory;
-	else if (_mouseField == 768)
-		mouseLocation = onInventoryArrowUp;
-	else if (_mouseField == 769)
-		mouseLocation = onInventoryArrowDown;
-	else
-		mouseLocation = onNone;
-
-	if (_mouseClickType == Common::EVENT_LBUTTONUP) {
-		if (_vm->_screen->isMessageShown() && !_cracking) {
-			// Hide the message and consume the event
-			_vm->removeMessage();
-			if (mouseLocation != onCmdButton)
-				return;
-		}
-
-		switch(mouseLocation) {
-		case onObject:
-		case onInventory:
-			// Fallthrough
-			if (_inputVerb == ACTION_GIVE || _inputVerb == ACTION_USE) {
-				if (isNullObject(_inputObject[0])) {
-					_inputObject[0] = _currentInputObject;
-					if (!_inputObject[0]->hasProperty(COMBINABLE))
-						_processInput = true;
-				} else {
-					_inputObject[1] = _currentInputObject;
-					_processInput = true;
-				}
-			} else {
-				_inputObject[0] = _currentInputObject;
-				if (!isNullObject(_currentInputObject))
-					_processInput = true;
-			}
-			break;
-		case onCmdButton:
-			resetInputState();
-			_inputVerb = static_cast<Action>(_mouseField - 256);
-			break;
-		case onInventoryArrowUp:
-			if (_inventoryScroll >= 2)
-				_inventoryScroll -= 2;
-			break;
-		case onInventoryArrowDown:
-			if (_inventoryScroll < _inventory.getSize() - ARRAYSIZE(_guiInventory))
-				_inventoryScroll += 2;
-			break;
-		case onNone:
-			break;
-		}
-
-	} else if (_mouseClickType == Common::EVENT_RBUTTONUP) {
-		if (_vm->_screen->isMessageShown()) {
-			// Hide the message and consume the event
-			_vm->removeMessage();
-			return;
-		}
-
-		if (isNullObject(_currentInputObject))
-			return;
-
-		if (mouseLocation == onObject || mouseLocation == onInventory) {
-			_inputObject[0] = _currentInputObject;
-			ObjectTypes type = _inputObject[0]->_type;
-			if (type & OPENABLE)
-				_inputVerb = (type & OPENED) ? ACTION_CLOSE : ACTION_OPEN;
-			else if (type & PRESS)
-				_inputVerb = ACTION_PRESS;
-			else if (type & TALK)
-				_inputVerb = ACTION_TALK;
-			else
-				_inputVerb = ACTION_LOOK;
-
-			_processInput = true;
-		}
-
-	} else if (_mouseClickType == Common::EVENT_MOUSEMOVE) {
-		int field = -1;
-		int click = -1;
-
-		if ((_mouseY >= _guiCommandButton[0].top) && (_mouseY <= _guiCommandButton[0].bottom)) {
-			/* command row */
-			field = 9;
-			while (_mouseX < _guiCommandButton[field].left - 1)
-				field--;
-			field += 256;
-		} else if ((_mouseX >= 283) && (_mouseX <= 317) && (_mouseY >= 163) && (_mouseY <= 197)) {
-			/* exit box */
-			field = _exitList[(_mouseX - 283) / 7 + 5 * ((_mouseY - 163) / 7)];
-		} else if ((_mouseY >= 161) && (_mouseX <= 270)) {
-			/* inventory box */
-			field = (_mouseX + 1) / 136 + ((_mouseY - 161) / 10) * 2;
-			if (field + _inventoryScroll < _inventory.getSize())
-				field += 512;
-			else
-				field = -1;
-		} else if ((_mouseY >= 161) && (_mouseX >= 271) && (_mouseX < 279)) {
-			/* inventory arrows */
-			field = (_mouseY > 180) ? 769 : 768;
-		} else {
-			/* normal item */
-			for (int i = 0; (_currentRoom->getObject(i)->_id != INVALIDOBJECT) &&
-							(field == -1) && i < kMaxObject; i++) {
-				click = _currentRoom->getObject(i)->_click;
-				const MS2Image *image = _vm->_screen->getCurrentImage();
-				if (click != 255 && image) {
-					const MS2Image::ClickField *clickField = image->_clickField;
-					do {
-						if ((_mouseX >= clickField[click].x1) && (_mouseX <= clickField[click].x2) &&
-							(_mouseY >= clickField[click].y1) && (_mouseY <= clickField[click].y2))
-							field = i;
-
-						click = clickField[click].next;
-					} while ((click != 0) && (field == -1));
-				}
-			}
-		}
-
-		if (_mouseField != field) {
-			switch (mouseLocation) {
-			case onInventoryArrowUp:
-			case onInventoryArrowDown:
-				// Fallthrough
-				_guiInventoryArrow[_mouseField - 768].setHighlight(false);
-				break;
-			case onInventory:
-				_guiInventory[_mouseField - 512].setHighlight(false);
-				break;
-			case onCmdButton:
-				_guiCommandButton[_mouseField - 256].setHighlight(false);
-				break;
-			case onObject:
-			case onNone:
-				// Fallthrough
-				break;
-			}
-
-			setObjectNull(_currentInputObject);
-
-			_mouseField = field;
-			if (_mouseField >= 0 && _mouseField < 256)
-				mouseLocation = onObject;
-			else if (_mouseField >= 256 && _mouseField < 512)
-				mouseLocation = onCmdButton;
-			else if (_mouseField >= 512 && _mouseField < 768)
-				mouseLocation = onInventory;
-			else if (_mouseField == 768)
-				mouseLocation = onInventoryArrowUp;
-			else if (_mouseField == 769)
-				mouseLocation = onInventoryArrowDown;
-			else
-				mouseLocation = onNone;
-
-			switch (mouseLocation) {
-			case onInventoryArrowUp:
-			case onInventoryArrowDown:
-				// Fallthrough
-				_guiInventoryArrow[_mouseField - 768].setHighlight(true);
-				break;
-			case onInventory:
-				_guiInventory[_mouseField - 512].setHighlight(true);
-				_currentInputObject = _inventory.get(_mouseField - 512 + _inventoryScroll);
-				break;
-			case onCmdButton:
-				_guiCommandButton[_mouseField - 256].setHighlight(true);
-				break;
-			case onObject:
-				_currentInputObject = _currentRoom->getObject(_mouseField);
-				break;
-			case onNone:
-				break;
-			}
-		}
-	}
-}
-
-void GameManager::setObjectNull(Object *&obj) {
-	obj = &_nullObject;
-}
-
-bool GameManager::isNullObject(Object *obj) {
-	return obj == &_nullObject;
-}
-
-void GameManager::sentence(int number, bool brightness) {
-	if (number < 0)
-		return;
-	_vm->renderBox(0, 141 + _rowsStart[number] * 10, 320, _rows[number] * 10 - 1, brightness ? kColorWhite44 : kColorWhite25);
-	if (_texts[_rowsStart[number]] == kStringDialogSeparator)
-		_vm->renderText(kStringConversationEnd, 1, 142 + _rowsStart[number] * 10, brightness ? kColorRed : kColorDarkRed);
-	else {
-		for (int r = _rowsStart[number]; r < _rowsStart[number] + _rows[number]; ++r)
-			_vm->renderText(_texts[r], 1, 142 + r * 10, brightness ? kColorGreen : kColorDarkGreen);
-	}
-}
-
-void GameManager::say(StringId textId) {
-	Common::String str = _vm->getGameString(textId);
-	if (!str.empty())
-		say(str.c_str());
-}
-
-void GameManager::say(const char *text) {
-	Common::String t(text);
-	char *row[6];
-	Common::String::iterator p = t.begin();
-	uint numRows = 0;
-	while (*p) {
-		row[numRows++] = p;
-		while ((*p != '\0') && (*p != '|')) {
-			++p;
-		}
-		if (*p == '|') {
-			*p = 0;
-			++p;
-		}
-	}
-
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-	_vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
-	for (uint r = 0; r < numRows; ++r)
-		_vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
-	waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-}
-
-void GameManager::reply(StringId textId, int aus1, int aus2) {
-	Common::String str = _vm->getGameString(textId);
-	if (!str.empty())
-		reply(str.c_str(), aus1, aus2);
-}
-
-void GameManager::reply(const char *text, int aus1, int aus2) {
-	if (*text != '|')
-		_vm->renderMessage(text, kMessageTop);
-
-	for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
-		if (aus1)
-			_vm->renderImage(aus1);
-		waitOnInput(2);
-		if (_keyPressed || _mouseClicked)
-			z = 1;
-		if (aus2)
-			_vm->renderImage(aus2);
-		waitOnInput(2);
-		if (_keyPressed || _mouseClicked)
-			z = 1;
-	}
-	if (*text != '|')
-		_vm->removeMessage();
-}
-
-int GameManager::dialog(int num, byte rowLength[6], StringId text[6], int number) {
-	_vm->_allowLoadGame = false;
-	_guiEnabled = false;
-
-	bool remove[6];
-	for (int i = 0; i < 6; ++i)
-		remove[i] = _currentRoom->sentenceRemoved(i, number);
-
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-
-	for (int i = 0; i < 6 ; ++i)
-		_sentenceNumber[i] = -1;
-
-	int r = 0, rq = 0;
-	for (int i = 0; i < num; ++i) {
-		if (!remove[i]) {
-			_rowsStart[i] = r;
-			_rows[i] = rowLength[i];
-			for (int j = 0; j < _rows[i]; ++j, ++r, ++rq) {
-				_texts[r] = text[rq];
-				_sentenceNumber[r] = i;
-			}
-			sentence(i, false);
-		} else
-			rq += rowLength[i];
-	}
-
-	_currentSentence = -1;
-	do {
-		do {
-			updateEvents();
-			mousePosDialog(_mouseX, _mouseY);
-			g_system->updateScreen();
-			g_system->delayMillis(_vm->_delay);
-		} while (!_mouseClicked && !_vm->shouldQuit());
-	} while (_currentSentence == -1 && !_vm->shouldQuit());
-
-	_vm->renderBox(0, 138, 320, 62, kColorBlack);
-
-	if (number && _currentSentence != -1 && _texts[_rowsStart[_currentSentence]] != kStringDialogSeparator)
-		_currentRoom->removeSentence(_currentSentence, number);
-
-	_guiEnabled = true;
-	_vm->_allowLoadGame = true;
-
-	return _currentSentence;
-}
-
-void GameManager::mousePosDialog(int x, int y) {
-	int a = y < 141 ? -1 : _sentenceNumber[(y - 141) / 10];
-	if (a != _currentSentence) {
-		sentence(_currentSentence, false);
-		_currentSentence = a;
-		sentence(_currentSentence, true);
-	}
-}
-
-void GameManager::takeObject(Object &obj) {
-	if (obj.hasProperty(CARRIED))
-		return;
-
-	if (obj._section != 0)
-		_vm->renderImage(obj._section);
-	obj._click = obj._click2 = 255;
-	_inventory.add(obj);
-}
-
-void GameManager::drawCommandBox() {
-	for (int i = 0; i < ARRAYSIZE(_guiCommandButton); ++i) {
-		_vm->renderBox(_guiCommandButton[i]);
-		int space = (_guiCommandButton[i].width() - Screen::textWidth(_guiCommandButton[i].getText())) / 2;
-		_vm->renderText(_guiCommandButton[i].getText(),
-						_guiCommandButton[i].getTextPos().x + space,
-						_guiCommandButton[i].getTextPos().y,
-						_guiCommandButton[i].getTextColor());
-	}
-}
-
-void GameManager::drawInventory() {
-	for (int i = 0; i < ARRAYSIZE(_guiInventory); ++i) {
-		_vm->renderBox(_guiInventory[i]);
-		_vm->renderText(_inventory.get(i + _inventoryScroll)->_name,
-						_guiInventory[i].getTextPos().x,
-						_guiInventory[i].getTextPos().y,
-						_guiInventory[i].getTextColor());
-	}
-
-	_vm->renderBox(_guiInventoryArrow[0]);
-	_vm->renderBox(_guiInventoryArrow[1]);
-	if (_inventory.getSize() > ARRAYSIZE(_guiInventory)) {
-		if (_inventoryScroll != 0)
-			_vm->renderText(_guiInventoryArrow[0]);
-		if (_inventoryScroll + ARRAYSIZE(_guiInventory) < _inventory.getSize())
-			_vm->renderText(_guiInventoryArrow[1]);
-	}
-}
-
-uint16 GameManager::getKeyInput(bool blockForPrintChar) {
-	while (!_vm->shouldQuit()) {
-		updateEvents();
-		if (_keyPressed) {
-			if (blockForPrintChar) {
-				if (Common::isPrint(_key.keycode) ||
-					_key.keycode == Common::KEYCODE_BACKSPACE ||
-					_key.keycode == Common::KEYCODE_DELETE ||
-					_key.keycode == Common::KEYCODE_RETURN ||
-					_key.keycode == Common::KEYCODE_SPACE ||
-					_key.keycode == Common::KEYCODE_ESCAPE ||
-					_key.keycode == Common::KEYCODE_UP ||
-					_key.keycode == Common::KEYCODE_DOWN ||
-					_key.keycode == Common::KEYCODE_LEFT ||
-					_key.keycode == Common::KEYCODE_RIGHT) {
-					if (_key.flags & Common::KBD_SHIFT)
-						return toupper(_key.ascii);
-					else
-						return tolower(_key.ascii);
-				}
-			} else {
-				return _key.ascii;
-			}
-		}


Commit: eb2a017a68e965b46881a2b41d9178d5e20b05b2
    https://github.com/scummvm/scummvm/commit/eb2a017a68e965b46881a2b41d9178d5e20b05b2
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Generate new dat files for supernova.

Changed paths:
  A dists/engine-data/supernova2.dat
    dists/engine-data/supernova.dat


diff --git a/dists/engine-data/supernova.dat b/dists/engine-data/supernova.dat
index a3c798b..839b3b6 100644
Binary files a/dists/engine-data/supernova.dat and b/dists/engine-data/supernova.dat differ
diff --git a/dists/engine-data/supernova2.dat b/dists/engine-data/supernova2.dat
new file mode 100644
index 0000000..decb910
Binary files /dev/null and b/dists/engine-data/supernova2.dat differ


Commit: 3cf9cfbf78433e81ac5dcc39b31f5fa76983bde4
    https://github.com/scummvm/scummvm/commit/3cf9cfbf78433e81ac5dcc39b31f5fa76983bde4
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Merge in the supernova2 engine.

Changed paths:
  A engines/supernova/supernova1/stringid.h
  A engines/supernova/supernova2/rooms.cpp
  A engines/supernova/supernova2/rooms.h
  A engines/supernova/supernova2/state.cpp
  A engines/supernova/supernova2/state.h
  A engines/supernova/supernova2/stringid.h
    engines/supernova/detection.cpp
    engines/supernova/game-manager.cpp
    engines/supernova/game-manager.h
    engines/supernova/module.mk
    engines/supernova/msn_def.h
    engines/supernova/resman.cpp
    engines/supernova/resman.h
    engines/supernova/room.cpp
    engines/supernova/room.h
    engines/supernova/screen.cpp
    engines/supernova/screen.h
    engines/supernova/sound.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova1/rooms.h
    engines/supernova/supernova1/state.cpp
    engines/supernova/supernova1/state.h


diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 0dc210e..b68c44c 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -31,6 +31,7 @@
 
 static const PlainGameDescriptor supernovaGames[] = {
 	{"msn1", "Mission Supernova 1"},
+	{"msn2", "Mission Supernova 2"},
 	{nullptr, nullptr}
 };
 
@@ -55,6 +56,25 @@ static const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE,
 		GUIO1(GUIO_NONE)
 	},
+	// Mission Supernova 2
+	{
+		"msn2",
+		nullptr,
+		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
+		Common::DE_DEU,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GUIO_NONE)
+	},
+	{
+		"msn2",
+		nullptr,
+		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GUIO_NONE)
+	},
 	AD_TABLE_END_MARKER
 };
 }
@@ -114,7 +134,11 @@ bool SupernovaMetaEngine::createInstance(OSystem *syst, Engine **engine, const A
 
 SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
 	Common::StringArray filenames;
-	Common::String pattern("msn_save.###");
+	Common::String pattern;
+	if (!strcmp(target, "msn1"))
+		pattern = Common::String::format("msn_save.###");
+	if (!strcmp(target, "msn2"))
+		pattern = Common::String::format("ms2_save.###");
 
 	filenames = g_system->getSavefileManager()->listSavefiles(pattern);
 
@@ -126,7 +150,8 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
 			Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(*file);
 			if (savefile) {
 				uint saveHeader = savefile->readUint32LE();
-				if (saveHeader == SAVEGAME_HEADER) {
+				if ((saveHeader == SAVEGAME_HEADER && !strcmp(target, "msn1")) ||
+					(saveHeader == SAVEGAME_HEADER2 && !strcmp(target, "msn2"))) {
 					byte saveVersion = savefile->readByte();
 					if (saveVersion <= SAVEGAME_VERSION) {
 						int saveFileDescSize = savefile->readSint16LE();
@@ -146,17 +171,26 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
 }
 
 void SupernovaMetaEngine::removeSaveState(const char *target, int slot) const {
-	Common::String filename = Common::String::format("msn_save.%03d", slot);
+	Common::String filename;
+	if (!strcmp(target, "msn1"))
+		filename = Common::String::format("msn_save.%03d", slot);
+	if (!strcmp(target, "msn2"))
+		filename = Common::String::format("ms2_save.%03d", slot);
 	g_system->getSavefileManager()->removeSavefile(filename);
 }
 
 SaveStateDescriptor SupernovaMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
-	Common::String fileName = Common::String::format("msn_save.%03d", slot);
+	Common::String fileName;
+	if (!strcmp(target, "msn1"))
+		fileName = Common::String::format("msn_save.%03d", slot);
+	if (!strcmp(target, "msn2"))
+		fileName = Common::String::format("ms2_save.%03d", slot);
 	Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(fileName);
 
 	if (savefile) {
 		uint saveHeader = savefile->readUint32LE();
-		if (saveHeader != SAVEGAME_HEADER) {
+		if ((!strcmp(target, "msn1") && saveHeader != SAVEGAME_HEADER) || 
+			(!strcmp(target, "msn2") && saveHeader != SAVEGAME_HEADER2)) {
 			delete savefile;
 			return SaveStateDescriptor();
 		}
diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index 99d9215..6aae050 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -140,12 +140,12 @@ void GuiElement::setHighlight(bool isHighlighted_) {
 	}
 }
 
-StringId GameManager::guiCommands[] = {
+int GameManager::guiCommands[] = {
 	kStringCommandGo, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
 	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive
 };
 
-StringId GameManager::guiStatusCommands[] = {
+int GameManager::guiStatusCommands[] = {
 	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
 	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive
 };
@@ -480,7 +480,7 @@ void GameManager::sentence(int number, bool brightness) {
 	}
 }
 
-void GameManager::say(StringId textId) {
+void GameManager::say(int textId) {
 	Common::String str = _vm->getGameString(textId);
 	if (!str.empty())
 		say(str.c_str());
@@ -510,7 +510,7 @@ void GameManager::say(const char *text) {
 	_vm->renderBox(0, 138, 320, 62, kColorBlack);
 }
 
-void GameManager::reply(StringId textId, int aus1, int aus2) {
+void GameManager::reply(int textId, int aus1, int aus2) {
 	Common::String str = _vm->getGameString(textId);
 	if (!str.empty())
 		reply(str.c_str(), aus1, aus2);
@@ -536,7 +536,7 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
 		_vm->removeMessage();
 }
 
-int GameManager::dialog(int num, byte rowLength[6], StringId text[6], int number) {
+int GameManager::dialog(int num, byte rowLength[6], int text[6], int number) {
 	_vm->_allowLoadGame = false;
 	_guiEnabled = false;
 
@@ -769,9 +769,14 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 	bool isEditing = true;
 	uint cursorIndex = input.size();
 	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
-	int overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
-						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
+	int overdrawWidth;
 
+	if (_vm->_MSPart == 1)
+		overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
+						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
+	else if (_vm->_MSPart == 2)
+		overdrawWidth = ((int)((length + 1) * (kFontWidth2 + 2)) > (kScreenWidth - x)) 
+			? kScreenWidth - x : (length + 1) * (kFontWidth2 + 2);
 	_guiEnabled = false;
 	while (isEditing) {
 		_vm->_screen->setTextCursorPos(x, y);
@@ -788,10 +793,10 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 				_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1,
 							   Screen::textWidth(input[i]), 9, kColorWhite99);
 				_vm->_screen->setTextCursorColor(background);
-				_vm->renderText(input[i]);
+				_vm->renderText((uint16)input[i]);
 				_vm->_screen->setTextCursorColor(kColorWhite99);
 			} else
-				_vm->renderText(input[i]);
+				_vm->renderText((uint16)input[i]);
 		}
 
 		if (cursorIndex == input.size()) {
@@ -860,7 +865,7 @@ void GameManager::drawStatus() {
 	}
 }
 
-void GameManager::dead(StringId messageId) {
+void GameManager::dead(int messageId) {
 	_vm->paletteFadeOut();
 	_guiEnabled = false;
 	if (_vm->_MSPart == 1)
@@ -869,7 +874,10 @@ void GameManager::dead(StringId messageId) {
 		_vm->setCurrentImage(43);
 	_vm->renderImage(0);
 	_vm->renderMessage(messageId);
-	_sound->play(kAudioDeath);
+	if (_vm->_MSPart == 1)
+		_sound->play(kAudioDeath);
+	else if (_vm->_MSPart == 2)
+		_sound->play(kAudioDeath2);
 	_vm->paletteFadeIn();
 	getInput();
 	_vm->paletteFadeOut();
@@ -881,7 +889,7 @@ void GameManager::dead(StringId messageId) {
 	if (_vm->_MSPart == 1)
 		changeRoom(CABIN_R3);
 	else if (_vm->_MSPart == 2)
-		changeRoom(CABIN_R3);
+		changeRoom(AIRPORT);
 	initGui();
 	_inventory.clear();
 	g_system->fillScreen(kColorBlack);
diff --git a/engines/supernova/game-manager.h b/engines/supernova/game-manager.h
index 26c7a9e..5ee747f 100644
--- a/engines/supernova/game-manager.h
+++ b/engines/supernova/game-manager.h
@@ -111,8 +111,8 @@ public:
 	virtual bool serialize(Common::WriteStream *out);
 	virtual bool deserialize(Common::ReadStream *in, int version);
 
-	static StringId guiCommands[];
-	static StringId guiStatusCommands[];
+	static int guiCommands[];
+	static int guiStatusCommands[];
 	SupernovaEngine *_vm;
 	Sound *_sound;
 	Common::KeyState _key;
@@ -125,7 +125,7 @@ public:
 	Room *_currentRoom;
 	Room *_lastRoom;
 	bool _newRoom;
-	Room *_rooms[NUMROOMS];
+	Room **_rooms;
 	Inventory _inventory;
 	bool _processInput;
 	bool _guiEnabled;
@@ -148,7 +148,7 @@ public:
 	// Dialog
 	int _currentSentence;
 	int _sentenceNumber[6];
-	StringId _texts[6];
+	int _texts[6];
 	byte _rows[6];
 	byte _rowsStart[6];
 	int32 _time;
@@ -189,12 +189,12 @@ public:
 	virtual void loadTime();
 	virtual void saveTime();
 	void setAnimationTimer(int ticks);
-	void dead(StringId messageId);
-	int  dialog(int num, byte rowLength[6], StringId text[6], int number);
+	void dead(int messageId);
+	int  dialog(int num, byte rowLength[6], int text[6], int number);
 	void sentence(int number, bool brightness);
-	void say(StringId textId);
+	void say(int textId);
 	void say(const char *text);
-	void reply(StringId textId, int aus1, int aus2);
+	void reply(int textId, int aus1, int aus2);
 	void reply(const char *text, int aus1, int aus2);
 	void mousePosDialog(int x, int y);
 	virtual void takeMoney(int amount);
diff --git a/engines/supernova/module.mk b/engines/supernova/module.mk
index 2665af4..ae8a71a 100644
--- a/engines/supernova/module.mk
+++ b/engines/supernova/module.mk
@@ -7,10 +7,12 @@ MODULE_OBJS := \
 	resman.o \
 	room.o \
 	supernova1/rooms.o \
+	supernova2/rooms.o \
 	screen.o \
 	sound.o \
 	game-manager.o \
 	supernova1/state.o \
+	supernova2/state.o \
 	supernova.o
 
 MODULE_DIRS += \
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 5c3ee1f..eebffc3 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -32,7 +32,7 @@ const int kMsecPerTick = 55;
 
 const int kMaxSection = 40;
 const int kMaxDialog = 2;
-const int kMaxObject = 25;
+const int kMaxObject = 30;
 const int kMaxCarry = 30;
 
 const int kSleepAutosaveSlot = 999;
@@ -80,7 +80,8 @@ enum Action {
 };
 
 enum RoomId {
-	INTRO,CORRIDOR,HALL,SLEEP,COCKPIT,AIRLOCK,
+	// Supernova 1
+	INTRO1,CORRIDOR_ROOM,HALL,SLEEP,COCKPIT,AIRLOCK,
 	HOLD,LANDINGMODULE,GENERATOR,OUTSIDE,
 	CABIN_R1,CABIN_R2,CABIN_R3,CABIN_L1,CABIN_L2,CABIN_L3,BATHROOM,
 
@@ -88,12 +89,31 @@ enum RoomId {
 
 	CELL,CORRIDOR1,CORRIDOR2,CORRIDOR3,CORRIDOR4,CORRIDOR5,CORRIDOR6,CORRIDOR7,CORRIDOR8,CORRIDOR9,
 	BCORRIDOR,GUARD,GUARD3,OFFICE_L1,OFFICE_L2,OFFICE_R1,OFFICE_R2,OFFICE_L,
-	ELEVATOR,STATION,SIGN,OUTRO,NUMROOMS,NULLROOM
+	ELEVATOR,STATION,SIGN_ROOM,OUTRO,NUMROOMS1,
+
+	// Supernova 2
+	INTRO2 = 0,AIRPORT,TAXISTAND,STREET,GAMES,CABIN2,KIOSK,
+	CULTURE_PALACE,CHECKOUT,CITY1,CITY2,ELEVATOR2,APARTMENT,SHIP,
+
+	PYRAMID,PYR_ENTRANCE,UPSTAIRS1,DOWNSTAIRS1,
+	BOTTOM_RIGHT_DOOR,BOTTOM_LEFT_DOOR,UPSTAIRS2,DOWNSTAIRS2,
+	UPPER_DOOR,PUZZLE_FRONT,PUZZLE_BEHIND,
+	FORMULA1_F,FORMULA1_N,FORMULA2_F,FORMULA2_N,TOMATO_F,TOMATO_N,
+	MONSTER_F,MONSTER1_N,MONSTER2_N,UPSTAIRS3,DOWNSTAIRS3,
+	LCORRIDOR1,LCORRIDOR2,HOLE_ROOM,IN_HOLE,FLOORDOOR,FLOORDOOR_U,
+	BST_DOOR,HALL2,COFFIN_ROOM,MASK,
+
+	MUSEUM,MUS_ENTRANCE,MUS1,MUS2,MUS3,MUS4,MUS5,MUS6,MUS7,MUS8,
+	MUS9,MUS10,MUS11,MUS_ROUND,
+	MUS12,MUS13,MUS14,MUS15,MUS16,MUS17,MUS18,MUS19,MUS20,MUS21,MUS22,
+	NUMROOMS2,NULLROOM
 };
 
 enum ObjectId {
 	INVALIDOBJECT = -1,
 	NULLOBJECT = 0,
+
+	// Supernova 1
 	KEYCARD,KNIFE,WATCH,
 	SOCKET,
 	BUTTON,HATCH1,
@@ -132,7 +152,32 @@ enum ObjectId {
 	PILLAR1,PILLAR2,DOOR1,DOOR2,DOOR3,DOOR4,
 	GUARDIAN,LAMP,
 	MASTERKEYCARD,PAINTING,MONEY,LOCKER,LETTER,
-	JUNGLE,STATION_SLOT,STATION_SIGN
+	JUNGLE,STATION_SLOT,STATION_SIGN,
+
+
+	// Supernova2
+	TAXI,TRANSMITTER,ROD,OCCUPIED_CABIN,
+	SLOT1,CHAIR,CORRIDOR,G_RIGHT,G_LEFT,PYRA_ENTRANCE,
+	PART0,PART1,PART2,PART3,PART4,PART5,PART6,PART7,
+	PART8,PART9,PART10,PART11,PART12,PART13,PART14,PART15,
+	TKNIFE,NOTE,MOUTH,
+	HOLE1,HOLE2,HOLE3,HOLE4,HOLE5,HOLE6,HOLE7,HOLE8,HOLE9,HOLE10,
+	HOLE11,HOLE12,HOLE13,HOLE14,HOLE15,HOLE16,HOLE17,HOLE18,HOLE19,HOLE20,
+	HOLE21,HOLE22,HOLE23,HOLE24,HOLE25,SIGN,
+	SLOT,HOLE,STONES,
+	BST1,BST2,BST3,BST4,BST5,BST6,BST7,BST8,
+	BST9,BST10,BST11,BST12,BST13,BST14,BST15,BST16,
+	COFFIN,SUN,MONSTER,EYE,EYE1,EYE2,L_BALL,R_BALL,
+	PRIZE,REAR_STREET,
+	BMASK,BOTTLE,PLAYER,TOOTHBRUSH,BOOKS,LEXICON,PLANT,SNAKE,
+	JOYSTICK,BOTTLE1,BOTTLE2,BOTTLE3,BOTTLE4,BOX,FACES,
+	SELLER,POSTER,AXACUSSER,KP_ENTRANCE,CHIP,CARD,
+	SCRIBBLE1,SCRIBBLE2,BELL,KEYPAD,DOOR_L,DOOR_R,ID_CARD,
+	UNDER_BED,KEY,HATCH,CABINET,
+	SMALL_DOOR,BACK_MONEY,WALL,SUCTION_CUP,IMITATION,SP_KEYCARD,ALARM_CRACKER,
+	ENCRYPTED_DOOR,ALARM_SYSTEM,MUS_STREET,BIG_DOOR,MUSIC_SYSTEM,
+	HANDLE,SWITCH,DOOR_SWITCH,CABLE,RCABLE,
+	MUSCARD,HEAD, DISPLAY
 };
 
 enum StringId {
@@ -141,162 +186,7 @@ enum StringId {
 	kStringCommandGo = 0, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
 	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
 	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
-	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive,
-	kStringTitleVersion, kStringTitle1, kStringTitle2, kStringTitle3, kStringIntro1,
-	kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5, kStringIntro6,
-	kStringIntro7, kStringIntro8, kStringIntro9, kStringIntro10, kStringIntro11,
-	kStringIntro12, kStringIntro13, kStringBroken, kStringDefaultDescription, kStringTakeMessage,
-	kStringKeycard, kStringKeycardDescription, kStringKnife, kStringKnifeDescription, kStringWatch,
-	kStringDiscman, kStringDiscmanDescription, kStringHatch, kStringButton, kStringHatchButtonDescription,
-	// 50
-	kStringLadder, kStringExit, kStringCockpitHatchDescription, kStringKitchenHatchDescription, kStringStasisHatchDescription,
-	kStringStasisHatchDescription2, kStringSlot, kStringSlotDescription, kStringCorridor, kStringComputer,
-	kStringComputerPassword, kStringInstruments, kStringInstrumentsDescription1, kStringMonitor, kStringMonitorDescription,
-	kStringImage, kStringGenericDescription1, kStringGenericDescription2, kStringGenericDescription3, kStringGenericDescription4,
-	kStringMagnete, kStringMagneteDescription, kStringPen, kStringPenDescription, kStringShelf,
-	kStringCompartment, kStringSocket, kStringToilet, kStringPistol, kStringPistolDescription,
-	kStringBooks, kStringBooksDescription, kStringSpool, kStringSpoolDescription, kStringBook,
-	kStringUnderwear, kStringUnderwearDescription, kStringClothes, kStringJunk, kStringJunkDescription,
-	kStringFolders, kStringFoldersDescription, kStringPoster, kStringPosterDescription1, kStringPosterDescription2,
-	kStringSpeaker, kStringRecord, kStringRecordDescription, kStringRecordStand, kStringRecordStandDescription,
-	// 100
-	kStringTurntable, kStringTurntableDescription, kStringWire, kStringPlug, kStringImageDescription1,
-	kStringDrawingInstruments, kStringDrawingInstrumentsDescription, kStringChessGame, kStringChessGameDescription1, kStringTennisRacket,
-	kStringTennisRacketDescription, kStringTennisBall, kStringChessGameDescription2, kStringBed, kStringBedDescription,
-	kStringCompartmentDescription, kStringAlbums, kStringAlbumsDescription, kStringRope, kStringRopeDescription,
-	kStringShelfDescription, kStringClothesDescription, kStringSocks, kStringBookHitchhiker, kStringBathroom,
-	kStringBathroomDescription, kStringShower, kStringHatchDescription1, kStringHatchDescription2, kStringHelmet,
-	kStringHelmetDescription, kStringSuit, kStringSuitDescription, kStringLifeSupport, kStringLifeSupportDescription,
-	kStringScrap, kStringScrapDescription1, kStringTerminalStrip, kStringScrapDescription2, kStringReactor,
-	kStringReactorDescription, kStringNozzle, kStringPumpkin, kStringPumpkinDescription, kStringLandingModule,
-	kStringLandingModuleDescription, kStringHatchDescription3, kStringGenerator, kStringGeneratorDescription, kStringScrapDescription3,
-	// 150
-	kSafetyButtonDescription, kStringKeyboard, kStringGeneratorWire, kStringEmptySpool, kStringKeycard2,
-	kStringKeycard2Description, kStringTrap, kStringVoltmeter, kStringClip, kStringWireDescription,
-	kStringStone, kStringCaveOpening, kStringCaveOpeningDescription, kStringExitDescription, kStringCave,
-	kStringSign, kStringSignDescription, kStringEntrance, kStringStar, kStringSpaceshift,
-	kStringPorter, kStringPorterDescription, kStringDoor, kStringChewingGum, kStringGummyBears,
-	kStringChocolateBall, kStringEgg, kStringLiquorice, kStringPill, kStringPillDescription,
-	kStringVendingMachine, kStringVendingMachineDescription, kStringToiletDescription, kStringStaircase, kStringCoins,
-	kStringCoinsDescription, kStringTabletPackage, kStringTabletPackageDescription, kStringChair, kStringShoes,
-	kStringShoesDescription, kStringFrogFace, kStringScrible, kStringScribleDescription, kStringWallet,
-	kStringMenu, kStringMenuDescription, kStringCup, kStringCupDescription, kStringBill,
-	// 200
-	kStringBillDescription, kStringKeycard3, kStringAnnouncement, kStringAnnouncementDescription, kStringRoger,
-	kStringUfo, kStringUfoDescription, kStringTray, kStringTrayDescription, kStringLamp,
-	kStringLampDescription, kStringEyes, kStringEyesDescription, kStringSocketDescription, kStringMetalBlock,
-	kStringMetalBlockDescription, kStringRobot, kStringRobotDescription, kStringTable, kStringTableDescription,
-	kStringCellDoor, kStringCellDoorDescription, kStringLaptop, kStringWristwatch, kStringPillar,
-	kStringDoorDescription1, kStringDoorDescription2, kStringDoorDescription3, kStringDoorDescription4, kStringDontEnter,
-	kStringAxacussan, kStringAxacussanDescription, kStringImageDescription2, kStringMastercard, kStringMastercardDescription,
-	kStringLamp2, kStringGenericDescription5, kStringMoney, kStringMoneyDescription1, kStringLocker,
-	kStringLockerDescription, kStringLetter, kStringCube, kStringGenericDescription6, kStringGenericDescription7,
-	kStringStrangeThing, kStringGenericDescription8, kStringImageDescription3, kStringPlant, kStringStatue,
-	// 250
-	kStringStatueDescription, kStringPlantDescription, kStringComputerDescription, kStringGraffiti, kStringGraffitiDescription,
-	kStringMoneyDescription2, kStringJungle, kStringJungleDescription, kStringOutro1, kStringOutro2,
-	kStringOutro3, kStringOutro4, kStringOutro5, kStringOutro6, kStringOutro7,
-	kStringOutro8, kStringOutro9, kStringOutro10, kStringOutro11, kStringOutro12,
-	kStringOutro13, kStringOutro14, kStringWireAndPlug, kStringWireAndClip, kStringWireAndPlug2,
-	// 275
-	kStringSignDescription2, kStringCoin, kStringDoorDescription5, kStringDoorDescription6, kStringKeycard2Description2,
-	kSringSpoolAndClip, kStringIntroCutscene1, kStringIntroCutscene2, kStringIntroCutscene3, kStringIntroCutscene4,
-	kStringIntroCutscene5, kStringIntroCutscene6, kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9,
-	kStringIntroCutscene10, kStringIntroCutscene11, kStringIntroCutscene12, kStringIntroCutscene13, kStringIntroCutscene14,
-	kStringIntroCutscene15, kStringIntroCutscene16, kStringIntroCutscene17, kStringIntroCutscene18, kStringIntroCutscene19,
-	// 300
-	kStringIntroCutscene20, kStringIntroCutscene21, kStringIntroCutscene22, kStringIntroCutscene23, kStringIntroCutscene24,
-	kStringIntroCutscene25, kStringIntroCutscene26, kStringIntroCutscene27, kStringIntroCutscene28, kStringIntroCutscene29,
-	kStringIntroCutscene30, kStringIntroCutscene31, kStringIntroCutscene32, kStringIntroCutscene33, kStringIntroCutscene34,
-	kStringIntroCutscene35, kStringIntroCutscene36, kStringIntroCutscene37, kStringIntroCutscene38, kStringIntroCutscene39,
-	kStringIntroCutscene40, kStringIntroCutscene41, kStringIntroCutscene42, kStringShipHall1,       kStringShipSleepCabin1,
-	//325
-	kStringShipSleepCabin2,  kStringShipSleepCabin3,  kStringShipSleepCabin4,  kStringShipSleepCabin5,  kStringShipSleepCabin6,
-	kStringShipSleepCabin7,  kStringShipSleepCabin8,  kStringShipSleepCabin9,  kStringShipSleepCabin10, kStringShipSleepCabin11,
-	kStringShipSleepCabin12, kStringShipSleepCabin13, kStringShipSleepCabin14, kStringShipSleepCabin15, kStringShipSleepCabin16,
-	kStringShipCockpit1, kStringShipCockpit2, kStringShipCockpit3, kStringShipCockpit4, kStringShipCockpit5,
-	kStringShipCockpit6, kStringShipCockpit7, kStringShipCockpit8, kStringShipCockpit9, kStringShipCockpit10,
-	// 350
-	kStringShipCockpit11, kStringShipCockpit12, kStringShipCockpit13, kStringShipCabinL3_1, kStringShipCabinL3_2,
-	kStringShipCabinL3_3, kStringShipCabinL3_4, kStringShipCabinL3_5, kStringShipAirlock1, kStringShipAirlock2,
-	kStringShipAirlock3, kStringShipAirlock4, kStringShipHold1, kStringCable1, kStringCable2,
-	kStringCable3, kStringCable4, kStringShipHold2, kStringShipHold3, kStringShipHold4,
-	kStringShipHold5, kStringShipHold6, kStringShipHold7, kStringShipHold8, kStringShipHold9,
-	// 375
-	kStringShipHold10, kStringShipHold11, kStringShipHold12, kStringShipHold13, kStringShipHold14,
-	kStringShipHold15, kStringShipHold16, kStringArsanoMeetup1, kStringArsanoMeetup2, kStringArsanoMeetup3,
-	kStringArsanoEntrance1, kStringArsanoEntrance2, kStringArsanoEntrance3, kStringArsanoEntrance4, kStringArsanoEntrance5,
-	kStringArsanoEntrance6, kStringArsanoEntrance7, kStringArsanoEntrance8, kStringArsanoEntrance9, kStringArsanoEntrance10,
-	kStringArsanoEntrance11, kStringArsanoEntrance12, kStringArsanoEntrance13, kStringArsanoEntrance14, kStringArsanoEntrance15,
-	// 400
-	kStringArsanoEntrance16, kStringArsanoEntrance17, kStringArsanoEntrance18, kStringArsanoEntrance19, kStringArsanoEntrance20,
-	kStringArsanoEntrance21, kStringArsanoEntrance22, kStringArsanoEntrance23, kStringArsanoEntrance24, kStringArsanoEntrance25,
-	kStringArsanoEntrance26, kStringArsanoEntrance27, kStringArsanoDialog1, kStringArsanoDialog2, kStringArsanoDialog3,
-	kStringArsanoDialog4, kStringArsanoDialog5, kStringArsanoDialog6, kStringArsanoDialog7, kStringArsanoDialog8,
-	kStringArsanoDialog9, kStringDialogSeparator, kStringDialogArsanoRoger1, kStringDialogArsanoRoger2, kStringDialogArsanoRoger3,
-	// 425
-	kStringDialogArsanoMeetup3_1, kStringDialogArsanoMeetup3_2, kStringDialogArsanoMeetup3_3, kStringDialogArsanoMeetup3_4, kStringDialogArsanoMeetup3_5,
-	kStringArsanoRoger1, kStringArsanoRoger2, kStringArsanoRoger3, kStringArsanoRoger4, kStringArsanoRoger5,
-	kStringArsanoRoger6, kStringArsanoRoger7, kStringArsanoRoger8, kStringArsanoRoger9, kStringArsanoRoger10,
-	kStringArsanoRoger11, kStringArsanoRoger12, kStringArsanoRoger13, kStringArsanoRoger14, kStringArsanoRoger15,
-	kStringArsanoRoger16, kStringArsanoRoger17, kStringArsanoRoger18, kStringArsanoRoger19, kStringArsanoRoger20,
-	// 450
-	kStringArsanoRoger21, kStringArsanoRoger22, kStringArsanoRoger23, kStringArsanoRoger24, kStringArsanoRoger25,
-	kStringArsanoRoger26, kStringArsanoRoger27, kStringArsanoRoger28, kStringArsanoRoger29, kStringArsanoRoger30,
-	kStringArsanoRoger31, kStringArsanoRoger32, kStringArsanoRoger33, kStringArsanoRoger34, kStringArsanoRoger35,
-	kStringArsanoRoger36, kStringArsanoRoger37, kStringArsanoRoger38, kStringArsanoRoger39, kStringArsanoRoger40,
-	kStringArsanoGlider1, kStringArsanoMeetup2_1, kStringArsanoMeetup2_2, kStringArsanoMeetup2_3, kStringArsanoMeetup2_4,
-	// 475
-	kStringArsanoMeetup2_5, kStringArsanoMeetup2_6, kStringArsanoMeetup2_7, kStringArsanoMeetup2_8, kStringArsanoMeetup2_9,
-	kStringArsanoMeetup2_10, kStringArsanoMeetup2_11, kStringArsanoMeetup2_12, kStringArsanoMeetup2_13, kStringArsanoMeetup3_1,
-	kStringArsanoMeetup3_2, kStringArsanoMeetup3_3, kStringArsanoMeetup3_4, kStringArsanoMeetup3_5, kStringArsanoMeetup3_6,
-	kStringArsanoMeetup3_7, kStringArsanoMeetup3_8, kStringArsanoMeetup3_9, kStringArsanoMeetup3_10, kStringArsanoMeetup3_11,
-	kStringArsanoMeetup3_12, kStringArsanoMeetup3_13, kStringArsanoMeetup3_14, kStringArsanoMeetup3_15, kStringArsanoMeetup3_16,
-	// 500
-	kStringArsanoMeetup3_17, kStringArsanoMeetup3_18, kStringArsanoMeetup3_19, kStringArsanoMeetup3_20, kStringArsanoMeetup3_21,
-	kStringArsanoMeetup3_22, kStringArsanoMeetup3_23, kStringArsanoMeetup3_24, kStringArsanoMeetup3_25, kStringArsanoMeetup3_26,
-	kStringArsanoMeetup3_27, kStringArsanoMeetup3_28, kStringAxacussCell_1, kStringAxacussCell_2, kStringAxacussCell_3,
-	kStringAxacussCell_4, kStringAxacussCell_5, kStringOk, kStringDialogArsanoMeetup2_1, kStringDialogArsanoMeetup2_2,
-	kStringDialogArsanoMeetup2_3, kStringDialogArsanoMeetup2_4, kStringDialogArsanoMeetup2_5, kStringDialogArsanoMeetup2_6, kStringDialogArsanoMeetup2_7,
-	// 525
-	kStringDialogArsanoMeetup2_8, kStringDialogArsanoMeetup2_9, kStringDialogArsanoMeetup2_10, kStringDialogArsanoMeetup2_11, kStringDialogAxacussCorridor5_1,
-	kStringDialogAxacussCorridor5_2, kStringDialogAxacussCorridor5_3, kStringDialogAxacussCorridor5_4, kStringDialogAxacussCorridor5_5, kStringDialogAxacussCorridor5_6,
-	kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3, kStringAxacussCorridor5_1,
-	kStringAxacussCorridor5_2, kStringAxacussCorridor5_3, kStringAxacussCorridor5_4, kStringAxacussCorridor5_5, kStringAxacussCorridor5_6,
-	kStringAxacussCorridor5_7, kStringAxacussBcorridor_1, kStringAxacussOffice1_1, kStringAxacussOffice1_2, kStringAxacussOffice1_3,
-	// 550
-	kStringAxacussOffice1_4, kStringAxacussOffice1_5, kStringAxacussOffice1_6, kStringAxacussOffice1_7, kStringAxacussOffice1_8,
-	kStringAxacussOffice1_9, kStringAxacussOffice1_10, kStringAxacussOffice1_11, kStringAxacussOffice1_12, kStringAxacussOffice1_13,
-	kStringAxacussOffice1_14, kStringAxacussOffice1_15, kStringAxacussOffice1_16, kStringAxacussOffice3_1, kStringAxacussElevator_1,
-	kStringAxacussElevator_2, kStringAxacussElevator_3, kStringShock, kStringShot, kStringCloseLocker_1,
-	kStringIsHelmetOff_1, kStringGenericInteract_1, kStringGenericInteract_2, kStringGenericInteract_3, kStringGenericInteract_4,
-	// 575
-	kStringGenericInteract_5, kStringGenericInteract_6, kStringGenericInteract_7, kStringGenericInteract_8, kStringGenericInteract_9,
-	kStringGenericInteract_10, kStringGenericInteract_11, kStringGenericInteract_12, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith,
-	kStringGenericInteract_13, kStringGenericInteract_14, kStringGenericInteract_15, kStringGenericInteract_16, kStringGenericInteract_17,
-	kStringGenericInteract_18, kStringGenericInteract_19, kStringGenericInteract_20, kStringGenericInteract_21, kStringGenericInteract_22,
-	kStringGenericInteract_23, kStringGenericInteract_24, kStringGenericInteract_25, kStringGenericInteract_26, kStringGenericInteract_27,
-	// 600
-	kStringGenericInteract_28, kStringGenericInteract_29, kStringGenericInteract_30, kStringGenericInteract_31, kStringGenericInteract_32,
-	kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35, kStringGenericInteract_36, kStringGenericInteract_37,
-	kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40, kStringGenericInteract_41, kStringGenericInteract_42,
-	kStringGenericInteract_43, kStringConversationEnd, kStringSupernova1, kStringSupernova2, kStringSupernova3,
-	kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8,
-	// 625
-	kStringTextSpeed, kStringGuardNoticed1, kStringGuardNoticed2, kStringTelomat1, kStringTelomat2,
-	kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
-	kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
-	kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
-	kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm,
-	// 650
-	kStringLeaveGame, kStringYes, kStringNo, kStringHelpOverview1, kStringHelpOverview2,
-	kStringHelpOverview3, kStringHelpOverview4, kStringHelpOverview5, kStringHelpOverview6, kStringHelpOverview7,
-
-	// Add two placeholder strings at the end for variable text
-	kStringPlaceholder1, kStringPlaceholder2,
-
-	// String for money in inventory
-	kStringInventoryMoney
+	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kStringDefaultDescription, kStringDialogSeparator, kStringConversationEnd
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
@@ -319,7 +209,7 @@ struct Object {
 		, _exitRoom(NULLROOM)
 		, _direction(0)
 	{}
-	Object(byte roomId, StringId name, StringId description, ObjectId id, ObjectType type,
+	Object(byte roomId, int name, int description, ObjectId id, ObjectType type,
 		   byte click, byte click2, byte section = 0, RoomId exitRoom = NULLROOM, byte direction = 0)
 		: _name(name)
 		, _description(description)
@@ -358,8 +248,8 @@ struct Object {
 	}
 
 	byte _roomId;
-	StringId _name;
-	StringId _description;
+	int _name;
+	int _description;
 	ObjectId _id;
 	ObjectTypes _type;
 	byte _click;
diff --git a/engines/supernova/resman.cpp b/engines/supernova/resman.cpp
index f2b9f31..9b89b10 100644
--- a/engines/supernova/resman.cpp
+++ b/engines/supernova/resman.cpp
@@ -44,7 +44,8 @@ struct AudioInfo {
 
 static Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
 
-static const AudioInfo audioInfo[kAudioNumSamples] = {
+static const AudioInfo audioInfo[] = {
+	// Supernova 1
 	{44,     0,    -1},
 	{45,     0,    -1},
 	{46,     0,  2510},
@@ -64,7 +65,29 @@ static const AudioInfo audioInfo[kAudioNumSamples] = {
 	{54,  8010, 24020},
 	{54, 24020, 30030},
 	{54, 30030, 31040},
-	{54, 31040,    -1}
+	{54, 31040,    -1},
+
+	{0 ,     0,     0},
+	// Supernova 2
+	{55,     18230,    -1},
+	{47,     0,     16010},
+	{47,     16010, 17020},
+	{49,     8010,     -1},
+	{49,     0,      8010},
+	{53,     30020,    -1},
+	{55,     7010,  17020},
+	{55,     0,      7010},
+	{53,     5010,  30020},
+	{55,     18230,    -1},
+	{55,     17020, 18230},
+	{53,     0,      5010},
+	{47,     17020,    -1},
+	{51,     9020,     -1},
+	{51,     0,      6010},
+	{50,     0,        -1},
+	{51,     6010,   9020},
+	{54,     0,        -1},
+	{48,     0,        -1}
 };
 
 static const byte mouseNormal[64] = {
@@ -95,16 +118,25 @@ static const byte mouseWait[64] = {
 ResourceManager::ResourceManager(int MSPart)
 	: _audioRate(11931)
 	, _MSPart(MSPart) {
-	initSoundFiles();
+	if (MSPart == 1)
+		initSoundFiles1();
+	else if (MSPart == 2)
+		initSoundFiles2();
 	initGraphics();
 }
 
 ResourceManager::~ResourceManager() {
-	for (int i = 0; i < kNumImageFiles; i++)
-		delete _images[i];
+	if (_MSPart == 1) {	
+		for (int i = 0; i < 44; i++)
+			delete _images[i];
+	}
+	if (_MSPart == 2) {	
+		for (int i = 0; i < 47; i++)
+			delete _images[i];
+	}
 }
 
-void ResourceManager::initSoundFiles() {
+void ResourceManager::initSoundFiles1() {
 	// Sound
 	// Note:
 	//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
@@ -113,7 +145,7 @@ void ResourceManager::initSoundFiles() {
 	// Skip those in the buffer
 	Common::File file;
 
-	for (int i = 0; i < kAudioNumSamples; ++i) {
+	for (int i = 0; i < kAudioNumSamples1; ++i) {
 		if (!file.open(Common::String::format("msn_data.%03d", audioInfo[i]._filenumber))) {
 			error("File %s could not be read!", file.getName());
 		}
@@ -141,10 +173,51 @@ void ResourceManager::initSoundFiles() {
 	_musicOutroBuffer.reset(convertToMod("msn_data.049"));
 }
 
+void ResourceManager::initSoundFiles2() {
+	// Sound
+	// Note:
+	//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
+	//     where SS SS (LE uint16) is the size of the sound sample + 2
+	//   - samples end with a footer of 4 bytes: 00 00
+	// Skip those in the buffer
+	Common::File file;
+
+	for (int i = 0; i < kAudioNumSamples2 - kAudioNumSamples1 - 1; ++i) {
+		if (!file.open(Common::String::format("ms2_data.%03d", audioInfo[i + kAudioNumSamples1 + 1]._filenumber))) {
+			error("File %s could not be read!", file.getName());
+		}
+
+		int length = 0;
+		byte *buffer = nullptr;
+
+		if (audioInfo[i + kAudioNumSamples1 + 1]._offsetEnd == -1) {
+			file.seek(0, SEEK_END);
+			length = file.pos() - audioInfo[i + kAudioNumSamples1 + 1]._offsetStart - 10;
+		} else {
+			length = audioInfo[i + kAudioNumSamples1 + 1]._offsetEnd - audioInfo[i + kAudioNumSamples1 + 1]._offsetStart - 10;
+		}
+		buffer = new byte[length];
+		file.seek(audioInfo[i + kAudioNumSamples1 + 1]._offsetStart + 6);
+		file.read(buffer, length);
+		file.close();
+
+		byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
+		_soundSamples[i].reset(Audio::makeRawStream(buffer, length, _audioRate,
+													streamFlag, DisposeAfterUse::YES));
+	}
+	initSiren();
+
+	_musicIntroBuffer.reset(convertToMod("ms2_data.052", 2));
+	_musicMadMonkeysBuffer.reset(convertToMod("ms2_data.056", 2));
+}
+
 void ResourceManager::initGraphics() {
 	Screen::initPalette();
 	initCursorGraphics();
-	initImages();
+	if (_MSPart == 1)
+		initImages1();
+	else if (_MSPart == 2)
+		initImages2();
 }
 
 void ResourceManager::initCursorGraphics() {
@@ -168,7 +241,7 @@ void ResourceManager::initCursorGraphics() {
 	}
 }
 
-void ResourceManager::initImages() {
+void ResourceManager::initImages1() {
 	for (int i = 0; i < 44; ++i) {
 		_images[i] = new MSNImage(_MSPart);
 		if (!_images[i]->init(i))
@@ -179,8 +252,20 @@ void ResourceManager::initImages() {
 			error("Failed reading image file msn_data.055");
 }
 
+void ResourceManager::initImages2() {
+	for (int i = 0; i < 47; ++i) {
+		_images[i] = new MSNImage(_MSPart);
+		if (!_images[i]->init(i))
+			error("Failed reading image file ms2_data.%03d", i);
+	}
+}
+
 Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
-	Audio::SeekableAudioStream *stream = _soundSamples[index].get();
+	Audio::SeekableAudioStream *stream;
+	if (_MSPart == 1)
+		stream = _soundSamples[index].get();
+	else if (_MSPart == 2)
+		stream = _soundSamples[index - kAudioNumSamples1 - 1].get();
 	stream->rewind();
 
 	return stream;
@@ -207,12 +292,20 @@ Audio::AudioStream *ResourceManager::getSirenStream() {
 }
 
 MSNImage *ResourceManager::getImage(int filenumber) {
-	if (filenumber < 44)
-		return _images[filenumber];
-	else if (filenumber == 55)
-		return _images[44];
-	else
-		return nullptr;
+	if (_MSPart == 1) {
+		if (filenumber < 44)
+			return _images[filenumber];
+		else if (filenumber == 55)
+			return _images[44];
+		else
+			return nullptr;
+	} else if (_MSPart == 2) {
+		if (filenumber < 47)
+			return _images[filenumber];
+		else
+			return nullptr;
+	}
+	else return nullptr;
 }
 
 const byte *ResourceManager::getImage(CursorId id) const {
diff --git a/engines/supernova/resman.h b/engines/supernova/resman.h
index 194b798..9cbf83a 100644
--- a/engines/supernova/resman.h
+++ b/engines/supernova/resman.h
@@ -45,7 +45,7 @@ public:
 	};
 
 public:
-	static const int kNumImageFiles = 45;
+	static const int kNumImageFiles = 47;
 
 public:
 	ResourceManager(int MSPart);
@@ -60,15 +60,17 @@ public:
 	int getAudioRate();
 
 private:
-	void initSoundFiles();
+	void initSoundFiles1();
+	void initSoundFiles2();
 	void initGraphics();
 	void initCursorGraphics();
-	void initImages();
+	void initImages1();
+	void initImages2();
 	void initSiren();
 	byte *generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table);
 
 private:
-	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples];
+	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples1];
 	Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer;
diff --git a/engines/supernova/room.cpp b/engines/supernova/room.cpp
index 5ac00f15..487aeee 100644
--- a/engines/supernova/room.cpp
+++ b/engines/supernova/room.cpp
@@ -35,7 +35,6 @@ Room::Room() {
 	_fileNumber = 0;
 	_id = NULLROOM;
 	_vm = nullptr;
-	_gm = nullptr;
 
 	for (int i = 0; i < kMaxSection; ++i)
 		_shown[i] = kShownFalse;
@@ -96,8 +95,8 @@ bool Room::deserialize(Common::ReadStream *in, int version) {
 
 	int numObjects = in->readSint32LE();
 	for (int i = 0; i < numObjects; ++i) {
-		_objectState[i]._name = static_cast<StringId>(in->readSint32LE());
-		_objectState[i]._description = static_cast<StringId>(in->readSint32LE());
+		_objectState[i]._name = in->readSint32LE();
+		_objectState[i]._description = in->readSint32LE();
 		_objectState[i]._roomId = in->readByte();
 		_objectState[i]._id = static_cast<ObjectId>(in->readSint32LE());
 		_objectState[i]._type = static_cast<ObjectType>(in->readSint32LE());
diff --git a/engines/supernova/room.h b/engines/supernova/room.h
index 38d80ab..c784758 100644
--- a/engines/supernova/room.h
+++ b/engines/supernova/room.h
@@ -64,12 +64,11 @@ public:
 
 protected:
 	int _fileNumber;
-	bool _shown[kMaxSection];
+	char _shown[kMaxSection];
 	byte _sentenceRemoved[kMaxDialog];
 	Object _objectState[kMaxObject];
 	RoomId _id;
 	SupernovaEngine *_vm;
-	GameManager1 *_gm;
 
 private:
 	bool _seen;
diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index 5a89b40..5cdbb4c 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -263,7 +263,7 @@ void Screen::setTextCursorColor(byte color) {
 	_textColor = color;
 }
 
-void Screen::renderMessage(StringId stringId, MessagePosition position,
+void Screen::renderMessage(int stringId, MessagePosition position,
 						   Common::String var1, Common::String var2) {
 	Common::String text = _vm->getGameString(stringId);
 
@@ -293,7 +293,7 @@ void Screen::renderText(const char *text) {
 	renderText(text, _textCursorX, _textCursorY, _textColor);
 }
 
-void Screen::renderText(StringId stringId) {
+void Screen::renderText(int stringId) {
 	renderText(_vm->getGameString(stringId));
 }
 
@@ -357,7 +357,7 @@ void Screen::renderText(const Common::String &text, int x, int y, byte color) {
 		renderText(text.c_str(), x, y, color);
 }
 
-void Screen::renderText(StringId stringId, int x, int y, byte color) {
+void Screen::renderText(int stringId, int x, int y, byte color) {
 	renderText(_vm->getGameString(stringId), x, y, color);
 }
 
@@ -458,7 +458,7 @@ void Screen::restoreScreen() {
 }
 
 void Screen::renderRoom(Room &room) {
-	if (room.getId() == INTRO)
+	if (room.getId() == INTRO1 || room.getId() == INTRO2)
 		return;
 
 	if (setCurrentImage(room.getFileNumber())) {
diff --git a/engines/supernova/screen.h b/engines/supernova/screen.h
index dc5aa4d..0779973 100644
--- a/engines/supernova/screen.h
+++ b/engines/supernova/screen.h
@@ -44,6 +44,7 @@ class Screen;
 const int kScreenWidth  = 320;
 const int kScreenHeight = 200;
 const int kFontWidth = 5;
+const int kFontWidth2 = 4;
 const int kFontHeight = 8;
 
 enum Color {
@@ -158,17 +159,17 @@ public:
 	void renderRoom(Room &room);
 	void renderMessage(const char *text, MessagePosition position = kMessageNormal, int positionX = -1, int positionY = -1);
 	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
-	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
+	void renderMessage(int stringId, MessagePosition position = kMessageNormal,
 					   Common::String var1 = "", Common::String var2 = "");
 	void removeMessage();
 	void renderText(const uint16 character);
 	void renderText(const char *text);
 	void renderText(const Common::String &text);
-	void renderText(StringId stringId);
+	void renderText(int stringId);
 	void renderText(const uint16 character, int x, int y, byte color);
 	void renderText(const char *text, int x, int y, byte color);
 	void renderText(const Common::String &text, int x, int y, byte color);
-	void renderText(StringId stringId, int x, int y, byte color);
+	void renderText(int stringId, int x, int y, byte color);
 	void renderText(const GuiElement &guiElement);
 	void renderBox(int x, int y, int width, int height, byte color);
 	void renderBox(const GuiElement &guiElement);
diff --git a/engines/supernova/sound.h b/engines/supernova/sound.h
index bfea019..c0ca635 100644
--- a/engines/supernova/sound.h
+++ b/engines/supernova/sound.h
@@ -31,6 +31,7 @@ class SupernovaEngine;
 class ResourceManager;
 
 enum AudioId {
+	// Supernova 1
 	kAudioFoundLocation,        // 44|0
 	kAudioCrash,                // 45|0
 	kAudioVoiceHalt,            // 46|0
@@ -51,11 +52,34 @@ enum AudioId {
 	kAudioSlideDoor,            // 54|24020
 	kAudioDoorOpen,             // 54|30030
 	kAudioDoorClose,            // 54|31040
-	kAudioNumSamples
+	kAudioNumSamples1,
+
+	// Supernova 2
+	kAudioIntroDing,
+	kAudioSuccess2,
+	kAudioTaxiOpen,
+	kAudioTaxiLeaving,
+	kAudioTaxiArriving,
+	kAudioKiosk,
+	kAudioStage1,
+	kAudioStage2,
+	kAudioAppearance1,
+	kAudioAppearance2,
+	kAudioAppearance3,
+	kAudioElevatorBell,
+	kAudioElevator1,
+	kAudioShip1,
+	kAudioShip2,
+	kAudioShip3,
+	kAudioShipDeath,
+	kAudioDeath2,
+	kAudioCaught,
+	kAudioNumSamples2
 };
 
 enum MusicId {
 	kMusicIntro = 49,
+	kMusicIntro2 = 52,
 	kMusicOutro = 52,
 	kMusicMadMonkeys = 51
 };
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 9c7cdde..4ff5434 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -46,6 +46,7 @@
 #include "supernova/sound.h"
 #include "supernova/supernova.h"
 #include "supernova/supernova1/state.h"
+#include "supernova/supernova2/state.h"
 #include "supernova/game-manager.h"
 
 namespace Supernova {
@@ -142,9 +143,11 @@ void SupernovaEngine::init() {
 
 	_resMan = new ResourceManager(_MSPart);
 	_sound = new Sound(_mixer, _resMan);
+	_screen = new Screen(this, _resMan);
 	if (_MSPart == 1)
 		_gm = new GameManager1(this, _sound);
-	_screen = new Screen(this, _resMan);
+	else if (_MSPart == 2)
+		_gm = new GameManager2(this, _sound);
 	_console = new Console(this, _gm);
 
 	setTotalPlayTime(0);
@@ -320,12 +323,12 @@ void SupernovaEngine::renderMessage(const Common::String &text, MessagePosition
 	_screen->renderMessage(text, position);
 }
 
-void SupernovaEngine::renderMessage(StringId stringId, MessagePosition position, Common::String var1, Common::String var2) {
+void SupernovaEngine::renderMessage(int stringId, MessagePosition position, Common::String var1, Common::String var2) {
 	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
 	_screen->renderMessage(stringId, position, var1, var2);
 }
 
-void SupernovaEngine::renderMessage(StringId stringId, int x, int y) {
+void SupernovaEngine::renderMessage(int stringId, int x, int y) {
 	_gm->_messageDuration = (getGameString(stringId).size() + 20) * _textSpeed / 10;
 	_screen->renderMessage(getGameString(stringId).c_str(), kMessageNormal, x, y);
 }
@@ -346,7 +349,7 @@ void SupernovaEngine::renderText(const Common::String &text) {
 	_screen->renderText(text);
 }
 
-void SupernovaEngine::renderText(StringId stringId) {
+void SupernovaEngine::renderText(int stringId) {
 	_screen->renderText(stringId);
 }
 
@@ -366,7 +369,7 @@ void SupernovaEngine::renderText(const Common::String &text, int x, int y, byte
 	_screen->renderText(text, x, y, color);
 }
 
-void SupernovaEngine::renderText(StringId stringId, int x, int y, byte color) {
+void SupernovaEngine::renderText(int stringId, int x, int y, byte color) {
 	_screen->renderText(stringId, x, y, color);
 }
 
@@ -688,7 +691,7 @@ bool SupernovaEngine::loadGame(int slot) {
 
 	byte saveVersion = savefile->readByte();
 	// Save version 1 was used during development and is no longer supported
-	if (saveVersion > SAVEGAME_VERSION || saveVersion == 1) {
+	if (saveVersion > SAVEGAME_VERSION || saveVersion < 10) {
 		warning("Save game version %i not supported", saveVersion);
 		delete savefile;
 		return false; //Common::kUnknownError;
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index d50fe6a..7054fcd 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -46,13 +46,13 @@ namespace Supernova {
 
 #define SAVEGAME_HEADER MKTAG('M','S','N','1')
 #define SAVEGAME_HEADER2 MKTAG('M','S','N','2')
-#define SAVEGAME_VERSION 9
+#define SAVEGAME_VERSION 10
 
 #define SUPERNOVA_DAT "supernova.dat"
-#define SUPERNOVA_DAT_VERSION 1
+#define SUPERNOVA_DAT_VERSION 2
 
 #define SUPERNOVA2_DAT "supernova2.dat"
-#define SUPERNOVA2_DAT_VERSION 1
+#define SUPERNOVA2_DAT_VERSION 2
 
 class GuiElement;
 class ResourceManager;
@@ -120,18 +120,18 @@ public:
 	void renderRoom(Room &room);
 	void renderMessage(const char *text, MessagePosition position = kMessageNormal);
 	void renderMessage(const Common::String &text, MessagePosition position = kMessageNormal);
-	void renderMessage(StringId stringId, MessagePosition position = kMessageNormal,
+	void renderMessage(int stringId, MessagePosition position = kMessageNormal,
 					   Common::String var1 = "", Common::String var2 = "");
-	void renderMessage(StringId stringId, int x, int y);
+	void renderMessage(int stringId, int x, int y);
 	void removeMessage();
 	void renderText(const uint16 character);
 	void renderText(const char *text);
 	void renderText(const Common::String &text);
-	void renderText(StringId stringId);
+	void renderText(int stringId);
 	void renderText(const uint16 character, int x, int y, byte color);
 	void renderText(const char *text, int x, int y, byte color);
 	void renderText(const Common::String &text, int x, int y, byte color);
-	void renderText(StringId stringId, int x, int y, byte color);
+	void renderText(int stringId, int x, int y, byte color);
 	void renderText(const GuiElement &guiElement);
 	void renderBox(int x, int y, int width, int height, byte color);
 	void renderBox(const GuiElement &guiElement);
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index 4c52903..7190a75 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -35,7 +35,7 @@ Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
 	_gm = gm;
 
 	_fileNumber = -1;
-	_id = INTRO;
+	_id = INTRO1;
 	_shown[0] = kShownFalse;
 
 	_objectState[0] =
@@ -162,7 +162,7 @@ bool Intro::animate(int section1, int section2, int duration) {
 }
 
 bool Intro::animate(int section1, int section2, int duration,
-					MessagePosition position, StringId textId) {
+					MessagePosition position, int textId) {
 	Common::KeyCode key = Common::KEYCODE_INVALID;
 	const Common::String& text = _vm->getGameString(textId);
 	_vm->renderMessage(text, position);
@@ -187,7 +187,7 @@ bool Intro::animate(int section1, int section2, int duration,
 }
 
 bool Intro::animate(int section1, int section2, int section3, int section4,
-					int duration, MessagePosition position, StringId textId) {
+					int duration, MessagePosition position, int textId) {
 	Common::KeyCode key = Common::KEYCODE_INVALID;
 	const Common::String& text = _vm->getGameString(textId);
 	_vm->renderMessage(text, position);
@@ -266,7 +266,7 @@ void Intro::cutscene() {
 	exitOnEscape(28);
 	_vm->removeMessage();
 
-	StringId textCounting[4] =
+	int textCounting[4] =
 	{kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9, kStringIntroCutscene10};
 	_vm->setCurrentImage(31);
 	_vm->renderImage(0);
@@ -461,7 +461,7 @@ ShipCorridor::ShipCorridor(SupernovaEngine *vm, GameManager1 *gm) {
 	_gm = gm;
 
 	_fileNumber = 17;
-	_id = CORRIDOR;
+	_id = CORRIDOR_ROOM;
 	_shown[0] = kShownTrue;
 	_shown[4] = kShownTrue;
 
@@ -518,7 +518,7 @@ ShipHall::ShipHall(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[2] = Object(_id, kStringHatch, kStringStasisHatchDescription, NULLOBJECT, OPENABLE | CLOSED | EXIT, 1, 1, 2, SLEEP, 8);
 	_objectState[3] = Object(_id, kStringSlot, kStringSlotDescription, SLEEP_SLOT, COMBINABLE, 2, 2, 0, NULLROOM, 0);
 	_objectState[4] = Object(_id, kStringLadder, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 3, SLEEP, 0, NULLROOM, 0);
-	_objectState[5] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR, 19);
+	_objectState[5] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, CORRIDOR_ROOM, 19);
 }
 
 bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) {
@@ -869,7 +869,7 @@ ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[3] = Object(_id, kStringMagnete, kStringMagneteDescription, NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
 	_objectState[4] = Object(_id, kStringImage, kStringGenericDescription4, NULLOBJECT, UNNECESSARY, 9, 9, 0);
 	_objectState[5] = Object(_id, kStringPen, kStringPenDescription, PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
-	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR, 9);
+	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR_ROOM, 9);
 	_objectState[7] = Object(_id, kStringSlot, kStringSlotDescription, NULLOBJECT, COMBINABLE, 0, 0, 0);
 	_objectState[8] = Object(_id, kStringShelf, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
 	_objectState[9] = Object(_id, kStringCompartment, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
@@ -905,7 +905,7 @@ ShipCabinL2::ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[16] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,38,38,0);
 	_objectState[17] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,23,23,0);
 	_objectState[18] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
-	_objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+	_objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR_ROOM,9);
 	_objectState[20] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[21] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[22] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -979,7 +979,7 @@ ShipCabinL3::ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,WIRE,COMBINABLE,18,18,0);
 	_objectState[9] = Object(_id, kStringWire,kStringDefaultDescription,WIRE2,COMBINABLE,19,19,0);
 	_objectState[10] = Object(_id, kStringPlug,kStringDefaultDescription,PLUG,COMBINABLE,20,20,0);
-	_objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR,9);
+	_objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR_ROOM,9);
 	_objectState[12] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[13] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[14] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1081,7 +1081,7 @@ ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[0] = Object(_id, kStringImage,kStringImageDescription1,NULLOBJECT,UNNECESSARY,5,5,0);
 	_objectState[1] = Object(_id, kStringDrawingInstruments,kStringDrawingInstrumentsDescription,NULLOBJECT,UNNECESSARY,6,6,0);
 	_objectState[2] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,7,7,0);
-	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR_ROOM,5);
 	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1103,7 +1103,7 @@ ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
 	_objectState[1] = Object(_id, kStringTennisRacket,kStringTennisRacketDescription,NULLOBJECT,UNNECESSARY,8,8,0);
 	_objectState[2] = Object(_id, kStringTennisBall,kStringGenericDescription2,NULLOBJECT,UNNECESSARY,9,9,0);
-	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR,5);
+	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR_ROOM,5);
 	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1140,7 +1140,7 @@ ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[15] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF4,OPENABLE | CLOSED,24,25,13);
 	_objectState[16] = Object(_id, kStringBook,kStringBookHitchhiker,BOOK,TAKE,26,26,14);
 	_objectState[17] = Object(_id, kStringDiscman,kStringDiscmanDescription,DISCMAN,TAKE | COMBINABLE,33,33,16);
-	_objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR,5);
+	_objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR_ROOM,5);
 	_objectState[19] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[20] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[21] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1194,7 +1194,7 @@ bool ShipCabinR3::interact(Action verb, Object &obj1, Object &obj2) {
 
 void ShipCabinR3::onEntrance() {
 	for (int i = 0; i < 3; ++i)
-		_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(i));
+		_gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(i));
 
 	setRoomSeen(true);
 }
@@ -1221,7 +1221,7 @@ ShipAirlock::ShipAirlock(SupernovaEngine *vm, GameManager1 *gm) {
 	_shown[0] = kShownTrue;
 	_shown[6] = kShownTrue;
 
-	_objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR,10);
+	_objectState[0] = Object(_id, kStringHatch,kStringHatchDescription1,NULLOBJECT,EXIT | OPENABLE | OPENED | CLOSED,0,0,0,CORRIDOR_ROOM,10);
 	_objectState[1] = Object(_id, kStringHatch,kStringHatchDescription2,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,HOLD,14);
 	_objectState[2] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON1,PRESS,2,2,0);
 	_objectState[3] = Object(_id, kStringButton,kStringDefaultDescription,BUTTON2,PRESS,3,3,0);
@@ -2591,7 +2591,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
 	if (((verb == ACTION_WALK) &&
 			((obj1._id == SPACESHIP) || (obj1._id == ROGER_W))) ||
 			((verb == ACTION_TALK) && (obj1._id == ROGER_W))) {
-		_gm->changeRoom(INTRO);
+		_gm->changeRoom(INTRO1);
 		_vm->setCurrentImage(30);
 		_vm->renderImage(0);
 		_vm->paletteBrightness();
@@ -2823,17 +2823,17 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
 		_vm->paletteFadeOut();
 		// Remove all objects from the inventory except the Knife, Watch and Discman
-		bool has_knife = _gm->_rooms[INTRO]->getObject(1)->hasProperty(CARRIED);
-		bool has_watch = _gm->_rooms[INTRO]->getObject(2)->hasProperty(CARRIED);
-		bool has_discman = _gm->_rooms[INTRO]->getObject(3)->hasProperty(CARRIED);
+		bool has_knife = _gm->_rooms[INTRO1]->getObject(1)->hasProperty(CARRIED);
+		bool has_watch = _gm->_rooms[INTRO1]->getObject(2)->hasProperty(CARRIED);
+		bool has_discman = _gm->_rooms[INTRO1]->getObject(3)->hasProperty(CARRIED);
 		_gm->_inventory.clear();
 		_gm->_inventoryScroll = 0;
 		if (has_knife)
-			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(1));
+			_gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(1));
 		if (has_watch)
-			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(2));
+			_gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(2));
 		if (has_discman)
-			_gm->_inventory.add(*_gm->_rooms[INTRO]->getObject(3));
+			_gm->_inventory.add(*_gm->_rooms[INTRO1]->getObject(3));
 		_gm->changeRoom(CELL);
 		_gm->_state._dream = true;
 	} else
@@ -3158,7 +3158,7 @@ bool AxacussCorridor4::interact(Action verb, Object &obj1, Object &obj2) {
 	} else if ((verb == ACTION_TAKE) && (obj1._id == WATCH) && !obj1.hasProperty(CARRIED)) {
 		setSectionVisible(29, false);
 		getObject(4)->_click = 255;
-		_gm->takeObject(*_gm->_rooms[INTRO]->getObject(2));
+		_gm->takeObject(*_gm->_rooms[INTRO1]->getObject(2));
 		if (isSectionVisible(9))
 			_vm->renderImage(9);
 	} else
@@ -4004,7 +4004,7 @@ AxacussStation::AxacussStation(SupernovaEngine *vm, GameManager1 *gm) {
 
 bool AxacussStation::interact(Action verb, Object &obj1, Object &obj2) {
 	if ((verb == ACTION_LOOK) && (obj1._id == STATION_SIGN)) {
-		_gm->changeRoom(SIGN);
+		_gm->changeRoom(SIGN_ROOM);
 	} else if ((verb == ACTION_WALK) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) {
 		_gm->great(0);
 		_gm->_guiEnabled = false;
@@ -4022,7 +4022,7 @@ AxacussSign::AxacussSign(SupernovaEngine *vm, GameManager1 *gm) {
 	_gm = gm;
 
 	_fileNumber = 32;
-	_id = SIGN;
+	_id = SIGN_ROOM;
 	_shown[0] = kShownTrue;
 	_shown[1] = kShownTrue;
 
diff --git a/engines/supernova/supernova1/rooms.h b/engines/supernova/supernova1/rooms.h
index c49e835..0b0dbc4 100644
--- a/engines/supernova/supernova1/rooms.h
+++ b/engines/supernova/supernova1/rooms.h
@@ -26,6 +26,7 @@
 #include "common/str.h"
 
 #include "supernova/msn_def.h"
+#include "supernova/supernova1/stringid.h"
 #include "supernova/room.h"
 
 namespace Common {
@@ -45,11 +46,12 @@ public:
 	virtual void onEntrance();
 
 private:
+	GameManager1 *_gm;
 	bool animate(int section1, int section2, int duration);
 	bool animate(int section1, int section2, int duration, MessagePosition position,
-				 StringId text);
+				 int text);
 	bool animate(int section1, int section2, int section3, int section4, int duration,
-				 MessagePosition position, StringId text);
+				 MessagePosition position, int text);
 
 	void titleScreen();
 	void titleFadeIn();
@@ -66,6 +68,9 @@ public:
 	ShipCorridor(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipHall: public Room {
@@ -73,6 +78,9 @@ public:
 	ShipHall(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipSleepCabin: public Room {
@@ -84,6 +92,7 @@ public:
 	virtual void onEntrance();
 
 private:
+	GameManager1 *_gm;
 	byte _color;
 };
 
@@ -96,12 +105,16 @@ public:
 	virtual void onEntrance();
 
 private:
+	GameManager1 *_gm;
 	byte _color;
 };
 
 class ShipCabinL1: public Room {
 public:
 	ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipCabinL2 : public Room {
@@ -109,6 +122,9 @@ public:
 	ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipCabinL3 : public Room {
@@ -116,16 +132,25 @@ public:
 	ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipCabinR1 : public Room {
 public:
 	ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipCabinR2 : public Room {
 public:
 	ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipCabinR3 : public Room {
@@ -134,11 +159,17 @@ public:
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipCabinBathroom : public Room  {
 public:
 	ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipAirlock : public Room {
@@ -147,6 +178,9 @@ public:
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipHold : public Room {
@@ -155,6 +189,9 @@ public:
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipLandingModule : public Room {
@@ -162,6 +199,9 @@ public:
 	ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipGenerator : public Room {
@@ -169,11 +209,17 @@ public:
 	ShipGenerator(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ShipOuterSpace : public Room {
 public:
 	ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm);
+
+private:
+	GameManager1 *_gm;
 };
 
 
@@ -184,11 +230,17 @@ public:
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ArsanoCave : public Room {
 public:
 	ArsanoCave(SupernovaEngine *vm, GameManager1 *gm);
+
+private:
+	GameManager1 *_gm;
 };
 
 class ArsanoMeetup : public Room {
@@ -202,6 +254,7 @@ public:
 private:
 	byte _sign;
 	byte _beacon;
+	GameManager1 *_gm;
 };
 
 class ArsanoEntrance : public Room {
@@ -212,10 +265,11 @@ public:
 	virtual void animation();
 
 private:
-	StringId _dialog1[5];
-	StringId _dialog2[5];
-	StringId _dialog3[5];
+	int _dialog1[5];
+	int _dialog2[5];
+	int _dialog3[5];
 	byte _eyewitness;
+	GameManager1 *_gm;
 };
 
 class ArsanoRemaining : public Room {
@@ -227,6 +281,7 @@ public:
 private:
 	bool _chewing;
 	int _i;
+	GameManager1 *_gm;
 };
 
 class ArsanoRoger : public Room {
@@ -238,9 +293,10 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	StringId _dialog1[4];
+	int _dialog1[4];
 	byte _eyewitness;
 	byte _hands;
+	GameManager1 *_gm;
 };
 
 class ArsanoGlider : public Room {
@@ -252,6 +308,7 @@ public:
 
 private:
 	byte _sinus;
+	GameManager1 *_gm;
 };
 
 class ArsanoMeetup2 : public Room {
@@ -265,10 +322,11 @@ public:
 
 private:
 	// TODO: change to 6, fix initialization
-	StringId _dialog1[2];
-	StringId _dialog2[2];
-	StringId _dialog3[4];
-	StringId _dialog4[3];
+	int _dialog1[2];
+	int _dialog2[2];
+	int _dialog3[4];
+	int _dialog4[3];
+	GameManager1 *_gm;
 
 	// FIXME: Remove following unused bool variables?
 	//bool _found;
@@ -282,11 +340,12 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	StringId _dialog2[4];
-	StringId _dialog3[2];
+	int _dialog2[4];
+	int _dialog3[2];
 
 	// TODO: Hack, to be move away and renamed when the other uses are found
-	StringId _dialogsX[6];
+	int _dialogsX[6];
+	GameManager1 *_gm;
 };
 
 
@@ -298,6 +357,9 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 	virtual void animation();
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor1 : public Room {
@@ -305,6 +367,9 @@ public:
 	AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor2 : public Room {
@@ -312,6 +377,9 @@ public:
 	AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor3 : public Room {
@@ -319,6 +387,9 @@ public:
 	AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor4 : public Room {
@@ -328,6 +399,9 @@ public:
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor5 : public Room {
@@ -342,11 +416,13 @@ private:
 	bool handleMoneyDialog();
 
 	// TODO: Change to 6, or change struct, and fix initialization
-	StringId _dialog1[2];
-	StringId _dialog2[2];
-	StringId _dialog3[4];
+	int _dialog1[2];
+	int _dialog2[2];
+	int _dialog3[4];
 
 	byte _rows[6];
+
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor6 : public Room {
@@ -355,6 +431,9 @@ public:
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor7 : public Room {
@@ -362,6 +441,9 @@ public:
 	AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor8 : public Room {
@@ -370,6 +452,9 @@ public:
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussCorridor9 : public Room {
@@ -378,6 +463,9 @@ public:
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussBcorridor : public Room {
@@ -386,6 +474,9 @@ public:
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussIntersection : public Room {
@@ -395,7 +486,8 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	StringId _dialogsX[6];
+	int _dialogsX[6];
+	GameManager1 *_gm;
 };
 
 class AxacussExit : public Room {
@@ -405,7 +497,8 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	StringId _dialogsX[6];
+	int _dialogsX[6];
+	GameManager1 *_gm;
 };
 
 class AxacussOffice1 : public Room {
@@ -413,6 +506,9 @@ public:
 	AxacussOffice1(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussOffice2 : public Room {
@@ -420,6 +516,9 @@ public:
 	AxacussOffice2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussOffice3 : public Room {
@@ -427,6 +526,9 @@ public:
 	AxacussOffice3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussOffice4 : public Room {
@@ -434,6 +536,9 @@ public:
 	AxacussOffice4(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussOffice5 : public Room {
@@ -442,6 +547,9 @@ public:
 
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussElevator : public Room {
@@ -449,6 +557,9 @@ public:
 	AxacussElevator(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussStation : public Room {
@@ -456,6 +567,9 @@ public:
 	AxacussStation(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class AxacussSign : public Room {
@@ -463,6 +577,9 @@ public:
 	AxacussSign(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager1 *_gm;
 };
 
 class Outro : public Room {
@@ -480,6 +597,7 @@ private:
 				 MessagePosition position, const char *text);
 
 	Common::String _outroText;
+	GameManager1 *_gm;
 };
 
 }
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index fff5ad7..f3f8bba 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -28,6 +28,7 @@
 #include "supernova/screen.h"
 #include "supernova/supernova.h"
 #include "supernova/supernova1/state.h"
+#include "supernova/supernova1/stringid.h"
 
 namespace Supernova {
 
@@ -75,7 +76,7 @@ bool GameManager1::serialize(Common::WriteStream *out) {
 
 	// Rooms
 	out->writeByte(_currentRoom->getId());
-	for (int i = 0; i < NUMROOMS; ++i) {
+	for (int i = 0; i < NUMROOMS1; ++i) {
 		_rooms[i]->serialize(out);
 	}
 
@@ -144,7 +145,7 @@ bool GameManager1::deserialize(Common::ReadStream *in, int version) {
 
 	// Rooms
 	RoomId curRoomId = static_cast<RoomId>(in->readByte());
-	for (int i = 0; i < NUMROOMS; ++i) {
+	for (int i = 0; i < NUMROOMS1; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
 	changeRoom(curRoomId);
@@ -179,7 +180,7 @@ static Common::String timeToString(int msec) {
 GameManager1::GameManager1(SupernovaEngine *vm, Sound *sound)
 	: GameManager(vm, sound) {
 	initRooms();
-	changeRoom(INTRO);
+	changeRoom(INTRO1);
 	initState();
 }
 
@@ -188,8 +189,8 @@ GameManager1::~GameManager1() {
 }
 
 void GameManager1::destroyRooms() {
-	delete _rooms[INTRO];
-	delete _rooms[CORRIDOR];
+	delete _rooms[INTRO1];
+	delete _rooms[CORRIDOR_ROOM];
 	delete _rooms[HALL];
 	delete _rooms[SLEEP];
 	delete _rooms[COCKPIT];
@@ -236,8 +237,9 @@ void GameManager1::destroyRooms() {
 	delete _rooms[OFFICE_L];
 	delete _rooms[ELEVATOR];
 	delete _rooms[STATION];
-	delete _rooms[SIGN];
+	delete _rooms[SIGN_ROOM];
 	delete _rooms[OUTRO];
+	delete _rooms;
 }
 
 void GameManager1::initState() {
@@ -297,8 +299,9 @@ void GameManager1::initState() {
 }
 
 void GameManager1::initRooms() {
-	_rooms[INTRO] = new Intro(_vm, this);
-	_rooms[CORRIDOR] = new ShipCorridor(_vm, this);
+	_rooms = new Room *[NUMROOMS1];
+	_rooms[INTRO1] = new Intro(_vm, this);
+	_rooms[CORRIDOR_ROOM] = new ShipCorridor(_vm, this);
 	_rooms[HALL] = new ShipHall(_vm, this);
 	_rooms[SLEEP] = new ShipSleepCabin(_vm, this);
 	_rooms[COCKPIT] = new ShipCockpit(_vm, this);
@@ -345,7 +348,7 @@ void GameManager1::initRooms() {
 	_rooms[OFFICE_L] = new AxacussOffice5(_vm, this);
 	_rooms[ELEVATOR] = new AxacussElevator(_vm, this);
 	_rooms[STATION] = new AxacussStation(_vm, this);
-	_rooms[SIGN] = new AxacussSign(_vm, this);
+	_rooms[SIGN_ROOM] = new AxacussSign(_vm, this);
 	_rooms[OUTRO] = new Outro(_vm, this);
 }
 
@@ -408,7 +411,7 @@ void GameManager1::updateEvents() {
 		case Common::EVENT_LBUTTONUP:
 			// fallthrough
 		case Common::EVENT_RBUTTONUP:
-			if (_currentRoom->getId() != INTRO && _sound->isPlaying())
+			if (_currentRoom->getId() != INTRO1 && _sound->isPlaying())
 				return;
 			_mouseClicked = true;
 			// fallthrough
@@ -449,7 +452,7 @@ void GameManager1::telomat(int nr) {
 		"Alga Hurz Li"
 	};
 
-	StringId dial1[4];
+	int dial1[4];
 	dial1[0] = kStringTelomat1;
 	dial1[1] = kNoString;
 	dial1[2] = kStringTelomat3;
@@ -457,7 +460,7 @@ void GameManager1::telomat(int nr) {
 
 	static byte rows1[3] = {1, 2, 1};
 
-	StringId dial2[4];
+	int dial2[4];
 	dial2[0] = kStringTelomat4;
 	dial2[1] = kStringTelomat5;
 	dial2[2] = kStringTelomat6;
@@ -947,7 +950,7 @@ void GameManager1::guardWalkEvent() {
 }
 
 void GameManager1::taxiEvent() {
-	if (_currentRoom->getId() == SIGN) {
+	if (_currentRoom->getId() == SIGN_ROOM) {
 		changeRoom(STATION);
 		_vm->renderRoom(*_currentRoom);
 	}
@@ -966,8 +969,8 @@ void GameManager1::taxiEvent() {
 		_vm->renderImage(invertSection(i - 1));
 		_vm->renderImage(i);
 	}
-	_rooms[SIGN]->setSectionVisible(2, false);
-	_rooms[SIGN]->setSectionVisible(3, true);
+	_rooms[SIGN_ROOM]->setSectionVisible(2, false);
+	_rooms[SIGN_ROOM]->setSectionVisible(3, true);
 }
 
 void GameManager1::searchStartEvent() {
@@ -1098,7 +1101,7 @@ void GameManager1::shot(int a, int b) {
 }
 
 void GameManager1::takeMoney(int amount) {
-	Object *moneyObject = _rooms[INTRO]->getObject(4);
+	Object *moneyObject = _rooms[INTRO1]->getObject(4);
 	_state._money += amount;
 	_vm->setGameString(kStringInventoryMoney, Common::String::format("%d Xa", _state._money));
 
@@ -1567,7 +1570,7 @@ void GameManager1::guard3Shot() {
 }
 
 void GameManager1::alarm() {
-	if (_rooms[INTRO]->getObject(2)->hasProperty(CARRIED)) {
+	if (_rooms[INTRO1]->getObject(2)->hasProperty(CARRIED)) {
 		alarmSound();
 		if (_currentRoom->getId() == GUARD)
 			guardShot();
diff --git a/engines/supernova/supernova1/state.h b/engines/supernova/supernova1/state.h
index ba02b01..9e997e9 100644
--- a/engines/supernova/supernova1/state.h
+++ b/engines/supernova/supernova1/state.h
@@ -64,7 +64,7 @@ class GameState {
 		bool   _playerHidden;
 };
 
-class GameManager1 : public GameManager {
+class GameManager1: public GameManager {
 public:
 	GameManager1(SupernovaEngine *vm, Sound *sound);
 	virtual ~GameManager1();
diff --git a/engines/supernova/supernova1/stringid.h b/engines/supernova/supernova1/stringid.h
new file mode 100644
index 0000000..7f3c1f1
--- /dev/null
+++ b/engines/supernova/supernova1/stringid.h
@@ -0,0 +1,188 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA_STRINGID_H
+#define SUPERNOVA_STRINGID_H
+
+#include "common/scummsys.h"
+
+namespace Supernova {
+
+enum StringId1 {
+	kStringTitleVersion = 25, kStringTitle1, kStringTitle2, kStringTitle3, kStringIntro1,
+	kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5, kStringIntro6,
+	kStringIntro7, kStringIntro8, kStringIntro9, kStringIntro10, kStringIntro11,
+	kStringIntro12, kStringIntro13, kStringBroken, kStringTakeMessage,
+	kStringKeycard, kStringKeycardDescription, kStringKnife, kStringKnifeDescription, kStringWatch,
+	kStringDiscman, kStringDiscmanDescription, kStringHatch, kStringButton, kStringHatchButtonDescription,
+	// 50
+	kStringLadder, kStringExit, kStringCockpitHatchDescription, kStringKitchenHatchDescription, kStringStasisHatchDescription,
+	kStringStasisHatchDescription2, kStringSlot, kStringSlotDescription, kStringCorridor, kStringComputer,
+	kStringComputerPassword, kStringInstruments, kStringInstrumentsDescription1, kStringMonitor, kStringMonitorDescription,
+	kStringImage, kStringGenericDescription1, kStringGenericDescription2, kStringGenericDescription3, kStringGenericDescription4,
+	kStringMagnete, kStringMagneteDescription, kStringPen, kStringPenDescription, kStringShelf,
+	kStringCompartment, kStringSocket, kStringToilet, kStringPistol, kStringPistolDescription,
+	kStringBooks, kStringBooksDescription, kStringSpool, kStringSpoolDescription, kStringBook,
+	kStringUnderwear, kStringUnderwearDescription, kStringClothes, kStringJunk, kStringJunkDescription,
+	kStringFolders, kStringFoldersDescription, kStringPoster, kStringPosterDescription1, kStringPosterDescription2,
+	kStringSpeaker, kStringRecord, kStringRecordDescription, kStringRecordStand, kStringRecordStandDescription,
+	// 100
+	kStringTurntable, kStringTurntableDescription, kStringWire, kStringPlug, kStringImageDescription1,
+	kStringDrawingInstruments, kStringDrawingInstrumentsDescription, kStringChessGame, kStringChessGameDescription1, kStringTennisRacket,
+	kStringTennisRacketDescription, kStringTennisBall, kStringChessGameDescription2, kStringBed, kStringBedDescription,
+	kStringCompartmentDescription, kStringAlbums, kStringAlbumsDescription, kStringRope, kStringRopeDescription,
+	kStringShelfDescription, kStringClothesDescription, kStringSocks, kStringBookHitchhiker, kStringBathroom,
+	kStringBathroomDescription, kStringShower, kStringHatchDescription1, kStringHatchDescription2, kStringHelmet,
+	kStringHelmetDescription, kStringSuit, kStringSuitDescription, kStringLifeSupport, kStringLifeSupportDescription,
+	kStringScrap, kStringScrapDescription1, kStringTerminalStrip, kStringScrapDescription2, kStringReactor,
+	kStringReactorDescription, kStringNozzle, kStringPumpkin, kStringPumpkinDescription, kStringLandingModule,
+	kStringLandingModuleDescription, kStringHatchDescription3, kStringGenerator, kStringGeneratorDescription, kStringScrapDescription3,
+	// 150
+	kSafetyButtonDescription, kStringKeyboard, kStringGeneratorWire, kStringEmptySpool, kStringKeycard2,
+	kStringKeycard2Description, kStringTrap, kStringVoltmeter, kStringClip, kStringWireDescription,
+	kStringStone, kStringCaveOpening, kStringCaveOpeningDescription, kStringExitDescription, kStringCave,
+	kStringSign, kStringSignDescription, kStringEntrance, kStringStar, kStringSpaceshift,
+	kStringPorter, kStringPorterDescription, kStringDoor, kStringChewingGum, kStringGummyBears,
+	kStringChocolateBall, kStringEgg, kStringLiquorice, kStringPill, kStringPillDescription,
+	kStringVendingMachine, kStringVendingMachineDescription, kStringToiletDescription, kStringStaircase, kStringCoins,
+	kStringCoinsDescription, kStringTabletPackage, kStringTabletPackageDescription, kStringChair, kStringShoes,
+	kStringShoesDescription, kStringFrogFace, kStringScrible, kStringScribleDescription, kStringWallet,
+	kStringMenu, kStringMenuDescription, kStringCup, kStringCupDescription, kStringBill,
+	// 200
+	kStringBillDescription, kStringKeycard3, kStringAnnouncement, kStringAnnouncementDescription, kStringRoger,
+	kStringUfo, kStringUfoDescription, kStringTray, kStringTrayDescription, kStringLamp,
+	kStringLampDescription, kStringEyes, kStringEyesDescription, kStringSocketDescription, kStringMetalBlock,
+	kStringMetalBlockDescription, kStringRobot, kStringRobotDescription, kStringTable, kStringTableDescription,
+	kStringCellDoor, kStringCellDoorDescription, kStringLaptop, kStringWristwatch, kStringPillar,
+	kStringDoorDescription1, kStringDoorDescription2, kStringDoorDescription3, kStringDoorDescription4, kStringDontEnter,
+	kStringAxacussan, kStringAxacussanDescription, kStringImageDescription2, kStringMastercard, kStringMastercardDescription,
+	kStringLamp2, kStringGenericDescription5, kStringMoney, kStringMoneyDescription1, kStringLocker,
+	kStringLockerDescription, kStringLetter, kStringCube, kStringGenericDescription6, kStringGenericDescription7,
+	kStringStrangeThing, kStringGenericDescription8, kStringImageDescription3, kStringPlant, kStringStatue,
+	// 250
+	kStringStatueDescription, kStringPlantDescription, kStringComputerDescription, kStringGraffiti, kStringGraffitiDescription,
+	kStringMoneyDescription2, kStringJungle, kStringJungleDescription, kStringOutro1, kStringOutro2,
+	kStringOutro3, kStringOutro4, kStringOutro5, kStringOutro6, kStringOutro7,
+	kStringOutro8, kStringOutro9, kStringOutro10, kStringOutro11, kStringOutro12,
+	kStringOutro13, kStringOutro14, kStringWireAndPlug, kStringWireAndClip, kStringWireAndPlug2,
+	// 275
+	kStringSignDescription2, kStringCoin, kStringDoorDescription5, kStringDoorDescription6, kStringKeycard2Description2,
+	kSringSpoolAndClip, kStringIntroCutscene1, kStringIntroCutscene2, kStringIntroCutscene3, kStringIntroCutscene4,
+	kStringIntroCutscene5, kStringIntroCutscene6, kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9,
+	kStringIntroCutscene10, kStringIntroCutscene11, kStringIntroCutscene12, kStringIntroCutscene13, kStringIntroCutscene14,
+	kStringIntroCutscene15, kStringIntroCutscene16, kStringIntroCutscene17, kStringIntroCutscene18, kStringIntroCutscene19,
+	// 300
+	kStringIntroCutscene20, kStringIntroCutscene21, kStringIntroCutscene22, kStringIntroCutscene23, kStringIntroCutscene24,
+	kStringIntroCutscene25, kStringIntroCutscene26, kStringIntroCutscene27, kStringIntroCutscene28, kStringIntroCutscene29,
+	kStringIntroCutscene30, kStringIntroCutscene31, kStringIntroCutscene32, kStringIntroCutscene33, kStringIntroCutscene34,
+	kStringIntroCutscene35, kStringIntroCutscene36, kStringIntroCutscene37, kStringIntroCutscene38, kStringIntroCutscene39,
+	kStringIntroCutscene40, kStringIntroCutscene41, kStringIntroCutscene42, kStringShipHall1,       kStringShipSleepCabin1,
+	//325
+	kStringShipSleepCabin2,  kStringShipSleepCabin3,  kStringShipSleepCabin4,  kStringShipSleepCabin5,  kStringShipSleepCabin6,
+	kStringShipSleepCabin7,  kStringShipSleepCabin8,  kStringShipSleepCabin9,  kStringShipSleepCabin10, kStringShipSleepCabin11,
+	kStringShipSleepCabin12, kStringShipSleepCabin13, kStringShipSleepCabin14, kStringShipSleepCabin15, kStringShipSleepCabin16,
+	kStringShipCockpit1, kStringShipCockpit2, kStringShipCockpit3, kStringShipCockpit4, kStringShipCockpit5,
+	kStringShipCockpit6, kStringShipCockpit7, kStringShipCockpit8, kStringShipCockpit9, kStringShipCockpit10,
+	// 350
+	kStringShipCockpit11, kStringShipCockpit12, kStringShipCockpit13, kStringShipCabinL3_1, kStringShipCabinL3_2,
+	kStringShipCabinL3_3, kStringShipCabinL3_4, kStringShipCabinL3_5, kStringShipAirlock1, kStringShipAirlock2,
+	kStringShipAirlock3, kStringShipAirlock4, kStringShipHold1, kStringCable1, kStringCable2,
+	kStringCable3, kStringCable4, kStringShipHold2, kStringShipHold3, kStringShipHold4,
+	kStringShipHold5, kStringShipHold6, kStringShipHold7, kStringShipHold8, kStringShipHold9,
+	// 375
+	kStringShipHold10, kStringShipHold11, kStringShipHold12, kStringShipHold13, kStringShipHold14,
+	kStringShipHold15, kStringShipHold16, kStringArsanoMeetup1, kStringArsanoMeetup2, kStringArsanoMeetup3,
+	kStringArsanoEntrance1, kStringArsanoEntrance2, kStringArsanoEntrance3, kStringArsanoEntrance4, kStringArsanoEntrance5,
+	kStringArsanoEntrance6, kStringArsanoEntrance7, kStringArsanoEntrance8, kStringArsanoEntrance9, kStringArsanoEntrance10,
+	kStringArsanoEntrance11, kStringArsanoEntrance12, kStringArsanoEntrance13, kStringArsanoEntrance14, kStringArsanoEntrance15,
+	// 400
+	kStringArsanoEntrance16, kStringArsanoEntrance17, kStringArsanoEntrance18, kStringArsanoEntrance19, kStringArsanoEntrance20,
+	kStringArsanoEntrance21, kStringArsanoEntrance22, kStringArsanoEntrance23, kStringArsanoEntrance24, kStringArsanoEntrance25,
+	kStringArsanoEntrance26, kStringArsanoEntrance27, kStringArsanoDialog1, kStringArsanoDialog2, kStringArsanoDialog3,
+	kStringArsanoDialog4, kStringArsanoDialog5, kStringArsanoDialog6, kStringArsanoDialog7, kStringArsanoDialog8,
+	kStringArsanoDialog9, kStringDialogArsanoRoger1, kStringDialogArsanoRoger2, kStringDialogArsanoRoger3,
+	// 425
+	kStringDialogArsanoMeetup3_1, kStringDialogArsanoMeetup3_2, kStringDialogArsanoMeetup3_3, kStringDialogArsanoMeetup3_4, kStringDialogArsanoMeetup3_5,
+	kStringArsanoRoger1, kStringArsanoRoger2, kStringArsanoRoger3, kStringArsanoRoger4, kStringArsanoRoger5,
+	kStringArsanoRoger6, kStringArsanoRoger7, kStringArsanoRoger8, kStringArsanoRoger9, kStringArsanoRoger10,
+	kStringArsanoRoger11, kStringArsanoRoger12, kStringArsanoRoger13, kStringArsanoRoger14, kStringArsanoRoger15,
+	kStringArsanoRoger16, kStringArsanoRoger17, kStringArsanoRoger18, kStringArsanoRoger19, kStringArsanoRoger20,
+	// 450
+	kStringArsanoRoger21, kStringArsanoRoger22, kStringArsanoRoger23, kStringArsanoRoger24, kStringArsanoRoger25,
+	kStringArsanoRoger26, kStringArsanoRoger27, kStringArsanoRoger28, kStringArsanoRoger29, kStringArsanoRoger30,
+	kStringArsanoRoger31, kStringArsanoRoger32, kStringArsanoRoger33, kStringArsanoRoger34, kStringArsanoRoger35,
+	kStringArsanoRoger36, kStringArsanoRoger37, kStringArsanoRoger38, kStringArsanoRoger39, kStringArsanoRoger40,
+	kStringArsanoGlider1, kStringArsanoMeetup2_1, kStringArsanoMeetup2_2, kStringArsanoMeetup2_3, kStringArsanoMeetup2_4,
+	// 475
+	kStringArsanoMeetup2_5, kStringArsanoMeetup2_6, kStringArsanoMeetup2_7, kStringArsanoMeetup2_8, kStringArsanoMeetup2_9,
+	kStringArsanoMeetup2_10, kStringArsanoMeetup2_11, kStringArsanoMeetup2_12, kStringArsanoMeetup2_13, kStringArsanoMeetup3_1,
+	kStringArsanoMeetup3_2, kStringArsanoMeetup3_3, kStringArsanoMeetup3_4, kStringArsanoMeetup3_5, kStringArsanoMeetup3_6,
+	kStringArsanoMeetup3_7, kStringArsanoMeetup3_8, kStringArsanoMeetup3_9, kStringArsanoMeetup3_10, kStringArsanoMeetup3_11,
+	kStringArsanoMeetup3_12, kStringArsanoMeetup3_13, kStringArsanoMeetup3_14, kStringArsanoMeetup3_15, kStringArsanoMeetup3_16,
+	// 500
+	kStringArsanoMeetup3_17, kStringArsanoMeetup3_18, kStringArsanoMeetup3_19, kStringArsanoMeetup3_20, kStringArsanoMeetup3_21,
+	kStringArsanoMeetup3_22, kStringArsanoMeetup3_23, kStringArsanoMeetup3_24, kStringArsanoMeetup3_25, kStringArsanoMeetup3_26,
+	kStringArsanoMeetup3_27, kStringArsanoMeetup3_28, kStringAxacussCell_1, kStringAxacussCell_2, kStringAxacussCell_3,
+	kStringAxacussCell_4, kStringAxacussCell_5, kStringOk, kStringDialogArsanoMeetup2_1, kStringDialogArsanoMeetup2_2,
+	kStringDialogArsanoMeetup2_3, kStringDialogArsanoMeetup2_4, kStringDialogArsanoMeetup2_5, kStringDialogArsanoMeetup2_6, kStringDialogArsanoMeetup2_7,
+	// 525
+	kStringDialogArsanoMeetup2_8, kStringDialogArsanoMeetup2_9, kStringDialogArsanoMeetup2_10, kStringDialogArsanoMeetup2_11, kStringDialogAxacussCorridor5_1,
+	kStringDialogAxacussCorridor5_2, kStringDialogAxacussCorridor5_3, kStringDialogAxacussCorridor5_4, kStringDialogAxacussCorridor5_5, kStringDialogAxacussCorridor5_6,
+	kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3, kStringAxacussCorridor5_1,
+	kStringAxacussCorridor5_2, kStringAxacussCorridor5_3, kStringAxacussCorridor5_4, kStringAxacussCorridor5_5, kStringAxacussCorridor5_6,
+	kStringAxacussCorridor5_7, kStringAxacussBcorridor_1, kStringAxacussOffice1_1, kStringAxacussOffice1_2, kStringAxacussOffice1_3,
+	// 550
+	kStringAxacussOffice1_4, kStringAxacussOffice1_5, kStringAxacussOffice1_6, kStringAxacussOffice1_7, kStringAxacussOffice1_8,
+	kStringAxacussOffice1_9, kStringAxacussOffice1_10, kStringAxacussOffice1_11, kStringAxacussOffice1_12, kStringAxacussOffice1_13,
+	kStringAxacussOffice1_14, kStringAxacussOffice1_15, kStringAxacussOffice1_16, kStringAxacussOffice3_1, kStringAxacussElevator_1,
+	kStringAxacussElevator_2, kStringAxacussElevator_3, kStringShock, kStringShot, kStringCloseLocker_1,
+	kStringIsHelmetOff_1, kStringGenericInteract_1, kStringGenericInteract_2, kStringGenericInteract_3, kStringGenericInteract_4,
+	// 575
+	kStringGenericInteract_5, kStringGenericInteract_6, kStringGenericInteract_7, kStringGenericInteract_8, kStringGenericInteract_9,
+	kStringGenericInteract_10, kStringGenericInteract_11, kStringGenericInteract_12,
+	kStringGenericInteract_13, kStringGenericInteract_14, kStringGenericInteract_15, kStringGenericInteract_16, kStringGenericInteract_17,
+	kStringGenericInteract_18, kStringGenericInteract_19, kStringGenericInteract_20, kStringGenericInteract_21, kStringGenericInteract_22,
+	kStringGenericInteract_23, kStringGenericInteract_24, kStringGenericInteract_25, kStringGenericInteract_26, kStringGenericInteract_27,
+	// 600
+	kStringGenericInteract_28, kStringGenericInteract_29, kStringGenericInteract_30, kStringGenericInteract_31, kStringGenericInteract_32,
+	kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35, kStringGenericInteract_36, kStringGenericInteract_37,
+	kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40, kStringGenericInteract_41, kStringGenericInteract_42,
+	kStringGenericInteract_43, kStringSupernova1, kStringSupernova2, kStringSupernova3,
+	kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8,
+	// 625
+	kStringTextSpeed, kStringGuardNoticed1, kStringGuardNoticed2, kStringTelomat1, kStringTelomat2,
+	kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
+	kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
+	kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
+	kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm,
+	// 650
+	kStringLeaveGame, kStringYes, kStringNo, kStringHelpOverview1, kStringHelpOverview2,
+	kStringHelpOverview3, kStringHelpOverview4, kStringHelpOverview5, kStringHelpOverview6, kStringHelpOverview7,
+
+	// Add two placeholder strings at the end for variable text
+	kStringPlaceholder1, kStringPlaceholder2,
+
+	// String for money in inventory
+	kStringInventoryMoney
+};
+}
+#endif // SUPERNOVA_STRINGID_H
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
new file mode 100644
index 0000000..01ccb59
--- /dev/null
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -0,0 +1,4758 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "common/config-manager.h"
+#include "graphics/palette.h"
+#include "graphics/cursorman.h"
+
+#include "supernova/screen.h"
+#include "supernova/supernova.h"
+#include "supernova/supernova2/state.h"
+#include "supernova/supernova2/rooms.h"
+#include "supernova/supernova2/stringid.h"
+#include "supernova/graphics.h"
+
+namespace Supernova {
+
+Intro2::Intro2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = -1;
+	_id = INTRO2;
+
+	_objectState[0] = Object(_id, kStringKnife, kStringKnifeDescription, KNIFE, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+	_objectState[1] = Object(_id, kStringMoney, kStringDefaultDescription, MONEY, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+	_objectState[2] = Object(_id, kStringDiscman, kStringDiscmanDescription, DISCMAN, TAKE | CARRIED | COMBINABLE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringSuctionCup, kStringSuctionCupDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[4] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[5] = Object(_id, kStringSpecialCard, kStringSpecialCardDescription, SP_KEYCARD, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[6] = Object(_id, kStringAlarmCracker, kStringAlarmCrackerDescription, ALARM_CRACKER, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[7] = Object(_id, kStringDinosaurHead, kStringDefaultDescription, NULLOBJECT, TAKE, 255, 255, 0);
+	_objectState[8] = Object(_id, kStringKeycard, kStringDefaultDescription, MUSCARD, TAKE, 255, 255, 0);
+
+	_introText = 
+		_vm->getGameString(kStringIntro1) + '\0' + 
+		_vm->getGameString(kStringIntro2) + '\0' + 
+		_vm->getGameString(kStringIntro3) + '\0' + 
+		_vm->getGameString(kStringIntro4) + '\0' + 
+		_vm->getGameString(kStringIntro5) + '\0' + 
+		"^Matthias Neef#" + '\0' +
+		"^Sascha Otterbach#" + '\0' +
+		"^Thomas Mazzoni#" + '\0' +
+		"^Matthias Klein#" + '\0' +
+		"^Gerrit Rothmaier#" + '\0' +
+		"^Thomas Hassler#" + '\0' +
+		"^Rene Kach#" + '\0' +
+		'\233' + '\0';
+}
+
+void Intro2::onEntrance() {
+	_gm->_guiEnabled = false;
+	_vm->_allowSaveGame = false;
+	_vm->_allowLoadGame = false;
+
+	titleScreen();
+	if (!(thoughts1() && tvDialogue() && thoughts2()))
+		_gm->_rooms[AIRPORT]->setRoomSeen(true);
+	_vm->paletteFadeOut();
+
+	for (int i = 0; i < 3; ++i)
+		_gm->_inventory.add(*_gm->_rooms[INTRO2]->getObject(i));
+
+	_gm->changeRoom(AIRPORT);
+	_gm->_guiEnabled = true;
+	_vm->_allowSaveGame = true;
+	_vm->_allowLoadGame = true;
+}
+
+void Intro2::titleScreen() {
+	CursorMan.showMouse(false);
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->_screen->setViewportBrightness(0);
+	_vm->_screen->setGuiBrightness(0);
+	_vm->paletteBrightness();
+	_vm->setCurrentImage(1);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->wait(15);
+	_vm->renderImage(1);
+	_gm->wait(15);
+	_vm->renderImage(2);
+	const Common::String title1 = "V1.02";
+	_vm->_screen->renderText(title1, 295, 190, 3);
+
+	_vm->playSound(kMusicIntro);
+	Marquee marquee(_vm->_screen, Marquee::kMarqueeIntro, _introText.c_str());
+	while (!_vm->shouldQuit()) {
+		_gm->updateEvents();
+		marquee.renderCharacter();
+		if (_gm->_mouseClicked || _gm->_keyPressed)
+			break;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+	_vm->stopSound();
+	_vm->paletteFadeOut();
+	CursorMan.showMouse(true);
+}
+
+bool Intro2::displayThoughtMessage(int id) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	const Common::String& text = _vm->getGameString(id);
+	_vm->renderMessage(text, kMessageNormal);
+	if (_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10, key)) {
+		_vm->removeMessage();
+		return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+	}
+	_vm->removeMessage();
+	return true;
+}
+
+bool Intro2::thoughts1() {
+	if(_vm->shouldQuit())
+		return false;
+
+	_vm->setCurrentImage(41);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+
+	if(!displayThoughtMessage(kStringIntro6))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro7))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro8))
+		return false;
+
+	_vm->paletteFadeOut();
+	return true;
+}
+
+bool Intro2::thoughts2() {
+	if(_vm->shouldQuit())
+		return false;
+
+	_vm->setCurrentImage(41);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+
+	if(!displayThoughtMessage(kStringIntro9))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro10))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro11))
+		return false;
+
+	_vm->paletteFadeOut();
+
+	_vm->setCurrentImage(2);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->paletteFadeIn();
+
+	for (int i = 0; i < 35; i++)
+	{
+		_vm->renderImage((i % 3) + 2);
+		_gm->wait(3);
+	}
+	_vm->paletteFadeOut();
+
+	_vm->setCurrentImage(41);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->paletteFadeIn();
+
+	if(!displayThoughtMessage(kStringIntro12))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro13))
+		return false;
+
+	if(!displayThoughtMessage(kStringIntro14))
+		return false;
+
+	_vm->paletteFadeOut();
+	return true;
+}
+
+bool Intro2::tvDialogue() {
+	if(_vm->shouldQuit())
+		return false;
+
+	_vm->setCurrentImage(39);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->wait(50);
+	_vm->setCurrentImage(40);
+	_vm->renderImage(0);
+	for (int i = 1; i < 11; i++)
+	{
+		_gm->wait(3);
+		_vm->renderImage(i);
+	}
+	_vm->playSound(kAudioIntroDing);
+	_gm->wait(30);
+	_vm->renderImage(11);
+	_vm->playSound(kAudioIntroDing);
+	_gm->wait(60);
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->setCurrentImage(42);
+	_vm->renderImage(0);
+
+	if(!_gm->talk(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
+		return false;
+
+	_vm->renderImage(4);
+	_gm->wait(3);
+	_vm->renderImage(6);
+
+	if(!_gm->talk(8, 6, 7, kMessageLeft, kStringIntroTV2))
+		return false;
+	debug("%d", _vm->shouldQuit());
+
+	_vm->renderImage(10);
+
+	if(!_gm->talkRest(8, 6, _gm->_restTime))
+		return false;
+
+	_vm->removeMessage();
+
+	if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV3))
+		return false;
+
+	if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV4))
+		return false;
+
+	_vm->renderImage(10 + 128);
+	_gm->wait(3);
+	_vm->renderImage(5);
+	_gm->wait(3);
+	_vm->renderImage(7);
+
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV5))
+		return false;
+
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV6))
+		return false;
+
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV7))
+		return false;
+
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
+		return false;
+
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
+		return false;
+
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV10))
+		return false;
+
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
+		return false;
+
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
+		return false;
+
+	if(!_gm->talk(9, 7, 8, kMessageCenter, kStringIntroTV13))
+		return false;
+
+	_vm->renderImage(4);
+
+	if(!_gm->talkRest(9, 7, 1))
+		return false;
+
+	_vm->renderImage(4 + 128);
+
+	if(!_gm->talkRest(9, 7, 3))
+		return false;
+
+	_vm->renderImage(4);
+
+	if(!_gm->talkRest(9, 7, 1))
+		return false;
+
+	_vm->renderImage(6);
+
+	if(!_gm->talkRest(9, 7, _gm->_restTime - 5))
+		return false;
+
+	_vm->removeMessage();
+
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
+		return false;
+
+	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
+		return false;
+
+	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV16))
+		return false;
+
+	return true;
+}
+
+Airport::Airport(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 2;
+	_id = AIRPORT;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSpaceship, kStringSpaceshipDescription, NULLOBJECT, NULLTYPE, 0, 0, 0, NULLROOM, 0);
+	_objectState[1] = Object(_id, kStringVehicles, kStringVehiclesDescription, NULLOBJECT, EXIT, 1, 1, 0, TAXISTAND, 8);
+}
+
+void Airport::onEntrance() {
+	if (hasSeen() == false) {
+		_vm->renderMessage(kStringAirportEntrance);
+	}
+	setRoomSeen(true);
+}
+
+TaxiStand::TaxiStand(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 3;
+	_id = TAXISTAND;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[7] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringVehicle, kStringVehicleDescription, TAXI, NULLTYPE, 2, 2, 0, NULLROOM, 11);
+	_objectState[1] = Object(_id, kStringVehicle, kStringVehicleDescription, NULLOBJECT, NULLTYPE, 1, 1, 0);
+	_objectState[2] = Object(_id, kStringEntrance, kStringEntranceDescription, DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, NULLROOM, 1);
+	_objectState[3] = Object(_id, kStringWallet, kStringWalletDescription, WALLET, TAKE, 0, 0, 7 + 128);
+	_objectState[4] = Object(_id, kStringDevice, kStringDeviceDescription, TRANSMITTER, TAKE | PRESS, 255, 255, 0);
+	_objectState[5] = Object(_id, kStringIdCard, kStringIdCardDescription, ID_CARD, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[6] = Object(_id, kStringAirport, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, AIRPORT, 22);
+}
+
+void TaxiStand::onEntrance() {
+	setRoomSeen(true);
+}
+
+void TaxiStand::animation() {
+	if (isSectionVisible(4)) {
+		setSectionVisible(1, kShownFalse);
+		setSectionVisible(2, kShownFalse);
+		setSectionVisible(3, kShownFalse);
+		setSectionVisible(4, kShownFalse);
+	}
+	else if (isSectionVisible(3))
+		setSectionVisible(4, kShownTrue);
+	else if (isSectionVisible(2))
+		setSectionVisible(3, kShownTrue);
+	else if (isSectionVisible(1))
+		setSectionVisible(2, kShownTrue);
+	else
+		setSectionVisible(1, kShownTrue);
+	_gm->setAnimationTimer(7);
+}
+
+bool TaxiStand::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_WALK && obj1._id == TAXI && isSectionVisible(6))
+		_gm->taxi();
+	else if ((verb == ACTION_WALK || verb == ACTION_OPEN) && obj1._id == DOOR)
+		_vm->renderMessage(obj1._description);
+	else 
+		return false;
+	return true;
+}
+
+Street::Street(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 5;
+	_id = STREET;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, GAMES, 10);
+	_objectState[1] = Object(_id, kStringStaircase, kStringStaircaseDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[2] = Object(_id, kStringBusinessStreet, kStringBusinessStreetDescription, REAR_STREET, EXIT, 3, 3, 0, KIOSK, 3);
+	_objectState[3] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 7, 7, 22);
+	_objectState[4] = Object(_id, kStringRod, kStringLooksMetal, ROD, COMBINABLE, 6, 6, 0);
+	_objectState[5] = Object(_id, kStringPost, kStringLooksMetal, NULLOBJECT, NULLTYPE, 4, 4, 0);
+	_objectState[6] = Object(_id, kStringRailing, kStringLooksMetal, NULLOBJECT, NULLTYPE, 5, 5, 0);
+}
+
+void Street::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Street::animation() {
+	static int ltab[36] = {
+		8, 9 + 128, 10, 11 + 128, 6, 12, 13 + 128, 9, 14, 15 + 128, 19,
+		16, 17 + 128, 9 + 128, 18, 19 + 128, 6 + 128, 20, 21 + 128,
+		8 + 128, 9, 10 + 128, 11, 6, 12 + 128, 13, 14 + 128, 15, 19,
+		16 + 128, 17, 18 + 128, 19 + 128, 6 + 128, 20 + 128, 21
+	};
+
+	static int i, banks, light;
+
+	if (isSectionVisible(7))
+		setSectionVisible(7, kShownFalse);
+	else
+		setSectionVisible(7, kShownTrue);
+
+	if (++i == 4) {
+		i = 0;
+		switch (banks) {
+		case 0:
+			setSectionVisible(1, kShownTrue);
+			break;
+		case 1:
+			setSectionVisible(2, kShownTrue);
+			break;
+		case 2:
+			setSectionVisible(3, kShownTrue);
+			break;
+		case 3:
+			setSectionVisible(4, kShownTrue);
+			break;
+		case 4:
+			setSectionVisible(5, kShownTrue);
+			break;
+		case 5:
+			// fall through
+		case 7:
+			// fall through
+		case 9:
+			setSectionVisible(1, kShownFalse);
+			setSectionVisible(2, kShownFalse);
+			setSectionVisible(3, kShownFalse);
+			setSectionVisible(4, kShownFalse);
+			setSectionVisible(5, kShownFalse);
+			break;
+		case 6:
+			// fall through
+		case 8:
+			setSectionVisible(1, kShownTrue);
+			setSectionVisible(2, kShownTrue);
+			setSectionVisible(3, kShownTrue);
+			setSectionVisible(4, kShownTrue);
+			setSectionVisible(5, kShownTrue);
+			break;
+		}
+		banks++;
+		if (banks == 10) banks = 0;
+	}
+	setSectionVisible(ltab[light], kShownTrue);
+	light++;
+	if (light == 36)
+		light = 0;
+	_gm->setAnimationTimer(2);
+}
+
+bool Street::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, KNIFE, ROD)) {
+		if (getObject(3)->_type & CARRIED)
+			_vm->renderMessage(kStringAlreadyHavePole);
+		else {
+			_vm->renderMessage(kStringSawPole);
+			_gm->takeObject(*getObject(3));
+			_vm->playSound(kAudioSuccess2);
+		}
+	} else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
+		Common::String text = _vm->getGameString(kStringOnlyShop);
+		_vm->renderMessage(text);
+		_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+		return false;
+	} else 
+		return false;
+	return true;
+}
+
+Games::Games(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 6;
+	_id = GAMES;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringPoster, kStringPosterDescription, POSTER, UNNECESSARY, 3, 3, 0);
+	_objectState[1] = Object(_id, kStringCabin, kStringCabinFree, NULLOBJECT, EXIT, 1, 1, 0, CABIN2, 9);
+	_objectState[2] = Object(_id, kStringCabin, kStringCabinOccupied, OCCUPIED_CABIN, NULLTYPE, 0, 0, 0);
+	_objectState[3] = Object(_id, kStringFeet, kStringFeetDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[4] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
+}
+
+void Games::onEntrance() {
+	setRoomSeen(true);
+}
+
+bool Games::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_WALK && obj1._id == OCCUPIED_CABIN) {
+		_vm->renderMessage(kStringCabinOccupiedSay);
+	} else if (verb == ACTION_LOOK && obj1._id == POSTER) {
+		_gm->_state._taxiPossibility &= ~4; // add culture palace
+		return false;
+	} else 
+		return false;
+	return true;
+}
+
+Cabin2::Cabin2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 7;
+	_id = CABIN2;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, GAMES, 22);
+	_objectState[1] = Object(_id, kStringHood, kStringHoodDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kString400Xa, kStringDefaultDescription, PRIZE, TAKE, 255, 255, 2 + 180);
+	_objectState[3] = Object(_id, kString10Xa, kStringDefaultDescription, BACK_MONEY, TAKE, 255, 255, 2 + 128);
+	_objectState[4] = Object(_id, kStringSlot, kStringSlotDescription1, SLOT1, COMBINABLE, 2, 2, 0);
+	_objectState[5] = Object(_id, kStringSlot, kStringSlotDescription2, NULLOBJECT, COMBINABLE, 3, 3, 0);
+	_objectState[6] = Object(_id, kStringChair, kStringChairDescription, CHAIR, NULLTYPE, 4, 4, 0);
+	_objectState[7] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE1, NULLTYPE, 5, 5, 0);
+	_objectState[8] = Object(_id, kStringScribble, kStringDefaultDescription, SCRIBBLE2, NULLTYPE, 6, 6, 0);
+	_objectState[9] = Object(_id, kStringFace, kStringFaceDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
+	_objectState[10] = Object(_id, kStringSign, kStringDefaultDescription, SIGN, UNNECESSARY, 1, 1, 0);
+}
+
+void Cabin2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Cabin2::animation() {
+	if (_shown[kMaxSection - 1]) {
+		if (isSectionVisible(1))
+			_vm->renderImage(1 + 128);
+		else
+			_vm->renderImage(1);
+	}
+	_gm->setAnimationTimer(4);
+}
+
+bool Cabin2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, MONEY, SLOT1)) {
+		if (isSectionVisible(2))
+			_vm->renderMessage(kStringTakeMoney);
+		else if (_shown[kMaxSection - 1])
+			_vm->renderMessage(kStringAlreadyPaid);
+		else if (_gm->_state._money < 10)
+			_vm->renderMessage(kStringNoMoney);
+		else {
+			_vm->renderMessage(kStringPay10Xa);
+			_gm->takeMoney(-10);
+			_shown[kMaxSection - 1] = true;
+		}
+	} else if (verb == ACTION_USE && obj1._id == CHAIR) {
+		if (_shown[kMaxSection - 1]) {
+			if (_shown[kMaxSection - 2]) {
+				_vm->paletteFadeOut();
+				_vm->setCurrentImage(31);
+				_vm->renderImage(0);
+				_vm->paletteFadeIn();
+				_shown[kMaxSection - 1] = true;
+				_gm->getInput();
+				_vm->paletteFadeOut();
+				_vm->setCurrentImage(7);
+				_vm->renderImage(0);
+				setSectionVisible(1, kShownFalse);
+				_shown[kMaxSection - 1] = false;
+				_vm->renderRoom(*this);
+				_vm->renderImage(2);
+				_gm->drawGUI();
+				_vm->paletteFadeIn();
+				getObject(3)->_click = 8;
+			} else {
+				_gm->_state._tipsy = false;
+				_vm->paletteFadeOut();
+				_vm->_system->fillScreen(kColorBlack);
+				_vm->_screen->setViewportBrightness(255);
+				Common::String text = _vm->getGameString(kStringWillPassOut);
+				_vm->renderMessage(text);
+				_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+				_vm->removeMessage();
+				_vm->paletteFadeOut();
+				_vm->saveGame(kSleepAutosaveSlot, "autosave");
+				_gm->_inventory.clear();
+				_gm->changeRoom(PYRAMID);
+				_gm->drawGUI();
+			}
+		} else
+			_vm->renderMessage(kStringRest);
+	} else if (verb == ACTION_TAKE && obj1._id == PRIZE) {
+		_vm->renderImage(2 + 128);
+		obj1._click = 255;
+		_gm->takeMoney(400);
+	} else if (verb == ACTION_TAKE && obj1._id == BACK_MONEY) {
+		_vm->renderImage(2 + 128);
+		obj1._click = 255;
+		_gm->takeMoney(10);
+	} else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE1) {
+		_vm->renderMessage(kStringCypher);
+	} else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE2) {
+		_gm->animationOff();
+		_vm->setCurrentImage(28);
+		_vm->renderImage(0);
+		_gm->getInput();
+		_vm->setCurrentImage(7);
+		_vm->renderRoom(*this);
+		_gm->drawGUI();
+		_gm->_state._addressKnown = true;
+		_gm->animationOn();
+	} else if (verb == ACTION_LOOK && obj1._id == SIGN) {
+		_gm->animationOff();
+		_vm->setCurrentImage(38);
+		_vm->renderImage(0);
+		_gm->getInput();
+		_vm->setCurrentImage(7);
+		_vm->renderRoom(*this);
+		_gm->drawGUI();
+		_gm->animationOn();
+	} else 
+		return false;
+	return true;
+}
+
+Kiosk::Kiosk(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 19;
+	_id = KIOSK;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, STREET, 22);
+	_objectState[1] = Object(_id, kStringBooks, kStringDefaultDescription, BOOKS, UNNECESSARY, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringDictionary, kStringDefaultDescription, LEXICON, UNNECESSARY, 1, 1, 0);
+	_objectState[3] = Object(_id, kStringPlant, kStringDefaultDescription, PLANT, UNNECESSARY, 2, 2, 0);
+	_objectState[4] = Object(_id, kStringMask, kStringDefaultDescription, BMASK, UNNECESSARY, 4, 4, 2 + 128);
+	_objectState[5] = Object(_id, kStringSnake, kStringDefaultDescription, SNAKE, UNNECESSARY, 3, 3, 0);
+	_objectState[6] = Object(_id, kStringCup, kStringDefaultDescription, CUP, UNNECESSARY, 5, 5, 0);
+	_objectState[7] = Object(_id, kStringJoystick, kStringDefaultDescription, JOYSTICK, UNNECESSARY, 6, 6, 0);
+	_objectState[8] = Object(_id, kStringToothbrush, kStringToothbrushDescription, TOOTHBRUSH, TAKE, 7, 7, 5 + 128);
+	_objectState[9] = Object(_id, kStringMusic, kStringMusicDescription, PLAYER, TAKE | COMBINABLE, 8, 8, 4 + 128);
+	_objectState[10] = Object(_id, kStringBottle, kStringBottleDescription, BOTTLE, TAKE, 9, 9, 3 + 128);
+	_objectState[11] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE1, UNNECESSARY, 10, 10, 0);
+	_objectState[12] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE2, UNNECESSARY, 11, 11, 0);
+	_objectState[13] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE3, UNNECESSARY, 12, 12, 0);
+	_objectState[14] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE4, UNNECESSARY, 13, 13, 0);
+	_objectState[15] = Object(_id, kStringBox, kStringDefaultDescription, BOX, UNNECESSARY, 14, 14, 0);
+	_objectState[16] = Object(_id, kStringFace, kStringDefaultDescription, FACES, UNNECESSARY, 15, 15, 0);
+	_objectState[17] = Object(_id, kStringSeller, kStringDefaultDescription, SELLER, TALK, 16, 16, 0);
+}
+
+void Kiosk::onEntrance() {
+	static int dialEntry[2] = {
+		kStringGoodEvening,
+		kStringHello
+	};
+
+	if (!hasSeen()) {
+		_gm->dialog(2, _gm->_dials, dialEntry, 0);
+		_vm->renderImage(6);
+		_vm->playSound(kAudioKiosk);
+		_gm->wait(8);
+		_vm->renderImage(6 + 128);
+		_gm->reply(kStringScaredMe, 1, 1 +128);
+		_gm->say(kStringHowSo);
+		_gm->reply(kStringDisguise, 1, 1 +128);
+		_gm->say(kStringWhatDisguise);
+		_gm->reply(kStringStopPretending, 1, 1 +128);
+		_gm->reply(kStringYouDisguised, 1, 1 +128);
+		_gm->say(kStringIAmHorstHummel);
+		_gm->reply(kStringGiveItUp, 1, 1 +128);
+		_gm->reply(kStringGestures, 1, 1 +128);
+		_gm->reply(kStringMovesDifferently, 1, 1 +128);
+		_gm->say(kStringHeIsRobot);
+		_gm->reply(kStringYouAreCrazy, 1, 1 +128);
+		_gm->say(kStringYouIdiot);
+		_gm->reply(kStringShutUp, 1, 1 +128);
+		_gm->drawGUI();
+		setRoomSeen(true);
+	}
+}
+
+void Kiosk::animation() {
+}
+
+bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
+	static int dialPrice[2] = {
+		kStringWillTakeIt,
+		kStringTooExpensive
+	};
+	static int dialSay[3] = {
+		kStringWouldBuy,
+		kStringMeHorstHummel,
+		kStringHaveMusicChip
+	};
+	static int dialSeller[16][3] = {
+		{kStringGreatMask, kStringThreeYears, kNoString},
+		{kStringStrongDrink, kNoString, kNoString},
+		{kStringMusicDevice, kNoString, kNoString},
+		{kStringArtusToothbrush, kStringSellInBulk, kNoString},
+		{kStringRarityBooks, kNoString, kNoString},
+		{kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words},
+		{kStringNotSale, kNoString, kNoString},
+		{kStringGaveOne, kStringExcited, kNoString},
+		{kStringFromGame, kNoString, kNoString},
+		{kStringRobust, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringCheapSwill, kNoString, kNoString},
+		{kStringStickers, kNoString, kNoString},
+		{kStringDishes, kStringUgly, kStringSellsWell}
+	};
+
+	if (verb == ACTION_TAKE && !(obj1._type & CARRIED) &&
+		obj1._id >= BOTTLE && obj1._id <= TOOTHBRUSH) {
+		int price = 0;
+		switch (obj1._id) {
+		case BOTTLE:
+			price = 30;
+			break;
+		case PLAYER:
+			price = 50;
+			break;
+		case TOOTHBRUSH:
+			price = 5;
+			break;
+		default:
+			break;
+		}
+		Common::String format = _vm->getGameString(kStringThatCosts);
+		Common::String cost = Common::String::format(format.c_str(), price);
+		_vm->renderMessage(cost, kMessageTop);
+		_gm->reply(cost.c_str(), 1, 1 +128);
+
+		if (_gm->_state._money < price)
+			_gm->say(dialPrice[1]);
+		else if (_gm->dialog(2, _gm->_dials, dialPrice, 0) == 0) {
+			_gm->takeObject(obj1);
+			_gm->takeMoney(-price);
+		}
+		_gm->drawGUI();
+	} else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
+		for(int i = 0; i < 3; i++) {
+			_gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + 128);
+		}
+	} else if (verb == ACTION_TALK && obj1._id >= SELLER) {
+		int i = 2;
+		if (getObject(9)->_type & CARRIED)
+			i++;
+		switch (_gm->dialog(i, _gm->_dials, dialSay, 0)) {
+		case 0:
+			_gm->reply(kStringTakeALook, 1, 1 + 128);
+			break;
+		case 1:
+			_gm->reply(kStringNonsense, 1, 1 + 128);
+			break;
+		case 2:
+			_gm->reply(kStringImSorry, 1, 1 + 128);
+			break;
+		}
+		_gm->drawGUI();
+	} else 
+		return false;
+	return true;
+}
+
+CulturePalace::CulturePalace(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 20;
+	_id = CULTURE_PALACE;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, CHECKOUT, 6);
+	_objectState[1] = Object(_id, kStringCulturePalace, kStringFascinating, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringTaxis, kStringTaxisDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[3] = Object(_id, kStringAxacussan, kStringDefaultDescription, AXACUSSER, TALK, 4, 4, 0);
+	_objectState[4] = Object(_id, kStringParticipationCard, kStringDefaultDescription, CARD, TAKE, 255, 255, 0);
+}
+
+void CulturePalace::onEntrance() {
+	setRoomSeen(true);
+}
+
+void CulturePalace::animation() {
+	static int i;
+	if (isSectionVisible(4))
+		setSectionVisible(4, kShownFalse);
+	else
+		setSectionVisible(4, kShownTrue);
+	i--;
+	if (i <= 0) {
+		if (isSectionVisible(3)) {
+			setSectionVisible(3, kShownFalse);
+			i = 4;
+		} else {
+			setSectionVisible(3, kShownTrue);
+			i = 10;
+		}
+	}
+	_gm->setAnimationTimer(2);
+}
+
+void CulturePalace::notEnoughMoney() {
+	_gm->reply(kStringWhat, 2, 1);
+	_gm->reply(kStringNotInformed, 2, 1);
+	_vm->renderImage(1 + 128);
+	setSectionVisible(2, kShownFalse);
+}
+
+bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
+	static int dial1[3] = {
+		kStringHorstHummel,
+		kStringNiceWeather,
+		kStringTellTicket,
+	};
+	static byte dials1[] = {1, 1, 2};
+
+	static int dial2[2] = {
+		kStringHereIsXa,
+		kStringYouAreCrazy
+	};
+	static int dial3[4] = {
+		kString500Xa,
+		kString1000Xa,
+		kString5000Xa,
+		kString10000Xa
+	};
+
+	int e;
+	if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
+		if (_shown[kMaxSection - 3]) {
+			_vm->renderImage(1);
+			_gm->reply(kStringThankYou, 2, 1);
+		} else if (_shown[kMaxSection - 2]) {
+			_vm->renderImage(1);
+			_gm->reply(kStringWhatYouOffer, 2, 1);
+		} else {
+			_gm->say(kStringHello2);
+			_vm->renderImage(1);
+			_gm->reply(kStringWhatYouWant, 2, 1);
+			addSentence(1, 1);
+			switch (_gm->dialog(3, dials1, dial1, 1)) {
+			case 0:
+				_gm->reply(kStringWhoAreYou, 2, 1);
+				_gm->say(kStringHorstHummel2);
+				_gm->reply(kStringNeverHeard, 2, 1);
+				_gm->say(kStringYouDontKnow);
+				_gm->say(kStringImOnTV);
+				_gm->reply(kStringIDontKnow, 2, 1);
+				_gm->say(kStringFunny);
+				break;
+			case 1:
+				_gm->reply(kStringAha, 2, 1);
+				break;
+			case 2:
+				_gm->reply(kStringICan, 2, 1);
+				_gm->say(kStringFromWhom);
+				_gm->reply(kStringCost, 2, 1);
+				if(!_gm->_state._money)
+					addSentence(2, 1);
+				else if (_gm->dialog(2, _gm->_dials, dial2, 0)) {
+					_gm->reply(kStringAsYouSay, 2, 1);
+					addSentence(2, 1);
+				} else {
+					_gm->takeMoney(-1);
+					_gm->reply(kStringGetCard, 2, 1);
+					_gm->reply(kStringOnlyParticipation, 2, 1);
+					_gm->say(kStringWhatForIt);
+					_gm->reply(kStringMakeOffer, 2, 1);
+					_shown[kMaxSection - 2] = true;
+				}
+				break;
+			}
+		}
+		_vm->renderImage(1 + 128);
+		setSectionVisible(2, kShownFalse);
+		_gm->drawGUI();
+	}
+	else if (verb == ACTION_GIVE && obj2._id == AXACUSSER && _shown[kMaxSection - 2]) {
+		_vm->renderImage(1);
+		if (obj1._id != MONEY)
+			notEnoughMoney();
+		else {
+			if (_gm->_state._money >= 10000) {
+				if ((e = _gm->dialog(4, _gm->_dials, dial3, 0)) >= 2) {
+					_gm->reply(kStringGoodOffer, 2, 1);
+					_vm->playSound(kAudioSuccess2);
+					_gm->reply(kStringGiveCard, 2, 1);
+					if (e == 2)
+						_gm->takeMoney(-5000);
+					else
+						_gm->takeMoney(-10000);
+					_gm->takeObject(*getObject(4));
+					_vm->renderImage(1 + 128);
+					setSectionVisible(2, false);
+					_gm->reply(kStringIdiot, 0, 0);
+					_shown[kMaxSection - 2] = false;
+					_shown[kMaxSection - 3] = true;
+					_gm->_rooms[CHECKOUT]->addSentence(1,1);
+					_gm->drawGUI();
+				} else {
+					notEnoughMoney();
+					_gm->drawGUI();
+				}
+			} else 
+				notEnoughMoney();
+		}
+	} else 
+		return false;
+	return true;
+}
+
+Checkout::Checkout(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 21;
+	_id = CHECKOUT;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringEntrance, kStringDefaultDescription, KP_ENTRANCE, EXIT, 0, 0, 0, NULLROOM, 3);
+	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, CULTURE_PALACE, 22);
+	_objectState[2] = Object(_id, kStringAxacussian, kStringDefaultDescription, AXACUSSER, TALK, 1, 1, 0);
+}
+
+void Checkout::onEntrance() {
+	if (!_shown[kMaxSection - 3]) {
+		_shown[kMaxSection - 3] = true;
+		_gm->reply(kStringAtMusicContest, 1, 1 + 128);
+		_gm->say(kStringNoImitation);
+		_gm->reply(kStringGoodJoke, 1, 1 + 128);
+		_gm->say(kStringIAmHorstHummel);
+		_gm->reply(kStringCommon, 1, 1 + 128);
+		_gm->say(kStringIWillProof);
+		_gm->say(kStringIWillPerform);
+		_gm->drawGUI();
+	}
+	setRoomSeen(true);
+}
+
+void Checkout::animation() {
+}
+
+bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
+	static int dialCheckout1[3] = {
+		kStringCheckout1,
+		kStringCheckout2,
+		kStringCheckout3
+	};
+	static int dialCheckout2[2] = {
+		kStringYes,
+		kStringNo
+	};
+	static int dialStage1[3] = {
+		kStringCheckout4,
+		kStringCheckout5,
+		kStringCheckout6
+	};
+	static int dialStage2[2] = {
+		kStringCheckout7,
+		kStringCheckout8
+	};
+	static int dialStage3[3] = {
+		kStringCheckout9,
+		kStringCheckout10,
+		kStringCheckout11
+	};
+	static int dialStage4[3] = {
+		kStringCheckout12,
+		kStringCheckout13
+	};
+	if (verb == ACTION_WALK && obj1._id == KP_ENTRANCE) {
+		if (_shown[kMaxSection - 4]) {
+			_vm->renderImage(2);
+			_gm->reply(kStringCheckout14, 0, 0);
+			_vm->renderImage(2 + 128);
+		} else if (_shown[kMaxSection - 2] == 0) {
+			_vm->renderImage(2);
+			_gm->reply(kStringCheckout15, 0, 0);
+			_vm->renderImage(2 + 128);
+			if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
+				_gm->say(kStringCheckout16);
+				_gm->reply(kStringCheckout17, 0, 0);
+			} else
+				_gm->say(kStringCheckout18);
+			_gm->drawGUI();
+		} else if (_shown[kMaxSection - 2] == 1) {
+			_gm->reply(kStringCheckout19, 1, 1 + 128);
+		} else {
+			if (_gm->_state._tipsy) {
+				_vm->setCurrentImage(22);
+				_vm->renderImage(0);
+				if (_shown[kMaxSection - 5] && _gm->_state._admission >= 2)
+					appearance();
+				else {
+					_gm->dialog(3, _gm->_dials, dialStage1, 0);
+					_gm->dialog(2, _gm->_dials, dialStage2, 0);
+					_vm->renderMessage(kStringCheckout20, 100, 70);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_vm->renderMessage(kStringCheckout21, 200, 40);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->say(kStringCheckout22);
+					_gm->dialog(3, _gm->_dials, dialStage3, 0);
+					_vm->renderMessage(kStringCheckout23, 120, 70);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->say(kStringCheckout24);
+					_vm->renderMessage(kStringCheckout25, 40, 100);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->dialog(2, _gm->_dials, dialStage4, 0);
+					_vm->playSound(kAudioStage1);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage1);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage2);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage2);
+					_vm->renderMessage(kStringCheckout26, 250, 80);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage1);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->removeMessage();
+					_vm->playSound(kAudioStage2);
+					_vm->renderMessage(kStringCheckout27, 140, 60);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_vm->playSound(kAudioStage2);
+					while(_vm->_sound->isPlaying())
+						_gm->wait(1);
+					_gm->wait(2);
+					_vm->removeMessage();
+					_vm->playSound(kAudioStage2);
+					_vm->renderMessage(kStringCheckout26, 180, 50);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_vm->renderMessage(kStringCheckout28, 50, 110);
+					_gm->waitOnInput(_gm->_messageDuration);
+					_vm->removeMessage();
+					_gm->say(kStringCheckout29);
+					_vm->renderRoom(*this);
+					if (_shown[kMaxSection - 5])
+						_vm->renderMessage(kStringCheckout30);
+					else
+						_vm->renderMessage(kStringCheckout31);
+					_shown[kMaxSection - 4] = true;
+					_gm->drawGUI();
+				}
+			} else {
+				_vm->renderMessage(kStringCheckout32);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->renderMessage(kStringCheckout33);
+			}
+		}
+	} else if (verb == ACTION_GIVE && obj1._id == CHIP && obj2._id == AXACUSSER &&
+			_shown[kMaxSection - 2] == 1) {
+		_gm->_inventory.remove(obj1);
+		_shown[kMaxSection - 5] = true;
+		_gm->reply(kStringCheckout37, 1, 1 + 128);
+		_shown[kMaxSection - 2] = 2;
+		_gm->drawGUI();
+	} else if (verb == ACTION_GIVE && obj1._id == CARD && obj2._id == AXACUSSER) {
+		_gm->_inventory.remove(*_gm->_rooms[CULTURE_PALACE]->getObject(4));
+		_gm->reply(kStringCheckout34, 1, 1 + 128);
+		_gm->reply(kStringCheckout35, 1, 1 + 128);
+		if (_gm->dialog(2, _gm->_dials, dialCheckout2, 0) == 1) {
+			_gm->reply(kStringCheckout36, 1, 1 + 128);
+			_shown[kMaxSection - 2] = 1;
+		} else {
+			_gm->reply(kStringCheckout37, 1, 1 + 128);
+			_shown[kMaxSection - 2] = 2;
+		}
+		_gm->drawGUI();
+	} else if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
+		if (_shown[kMaxSection - 4]) {
+			_gm->say(kStringCheckout38);
+			_gm->reply(kStringCheckout39, 1, 1 + 128);
+			_gm->drawGUI();
+		} else {
+			switch (_shown[kMaxSection - 2]) {
+			case 0:
+				addSentence(2, 1);
+				switch (_gm->dialog(3, _gm->_dials, dialCheckout1, 1)) {
+				case 0:
+					_gm->reply(kStringCheckout40, 1, 1 + 128);
+					_gm->say(kStringNo);
+					_gm->reply(kStringCheckout41, 1, 1 + 128);
+					_gm->say(kStringCheckout42);
+					break;
+				case 1:
+					_gm->reply(kStringCheckout43, 1, 1 + 128);
+					if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
+						_gm->say(kStringCheckout44);
+						return interact(ACTION_GIVE,
+								*_gm->_rooms[CULTURE_PALACE]->getObject(4),
+								*_gm->_rooms[CHECKOUT]->getObject(2));
+					} else {
+						_gm->say(kStringNo);
+						_gm->reply(kStringCheckout45, 1, 1 + 128);
+						_gm->say(kStringCheckout46);
+					}
+					break;
+				case 2:
+					_gm->reply(kStringCheckout47, 1, 1 + 128);
+					break;
+				}
+				_gm->drawGUI();
+				break;
+			case 1:
+				_gm->reply(kStringCheckout48, 1, 1 + 128);
+				break;
+			case 2:
+				_gm->reply(kStringCheckout49, 1, 1 + 128);
+				break;
+			}
+		}
+	} else 
+		return false;
+	return true;
+}
+
+void Checkout::shouting() {
+	static int i = 0;
+	switch(i)
+	{
+	case  50:
+		_vm->renderMessage(kStringShout1, 100, 60);
+		break;
+	case 130:
+		_vm->renderMessage(kStringShout2, 50, 90);
+		break;
+	case 200:
+		_vm->renderMessage(kStringShout3, 200, 80);
+		break;
+	case 300:
+		_vm->renderMessage(kStringShout4, 70, 30);
+		break;
+	case 400:
+		_vm->renderMessage(kStringShout5, 190, 90);
+		break;
+	case 450:
+		_vm->renderMessage(kStringShout6, 160, 60);
+		break;
+	case 500:
+		_vm->renderMessage(kStringShout7, 180, 70);
+		break;
+	case 530:
+		_vm->renderMessage(kStringShout8, 50, 20);
+		break;
+	case 610:
+		_vm->renderMessage(kStringShout9, 230, 50);
+		break;
+	case 650:
+		_vm->renderMessage(kStringShout10, 100, 90);
+		break;
+	case 720:
+		_vm->renderMessage(kStringShout11, 176, 65);
+		break;
+	case 800:
+		_vm->renderMessage(kStringShout12, 60, 20);
+		break;
+	case 850:
+		_vm->renderMessage(kStringShout13, 160, 40);
+		break;
+	case 930:
+		_vm->renderMessage(kStringShout14, 60, 95);
+		break;
+	case 1000:
+		_vm->renderMessage(kStringShout15, 100, 65);
+		break;
+	case  70:
+			  // fall through
+	case 150:
+			  // fall through
+	case 220:
+			  // fall through
+	case 320:
+			  // fall through
+	case 420:
+			  // fall through
+	case 470:
+			  // fall through
+	case 520:
+			  // fall through
+	case 550:
+			  // fall through
+	case 630:
+			  // fall through
+	case 680:
+			  // fall through
+	case 740:
+			  // fall through
+	case 820:
+			  // fall through
+	case 870:
+			  // fall through
+	case 950:
+			  // fall through
+	case 1020:
+		_vm->removeMessage();
+		break;
+	default: {} //do nothing
+	}
+	i++;
+}
+
+void Checkout::appearance() {
+	_vm->_allowSaveGame = false;
+	_vm->_allowLoadGame = false;
+	int xp = 0;
+	CursorMan.showMouse(false);
+	_vm->playSound(kMusicMadMonkeys);
+	Common::KeyCode k = Common::KEYCODE_INVALID;
+	while(_vm->_sound->isPlaying()) {
+		if (_gm->waitOnInput(1, k))
+			break;
+		shouting();
+	}
+	_vm->_sound->stop();
+	_vm->removeMessage();
+	CursorMan.showMouse(true);
+	_vm->removeMessage();
+	_vm->playSound(kAudioAppearance1);
+	while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
+		_gm->wait(1);
+	_vm->paletteFadeOut();
+
+	_vm->setCurrentImage(39);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_gm->wait(50);
+	_vm->setCurrentImage(40);
+	_vm->renderImage(0);
+	for (int i = 1; i < 11; i++) {
+		_gm->wait(3);
+		_vm->renderImage(i);
+	}
+	_vm->playSound(kAudioAppearance2);
+	_gm->wait(30);
+	_vm->renderImage(11);
+	_vm->playSound(kAudioAppearance2);
+	_gm->wait(60);
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->setCurrentImage(42);
+	_vm->renderImage(0);
+	_vm->renderImage(11);
+	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance1);
+	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance2);
+	_vm->renderImage(4);
+	_gm->wait(3);
+	_vm->renderImage(6);
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance3);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance4);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance5);
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance6);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance7);
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance8);
+	_gm->talk(12, 13, 4, kMessageCenter, kStringAppearance9);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(4 + 128);
+	_gm->talkRest(12, 13, 4);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(6);
+	_gm->talkRest(12, 13, _gm->_restTime + 6);
+	_vm->removeMessage();
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance10);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance11);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance12);
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance13);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance14);
+	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance15);
+	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance16);
+	_gm->talk(12, 13, 2, kMessageCenter, kStringAppearance17);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(4 + 128);
+	_gm->talkRest(12, 13, 4);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(6);
+	_gm->talkRest(12, 13, _gm->_restTime + 6);
+	_vm->removeMessage();
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance18);
+	_gm->talk(12, 13, 1, kMessageCenter, kStringAppearance19);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(4 + 128);
+	_gm->talkRest(12, 13, 4);
+	_vm->renderImage(4);
+	_gm->talkRest(12, 13, 1);
+	_vm->renderImage(6);
+	_gm->talkRest(12, 13, _gm->_restTime + 6);
+	_vm->removeMessage();
+	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance20);
+	_gm->talk(12, 13, 1, kMessageCenter, kStringAppearance21);
+	_vm->renderImage(17);
+	_gm->wait(2);
+	_vm->renderImage(18);
+	_gm->wait(2);
+	_vm->renderImage(19);
+	_gm->wait(2);
+	_vm->renderImage(20);
+	_gm->wait(3);
+	_vm->renderImage(21);
+	_vm->renderImage(19);
+	_gm->wait(1);
+	_vm->renderImage(21+128);
+	_vm->renderImage(22);
+	_vm->renderImage(18);
+	_gm->wait(1);
+	_vm->renderImage(22+128);
+	_vm->renderImage(23);
+	_gm->wait(1);
+	_vm->renderImage(23+128);
+	_vm->renderImage(24);
+	_vm->renderImage(17);
+	_gm->wait(1);
+	_vm->renderImage(24+128);
+	_vm->renderImage(25);
+	_gm->wait(1);
+	_vm->renderImage(25+128);
+	_vm->renderImage(32);
+	_vm->renderImage(11);
+	_vm->renderImage(26);
+	_vm->playSound(kAudioAppearance3);
+	_gm->wait(2);
+	_vm->renderImage(32+128);
+	_vm->renderImage(33);
+	_vm->renderImage(27);
+	_gm->wait(2);
+	_vm->renderImage(33+128);
+	_vm->renderImage(34);
+	_vm->renderImage(28);
+	_gm->wait(2);
+	_vm->renderImage(29);
+	_gm->wait(2);
+	_vm->renderImage(30);
+	_gm->wait(2);
+	_vm->renderImage(31);
+	_gm->wait(2);
+	_gm->wait(50);
+	_vm->paletteFadeOut();
+
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->_screen->setViewportBrightness(255);
+	_vm->_screen->setGuiBrightness(255);
+	_vm->paletteBrightness();
+	_vm->renderMessage(kStringAppearance22);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance23);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance24);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance25);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance26);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance27);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->_screen->setViewportBrightness(0);
+	_vm->_screen->setGuiBrightness(0);
+	_vm->paletteBrightness();
+	_vm->setCurrentImage(44);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+
+	MSNImage *image = _vm->_screen->getCurrentImage();
+
+	int i = 0;
+	do {
+		_vm->renderImage(1);
+		_gm->wait(1);
+		_vm->renderImage(1 + 128);
+		image->_section[1].x1 += xp;
+		image->_section[1].x2 += xp;
+		image->_section[1].y1 -= 2;
+		image->_section[1].y2 -= 2;
+		i++;
+		if (i == 6) {
+			i = 0;
+			xp++;
+		}
+	} while (image->_section[1].y1 < 200);
+	_vm->paletteFadeOut();
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->_screen->setViewportBrightness(255);
+	_vm->_screen->setGuiBrightness(255);
+	_vm->paletteBrightness();
+	_vm->renderMessage(kStringAppearance28);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance29);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance30);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringAppearance31);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_gm->changeRoom(SHIP);
+	_gm->_state._dark = true;
+	_vm->_screen->setViewportBrightness(1);
+	_vm->paletteBrightness();
+	_gm->drawGUI();
+	_vm->_allowSaveGame = true;
+	_vm->_allowLoadGame = true;
+}
+
+City1::City1(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 23;
+	_id = CITY1;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSign, kStringSign1Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[1] = Object(_id, kStringSign, kStringSign2Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR2, 10);
+	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR2, 14);
+}
+
+void City1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void City1::animation() {
+}
+
+bool City1::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
+		_objectState[0]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
+		_objectState[0]._click = 2;
+	} else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
+		_objectState[1]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
+		_objectState[1]._click = 3;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
+		_gm->_state._elevatorNumber = 1;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
+		_gm->_state._elevatorNumber = 2;
+	}
+	_gm->_rooms[ELEVATOR2]->getObject(5)->_exitRoom = CITY1;
+	_gm->_state._elevatorE = 0;
+	return false;
+}
+
+City2::City2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 23;
+	_id = CITY2;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSign, kStringSign3Description, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[1] = Object(_id, kStringSign, kStringSign4Description, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_L, EXIT | OPENABLE, 0, 0, 1, ELEVATOR2, 10);
+	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR_R, EXIT | OPENABLE, 1, 1, 2, ELEVATOR2, 14);
+}
+
+void City2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void City2::animation() {
+}
+
+bool City2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_OPEN && obj1._id == DOOR_L) {
+		_objectState[0]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_L) {
+		_objectState[0]._click = 2;
+	} else if (verb == ACTION_OPEN && obj1._id == DOOR_R) {
+		_objectState[1]._click = 255;
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR_R) {
+		_objectState[1]._click = 3;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_L) {
+		_gm->_state._elevatorNumber = 3;
+	} else if (verb == ACTION_WALK && obj1._id == DOOR_R) {
+		_gm->_state._elevatorNumber = 4;
+	}
+	_gm->_rooms[ELEVATOR2]->getObject(5)->_exitRoom = CITY2;
+	_gm->_state._elevatorE = 0;
+	return false;
+}
+
+Elevator2::Elevator2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 24;
+	_id = ELEVATOR2;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSlot, kStringDefaultDescription, SLOT, COMBINABLE, 0, 0, 0);
+	_objectState[1] = Object(_id, kStringBell, kStringDefaultDescription, BELL, PRESS, 1, 1, 0);
+	_objectState[2] = Object(_id, kStringDisplay, kStringDefaultDescription, DISPLAY, NULLTYPE, 2, 2, 0);
+	_objectState[3] = Object(_id, kStringKeypad, kStringKeypadDescription, KEYPAD, PRESS, 3, 3, 0);
+	_objectState[4] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | CLOSED, 4, 4, 0, APARTMENT, 3);
+	_objectState[5] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED | CLOSED, 255, 255, 0, CITY1, 22);
+}
+
+void Elevator2::onEntrance() {
+	if (_gm->_state._elevatorE)
+		_objectState[5]._type &= ~OPENED;
+	else
+		_objectState[5]._type |= OPENED;
+}
+
+void Elevator2::animation() {
+}
+
+bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
+	static int dialLuke1[4] = {
+		kStringElevator2,
+		kStringElevator3,
+		kStringElevator4,
+		kStringElevator5
+	};
+	static byte dialsLuke1[3] = {2,1,1};
+	static int dialBoss1[2] = {
+		kStringElevator6,
+		kStringElevator7
+	};
+	Common::String input;
+
+	if (verb == ACTION_LOOK && obj1._id == DISPLAY) {
+		Common::String format = _vm->getGameString(kStringElevator1);
+		Common::String display = 
+			Common::String::format(format.c_str(), _gm->_state._elevatorE);
+		_vm->renderMessage(display);
+	} else if (verb == ACTION_PRESS && obj1._id == BELL) {
+		_vm->renderImage(8);
+		_vm->playSound(kAudioElevatorBell);
+		while(_vm->_sound->isPlaying())
+			_gm->wait(1);
+		_vm->renderImage(8 + 128);
+		if (_gm->_state._elevatorNumber == 4 && _gm->_state._elevatorE == 4 && !_gm->_state._toMuseum) {
+			_gm->wait(18);
+			_vm->renderImage(1);
+			_gm->wait(3);
+			_vm->renderImage(2);
+			setSectionVisible(1, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(3);
+			setSectionVisible(2, kShownFalse);
+			_gm->reply(kStringWhatYouWant, 4, 3);
+			switch (_gm->dialog(3, dialsLuke1, dialLuke1, 1)) {
+			case 0:
+				_gm->reply(kStringElevator11, 4, 3);
+				_vm->renderImage(2);
+				setSectionVisible(3, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1);
+				setSectionVisible(2, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1 + 128);
+				_vm->renderMessage(kStringElevator12);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->renderImage(1);
+				_gm->wait(3);
+				_vm->renderImage(2);
+				setSectionVisible(1, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(3);
+				setSectionVisible(2, kShownFalse);
+				_gm->reply(kStringElevator13, 4, 3);
+				setSectionVisible(3, kShownFalse);
+				setSectionVisible(4, kShownFalse);
+				_vm->paletteFadeOut();
+				_vm->_system->fillScreen(kColorBlack);
+				_vm->_screen->setViewportBrightness(255);
+				_vm->renderMessage(kStringElevator14);
+				_gm->waitOnInput(_gm->_messageDuration);
+				_vm->removeMessage();
+				_vm->_screen->setViewportBrightness(0);
+				_vm->setCurrentImage(26);
+				_vm->renderImage(0);
+				_vm->paletteFadeIn();
+				_gm->reply(kStringElevator15, 1, 1 + 128);
+				_gm->say(kStringYes);
+				_gm->reply(kStringElevator16, 1, 1 + 128);
+				_gm->reply(kStringElevator17, 1, 1 + 128);
+				if (_gm->dialog(2, _gm->_dials, dialBoss1, 0)) {
+					_gm->reply(kStringElevator18, 1, 1 + 128);
+					_gm->reply(kStringElevator19, 1, 1 + 128);
+					_gm->say(kStringElevator20);
+				}
+				_gm->reply(kStringElevator21, 1, 1 + 128);
+				_gm->reply(kStringElevator22, 1, 1 + 128);
+				_gm->reply(kStringElevator23, 1, 1 + 128);
+				_gm->reply(kStringElevator24, 1, 1 + 128);
+				_gm->reply(kStringElevator25, 1, 1 + 128);
+				_gm->reply(kStringElevator26, 1, 1 + 128);
+				_gm->reply(kStringElevator27, 1, 1 + 128);
+				_gm->reply(kStringElevator28, 1, 1 + 128);
+				jobDescription();
+				return true;
+			case 1:
+				_gm->reply(kStringElevator59, 4, 3);
+				_vm->renderImage(2);
+				setSectionVisible(3, kShownFalse);
+				setSectionVisible(4, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1);
+				setSectionVisible(2, kShownFalse);
+				_vm->renderImage(1 + 128);
+				break;
+			case 2:
+				_gm->reply(kStringElevator60, 4, 3);
+				_vm->renderImage(2);
+				setSectionVisible(3, kShownFalse);
+				setSectionVisible(4, kShownFalse);
+				_gm->wait(3);
+				_vm->renderImage(1);
+				setSectionVisible(2, kShownFalse);
+				_vm->renderImage(1 + 128);
+				break;
+			}
+			_gm->drawGUI();
+		} else
+			_vm->renderMessage(kStringElevator61);
+	} else if ((verb == ACTION_USE || verb == ACTION_PRESS) && obj1._id == KEYPAD) {
+		_vm->renderMessage(kStringElevator62);
+		do {
+			_gm->edit(input, 237, 66, 2);
+		} while ((_gm->_key.keycode != Common::KEYCODE_RETURN) && 
+				 (_gm->_key.keycode != Common::KEYCODE_ESCAPE) && !_vm->shouldQuit());
+		_vm->removeMessage();
+		if (_gm->_key.keycode == Common::KEYCODE_RETURN && input[0] != 0) {
+			for (unsigned i = 0; i < input.size(); i++) {
+				if (input[i] < '0' || input[i] > '9') {
+					_vm->renderMessage(kStringElevator63);
+					return true;
+				}
+			}
+			int64 number = input.asUint64();
+			if (number > 60)
+				_vm->renderMessage(kStringElevator63);
+			else if (number != _gm->_state._elevatorE) {
+				if (isSectionVisible(6)) {
+					_vm->renderImage(6 + 128);
+					_objectState[4]._type &= ~OPENED;
+					_vm->playSound(kAudioElevator1);
+				}
+				_vm->renderMessage(kStringElevator64);
+				_gm->_state._elevatorE = number;
+				if (number)
+					_objectState[5]._type &= ~OPENED;
+				else
+					_objectState[5]._type |= OPENED;
+			}
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ID_CARD, SLOT)) {
+		if (_gm->_state._elevatorNumber == 1 && _gm->_state._elevatorE == 32) {
+			_vm->renderImage(6);
+			_objectState[4]._type |= OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		} else
+			_vm->renderMessage(kStringElevator65);
+	} else
+		return false;
+	return true;
+}
+
+void Elevator2::jobDescription() {
+	static int dialBoss2[3] = {
+		kStringElevator8,
+		kStringElevator9,
+		kStringElevator10
+	};
+	byte dialsBoss2[4] = {1,1,1,1};
+
+	_gm->reply(kStringElevator29, 1, 1 + 128);
+	_gm->reply(kStringElevator30, 1, 1 + 128);
+	_gm->reply(kStringElevator31, 1, 1 + 128);
+	_gm->reply(kStringElevator32, 1, 1 + 128);
+	_vm->setCurrentImage(30);
+	_vm->renderImage(0);
+	_gm->waitOnInput(72);
+	_gm->reply(kStringElevator33, 0, 0);
+	_gm->reply(kStringElevator34, 0, 0);
+	_gm->reply(kStringElevator35, 0, 0);
+	_gm->reply(kStringElevator36, 0, 0);
+	_gm->reply(kStringElevator37, 0, 0);
+	_gm->reply(kStringElevator38, 0, 0);
+	_gm->reply(kStringElevator39, 0, 0);
+	_gm->reply(kStringElevator40, 0, 0);
+	_gm->reply(kStringElevator41, 0, 0);
+	_gm->reply(kStringElevator42, 0, 0);
+	_gm->reply(kStringElevator43, 0, 0);
+	_gm->reply(kStringElevator44, 0, 0);
+	_gm->reply(kStringElevator45, 0, 0);
+	_gm->reply(kStringElevator46, 0, 0);
+	_gm->reply(kStringElevator47, 0, 0);
+	_gm->reply(kStringElevator48, 0, 0);
+	_vm->setCurrentImage(26);
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->renderImage(0);
+	_gm->reply(kStringElevator49, 1, 1 + 128);
+	int e;
+	do {
+		addSentence(0, 2);
+		switch (e = _gm->dialog(4, dialsBoss2, dialBoss2, 2)) {
+		case 0:
+			_gm->reply(kStringElevator50, 1, 1 + 128);
+			jobDescription();
+			return;
+		case 1:
+			_gm->reply(kStringElevator51, 1, 1 + 128);
+			break;
+		case 2:
+			_gm->reply(kStringElevator52, 1, 1 + 128);
+			break;
+		}
+		if (e == 1 || e == 2)
+			_gm->reply(kStringElevator53, 1, 1 + 128);
+	} while (e != 3);
+	_gm->reply(kStringElevator54, 1, 1 + 128);
+	_vm->paletteFadeOut();
+	_vm->_system->fillScreen(kColorBlack);
+	_vm->_screen->setViewportBrightness(255);
+	_vm->renderMessage(kStringElevator55);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->_screen->setViewportBrightness(0);
+	_gm->_state._tipsy = false;
+	_gm->_state._toMuseum = true;
+	_vm->saveGame(kSleepAutosaveSlot, "autosave");
+	_gm->_inventory.clear();
+	_gm->takeObject(*_gm->_rooms[INTRO2]->getObject(3));
+	_gm->takeObject(*_gm->_rooms[INTRO2]->getObject(5));
+	_gm->takeObject(*_gm->_rooms[INTRO2]->getObject(6));
+	_gm->takeObject(*_gm->_rooms[INTRO2]->getObject(8));
+	_vm->setCurrentImage(29);
+	_gm->changeRoom(MUSEUM);
+	_vm->renderImage(0);
+	_vm->paletteFadeIn();
+	_vm->renderMessage(kStringElevator56);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringElevator57);
+	_gm->waitOnInput(_gm->_messageDuration);
+	_vm->removeMessage();
+	_vm->renderMessage(kStringElevator58);
+	_gm->drawGUI();
+
+	// 21:72:72
+	_gm->_state._startTime = g_system->getMillis() - 130363200;
+}
+
+Apartment::Apartment(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 25;
+	_id = APARTMENT;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringChip, kStringChipDescription, CHIP, TAKE | COMBINABLE, 255, 255, 1);
+	_objectState[1] = Object(_id, kStringHatch, kStringHatchDescription, HATCH, OPENABLE | CLOSED | COMBINABLE, 0, 1, 1);
+	_objectState[2] = Object(_id, kStringDefaultDescription, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringMusicSystem, kStringMusicSystemDescription, MUSIC_SYSTEM, COMBINABLE, 4, 4, 0);
+	_objectState[4] = Object(_id, kStringSpeakers, kStringSpeakersDescription, NULLOBJECT, NULLTYPE, 5, 5, 0);
+	_objectState[5] = Object(_id, kStringPencils, kStringPencilsDescription, NULLOBJECT, UNNECESSARY, 6, 6, 0);
+	_objectState[6] = Object(_id, kStringMetalBlocks, kStringMetalBlocksDescription, MAGNET, TAKE | COMBINABLE, 10, 10, 3 + 128);
+	_objectState[7] = Object(_id, kStringImage, kStringImageDescription, NULLOBJECT, UNNECESSARY, 7, 7, 0);
+	_objectState[8] = Object(_id, kStringCabinet, kStringCabinetDescription, CABINET, OPENABLE | CLOSED, 8, 8, 0);
+	_objectState[9] = Object(_id, kStringChair, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
+	_objectState[10] = Object(_id, kStringElevator, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, ELEVATOR2, 22);
+	_objectState[11] = Object(_id, kStringUnderBed, kStringUnderBedDescription, UNDER_BED, NULLTYPE, 11, 11, 0);
+	_objectState[12] = Object(_id, kStringKey, kStringKeyDescription, KEY, TAKE | COMBINABLE, 255, 255, 0);
+}
+
+void Apartment::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Apartment::animation() {
+}
+
+bool Apartment::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, ROD, UNDER_BED)) {
+		if (_objectState[12]._type & CARRIED)
+			_vm->renderMessage(kStringApartment1);
+		else if (_shown[kMaxSection - 1]) {
+			_vm->renderMessage(kStringApartment2);
+			_gm->takeObject(_objectState[12]);
+			_vm->playSound(kAudioSuccess2);
+		} else {
+			_vm->renderMessage(kStringApartment3);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_vm->renderMessage(kStringApartment4);
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, HATCH)) {
+		if (_objectState[1]._type & OPENED)
+			_vm->renderMessage(kStringApartment5);
+		else {
+			_vm->renderImage(1);
+			_vm->playSound(kAudioTaxiOpen);
+			_objectState[1]._type |= OPENED;
+			_objectState[1]._click = 1;
+			if (!(_objectState[0]._type & CARRIED)) {
+				_vm->renderImage(2);
+				_objectState[0]._click = 2;
+			}
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == HATCH && obj1._type & OPENED) {
+		_vm->renderImage(1 + 128);
+		setSectionVisible(2, false);
+		_vm->playSound(kAudioElevator1);
+		obj1._type &= ~OPENED;
+		obj1._click = 0;
+		if (!(_objectState[0]._type & CARRIED))
+			_objectState[0]._click = 255;
+	} else if (verb == ACTION_TAKE && obj1._id == CHIP && !(obj1._type & CARRIED)) {
+		setSectionVisible(2, kShownFalse);
+		return false;
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, KEY, CABINET)) {
+		_vm->renderMessage(kStringApartment6);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CHIP, MUSIC_SYSTEM)) {
+		_vm->renderMessage(kStringApartment7);
+	} else if (verb == ACTION_PRESS && obj1._id == MUSIC_SYSTEM) {
+		_vm->renderMessage(kStringApartment8);
+	} else
+		return false;
+	return true;
+}
+
+Ship::Ship(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 45;
+	_id = SHIP;
+	_shown[0] = kShownTrue;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSwitch, kStringDefaultDescription, SWITCH, PRESS | COMBINABLE, 0, 0, 0);
+	_objectState[1] = Object(_id, kStringHandle, kStringDefaultDescription, HANDLE, NULLTYPE, 255, 255, 0);
+	_objectState[2] = Object(_id, kStringHatch2, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 255, 255, 0, SHIP, 19);
+	_objectState[3] = Object(_id, kStringSwitch, kStringDefaultDescription, DOOR_SWITCH, PRESS | COMBINABLE, 255, 255, 0);
+	_objectState[4] = Object(_id, kStringSpaceSuit, kStringSpaceSuitDescription, SUIT, TAKE, 255, 255, 1);
+	_objectState[5] = Object(_id, kStringCable, kStringCableDescription1, RCABLE, COMBINABLE, 255, 255, 0);
+	_objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + 128);
+
+	_outroText = 
+		_vm->getGameString(kStringIntro1) + '\0' + 
+		_vm->getGameString(kStringIntro2) + '\0' + 
+		_vm->getGameString(kStringIntro3) + '\0' + 
+		_vm->getGameString(kStringIntro4) + '\0' + 
+		_vm->getGameString(kStringIntro5) + '\0' + 
+		"^Matthias Neef#" + '\0' +
+		"^Sascha Otterbach#" + '\0' +
+		"^Thomas Mazzoni#" + '\0' +
+		"^Matthias Klein#" + '\0' +
+		"^Gerrit Rothmaier#" + '\0' +
+		"^Thomas Hassler#" + '\0' +
+		"^Rene Kach#" + '\0' +
+		'\233' + '\0';
+	Common::String waitString = "##################";
+	_outroText2 = 
+		waitString + '\0' +
+		_vm->getGameString(kStringOutro1) + '\0' + 
+		_vm->getGameString(kStringOutro2) + '\0' + 
+		_vm->getGameString(kStringOutro3) + '\0' + 
+		_vm->getGameString(kStringOutro4) + '\0' + 
+		_vm->getGameString(kStringOutro5) + '\0' + 
+		'\233' + '\0';
+}
+
+void Ship::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Ship::animation() {
+}
+
+bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_PRESS && obj1._id == SWITCH) {
+		if (_gm->_state._dark) {
+			_gm->_state._dark = false;
+			_vm->_screen->setViewportBrightness(255);
+			_objectState[1]._click = 1;
+			_objectState[2]._click = 2;
+			_objectState[3]._click = 3;
+			_objectState[5]._click = 4;
+			_objectState[6]._click = 5;
+			_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+			_gm->drawMapExits();
+		}
+	} else if (verb == ACTION_PRESS && obj1._id == DOOR_SWITCH &&
+			!isSectionVisible(7)) {
+		_vm->renderImage(3);
+		_gm->wait(2);
+		_vm->renderImage(6);
+		_vm->playSound(kAudioShip1);
+		while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
+			_gm->wait(1);
+		_vm->renderImage(6 + 128);
+		_vm->renderImage(7);
+		_objectState[3]._description = kStringShip1;
+		_objectState[2]._description = kStringShip2;
+	} else if (verb == ACTION_PULL && obj1._id == HANDLE) {
+		_vm->renderImage(2);
+		_vm->playSound(kAudioTaxiOpen);
+		obj1._click = 255;
+		_objectState[4]._click = 9;
+	} else if (verb == ACTION_TAKE && obj1._id == SUIT && !(obj1._type & CARRIED)) {
+		setSectionVisible(2, kShownFalse);
+		_gm->takeObject(obj1);
+	} else if (verb == ACTION_USE && obj1._id == SUIT) {
+		if (!(obj1._type & CARRIED)) {
+			setSectionVisible(2, kShownFalse);
+			_gm->takeObject(obj1);
+		}
+		if ((_shown[kMaxSection - 1] = !_shown[kMaxSection - 1]))
+			_vm->renderMessage(kStringShip3);
+		else
+			_vm->renderMessage(kStringShip4);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, RCABLE)) {
+		_objectState[6]._description = kStringDefaultDescription;
+		if (_objectState[6]._click == 5)
+			_vm->renderImage(8 + 128);
+		if (_objectState[6]._type & CARRIED)
+			_gm->_inventory.remove(_objectState[6]);
+		if (isSectionVisible(11) || isSectionVisible(10))
+			_vm->renderMessage(kStringShip5);
+		else if (isSectionVisible(9)) {
+			_vm->renderImage(9 + 128);
+			_vm->renderImage(11);
+			if (!_shown[kMaxSection - 1])
+				kill();
+			_objectState[6]._click = 8;
+			_gm->wait(2);
+			_vm->renderImage(4);
+			_vm->playSound(kAudioShip2);
+			_gm->wait(3);
+			_vm->renderImage(5);
+			_objectState[2]._type |= OPENED;
+			_objectState[2]._description = kStringDefaultDescription;
+		} else {
+			_vm->renderImage(10);
+			if (!_shown[kMaxSection - 1])
+				kill();
+			_objectState[6]._click = 7;
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, DOOR_SWITCH) && isSectionVisible(7)) {
+		_objectState[6]._description = kStringDefaultDescription;
+		if (_objectState[6]._click == 5)
+			_vm->renderImage(8 + 128);
+		if (_objectState[6]._type & CARRIED)
+			_gm->_inventory.remove(_objectState[6]);
+		if (isSectionVisible(11) || isSectionVisible(9))
+			_vm->renderMessage(kStringShip5);
+		else if (isSectionVisible(10)) {
+			_vm->renderImage(10 + 128);
+			_vm->renderImage(11);
+			if (!_shown[kMaxSection - 1])
+				kill();
+			_objectState[6]._click = 8;
+			_gm->wait(2);
+			_vm->renderImage(4);
+			_vm->playSound(kAudioShip2);
+			_gm->wait(3);
+			_vm->renderImage(5);
+			_objectState[2]._type |= OPENED;
+			_objectState[2]._description = kStringDefaultDescription;
+		} else {
+			_vm->renderImage(9);
+			_objectState[6]._click = 6;
+		}
+	} else if (verb == ACTION_TAKE && obj1._id == CABLE && obj1._type & CARRIED) {
+		if (isSectionVisible(8)) {
+			obj1._description = kStringDefaultDescription;
+			_gm->takeObject(obj1);
+		} else
+			_vm->renderMessage(kStringShip6);
+	} else if (verb == ACTION_WALK && obj1._type == (EXIT | OPENABLE | CLOSED | OPENED)) {
+		_vm->setCurrentImage(46);
+		_vm->renderImage(0);
+		_gm->wait(16);
+		_vm->renderMessage(kStringShip7, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip8, 1, 1 + 128);
+		_vm->renderMessage(kStringShip9, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip10, 1, 1 + 128);
+		_gm->reply(kStringShip11, 1, 1 + 128);
+		_gm->reply(kStringShip12, 1, 1 + 128);
+		_gm->reply(kStringShip13, 1, 1 + 128);
+		_vm->renderMessage(kStringShip14, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip15, 1, 1 + 128);
+		_vm->renderMessage(kStringShip16, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringAha, 1, 1 + 128);
+		_gm->reply(kStringShip17, 1, 1 + 128);
+		_vm->renderMessage(kStringShip18, kMessageRight);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_gm->reply(kStringShip19, 1, 1 + 128);
+		_gm->wait(16);
+		CursorMan.showMouse(false);
+		_vm->renderImage(2);
+		for (int i = 3; i < 12; i++) {
+			_vm->renderImage(i);
+			if (i == 9)
+				_vm->playSound(kAudioShip3);
+			_gm->wait(2);
+			_vm->renderImage(i + 128);
+		}
+		_vm->renderImage(12);
+		_gm->wait(18);
+		// TODO some palette stuff
+		outro();
+	} else
+		return false;
+	return true;
+}
+
+void Ship::outro() {
+	_vm->_screen->paletteFadeOut(100);
+	_vm->renderImage(13);
+	// Because the screen is partialy faded out, the original values (63, 20, 20)
+	// should be multiplied by 2.55, but are multiplied by 3.5, because the color
+	// looks closer to the original
+	byte palette[768];
+	_vm->_system->getPaletteManager()->grabPalette(palette, 0, 255);
+	palette[282] = 220;
+	palette[283] = 70;
+	palette[284] = 70;
+	// Restore marquee colors
+	for (int i = 0; i < 3; i++) {
+		palette[kColorPurple * 3 + i] *= 2.5;
+		palette[kColorLightYellow * 3 + i] *= 2.5;
+	}
+	_vm->_system->getPaletteManager()->setPalette(palette, 0, 255);
+	_vm->playSound(kMusicMadMonkeys);
+	_vm->renderBox(0, 190, 320, 10, kColorBlack);
+	Marquee marquee(_vm->_screen, Marquee::kMarqueeOutro, _outroText.c_str());
+	for(int i = 0; i < 2; i++) {
+		while (!_vm->shouldQuit()) {
+			_gm->updateEvents();
+			
+			if (!marquee.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
+				break;
+			g_system->updateScreen();
+			g_system->delayMillis(_vm->_delay);
+		}
+		marquee.reset();
+	}
+	Marquee marquee2(_vm->_screen, Marquee::kMarqueeOutro, _outroText2.c_str());
+	while (!_vm->shouldQuit()) {
+		_gm->updateEvents();
+		
+		if (!marquee2.renderCharacter() || _gm->_mouseClicked || _gm->_keyPressed)
+			break;
+		g_system->updateScreen();
+		g_system->delayMillis(_vm->_delay);
+	}
+	// TODO: End with some end of music
+	int volume;
+	do {
+		volume = _vm->_sound->getVolume() - 10;
+		_vm->_sound->setVolume(volume);
+		_gm->waitOnInput(1);
+	} while (volume > 10 && !_vm->shouldQuit());
+	Common::Event event;
+	event.type = Common::EVENT_RTL;
+	_vm->getEventManager()->pushEvent(event);
+}
+
+void Ship::kill() {
+	_vm->playSound(kAudioShipDeath);
+	while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
+		_gm->wait(1);
+	_gm->dead(kStringShip0);
+}
+
+Pyramid::Pyramid(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 8;
+	_id = PYRAMID;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + 128);
+	_objectState[1] = Object(_id, kStringSign, kStringSignDescription, SIGN, COMBINABLE, 25, 25, 0);
+	_objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 7);
+	_objectState[3] = Object(_id, kStringPyramid, kStringPyramidDescription, NULLOBJECT, NULLTYPE, 26, 26, 0);
+	_objectState[4] = Object(_id, kStringSun, kStringSunDescription, SUN, NULLTYPE, 28, 28, 0);
+	_objectState[5] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE1, COMBINABLE, 0, 0, 0);
+	_objectState[6] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE2, COMBINABLE, 1, 0, 0);
+	_objectState[7] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE3, COMBINABLE, 2, 0, 0);
+	_objectState[8] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE4, COMBINABLE, 3, 0, 0);
+	_objectState[9] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE5, COMBINABLE, 4, 0, 0);
+	_objectState[10] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE6, COMBINABLE, 5, 0, 0);
+	_objectState[11] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE7, COMBINABLE, 6, 0, 0);
+	_objectState[12] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE8, COMBINABLE, 7, 0, 0);
+	_objectState[13] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE9, COMBINABLE, 8, 0, 0);
+	_objectState[14] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE10, COMBINABLE, 9, 0, 0);
+	_objectState[15] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE11, COMBINABLE, 10, 0, 0);
+	_objectState[16] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE12, COMBINABLE, 11, 0, 0);
+	_objectState[17] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE13, COMBINABLE, 12, 0, 0);
+	_objectState[18] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE14, COMBINABLE, 13, 0, 0);
+	_objectState[19] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE15, COMBINABLE, 14, 0, 0);
+	_objectState[20] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE16, COMBINABLE, 15, 0, 0);
+	_objectState[21] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE17, COMBINABLE, 16, 0, 0);
+	_objectState[22] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE18, COMBINABLE, 17, 0, 0);
+	_objectState[23] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE19, COMBINABLE, 18, 0, 0);
+	_objectState[24] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE20, COMBINABLE, 19, 0, 0);
+	_objectState[25] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE21, COMBINABLE, 20, 0, 0);
+	_objectState[26] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE22, COMBINABLE, 21, 0, 0);
+	_objectState[27] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE23, COMBINABLE, 22, 0, 0);
+	_objectState[28] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE24, COMBINABLE, 23, 0, 0);
+	_objectState[29] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE25, COMBINABLE, 24, 0, 0);
+}
+
+void Pyramid::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Pyramid::animation() {
+}
+
+bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
+	Object *rope, *hole;
+	rope = hole = nullptr;
+
+	if (obj1._id == ROPE)
+		rope = &obj1;
+	if (obj2._id == ROPE)
+		rope = &obj2;
+	if (obj1._id >= HOLE1 && obj1._id <= HOLE25)
+		hole = &obj1;
+	if (obj2._id >= HOLE1 && obj2._id <= HOLE25)
+		hole = &obj2;
+
+	if (verb == ACTION_WALK && obj1._id == PYRA_ENTRANCE) {
+		_gm->_state._eventCallback = kPyramidEndFn;
+		_gm->_state._eventTime = g_system->getMillis() + 3600000; //hour
+		_gm->_state._pyraS = 4;
+		_gm->_state._pyraZ = 10;
+		_gm->_state._pyraDirection = 0;
+		_gm->passageConstruction();
+		return false;
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, SIGN)) {
+		if (rope->_type & CARRIED) {
+			_vm->renderImage(1);
+			_gm->_inventory.remove(*rope);
+			_objectState[0]._click = 29;
+		} else
+			_vm->renderMessage(kStringPyramid1);
+	} else if (verb == ACTION_USE && hole != nullptr && rope != nullptr) {
+		if (rope->_type & CARRIED)
+			_vm->renderMessage(kStringPyramid2);
+		else {
+			int number = hole->_id - HOLE1;
+			int start = number / 5 * 5 + 2;
+			for (int i = 1; i <= 26; i++)
+				_vm->renderImage(i + 128);
+			for (int i = start; i <= start + number % 5; i++)
+				_vm->renderImage(i);
+			_objectState[0]._click = 30;
+			if (number == 18) {
+				_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownTrue);
+				_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 5;
+				_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = EXIT;
+			} else {
+				_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+				_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+				_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+			}
+		}
+	} else if (verb == ACTION_PULL && rope != nullptr && !(rope->_type & CARRIED) &&
+			!isSectionVisible(1)) {
+		for (int i = 2; i <= 26; i++)
+			_vm->renderImage(i + 128);
+		_vm->renderImage(1);
+		_objectState[0]._click = 29;
+		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+	} else if (verb == ACTION_TAKE && rope != nullptr && !(rope->_type & CARRIED)) {
+		for (int i = 2; i <= 26; i++)
+			_vm->renderImage(i + 128);
+		_gm->takeObject(*rope);
+		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
+		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
+		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
+	} else if (verb == ACTION_WALK && obj1._id == SUN) {
+		_vm->renderMessage(kStringPyramid3);
+	} else
+		return false;
+	return true;
+}
+
+PyrEntrance::PyrEntrance(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 9;
+	_id = PYR_ENTRANCE;
+	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringSign, kStringSign5Description, SIGN, NULLTYPE, 255, 255, 0);
+	_objectState[1] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[2] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[3] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void PyrEntrance::onEntrance() {
+	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
+		_gm->setAnimationTimer(1);
+		_waitTime = g_system->getMillis() + 60000;
+	}
+}
+
+void PyrEntrance::animation() {
+	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
+		if (g_system->getMillis() >= _waitTime) { // around 1 minute
+			_vm->renderMessage(kStringPyramid4);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_gm->_state._pyraZ++;
+			_gm->_state._pyraDirection = 0;
+			_gm->changeRoom(FLOORDOOR);
+			_vm->setCurrentImage(14);
+			_vm->renderRoom(*_gm->_rooms[FLOORDOOR]);
+			_gm->drawMapExits();
+			_gm->wait(3);
+			_vm->renderImage(5);
+			_gm->wait(3);
+			_vm->renderImage(6);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(5, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(7);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(6, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(8);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(7, kShownFalse);
+			_gm->wait(3);
+			_vm->renderImage(9);
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(8, kShownFalse);
+			_vm->playSound(kAudioShip3);
+			_gm->screenShake();
+			_gm->_rooms[FLOORDOOR]->setSectionVisible(kMaxSection - 1, kShownTrue);
+		} else {
+			_gm->setAnimationTimer(1);
+		}
+	} else
+		_gm->setAnimationTimer(kMaxTimerValue);
+}
+
+bool PyrEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+	static RoomEntry roomTab[29] = {
+		{2, 8, 6, 0, FLOORDOOR},
+		{0, 8, 4, 2, FLOORDOOR_U},
+		{0, 4, 11, 2, PYRAMID},
+		{0, 0, 2, 1, UPSTAIRS1},
+		{1, 1, 2, 3, DOWNSTAIRS1},
+		{0, 5, 8, 3, BOTTOM_RIGHT_DOOR},
+		{0, 4, 8, 1, BOTTOM_LEFT_DOOR},
+		{1, 5, 8, 3, UPPER_DOOR},
+		{1, 4, 8, 1, UPPER_DOOR},
+		{0, 4, 8, 0, UPSTAIRS2},
+		{1, 4, 7, 2, DOWNSTAIRS2},
+		{1, 6, 6, 2, PUZZLE_FRONT},
+		{1, 6, 7, 0, PUZZLE_BEHIND},
+		{0, 3, 6, 0, FORMULA1_N},
+		{0, 3, 7, 0, FORMULA1_F},
+		{0, 4, 6, 0, FORMULA2_N},
+		{0, 4, 7, 0, FORMULA2_F},
+		{0, 8, 9, 2, TOMATO_N},
+		{0, 8, 8, 2, TOMATO_F},
+		{1, 4, 2, 0, MONSTER_F},
+		{1, 10, 8, 0, MONSTER_F},
+		{1, 4, 1, 0, MONSTER1_N},
+		{1, 10, 7, 0, MONSTER2_N},
+		{0, 2, 4, 2, DOWNSTAIRS3},
+		{1, 2, 5, 0, UPSTAIRS3},
+		{1, 2, 5, 3, LCORRIDOR1},
+		{1, 1, 5, 1, LCORRIDOR2},
+		{1, 1, 5, 3, HOLE_ROOM},
+		{0, 7, 4, 0, BST_DOOR}
+	};
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (_gm->_rooms[FLOORDOOR]->isSectionVisible(kMaxSection - 1))
+		roomTab[0]._e = 1;
+	else
+		roomTab[0]._e = 2;
+	for (int i = 0; i < 29; i++) {
+		if (_gm->_state._pyraE == roomTab[i]._e &&
+			_gm->_state._pyraS == roomTab[i]._s &&
+			_gm->_state._pyraZ == roomTab[i]._z &&
+			_gm->_state._pyraDirection == roomTab[i]._r) {
+			_gm->changeRoom(roomTab[i]._exitRoom);
+			_gm->_newRoom = true;
+			return true;
+		}
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Upstairs1::Upstairs1(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 10;
+	_id = UPSTAIRS1;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void Upstairs1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Upstairs1::animation() {
+}
+
+bool Upstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Downstairs1::Downstairs1(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 10;
+	_id = DOWNSTAIRS1;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void Downstairs1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Downstairs1::animation() {
+}
+
+bool Downstairs1::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+BottomRightDoor::BottomRightDoor(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 12;
+	_id = BOTTOM_RIGHT_DOOR;
+	_shown[0] = kShownTrue;
+	_shown[19] = kShownTrue;
+	_shown[23] = kShownTrue;
+	_shown[29] = kShownTrue;
+	_shown[30] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
+	_objectState[3] = Object(_id, kStringButton, kStringDefaultDescription, BUTTON, PRESS, 19, 19, 0);
+}
+
+void BottomRightDoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void BottomRightDoor::animation() {
+}
+
+bool BottomRightDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_PRESS && obj1._id == BUTTON) {
+		if (isSectionVisible(22)) {
+			_vm->renderImage(21);
+			setSectionVisible(22, kShownFalse);
+			_gm->wait(2);
+			_vm->renderImage(20);
+			setSectionVisible(21, kShownFalse);
+			_gm->wait(2);
+			_vm->renderImage(19);
+			setSectionVisible(20, kShownFalse);
+			_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+			_objectState[2]._id = DOOR;
+			_objectState[2]._description = kStringMassive;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = DOOR;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringMassive;
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_id = CORRIDOR;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringDefaultDescription;
+		} else {
+			_vm->renderImage(20);
+			setSectionVisible(19, kShownFalse);
+			_gm->wait(2);
+			_vm->renderImage(21);
+			_gm->wait(2);
+			_vm->renderImage(22);
+			_objectState[2]._type = EXIT;
+			_objectState[2]._id = CORRIDOR;
+			_objectState[2]._description = kStringDefaultDescription;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(20, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(21, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(22, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(19, kShownFalse);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(27, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(28, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->setSectionVisible(24, kShownTrue);
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_type = EXIT;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_id = CORRIDOR;
+			_gm->_rooms[BOTTOM_LEFT_DOOR]->getObject(2)->_description = kStringDefaultDescription;
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(26, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(27, kShownFalse);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(19, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->setSectionVisible(25, kShownTrue);
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_id = DOOR;
+			_gm->_rooms[UPPER_DOOR]->getObject(2)->_description = kStringMassive;
+		}
+		_vm->playSound(kAudioShip3);
+		_gm->screenShake();
+	} else
+		return false;
+	return true;
+}
+
+BottomLeftDoor::BottomLeftDoor(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 12;
+	_id = BOTTOM_LEFT_DOOR;
+	_shown[0] = kShownTrue;
+	_shown[19] = kShownTrue;
+	_shown[29] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void BottomLeftDoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void BottomLeftDoor::animation() {
+}
+
+bool BottomLeftDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		if (verb == ACTION_WALK && obj1._id == G_LEFT)
+			_gm->changeRoom(UPSTAIRS2);
+		else
+			_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else
+		return false;
+	return true;
+}
+
+Upstairs2::Upstairs2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 10;
+	_id = UPSTAIRS2;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void Upstairs2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Upstairs2::animation() {
+}
+
+bool Upstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	if (obj1._id == G_RIGHT)
+		_gm->changeRoom(BOTTOM_LEFT_DOOR);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Downstairs2::Downstairs2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 10;
+	_id = DOWNSTAIRS2;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void Downstairs2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Downstairs2::animation() {
+}
+
+bool Downstairs2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+	return true;
+}
+
+UpperDoor::UpperDoor(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 12;
+	_id = UPPER_DOOR;
+	_shown[0] = kShownTrue;
+	_shown[26] = kShownTrue;
+	_shown[27] = kShownTrue;
+	_shown[30] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void UpperDoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void UpperDoor::animation() {
+}
+
+bool UpperDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+PuzzleFront::PuzzleFront(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 12;
+	_id = PUZZLE_FRONT;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[9] = kShownTrue;
+	_shown[10] = kShownTrue;
+	_shown[11] = kShownTrue;
+	_shown[12] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[15] = kShownTrue;
+	_shown[30] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 255, 255, 0, PYR_ENTRANCE, 2);
+	_objectState[3] = Object(_id, kStringPiece, kStringDefaultDescription, PART0, PRESS, 3, 3, 0);
+	_objectState[4] = Object(_id, kStringPiece, kStringDefaultDescription, PART1, PRESS, 4, 4, 0);
+	_objectState[5] = Object(_id, kStringPiece, kStringDefaultDescription, PART2, PRESS, 5, 5, 0);
+	_objectState[6] = Object(_id, kStringPiece, kStringDefaultDescription, PART3, PRESS, 6, 6, 0);
+	_objectState[7] = Object(_id, kStringPiece, kStringDefaultDescription, PART4, PRESS, 7, 7, 0);
+	_objectState[8] = Object(_id, kStringPiece, kStringDefaultDescription, PART5, PRESS, 8, 8, 0);
+	_objectState[9] = Object(_id, kStringPiece, kStringDefaultDescription, PART6, PRESS, 9, 9, 0);
+	_objectState[10] = Object(_id, kStringPiece, kStringDefaultDescription, PART7, PRESS, 10, 10, 0);
+	_objectState[11] = Object(_id, kStringPiece, kStringDefaultDescription, PART8, PRESS, 11, 11, 0);
+	_objectState[12] = Object(_id, kStringPiece, kStringDefaultDescription, PART9, PRESS, 12, 12, 0);
+	_objectState[13] = Object(_id, kStringPiece, kStringDefaultDescription, PART10, PRESS, 13, 13, 0);
+	_objectState[14] = Object(_id, kStringPiece, kStringDefaultDescription, PART11, PRESS, 14, 14, 0);
+	_objectState[15] = Object(_id, kStringPiece, kStringDefaultDescription, PART12, PRESS, 15, 15, 0);
+	_objectState[16] = Object(_id, kStringPiece, kStringDefaultDescription, PART13, PRESS, 16, 16, 0);
+	_objectState[17] = Object(_id, kStringPiece, kStringDefaultDescription, PART14, PRESS, 17, 17, 0);
+	_objectState[18] = Object(_id, kStringPiece, kStringDefaultDescription, PART15, PRESS, 18, 18, 0);
+}
+
+void PuzzleFront::onEntrance() {
+	setRoomSeen(true);
+}
+
+void PuzzleFront::animation() {
+}
+
+bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
+	MSNImage *image = _vm->_screen->getCurrentImage();
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_PRESS && obj1._id >= PART0 && obj1._id <= PART15) {
+		int pos = obj1._id - PART0;
+		int newPos = 0;
+		if (pos > 3  && _gm->_puzzleField[pos - 4] == 255)
+			newPos = pos - 4;
+		else if (pos < 12 && _gm->_puzzleField[pos + 4] == 255)
+			newPos = pos + 4;
+		else if ((pos % 4) > 0 && _gm->_puzzleField[pos - 1] == 255)
+			newPos = pos - 1;
+		else if ((pos % 4) < 3 && _gm->_puzzleField[pos + 1] == 255)
+			newPos = pos + 1;
+		else {
+			_vm->renderMessage(kStringPyramid5);
+			return true;
+		}
+		int a = _gm->_puzzleField[pos] + 1;
+		_vm->renderImage(a + 128);
+		image->_section[a].x1 = 95 + (newPos % 4) * 33;
+		image->_section[a].x2 = image->_section[a].x1 + 31;
+		image->_section[a].y1 = 24 + (newPos / 4) * 25;
+		image->_section[a].y2 = image->_section[a].y1 + 23;
+		_vm->renderImage(a);
+		_vm->playSound(kAudioTaxiOpen);
+		_gm->_state._puzzleTab[a - 1] = newPos;
+		_gm->_puzzleField[pos] = 255;
+		_gm->_puzzleField[newPos] = a - 1;
+		_objectState[pos + 3]._click = 255;
+		_objectState[newPos + 3]._click = newPos + 3;
+		for (int i = 0; i < 15; i++)
+			if (_gm->_state._puzzleTab[i] != i)
+				return true;
+		
+		_gm->wait(2);
+		_vm->renderImage(16);
+		for (int i = 1; i < 16; i++)
+			setSectionVisible(i, kShownFalse);
+		_gm->wait(2);
+		_vm->renderImage(17);
+		_gm->wait(2);
+		_vm->renderImage(18);
+		_objectState[2]._type = EXIT;
+		_objectState[2]._id = CORRIDOR;
+		_objectState[2]._description = kStringDefaultDescription;
+		_objectState[2]._click = 0;
+		
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(31, kShownFalse);
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(26, kShownTrue);
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(27, kShownTrue);
+		_gm->_rooms[PUZZLE_BEHIND]->setSectionVisible(29, kShownTrue);
+		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_type = EXIT;
+		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_id = CORRIDOR;
+		_gm->_rooms[PUZZLE_BEHIND]->getObject(2)->_description = kStringDefaultDescription;
+		_vm->playSound(kAudioShip3);
+		_gm->screenShake();
+	} else
+		return false;
+	return true;
+}
+
+PuzzleBehind::PuzzleBehind(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 12;
+	_id = PUZZLE_BEHIND;
+	_shown[0] = kShownTrue;
+	_shown[29] = kShownTrue;
+	_shown[31] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void PuzzleBehind::onEntrance() {
+	setRoomSeen(true);
+}
+
+void PuzzleBehind::animation() {
+}
+
+bool PuzzleBehind::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Formula1F::Formula1F(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 14;
+	_id = FORMULA1_F;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 1, 1, 0, PYR_ENTRANCE, 2);
+}
+
+void Formula1F::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula1F::animation() {
+}
+
+bool Formula1F::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR)
+		_gm->changeRoom(FORMULA1_N);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Formula1N::Formula1N(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 13;
+	_id = FORMULA1_N;
+	_shown[0] = kShownTrue;
+	_shown[5] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+}
+
+void Formula1N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula1N::animation() {
+}
+
+bool Formula1N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Formula2F::Formula2F(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 14;
+	_id = FORMULA2_F;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, CORRIDOR, EXIT, 2, 2, 0, PYR_ENTRANCE, 2);
+}
+
+void Formula2F::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula2F::animation() {
+}
+
+bool Formula2F::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR)
+		_gm->changeRoom(FORMULA2_N);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Formula2N::Formula2N(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 13;
+	_id = FORMULA2_N;
+	_shown[0] = kShownTrue;
+	_shown[6] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringInscription, kStringInscriptionDescription, NULLOBJECT, NULLTYPE, 3, 3, 0);
+}
+
+void Formula2N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Formula2N::animation() {
+}
+
+bool Formula2N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+TomatoF::TomatoF(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 14;
+	_id = TOMATO_F;
+	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringTomato, kStringFunnyDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void TomatoF::onEntrance() {
+	setRoomSeen(true);
+}
+
+void TomatoF::animation() {
+}
+
+bool TomatoF::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR)
+		_gm->changeRoom(TOMATO_N);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+TomatoN::TomatoN(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 13;
+	_id = TOMATO_N;
+	_shown[0] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringKnife1, kStringKnife1Description, TKNIFE, TAKE | COMBINABLE, 5, 5, 7);
+	_objectState[3] = Object(_id, kStringTomato, kStringFunnyDescription, NULLOBJECT, UNNECESSARY, 4, 4, 0);
+}
+
+void TomatoN::onEntrance() {
+	setRoomSeen(true);
+}
+
+void TomatoN::animation() {
+}
+
+bool TomatoN::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_TAKE && obj1._id == TKNIFE) {
+		_gm->takeObject(obj1);
+		setSectionVisible(8, kShownFalse);
+	} else
+		return false;
+	return true;
+}
+
+MonsterF::MonsterF(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 14;
+	_id = MONSTER_F;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[14] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringMonster, kStringMonsterDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void MonsterF::onEntrance() {
+	setRoomSeen(true);
+}
+
+void MonsterF::animation() {
+}
+
+bool MonsterF::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraS == 4)
+			_gm->changeRoom(MONSTER1_N);
+		else
+			_gm->changeRoom(MONSTER2_N);
+	} else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Monster1N::Monster1N(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 13;
+	_id = MONSTER1_N;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringRope, kStringRopeDescription, ROPE, TAKE | COMBINABLE, 255, 255, 2);
+	_objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
+	_objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
+	_objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
+}
+
+void Monster1N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Monster1N::animation() {
+}
+
+bool Monster1N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
+		if (obj1._type & OPENED)
+			_vm->renderMessage(kStringGenericInteract8);
+		else {
+			obj1._type |= OPENED;
+			if (isSectionVisible(kMaxSection - 1))
+				_vm->renderImage(2);
+			else {
+				_objectState[2]._click = 1;
+				_vm->renderImage(4);
+				setSectionVisible(2, kShownFalse);
+			}
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
+		if (obj1._type & OPENED) {
+			_vm->renderImage(1);
+			setSectionVisible(2, kShownFalse);
+			obj1._type &= ~OPENED;
+			_vm->playSound(kAudioElevator1);
+		} else
+			_vm->renderMessage(kStringGenericInteract11);
+	} else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
+		_gm->takeObject(obj1);
+		setSectionVisible(3, kShownFalse);
+		setSectionVisible(4, kShownFalse);
+		setSectionVisible(kMaxSection - 1, kShownTrue);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
+		_vm->renderMessage(kStringPyramid6);
+	} else
+		return false;
+	return true;
+}
+
+Monster2N::Monster2N(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 13;
+	_id = MONSTER2_N;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 8, 8, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 7, 7, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringNote, kStringNoteDescription, NOTE, TAKE | COMBINABLE, 255, 255, 2);
+	_objectState[3] = Object(_id, kStringEyes, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 6, 6, 0);
+	_objectState[4] = Object(_id, kStringMouth, kStringDefaultDescription, MOUTH, NULLTYPE, 1, 1, 0);
+	_objectState[5] = Object(_id, kStringMonster, kStringMonster1Description, MONSTER, NULLTYPE, 0, 0, 0);
+}
+
+void Monster2N::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Monster2N::animation() {
+}
+
+bool Monster2N::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if ((verb == ACTION_OPEN || verb == ACTION_PULL) && obj1._id == MOUTH) {
+		if (obj1._type & OPENED)
+			_vm->renderMessage(kStringGenericInteract8);
+		else {
+			obj1._type |= OPENED;
+			if (isSectionVisible(kMaxSection - 1))
+				_vm->renderImage(2);
+			else {
+				_objectState[2]._click = 1;
+				_vm->renderImage(3);
+				setSectionVisible(2, kShownFalse);
+			}
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == MOUTH) {
+		if (obj1._type & OPENED) {
+			_vm->renderImage(1);
+			setSectionVisible(2, kShownFalse);
+			obj1._type &= ~OPENED;
+			_vm->playSound(kAudioElevator1);
+		} else
+			_vm->renderMessage(kStringGenericInteract11);
+	} else if (verb == ACTION_TAKE && (obj1._id == ROPE || obj1._id == NOTE)) {
+		_gm->takeObject(obj1);
+		setSectionVisible(3, kShownFalse);
+		setSectionVisible(4, kShownFalse);
+		setSectionVisible(kMaxSection - 1, kShownTrue);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, MONSTER)) {
+		_vm->renderMessage(kStringPyramid6);
+	} else
+		return false;
+	return true;
+}
+
+Upstairs3::Upstairs3(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 10;
+	_id = UPSTAIRS3;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 0, 0, 0, PYR_ENTRANCE, 2);
+}
+
+void Upstairs3::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Upstairs3::animation() {
+}
+
+bool Upstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	if (obj1._id == G_LEFT)
+		_gm->changeRoom(LCORRIDOR1);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+Downstairs3::Downstairs3(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 10;
+	_id = DOWNSTAIRS3;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 3, 3, 0, PYR_ENTRANCE, 2);
+}
+
+void Downstairs3::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Downstairs3::animation() {
+}
+
+bool Downstairs3::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == CORRIDOR) {
+		if (_gm->_state._pyraE)
+			_gm->_state._pyraE = 0;
+		else
+			_gm->_state._pyraE = 1;
+	}
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+LCorridor1::LCorridor1(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 9;
+	_id = LCORRIDOR1;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
+}
+
+void LCorridor1::onEntrance() {
+	setRoomSeen(true);
+}
+
+void LCorridor1::animation() {
+}
+
+bool LCorridor1::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	if (obj1._id == G_RIGHT)
+		_gm->changeRoom(UPSTAIRS3);
+	else if (obj1._id == CORRIDOR)
+		_gm->changeRoom(HOLE_ROOM);
+	else
+		_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+LCorridor2::LCorridor2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 9;
+	_id = LCORRIDOR2;
+	_shown[0] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, CORRIDOR, EXIT, 6, 6, 0, PYR_ENTRANCE, 2);
+}
+
+void LCorridor2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void LCorridor2::animation() {
+}
+
+bool LCorridor2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (!_gm->move(verb, obj1))
+		return false;
+	_gm->passageConstruction();
+	_gm->_newRoom = true;
+	return true;
+}
+
+HoleRoom::HoleRoom(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 9;
+	_id = HOLE_ROOM;
+	_shown[0] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 1, 1, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 2, 2, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringOpening, kStringOpeningDescription1, HOLE, EXIT, 3, 3, 0, IN_HOLE, 12);
+	_objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription2, NULLOBJECT, NULLTYPE, 4, 4, 0);
+}
+
+void HoleRoom::onEntrance() {
+	setRoomSeen(true);
+}
+
+void HoleRoom::animation() {
+}
+
+bool HoleRoom::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, ROPE, G_RIGHT) || 
+				Object::combine(obj1, obj2, ROPE, G_LEFT))) {
+		_vm->renderMessage(kStringPyramid7);
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) || 
+				Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
+		_vm->renderMessage(kStringPyramid8);
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
+		_vm->renderMessage(kStringPyramid9);
+	} else if (verb == ACTION_WALK && obj1._id == HOLE && !isSectionVisible(16)) {
+		_vm->renderMessage(kStringPyramid10);
+	} else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(16)) {
+		_gm->changeRoom(IN_HOLE);
+		_gm->_newRoom = true;
+	} else
+		return false;
+	return true;
+}
+
+InHole::InHole(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 11;
+	_id = IN_HOLE;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, EXIT, 0, 0, 0, HOLE_ROOM, 2);
+	_objectState[1] = Object(_id, kStringNote, kStringNoteDescription1, NULLOBJECT, TAKE, 255, 255, 1 + 128);
+	_objectState[2] = Object(_id, kStringSlot, kStringSlotDescription3, SLOT, COMBINABLE, 1, 1, 0);
+}
+
+void InHole::onEntrance() {
+	setRoomSeen(true);
+}
+
+void InHole::animation() {
+}
+
+bool InHole::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, SLOT)) {
+		if (isSectionVisible(kMaxSection - 1))
+			_vm->renderMessage(kStringPyramid11);
+		else {
+			_vm->renderImage(1);
+			_objectState[1]._click = 2;
+			setSectionVisible(kMaxSection - 1, kShownTrue);
+		}
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE) {
+		_vm->renderMessage(kStringPyramid9);
+	} else if (verb == ACTION_USE && obj1._id == ROPE) {
+		_gm->changeRoom(HOLE_ROOM);
+		_gm->_newRoom = true;
+	} else
+		return false;
+	return true;
+}
+
+Floordoor::Floordoor(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 14;
+	_id = FLOORDOOR;
+	_shown[0] = kShownTrue;
+	_shown[14] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringKnife1, kStringDefaultDescription, TKNIFE, TAKE | COMBINABLE, 255, 255, 9);
+	_objectState[3] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE, 255, 255, 11+128);
+	_objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription3, HOLE, EXIT, 4, 4, 0, FLOORDOOR_U, 12);
+	_objectState[5] = Object(_id, kStringStones, kStringDefaultDescription, STONES, COMBINABLE, 5, 5, 0);
+}
+
+void Floordoor::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Floordoor::animation() {
+}
+
+bool Floordoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_WALK && obj1._id == HOLE) {
+		if (isSectionVisible(11)) {
+			_gm->_state._pyraZ = 4;
+			_gm->_state._pyraDirection = 2;
+			_gm->_state._pyraE = 0;
+			return false;
+		} else
+			_vm->renderMessage(kStringPyramid12);
+	} else if (verb == ACTION_USE && obj1._id == ROPE && isSectionVisible(11)) {
+		_gm->_state._pyraZ = 4;
+		_gm->_state._pyraDirection = 2;
+		_gm->_state._pyraE = 0 ;
+		_gm->changeRoom(FLOORDOOR_U);
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, TKNIFE, STONES)) {
+		_vm->renderImage(10);
+		if (obj1._id == TKNIFE)
+			_gm->_inventory.remove(obj1);
+		else
+			_gm->_inventory.remove(obj2);
+		_objectState[2]._click = 6;
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, TKNIFE, G_RIGHT) ||
+				Object::combine(obj1, obj2, TKNIFE, G_LEFT))) {
+		_vm->renderMessage(kStringPyramid8);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROPE, TKNIFE) &&
+					isSectionVisible(10)) {
+		_vm->renderImage(11);
+		setSectionVisible(10, kShownFalse);
+		if (obj1._id == ROPE)
+			_gm->_inventory.remove(obj1);
+		else
+			_gm->_inventory.remove(obj2);
+		_objectState[2]._click = 255;
+		_objectState[3]._click = 7;
+		_objectState[3]._type &= ~COMBINABLE;
+	} else if (verb == ACTION_USE && 
+			   (Object::combine(obj1, obj2, ROPE, G_RIGHT) ||
+				Object::combine(obj1, obj2, ROPE, G_LEFT)  ||
+				Object::combine(obj1, obj2, ROPE, STONES))) {
+		_vm->renderMessage(kStringPyramid7);
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE && !(obj1._type & CARRIED)) {
+		_gm->takeObject(obj1);
+		obj1._type |= COMBINABLE;
+		_vm->renderImage(9);
+		_vm->renderImage(10);
+		_objectState[2]._click = 6;
+	} else if (verb == ACTION_TAKE && obj1._id == TKNIFE && !(obj1._type & CARRIED)) {
+		_gm->takeObject(obj1);
+		setSectionVisible(10, kShownFalse);
+	} else
+		return false;
+	return true;
+}
+
+FloordoorU::FloordoorU(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 14;
+	_id = FLOORDOOR_U;
+	_shown[0] = kShownTrue;
+	_shown[12] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, NULLTYPE, 10, 10, 0, FLOORDOOR, 2);
+	_objectState[3] = Object(_id, kStringOpening, kStringDefaultDescription, HOLE, EXIT, 8, 8, 0, FLOORDOOR, 2);
+	_objectState[4] = Object(_id, kStringPlate, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
+}
+
+void FloordoorU::onEntrance() {
+	setRoomSeen(true);
+}
+
+void FloordoorU::animation() {
+}
+
+bool FloordoorU::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_WALK && obj1._id == HOLE) {
+		_gm->_state._pyraZ = 6;
+		_gm->_state._pyraDirection = 0;
+		_gm->_state._pyraE = 1;
+		return false;
+	} else if (verb == ACTION_USE && obj1._id == ROPE) {
+		_gm->_state._pyraZ = 6;
+		_gm->_state._pyraDirection = 0;
+		_gm->_state._pyraE = 1;
+		_gm->changeRoom(FLOORDOOR);
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_TAKE && obj1._id == ROPE) {
+		_vm->renderMessage(kStringPyramid9);
+	} else
+		return false;
+	return true;
+}
+
+BstDoor::BstDoor(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 15;
+	_id = BST_DOOR;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 18, 18, 0, PYR_ENTRANCE, 14);
+	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 17, 17, 0, PYR_ENTRANCE, 10);
+	_objectState[2] = Object(_id, kStringLetter, kStringDefaultDescription, BST1, PRESS, 0, 0, 0);
+	_objectState[3] = Object(_id, kStringLetter, kStringDefaultDescription, BST2, PRESS, 1, 0, 0);
+	_objectState[4] = Object(_id, kStringLetter, kStringDefaultDescription, BST3, PRESS, 2, 0, 0);
+	_objectState[5] = Object(_id, kStringLetter, kStringDefaultDescription, BST4, PRESS, 3, 0, 0);
+	_objectState[6] = Object(_id, kStringLetter, kStringDefaultDescription, BST5, PRESS, 4, 0, 0);
+	_objectState[7] = Object(_id, kStringLetter, kStringDefaultDescription, BST6, PRESS, 5, 0, 0);
+	_objectState[8] = Object(_id, kStringLetter, kStringDefaultDescription, BST7, PRESS, 6, 0, 0);
+	_objectState[9] = Object(_id, kStringLetter, kStringDefaultDescription, BST8, PRESS, 7, 0, 0);
+	_objectState[10] = Object(_id, kStringLetter, kStringDefaultDescription, BST9, PRESS, 8, 0, 0);
+	_objectState[11] = Object(_id, kStringLetter, kStringDefaultDescription, BST10, PRESS, 9, 0, 0);
+	_objectState[12] = Object(_id, kStringLetter, kStringDefaultDescription, BST11, PRESS, 10, 0, 0);
+	_objectState[13] = Object(_id, kStringLetter, kStringDefaultDescription, BST12, PRESS, 11, 0, 0);
+	_objectState[14] = Object(_id, kStringLetter, kStringDefaultDescription, BST13, PRESS, 12, 0, 0);
+	_objectState[15] = Object(_id, kStringLetter, kStringDefaultDescription, BST14, PRESS, 13, 0, 0);
+	_objectState[16] = Object(_id, kStringLetter, kStringDefaultDescription, BST15, PRESS, 14, 0, 0);
+	_objectState[17] = Object(_id, kStringLetter, kStringDefaultDescription, BST16, PRESS, 15, 0, 0);
+	_objectState[18] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 16, 16, 0, HALL2, 2);
+
+	char germanPassword[16] =  {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0};
+	char englishPassword[16] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
+	if (ConfMan.get("language") == "en")
+		for (int i = 0; i < 16; i++)
+			_password[i] = englishPassword[i];
+	else
+		for (int i = 0; i < 16; i++)
+			_password[i] = germanPassword[i];
+}
+
+void BstDoor::onEntrance() {
+	if (ConfMan.get("language") == "en")
+		_vm->_screen->renderMessage("You are almost there", kMessageNormal, 105, 130);
+}
+
+void BstDoor::animation() {
+}
+
+bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
+	if (_gm->move(verb, obj1)) {
+		_gm->passageConstruction();
+		_gm->_newRoom = true;
+	} else if (verb == ACTION_PRESS && obj1._id >= BST1 && obj1._id <= BST16) {
+		int number = obj1._id - (BST1 - 1);
+		if (isSectionVisible(number))
+			_vm->renderImage(number + 128);
+		else
+			_vm->renderImage(number);
+		_vm->playSound(kAudioTaxiOpen);
+		for (number = 1; number <= 16; number++) {
+			if (isSectionVisible(number) != _password[number - 1])
+				return true;
+		}
+		_gm->wait(2);
+		_vm->renderImage(17);
+		for (number = 1; number <= 16; number++) {
+			setSectionVisible(number, kShownFalse);
+			_objectState[number + 1]._click = 255;
+		}
+		_gm->wait(2);
+		_vm->renderImage(18);
+		_gm->wait(2);
+		_vm->renderImage(19);
+		_objectState[18]._type = EXIT;
+		_objectState[18]._description = kStringDefaultDescription;
+		_vm->playSound(kAudioShip3);
+		_gm->screenShake();
+	} else
+		return false;
+	return true;
+}
+
+Hall2::Hall2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 16;
+	_id = HALL2;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringCoffin, kStringDefaultDescription, NULLOBJECT, EXIT, 0, 0, 0, COFFIN_ROOM, 2);
+	_objectState[1] = Object(_id, kStringExit, kStringDefaultDescription, CORRIDOR, EXIT, 255, 255, 0, PYR_ENTRANCE, 22);
+}
+
+void Hall2::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Hall2::animation() {
+}
+
+bool Hall2::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_WALK && obj1._id == CORRIDOR) {
+		_gm->_state._pyraDirection = 2;
+		_gm->passageConstruction();
+	}
+	return false;
+}
+
+CoffinRoom::CoffinRoom(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 17;
+	_id = COFFIN_ROOM;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, HALL2, 22);
+	_objectState[1] = Object(_id, kStringCoffin, kStringCreepy, COFFIN, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringToothbrush, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 1, 1, 0);
+	_objectState[3] = Object(_id, kStringToothpaste, kStringToothbrushDescription1, NULLOBJECT, NULLTYPE, 2, 2, 0);
+	_objectState[4] = Object(_id, kStringBall, kStringBallDescription, L_BALL, NULLTYPE, 3, 3, 0);
+	_objectState[5] = Object(_id, kStringBall, kStringBallDescription, R_BALL, NULLTYPE, 4, 4, 0);
+}
+
+void CoffinRoom::onEntrance() {
+	setRoomSeen(true);
+}
+
+void CoffinRoom::animation() {
+}
+
+bool CoffinRoom::interact(Action verb, Object &obj1, Object &obj2) {
+	char change;
+	if (verb == ACTION_OPEN && obj1._id == COFFIN && !isSectionVisible(1)) {
+		_vm->renderMessage(kStringPyramid13);
+	} else if (verb == ACTION_PRESS && (obj1._id == L_BALL || obj1._id == R_BALL)) {
+		if (obj1._id == L_BALL) {
+			if ((change = !isSectionVisible(2))) {
+				_vm->renderImage(2);
+				_vm->playSound(kAudioTaxiOpen);
+			} else
+				_vm->renderMessage(kStringPyramid14);
+		} else {
+			if ((change = !isSectionVisible(3))) {
+				_vm->renderImage(3);
+				_vm->playSound(kAudioTaxiOpen);
+			} else
+				_vm->renderMessage(kStringPyramid14);
+		} if (change) {
+			if (isSectionVisible(2) && isSectionVisible(3)) {
+				_vm->playSound(kAudioShip2);
+				_vm->renderImage(4);
+				_gm->wait(4);
+				_vm->renderImage(5);
+				_gm->wait(4);
+				_vm->renderImage(5);
+				_gm->wait(4);
+				_vm->renderImage(5);
+				_gm->wait(4);
+				_vm->renderImage(1);
+				setSectionVisible(4, kShownFalse);
+				setSectionVisible(5, kShownFalse);
+				setSectionVisible(6, kShownFalse);
+				setSectionVisible(7, kShownFalse);
+			}
+			else
+				_vm->renderMessage(kStringPyramid15);
+		}
+	} else if (verb == ACTION_LOOK && obj1._id == COFFIN && isSectionVisible(1)) {
+		_gm->changeRoom(MASK);
+		_gm->_newRoom = true;
+	} else
+		return false;
+	return true;
+}
+
+Mask::Mask(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 18;
+	_id = MASK;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, COFFIN_ROOM, 22);
+	_objectState[1] = Object(_id, kStringEye, kStringEyeDescription, EYE1, NULLTYPE, 0, 0, 0);
+	_objectState[2] = Object(_id, kStringEye, kStringEyeDescription, EYE2, NULLTYPE, 1, 1, 0);
+	_objectState[3] = Object(_id, kStringMouth, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 2, 2, 0);
+}
+
+void Mask::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mask::animation() {
+}
+
+bool Mask::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_OPEN && (obj1._id == EYE1 || obj1._id == EYE2)) {
+		if (obj1._type & OPENED)
+			_vm->renderMessage(kStringPyramid16);
+		else
+			_vm->renderImage(obj1._id - EYE1 + 1);
+		if (isSectionVisible(1) && isSectionVisible(2)) {
+			_gm->reply(kStringPyramid17, 3, 3 + 128);
+			_gm->reply(kStringPyramid18, 3, 3 + 128);
+			_gm->reply(kStringPyramid19, 3, 3 + 128);
+			_vm->playSound(kAudioAppearance1);
+			while(_vm->_sound->isPlaying())
+				_gm->wait(1);
+			_vm->paletteFadeOut();
+			_vm->loadGame(kSleepAutosaveSlot);
+			_gm->changeRoom(CABIN2);
+			_gm->setAnimationTimer(1);
+			_gm->_newRoom = true;
+			_gm->drawGUI();
+			_gm->_rooms[CABIN2]->setSectionVisible(2, kShownTrue);
+			_gm->_rooms[CABIN2]->setSectionVisible(kMaxSection - 1, kShownFalse);
+			_gm->_rooms[CABIN2]->setSectionVisible(kMaxSection - 2, kShownTrue);
+			_gm->_rooms[CABIN2]->setSectionVisible(1, kShownFalse);
+			_gm->_rooms[CABIN2]->getObject(2)->_click = 8;
+			_gm->_state._eventTime = kMaxTimerValue;
+		}
+		return true;
+	}
+	return false;
+}
+
+Museum::Museum(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 29;
+	_id = MUSEUM;
+	_shown[0] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDinosaur, kStringDinosaurDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
+	_objectState[1] = Object(_id, kStringEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 1, 1, 0, NULLROOM, 0);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE | CLOSED, 2, 2, 1, MUS_ENTRANCE, 9);
+	_objectState[3] = Object(_id, kStringRoad, kStringDefaultDescription, MUS_STREET, EXIT, 3, 3, 0);
+}
+
+void Museum::onEntrance() {
+	_gm->setAnimationTimer(1);
+	if (_gm->_state._alarmCracked && !_gm->_state._alarmOn) {
+		_gm->_state._eventTime = kMaxTimerValue;
+		_gm->_state._alarmOn = false;
+		_gm->_state._haste = false;
+		_vm->renderMessage(kStringMuseum1);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->_state._sirenOn = false;
+		_vm->stopSound();
+		_vm->paletteFadeOut();
+		_vm->_system->fillScreen(kColorBlack);
+		_vm->_screen->setViewportBrightness(255);
+		_vm->renderMessage(kStringMuseum2);
+		_gm->waitOnInput(_gm->_messageDuration);
+		_vm->removeMessage();
+		_vm->_screen->setViewportBrightness(0);
+		_vm->setCurrentImage(26);
+		bool hasDinosaurHead = false;
+		if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
+			hasDinosaurHead = true;
+		_vm->loadGame(kSleepAutosaveSlot);
+		_vm->renderImage(0);
+		_vm->paletteFadeIn();
+		if (hasDinosaurHead) {
+			_gm->reply(kStringMuseum3, 1, 1 + 128);
+			_gm->reply(kStringMuseum4, 1, 1 + 128);
+			_gm->takeMoney(30000);
+			_vm->playSound(kAudioAppearance1);
+		} else {
+			_gm->reply(kStringMuseum5, 1, 1 + 128);
+			_gm->say(kStringMuseum23);
+			_gm->reply(kStringMuseum24, 1, 1 + 128);
+		}
+		_vm->paletteFadeOut();
+		_gm->changeRoom(CITY2);
+		_gm->_newRoom = true;
+		_gm->drawGUI();
+	}
+}
+
+void Museum::animation() {
+}
+
+bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_WALK && obj1._id == MUS_STREET) {
+		if (!_gm->_state._alarmOn && 
+				!(_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)) {
+			_vm->renderMessage(kStringMuseum10);
+		} else {
+			_gm->_state._eventTime = kMaxTimerValue;
+			if (_gm->_state._alarmOn) {
+				_vm->renderMessage(kStringMuseum11);
+				if (_gm->_state._sirenOn) {
+					_vm->stopSound();
+					_gm->_state._sirenOn = false;
+				}
+			} else 
+				_vm->renderMessage(kStringMuseum12);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_vm->paletteFadeOut();
+			_vm->_system->fillScreen(kColorBlack);
+			_vm->_screen->setViewportBrightness(255);
+			_vm->_screen->setGuiBrightness(255);
+			_vm->_screen->paletteBrightness();
+			_vm->renderMessage(kStringMuseum13);
+			_gm->waitOnInput(_gm->_messageDuration);
+			_vm->removeMessage();
+			_vm->_screen->setViewportBrightness(0);
+			_vm->_screen->setGuiBrightness(0);
+			_vm->_screen->paletteBrightness();
+			bool hasDinosaurHead = false;
+			if (_gm->_rooms[MUS_ROUND]->getObject(4)->_type & CARRIED)
+				hasDinosaurHead = true;
+			_vm->loadGame(kSleepAutosaveSlot);
+			if (_gm->_state._money >= 8)
+				_gm->takeMoney(-8);
+			if (hasDinosaurHead)
+				_gm->takeObject(*_gm->_rooms[INTRO2]->getObject(7));
+			_gm->changeRoom(CULTURE_PALACE);
+			_gm->_newRoom = true;
+			_gm->_state._alarmOn = false;
+			_gm->_state._haste = false;
+			_gm->drawGUI();
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, DOOR) &&
+			!(_objectState[2]._type & OPENED)) {
+		if (_gm->crackDoor(20)) {
+			_vm->renderImage(1);
+			_objectState[2]._type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR && (obj1._type & OPENED)) {
+		_vm->renderImage(1 + 128);
+		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_USE &&
+					Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
+		_vm->renderMessage(kStringMuseum14);
+	} else if (verb == ACTION_WALK && obj1._id == DOOR) {
+		_gm->_state._haste = true;
+		return false;
+	} else
+		return false;
+	return true;
+}
+
+MusEntrance::MusEntrance(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 32;
+	_id = MUS_ENTRANCE;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED, 1, 1, 2, MUSEUM, 23);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS11, 2);
+}
+
+void MusEntrance::onEntrance() {
+	setRoomSeen(true);
+}
+
+void MusEntrance::animation() {
+}
+
+bool MusEntrance::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_OPEN && obj1._id == DOOR)
+		_gm->_rooms[MUS11]->getObject(2)->_type |= OPENED;
+	else if (verb == ACTION_CLOSE && obj1._id == DOOR)
+		_gm->_rooms[MUS11]->getObject(2)->_type &= ~OPENED;
+	else if (verb == ACTION_USE && 
+				Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) &&
+				!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(20)) {
+			_vm->renderImage(2);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+		return true;
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
+			(obj1._type & OPENED)) {
+		_vm->renderImage(2 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+		return true;
+	}
+	return false;
+}
+
+Mus1::Mus1(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 35;
+	_id = MUS1;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[15] = kShownTrue;
+	_shown[26] = kShownTrue;
+	_shown[27] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS2, 22);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 4, 4, 11, MUS8, 9);
+}
+
+void Mus1::onEntrance() {
+	_gm->securityEntrance();
+	setRoomSeen(true);
+}
+
+void Mus1::animation() {
+}
+
+bool Mus1::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
+}
+
+Mus2::Mus2(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 35;
+	_id = MUS2;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[22] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS1, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS3, 22);
+}
+
+void Mus2::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus2::animation() {
+}
+
+bool Mus2::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
+}
+
+Mus3::Mus3(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 35;
+	_id = MUS3;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[23] = kShownTrue;
+	_shown[28] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS2, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 5, 5, 12, MUS10, 19);
+}
+
+void Mus3::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus3::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus3::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
+}
+
+Mus4::Mus4(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 35;
+	_id = MUS4;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[20] = kShownTrue;
+	_shown[21] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS5, 22);
+	_objectState[1] = Object(_id, kStringCamera, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 7, 7, 0);
+
+}
+
+void Mus4::onEntrance() {
+	setRoomSeen(true);
+}
+
+void Mus4::animation() {
+}
+
+bool Mus4::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
+}
+
+Mus5::Mus5(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 35;
+	_id = MUS5;
+	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[24] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS4, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 8, MUS6, 22);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 2, 2, 9, MUS9, 5);
+
+}
+
+void Mus5::onEntrance() {
+	_gm->securityEntrance();
+	setRoomSeen(true);
+}
+
+void Mus5::animation() {
+}
+
+bool Mus5::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[1]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(8);
+			_objectState[1]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS6]->setSectionVisible(7, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(8 + 128);
+		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS6]->setSectionVisible(7, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
+	return true;
+}
+
+Mus6::Mus6(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 35;
+	_id = MUS6;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[19] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 7, MUS5, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 8, MUS7, 22);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 6, 6, 0);
+}
+
+void Mus6::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus6::animation() {
+}
+
+bool Mus6::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(7);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS5]->setSectionVisible(8, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(7 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS5]->setSectionVisible(8, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR))
+		_vm->renderMessage(kStringMuseum14);
+	else
+		return false;
+	return true;
+}
+
+Mus7::Mus7(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 35;
+	_id = MUS7;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[16] = kShownTrue;
+	_shown[25] = kShownTrue;
+	_shown[28] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 7, MUS6, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 3, 3, 10, MUS11, 15);
+}
+
+void Mus7::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus7::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus7::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	return false;
+}
+
+Mus8::Mus8(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 34;
+	_id = MUS8;
+	_shown[0] = kShownTrue;
+	_shown[12] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS1, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 1, 1, 2, MUS9, 14);
+}
+
+void Mus8::onEntrance() {
+	_gm->securityEntrance();
+	setRoomSeen(true);
+}
+
+void Mus8::animation() {
+}
+
+bool Mus8::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[1]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(2);
+			_objectState[1]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS9]->setSectionVisible(1, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(2 + 128);
+		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS9]->setSectionVisible(1, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
+	return true;
+}
+
+Mus9::Mus9(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 34;
+	_id = MUS9;
+	_shown[0] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[10] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | CLOSED | COMBINABLE, 0, 0, 1, MUS8, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS5, 14);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, MUS_ROUND, 21);
+}
+
+void Mus9::onEntrance() {
+	_gm->securityEntrance();
+	setRoomSeen(true);
+}
+
+void Mus9::animation() {
+}
+
+bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(1);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS8]->setSectionVisible(2, kShownTrue);
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(1 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS8]->setSectionVisible(2, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, SMALL_DOOR) &&
+			!(_objectState[2]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(6);
+			setSectionVisible(5, kShownFalse);
+			_objectState[2]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(5);
+		setSectionVisible(6, kShownFalse);
+		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS_ROUND]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
+	return true;
+}
+
+Mus10::Mus10(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 34;
+	_id = MUS10;
+	_shown[0] = kShownTrue;
+	_shown[11] = kShownTrue;
+	_shown[13] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS3, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS11, 14);
+	_objectState[2] = Object(_id, kStringMainEntrance, kStringDefaultDescription, BIG_DOOR, EXIT | OPENABLE | CLOSED, 4, 4, 0);
+}
+
+void Mus10::onEntrance() {
+	_gm->securityEntrance();
+	setRoomSeen(true);
+}
+
+void Mus10::animation() {
+}
+
+bool Mus10::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, SP_KEYCARD, BIG_DOOR)) {
+		_vm->renderMessage(kStringMuseum14);
+		return true;
+	}
+	return false;
+}
+
+Mus11::Mus11(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 34;
+	_id = MUS11;
+	_shown[0] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[9] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 0, 0, 1, MUS10, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, DOOR, EXIT | OPENABLE, 1, 1, 2, MUS7, 14);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, SMALL_DOOR, EXIT | OPENABLE, 2, 2, 0, MUS_ENTRANCE, 21);
+}
+
+void Mus11::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus11::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus11::interact(Action verb, Object &obj1, Object &obj2) {
+	_gm->museumDoorInteract(verb, obj1, obj2);
+	if (verb == ACTION_OPEN && obj1._id == SMALL_DOOR && !(obj1._type & OPENED)) {
+		obj1._type |= OPENED;
+		_vm->renderImage(4);
+		setSectionVisible(3, kShownFalse);
+		_vm->playSound(kAudioTaxiOpen);
+	} else if (verb == ACTION_CLOSE && obj1._id == SMALL_DOOR &&
+			(obj1._type & OPENED)) {
+		obj1._type &= ~OPENED;
+		_vm->renderImage(3);
+		setSectionVisible(4, kShownFalse);
+		_vm->playSound(kAudioElevator1);
+	} else
+		return false;
+	return true;
+}
+
+MusRound::MusRound(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 33;
+	_id = MUS_ROUND;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, ENCRYPTED_DOOR, EXIT | OPENABLE | OPENED | COMBINABLE, 0, 0, 1, MUS9, 2);
+	_objectState[1] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 1, 1, 0, MUS13, 10);
+	_objectState[2] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 2, 2, 0, MUS12, 14);
+	_objectState[3] = Object(_id, kStringDinosaur, kStringDinosaurDescription2, NULLOBJECT, NULLTYPE, 3, 3, 0);
+	_objectState[4] = Object(_id, kStringDinosaurHead, kStringDinosaurHeadDescription, HEAD, TAKE, 4, 4, 2);
+}
+
+void MusRound::onEntrance() {
+	setRoomSeen(true);
+}
+
+void MusRound::animation() {
+}
+
+bool MusRound::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, SP_KEYCARD, ENCRYPTED_DOOR) && 
+			!(_objectState[0]._type & OPENED)) {
+		if (_gm->crackDoor(50)) {
+			_vm->renderImage(1);
+			_objectState[0]._type = EXIT | OPENABLE | OPENED;
+			_gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | OPENED;
+			_vm->playSound(kAudioTaxiOpen);
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
+				(obj1._type & OPENED)) {
+		_vm->renderImage(1 + 128);
+		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
+		_gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
+		_vm->playSound(kAudioElevator1);
+	} else if (verb == ACTION_TAKE && obj1._id == HEAD && !(obj1._type & CARRIED)) {
+		_gm->takeObject(obj1);
+		_vm->playSound(kAudioSuccess2);
+	} else
+		return false;
+	return true;
+}
+
+Mus12::Mus12(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 37;
+	_id = MUS12;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[13] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 6, 6, 0, MUS_ROUND, 10);
+}
+
+void Mus12::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus12::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus12::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus13::Mus13(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 37;
+	_id = MUS13;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[14] = kShownTrue;
+	_shown[16] = kShownTrue;
+	_objectState[0] = Object(_id, kStringCorridor, kStringDefaultDescription, NULLOBJECT, EXIT, 7, 7, 0, MUS_ROUND, 14);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 0, 0, 7, MUS14, 10);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS15, 16);
+}
+
+void Mus13::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus13::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus13::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus14::Mus14(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 37;
+	_id = MUS14;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[8] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 8, MUS13, 14);
+}
+
+void Mus14::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus14::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus14::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus15::Mus15(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 36;
+	_id = MUS15;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[8] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS13, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS16, 22);
+}
+
+void Mus15::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus15::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus15::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus16::Mus16(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 36;
+	_id = MUS16;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[10] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS15, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS17, 22);
+}
+
+void Mus16::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus16::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus16::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus17::Mus17(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 37;
+	_id = MUS17;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[9] = kShownTrue;
+	_shown[17] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 2, 2, 9, MUS16, 6);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 8, MUS21, 14);
+	_objectState[2] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS18, 16);
+	_objectState[3] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 4, 4, 11, MUS20, 8);
+}
+
+void Mus17::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus17::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus17::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus18::Mus18(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 36;
+	_id = MUS18;
+	_shown[0] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[11] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS17, 2);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 1, 1, 4, MUS19, 22);
+}
+
+void Mus18::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus18::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus18::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus19::Mus19(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 37;
+	_id = MUS19;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[11] = kShownTrue;
+	_shown[15] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 4, 4, 11, MUS18, 8);
+}
+
+void Mus19::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus19::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus19::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus20::Mus20(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 36;
+	_id = MUS20;
+	_shown[0] = kShownTrue;
+	_shown[1] = kShownTrue;
+	_shown[4] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 1, 1, 4, MUS17, 22);
+}
+
+void Mus20::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus20::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus20::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus21::Mus21(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 37;
+	_id = MUS21;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[6] = kShownTrue;
+	_shown[7] = kShownTrue;
+	_shown[18] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 7, MUS17, 10);
+	_objectState[1] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE, 3, 3, 10, MUS22, 16);
+}
+
+void Mus21::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus21::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus21::interact(Action verb, Object &obj1, Object &obj2) {
+	return false;
+}
+
+Mus22::Mus22(SupernovaEngine *vm, GameManager2 *gm) {
+	_vm = vm;
+	_gm = gm;
+
+	_fileNumber = 36;
+	_id = MUS22;
+	_shown[0] = kShownTrue;
+	_shown[2] = kShownTrue;
+	_shown[3] = kShownTrue;
+	_shown[5] = kShownTrue;
+	_shown[9] = kShownTrue;
+
+	_objectState[0] = Object(_id, kStringDoor, kStringDefaultDescription, NULLOBJECT, EXIT | OPENABLE | OPENED, 0, 0, 3, MUS21, 2);
+	_objectState[1] = Object(_id, kStringAlarmSystem, kStringDefaultDescription, ALARM_SYSTEM, COMBINABLE, 2, 2, 0);
+	_objectState[2] = Object(_id, kStringSuctionCup, kStringDefaultDescription, SUCTION_CUP, TAKE | COMBINABLE, 255, 255, 0);
+	_objectState[3] = Object(_id, kStringWall, kStringDefaultDescription, WALL, COMBINABLE, 4, 4, 0);
+}
+
+void Mus22::onEntrance() {
+	_gm->pressureAlarmEntrance();
+}
+
+void Mus22::animation() {
+	_gm->pressureAlarmCount();
+}
+
+bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_USE && Object::combine(obj1, obj2, SUCTION_CUP, WALL)) {
+		if (isSectionVisible(6))
+			_vm->renderMessage(kStringMuseum17);
+		else {
+			_vm->renderImage(6);
+			_vm->renderMessage(kStringMuseum18);
+			_objectState[2]._click = 3;
+			if (obj1._id == SUCTION_CUP)
+				_gm->_inventory.remove(obj1);
+			else
+				_gm->_inventory.remove(obj2);
+		}
+	} else if (verb == ACTION_TAKE && obj1._id == SUCTION_CUP &&
+			!(obj1._type & CARRIED)) {
+		_vm->renderImage(2);
+		setSectionVisible(6, kShownFalse);
+		_vm->renderImage(5);
+		_gm->takeObject(obj1);
+		_vm->renderMessage(kStringMuseum19);
+	} else if (verb == ACTION_USE &&
+			Object::combine(obj1, obj2, ALARM_CRACKER, ALARM_SYSTEM)) {
+		if (_gm->_state._alarmCracked)
+			_vm->renderMessage(kStringMuseum20);
+		else {
+			_vm->renderMessage(kStringMuseum21);
+			_gm->crack(20);
+			if (!_gm->_state._alarmOn) {
+				_vm->renderMessage(kStringMuseum22);
+				_vm->playSound(kAudioSuccess2);
+				_gm->_state._alarmCracked = true;
+			}
+		}
+	} else
+		return false;
+	return true;
+}
+
+}
diff --git a/engines/supernova/supernova2/rooms.h b/engines/supernova/supernova2/rooms.h
new file mode 100644
index 0000000..7f9f272
--- /dev/null
+++ b/engines/supernova/supernova2/rooms.h
@@ -0,0 +1,847 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_ROOMS_H
+#define SUPERNOVA2_ROOMS_H
+
+#include "common/str.h"
+
+#include "supernova/msn_def.h"
+#include "supernova/room.h"
+
+namespace Common {
+class ReadStream;
+class WriteStream;
+}
+
+namespace Supernova {
+
+class GameManager2;
+class SupernovaEngine;
+
+struct RoomEntry {
+	int _e;
+	int _s;
+	int _z;
+	int _r;
+	RoomId _exitRoom;
+};
+
+
+class Intro2 : public Room {
+public:
+	Intro2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+
+private:
+	GameManager2 *_gm;
+	void titleScreen();
+	bool tvSay(int mod1, int mod2, int rest, MessagePosition pos, int id);
+	bool tvRest(int mod1, int mod2, int rest);
+	bool displayThoughtMessage(int id);
+	bool thoughts1();
+	bool tvDialogue();
+	bool thoughts2();
+
+	Common::String _introText;
+};
+
+class Airport : public Room {
+public:
+	Airport(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+
+private:
+	GameManager2 *_gm;
+};
+
+class TaxiStand : public Room {
+public:
+	TaxiStand(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Street : public Room {
+public:
+	Street(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Games : public Room {
+public:
+	Games(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Cabin2 : public Room {
+public:
+	Cabin2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+	bool _paid;
+};
+
+class Kiosk : public Room {
+public:
+	Kiosk(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class CulturePalace : public Room {
+public:
+	CulturePalace(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+	void notEnoughMoney();
+};
+
+class Checkout : public Room {
+public:
+	Checkout(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+	void appearance();
+	void shouting();
+};
+
+class City1 : public Room {
+public:
+	City1(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class City2 : public Room {
+public:
+	City2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Elevator2 : public Room {
+public:
+	Elevator2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+	void jobDescription();
+};
+
+class Apartment : public Room {
+public:
+	Apartment(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Ship : public Room {
+public:
+	Ship(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+	Common::String _outroText;
+	Common::String _outroText2;
+
+private:
+	GameManager2 *_gm;
+	void kill();
+	void outro();
+};
+
+class Pyramid : public Room {
+public:
+	Pyramid(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class PyrEntrance : public Room {
+public:
+	PyrEntrance(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+	uint32 _waitTime;
+};
+
+class Upstairs1 : public Room {
+public:
+	Upstairs1(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Downstairs1 : public Room {
+public:
+	Downstairs1(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class BottomRightDoor : public Room {
+public:
+	BottomRightDoor(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class BottomLeftDoor : public Room {
+public:
+	BottomLeftDoor(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Upstairs2 : public Room {
+public:
+	Upstairs2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Downstairs2 : public Room {
+public:
+	Downstairs2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class UpperDoor : public Room {
+public:
+	UpperDoor(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class PuzzleFront : public Room {
+public:
+	PuzzleFront(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class PuzzleBehind : public Room {
+public:
+	PuzzleBehind(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Formula1F : public Room {
+public:
+	Formula1F(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Formula1N : public Room {
+public:
+	Formula1N(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Formula2F : public Room {
+public:
+	Formula2F(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Formula2N : public Room {
+public:
+	Formula2N(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class TomatoF : public Room {
+public:
+	TomatoF(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class TomatoN : public Room {
+public:
+	TomatoN(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class MonsterF : public Room {
+public:
+	MonsterF(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Monster1N : public Room {
+public:
+	Monster1N(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Monster2N : public Room {
+public:
+	Monster2N(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Upstairs3 : public Room {
+public:
+	Upstairs3(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Downstairs3 : public Room {
+public:
+	Downstairs3(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class LCorridor1 : public Room {
+public:
+	LCorridor1(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class LCorridor2 : public Room {
+public:
+	LCorridor2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class HoleRoom : public Room {
+public:
+	HoleRoom(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class InHole : public Room {
+public:
+	InHole(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Floordoor : public Room {
+public:
+	Floordoor(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class FloordoorU : public Room {
+public:
+	FloordoorU(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class BstDoor : public Room {
+public:
+	BstDoor(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+	char _password[16];
+};
+
+class Hall2 : public Room {
+public:
+	Hall2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class CoffinRoom : public Room {
+public:
+	CoffinRoom(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mask : public Room {
+public:
+	Mask(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Museum : public Room {
+public:
+	Museum(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class MusEntrance : public Room {
+public:
+	MusEntrance(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus1 : public Room {
+public:
+	Mus1(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus2 : public Room {
+public:
+	Mus2(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus3 : public Room {
+public:
+	Mus3(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus4 : public Room {
+public:
+	Mus4(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus5 : public Room {
+public:
+	Mus5(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus6 : public Room {
+public:
+	Mus6(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus7 : public Room {
+public:
+	Mus7(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus8 : public Room {
+public:
+	Mus8(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus9 : public Room {
+public:
+	Mus9(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus10 : public Room {
+public:
+	Mus10(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus11 : public Room {
+public:
+	Mus11(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class MusRound : public Room {
+public:
+	MusRound(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus12 : public Room {
+public:
+	Mus12(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus13 : public Room {
+public:
+	Mus13(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus14 : public Room {
+public:
+	Mus14(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus15 : public Room {
+public:
+	Mus15(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus16 : public Room {
+public:
+	Mus16(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus17 : public Room {
+public:
+	Mus17(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus18 : public Room {
+public:
+	Mus18(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus19 : public Room {
+public:
+	Mus19(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus20 : public Room {
+public:
+	Mus20(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus21 : public Room {
+public:
+	Mus21(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+class Mus22 : public Room {
+public:
+	Mus22(SupernovaEngine *vm, GameManager2 *gm);
+	virtual void onEntrance();
+	virtual void animation();
+	virtual bool interact(Action verb, Object &obj1, Object &obj2);
+
+private:
+	GameManager2 *_gm;
+};
+
+}
+#endif // SUPERNOVA2_ROOMS_H
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
new file mode 100644
index 0000000..1bafec8
--- /dev/null
+++ b/engines/supernova/supernova2/state.cpp
@@ -0,0 +1,1491 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "graphics/cursorman.h"
+#include "graphics/palette.h"
+#include "gui/message.h"
+
+#include "supernova/screen.h"
+#include "supernova/supernova.h"
+#include "supernova/supernova2/state.h"
+#include "supernova/supernova2/stringid.h"
+
+namespace Supernova {
+
+bool GameManager2::serialize(Common::WriteStream *out) {
+	if (out->err())
+		return false;
+
+	// GameState
+	out->writeSint16LE(_state._money);
+	out->writeSint32LE(_state._startTime - g_system->getMillis());
+	out->writeByte(_state._addressKnown);
+	out->writeByte(_state._poleMagnet);
+	out->writeByte(_state._admission);
+	out->writeByte(_state._tipsy);
+	out->writeByte(_state._dark);
+	out->writeByte(_state._elevatorE);
+	out->writeByte(_state._elevatorNumber);
+	out->writeByte(_state._toMuseum);
+	out->writeSint16LE(_state._pyraE);
+	out->writeByte(_state._pyraS);
+	out->writeByte(_state._pyraZ);
+	out->writeByte(_state._alarmOn);
+	out->writeByte(_state._alarmCracked);
+	out->writeByte(_state._haste);
+	out->writeByte(_state._pressureCounter);
+	out->writeByte(_state._sirenOn);
+	out->writeSint16LE(_state._pyraDirection);
+	out->writeUint32LE(_state._eventTime - g_system->getMillis());
+	out->writeSint32LE(_state._eventCallback);
+	out->writeByte(_state._taxiPossibility);
+	for (int i = 0; i < 15; i++) {
+		out->writeSint16LE(_state._puzzleTab[i]);
+	}
+
+	// Inventory
+	out->writeSint32LE(_inventory.getSize());
+	out->writeSint32LE(_inventoryScroll);
+	for (int i = 0; i < _inventory.getSize(); ++i) {
+		Object *objectStateBegin = _rooms[_inventory.get(i)->_roomId]->getObject(0);
+		byte objectIndex = _inventory.get(i) - objectStateBegin;
+		out->writeSint32LE(_inventory.get(i)->_roomId);
+		out->writeSint32LE(objectIndex);
+	}
+
+	// Rooms
+	out->writeByte(_lastRoom->getId());
+	out->writeByte(_currentRoom->getId());
+	for (int i = 0; i < NUMROOMS2; ++i) {
+		_rooms[i]->serialize(out);
+	}
+
+	return !out->err();
+}
+
+
+bool GameManager2::deserialize(Common::ReadStream *in, int version) {
+	if (in->err())
+		return false;
+
+	// GameState
+	_state._money = in->readSint16LE();
+	_state._startTime = in->readSint32LE() + g_system->getMillis();
+	_state._addressKnown = in->readByte();
+	_state._poleMagnet = in->readByte();
+	_state._admission = in->readByte();
+	_state._tipsy = in->readByte();
+	_state._dark = in->readByte();
+	_state._elevatorE = in->readByte();
+	_state._elevatorNumber = in->readByte();
+	_state._toMuseum = in->readByte();
+	_state._pyraE = in->readSint16LE();
+	_state._pyraS = in->readByte();
+	_state._pyraZ = in->readByte();
+	_state._alarmOn = in->readByte();
+	_state._alarmCracked = in->readByte();
+	_state._haste = in->readByte();
+	_state._pressureCounter = in->readByte();
+	_state._sirenOn = in->readByte();
+	_state._pyraDirection = in->readSint16LE();
+	_state._eventTime = in->readUint32LE() + g_system->getMillis();
+	_state._eventCallback = (EventFunction)in->readSint32LE();
+	_state._taxiPossibility = in->readByte();
+	for (int i = 0; i < 15; i++)
+		_state._puzzleTab[i] = in->readSint16LE();
+	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
+
+	_oldTime = g_system->getMillis();
+
+	// Inventory
+	int inventorySize = in->readSint32LE();
+	_inventoryScroll = in->readSint32LE();
+	_inventory.clear();
+	for (int i = 0; i < inventorySize; ++i) {
+		RoomId objectRoom = static_cast<RoomId>(in->readSint32LE());
+		int objectIndex = in->readSint32LE();
+		_inventory.add(*_rooms[objectRoom]->getObject(objectIndex));
+	}
+
+	// Rooms
+	RoomId lastRoomId = static_cast<RoomId>(in->readByte());
+	RoomId curRoomId = static_cast<RoomId>(in->readByte());
+	for (int i = 0; i < NUMROOMS2; ++i) {
+		_rooms[i]->deserialize(in, version);
+	}
+	delete _rooms[BST_DOOR];
+	_rooms[BST_DOOR] = new BstDoor(_vm, this);
+	_lastRoom = _rooms[lastRoomId];
+	changeRoom(curRoomId);
+
+	// Some additional variables
+	_state._previousRoom = _rooms[INTRO2];
+	_guiEnabled = true;
+	_animationEnabled = true;
+
+	return !in->err();
+}
+
+GameManager2::GameManager2(SupernovaEngine *vm, Sound *sound)
+	: GameManager(vm, sound) {
+	initRooms();
+	changeRoom(INTRO2);
+	initState();
+}
+
+GameManager2::~GameManager2() {
+	destroyRooms();
+}
+
+void GameManager2::destroyRooms() {
+	delete _rooms[INTRO2];
+	delete _rooms[AIRPORT];
+	delete _rooms[TAXISTAND];
+	delete _rooms[STREET];
+	delete _rooms[GAMES];
+	delete _rooms[CABIN2];
+	delete _rooms[KIOSK];
+	delete _rooms[CULTURE_PALACE];
+	delete _rooms[CHECKOUT];
+	delete _rooms[CITY1];
+	delete _rooms[CITY2];
+	delete _rooms[ELEVATOR2];
+	delete _rooms[APARTMENT];
+	delete _rooms[SHIP];
+	delete _rooms[PYRAMID];
+	delete _rooms[PYR_ENTRANCE];
+	delete _rooms[UPSTAIRS1];
+	delete _rooms[DOWNSTAIRS1];
+	delete _rooms[BOTTOM_RIGHT_DOOR];
+	delete _rooms[BOTTOM_LEFT_DOOR];
+	delete _rooms[UPSTAIRS2];
+	delete _rooms[DOWNSTAIRS2];
+	delete _rooms[UPPER_DOOR];
+	delete _rooms[PUZZLE_FRONT];
+	delete _rooms[PUZZLE_BEHIND];
+	delete _rooms[FORMULA1_F];
+	delete _rooms[FORMULA1_N];
+	delete _rooms[FORMULA2_F];
+	delete _rooms[FORMULA2_N];
+	delete _rooms[TOMATO_F];
+	delete _rooms[TOMATO_N];
+	delete _rooms[MONSTER_F];
+	delete _rooms[MONSTER1_N];
+	delete _rooms[MONSTER2_N];
+	delete _rooms[UPSTAIRS3];
+	delete _rooms[DOWNSTAIRS3];
+	delete _rooms[LCORRIDOR1];
+	delete _rooms[LCORRIDOR2];
+	delete _rooms[HOLE_ROOM];
+	delete _rooms[IN_HOLE];
+	delete _rooms[FLOORDOOR];
+	delete _rooms[FLOORDOOR_U];
+	delete _rooms[BST_DOOR];
+	delete _rooms[HALL2];
+	delete _rooms[COFFIN_ROOM];
+	delete _rooms[MASK];
+	delete _rooms[MUSEUM];
+	delete _rooms[MUS_ENTRANCE];
+	delete _rooms[MUS1];
+	delete _rooms[MUS2];
+	delete _rooms[MUS3];
+	delete _rooms[MUS4];
+	delete _rooms[MUS5];
+	delete _rooms[MUS6];
+	delete _rooms[MUS7];
+	delete _rooms[MUS8];
+	delete _rooms[MUS9];
+	delete _rooms[MUS10];
+	delete _rooms[MUS11];
+	delete _rooms[MUS_ROUND];
+	delete _rooms[MUS12];
+	delete _rooms[MUS13];
+	delete _rooms[MUS14];
+	delete _rooms[MUS15];
+	delete _rooms[MUS16];
+	delete _rooms[MUS17];
+	delete _rooms[MUS18];
+	delete _rooms[MUS19];
+	delete _rooms[MUS20];
+	delete _rooms[MUS21];
+	delete _rooms[MUS22];
+}
+
+void GameManager2::initState() {
+	_currentInputObject = &_nullObject;
+	_inputObject[0] = &_nullObject;
+	_inputObject[1] = &_nullObject;
+	_inputVerb = ACTION_WALK;
+	_processInput = false;
+	_guiEnabled = true;
+	_animationEnabled = true;
+	_roomBrightness = 255;
+	_mouseClicked = false;
+	_keyPressed = false;
+	_mouseX = -1;
+	_mouseY = -1;
+	_mouseField = -1;
+	_inventoryScroll = 0;
+	_restTime = 0;
+	_oldTime = g_system->getMillis();
+	_timerPaused = 0;
+	_timePaused = false;
+	_messageDuration = 0;
+	_animationTimer = 0;
+	_mapOn = false;
+	_steps = false;
+	_cracking = false;
+	_alarmBefore = false;
+	RoomId startSecurityTab[10] = {MUS6, MUS7, MUS11, MUS10, MUS3, MUS2, MUS1, MUS8, MUS9, MUS5};
+	for (int i = 0; i < 10; i++)
+		_securityTab[i] = startSecurityTab[i];
+
+	_currentSentence = -1;
+	for (int i = 0 ; i < 6 ; ++i) {
+		_sentenceNumber[i] = -1;
+		_texts[i] = kNoString;
+		_rows[i] = 0;
+		_rowsStart[i] = 0;
+		_dials[i] = 1;
+	}
+
+	_prevImgId = 0;
+
+	_state._money = 20;
+	_state._startTime = 0;
+	_state._addressKnown = false;
+	_state._previousRoom = _currentRoom;
+	_lastRoom = _rooms[INTRO2];
+	_state._poleMagnet = false;
+	_state._admission = 0;
+	_state._tipsy = false;
+	_state._dark = false;
+	_state._elevatorE = 0;
+	_state._elevatorNumber = 0;
+	_state._toMuseum = false;
+	_state._pyraE = 0;
+	_state._pyraS = 4;
+	_state._pyraZ = 10;
+	_state._alarmOn = false;
+	_state._alarmCracked = false;
+	_state._haste = false;
+	_state._pressureCounter = 0;
+	_state._sirenOn = false;
+	_state._pyraDirection = 0;
+	_state._eventTime = kMaxTimerValue;
+	_state._eventCallback = kNoFn;
+	_state._taxiPossibility = 4;
+	int16 startPuzzleTab[15] = {12, 3, 14, 1, 11, 0, 2, 13, 9, 5, 4, 10, 7, 6, 8};
+	for (int i = 0; i < 15; i++)
+		_state._puzzleTab[i] = startPuzzleTab[i];
+}
+
+void GameManager2::initRooms() {
+	_rooms = new Room *[NUMROOMS2];
+	_rooms[INTRO2] = new Intro2(_vm, this);
+	_rooms[AIRPORT] = new Airport(_vm, this);
+	_rooms[TAXISTAND] = new TaxiStand(_vm, this);
+	_rooms[STREET] = new Street(_vm, this);
+	_rooms[GAMES] = new Games(_vm, this);
+	_rooms[CABIN2] = new Cabin2(_vm, this);
+	_rooms[KIOSK] = new Kiosk(_vm, this);
+	_rooms[CULTURE_PALACE] = new CulturePalace(_vm, this);
+	_rooms[CHECKOUT] = new Checkout(_vm, this);
+	_rooms[CITY1] = new City1(_vm, this);
+	_rooms[CITY2] = new City2(_vm, this);
+	_rooms[ELEVATOR2] = new Elevator2(_vm, this);
+	_rooms[APARTMENT] = new Apartment(_vm, this);
+	_rooms[SHIP] = new Ship(_vm, this);
+	_rooms[PYRAMID] = new Pyramid(_vm, this);
+	_rooms[PYR_ENTRANCE] = new PyrEntrance(_vm, this);
+	_rooms[UPSTAIRS1] = new Upstairs1(_vm, this);
+	_rooms[DOWNSTAIRS1] = new Downstairs1(_vm, this);
+	_rooms[BOTTOM_RIGHT_DOOR] = new BottomRightDoor(_vm, this);
+	_rooms[BOTTOM_LEFT_DOOR] = new BottomLeftDoor(_vm, this);
+	_rooms[UPSTAIRS2] = new Upstairs2(_vm, this);
+	_rooms[DOWNSTAIRS2] = new Downstairs2(_vm, this);
+	_rooms[UPPER_DOOR] = new UpperDoor(_vm, this);
+	_rooms[PUZZLE_FRONT] = new PuzzleFront(_vm, this);
+	_rooms[PUZZLE_BEHIND] = new PuzzleBehind(_vm, this);
+	_rooms[FORMULA1_F] = new Formula1F(_vm, this);
+	_rooms[FORMULA1_N] = new Formula1N(_vm, this);
+	_rooms[FORMULA2_F] = new Formula2F(_vm, this);
+	_rooms[FORMULA2_N] = new Formula2N(_vm, this);
+	_rooms[TOMATO_F] = new TomatoF(_vm, this);
+	_rooms[TOMATO_N] = new TomatoN(_vm, this);
+	_rooms[MONSTER_F] = new MonsterF(_vm, this);
+	_rooms[MONSTER1_N] = new Monster1N(_vm, this);
+	_rooms[MONSTER2_N] = new Monster2N(_vm, this);
+	_rooms[UPSTAIRS3] = new Upstairs3(_vm, this);
+	_rooms[DOWNSTAIRS3] = new Downstairs3(_vm, this);
+	_rooms[LCORRIDOR1] = new LCorridor1(_vm, this);
+	_rooms[LCORRIDOR2] = new LCorridor2(_vm, this);
+	_rooms[HOLE_ROOM] = new HoleRoom(_vm, this);
+	_rooms[IN_HOLE] = new InHole(_vm, this);
+	_rooms[FLOORDOOR] = new Floordoor(_vm, this);
+	_rooms[FLOORDOOR_U] = new FloordoorU(_vm, this);
+	_rooms[BST_DOOR] = new BstDoor(_vm, this);
+	_rooms[HALL2] = new Hall2(_vm, this);
+	_rooms[COFFIN_ROOM] = new CoffinRoom(_vm, this);
+	_rooms[MASK] = new Mask(_vm, this);
+	_rooms[MUSEUM] = new Museum(_vm, this);
+	_rooms[MUS_ENTRANCE] = new MusEntrance(_vm, this);
+	_rooms[MUS1] = new Mus1(_vm, this);
+	_rooms[MUS2] = new Mus2(_vm, this);
+	_rooms[MUS3] = new Mus3(_vm, this);
+	_rooms[MUS4] = new Mus4(_vm, this);
+	_rooms[MUS5] = new Mus5(_vm, this);
+	_rooms[MUS6] = new Mus6(_vm, this);
+	_rooms[MUS7] = new Mus7(_vm, this);
+	_rooms[MUS8] = new Mus8(_vm, this);
+	_rooms[MUS9] = new Mus9(_vm, this);
+	_rooms[MUS10] = new Mus10(_vm, this);
+	_rooms[MUS11] = new Mus11(_vm, this);
+	_rooms[MUS_ROUND] = new MusRound(_vm, this);
+	_rooms[MUS12] = new Mus12(_vm, this);
+	_rooms[MUS13] = new Mus13(_vm, this);
+	_rooms[MUS14] = new Mus14(_vm, this);
+	_rooms[MUS15] = new Mus15(_vm, this);
+	_rooms[MUS16] = new Mus16(_vm, this);
+	_rooms[MUS17] = new Mus17(_vm, this);
+	_rooms[MUS18] = new Mus18(_vm, this);
+	_rooms[MUS19] = new Mus19(_vm, this);
+	_rooms[MUS20] = new Mus20(_vm, this);
+	_rooms[MUS21] = new Mus21(_vm, this);
+	_rooms[MUS22] = new Mus22(_vm, this);
+}
+
+bool GameManager2::canSaveGameStateCurrently() {
+	return _animationEnabled && _guiEnabled && !_state._haste;
+}
+
+void GameManager2::updateEvents() {
+	handleTime();
+	if (_animationEnabled && !_vm->_screen->isMessageShown() && _animationTimer == 0)
+		_currentRoom->animation();
+
+	if (_state._eventCallback != kNoFn && g_system->getMillis() >= _state._eventTime) {
+		_vm->_allowLoadGame = false;
+		_vm->_allowSaveGame = false;
+		_state._eventTime = kMaxTimerValue;
+		EventFunction fn = _state._eventCallback;
+		_state._eventCallback = kNoFn;
+		switch (fn) {
+		case kNoFn:
+			break;
+		case kSoberFn:
+			sober();
+			break;
+		case kPyramidEndFn:
+			pyramidEnd();
+			break;
+		case kCaughtFn:
+			caught();
+			break;
+		default: //shouldn't happen
+			break;
+		}
+		_vm->_allowLoadGame = true;
+		_vm->_allowSaveGame = true;
+		return;
+	}
+
+	_mouseClicked = false;
+	_keyPressed = false;
+	Common::Event event;
+	while (g_system->getEventManager()->pollEvent(event)) {
+		switch (event.type) {
+		case Common::EVENT_KEYDOWN:
+			_keyPressed = true;
+			processInput(event.kbd);
+			break;
+		case Common::EVENT_LBUTTONUP:
+			// fallthrough
+		case Common::EVENT_RBUTTONUP:
+			_mouseClicked = true;
+			// fallthrough
+		case Common::EVENT_MOUSEMOVE:
+			_mouseClickType = event.type;
+			_mouseX = event.mouse.x;
+			_mouseY = event.mouse.y;
+			if (_guiEnabled)
+				processInput();
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+void GameManager2::handleTime() {
+	if (_timerPaused)
+		return;
+	int32 newTime = g_system->getMillis();
+	int32 delta = newTime - _oldTime;
+	_time += delta;
+
+	if (_animationTimer > delta)
+		_animationTimer -= delta;
+	else
+		_animationTimer = 0;
+
+	_oldTime = newTime;
+}
+
+void GameManager2::drawMapExits() {
+// TODO: Preload _exitList on room entry instead on every call
+	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+
+	if ((_currentRoom >= _rooms[PYR_ENTRANCE] && _currentRoom <= _rooms[HOLE_ROOM]) ||
+		(_currentRoom >= _rooms[FLOORDOOR] && _currentRoom <= _rooms[BST_DOOR]))
+		compass();
+	else {
+		for (int i = 0; i < 25; i++)
+			_exitList[i] = -1;
+		for (int i = 0; i < kMaxObject; i++) {
+			if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
+				byte r = _currentRoom->getObject(i)->_direction;
+				_exitList[r] = i;
+				int x = 284 + 7 * (r % 5);
+				int y = 164 + 7 * (r / 5);
+				_vm->renderBox(x, y, 5, 5, kColorDarkRed);
+			}
+		}
+	}
+}
+
+void GameManager2::takeMoney(int amount) {
+	_state._money += amount;
+	_vm->setGameString(kStringMoney, Common::String::format("%d Xa", _state._money));
+}
+
+bool GameManager2::genericInteract(Action verb, Object &obj1, Object &obj2) {
+	if (verb == ACTION_OPEN && obj1._id == WALLET) {
+		if (_rooms[TAXISTAND]->getObject(4)->_type & CARRIED)
+			_vm->renderMessage(kStringEmpty);
+		else {
+			_vm->renderMessage(kStringWalletOpen);
+			takeObject(*_rooms[TAXISTAND]->getObject(4));
+			takeObject(*_rooms[TAXISTAND]->getObject(5));
+			takeMoney(1);
+			_vm->playSound(kAudioSuccess2);
+		}
+	} else if (verb == ACTION_PRESS && obj1._id == TRANSMITTER) {
+		if (_currentRoom == _rooms[TAXISTAND]) {
+			if (_currentRoom->getObject(0)->_type != EXIT) {
+				_vm->renderImage(5);
+				wait(3);
+				_vm->renderImage(6);
+				_vm->playSound(kAudioTaxiOpen);
+				_currentRoom->getObject(0)->_type = EXIT;
+				drawMapExits();
+			}
+		} else if (_currentRoom == _rooms[STREET]	      ||
+				   _currentRoom == _rooms[CULTURE_PALACE] ||
+				   _currentRoom == _rooms[CITY1]          ||
+				   _currentRoom == _rooms[CITY2]) {
+			Common::String t = _vm->getGameString(kStringTaxiArrives);
+			_vm->renderMessage(t);
+			waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+			_vm->removeMessage();
+			taxi();
+		} else
+			_vm->renderMessage(kStringNothingHappens);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, ROD, MAGNET)) {
+		Object *o1, *o2;
+		if (obj2._id == ROD) {
+			o1 = &obj2;
+			o2 = &obj1;
+		} else {
+			o1 = &obj1;
+			o2 = &obj2;
+		}
+		if (!(o1->_type & CARRIED))
+			return false;
+
+		if (!(o2->_type & CARRIED))
+			takeObject(*o2);
+
+		_vm->renderMessage(kStringAttachMagnet);
+		o1->_name = kStringPoleMagnet;
+		o1->_description = kStringCunning;
+		_inventory.remove(*o2);
+		_rooms[APARTMENT]->setSectionVisible(kMaxSection - 1, kShownTrue);
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CHIP, PLAYER)) {
+		Object *o1, *o2;
+		if (obj2._id == CHIP) {
+			o1 = &obj2;
+			o2 = &obj1;
+		} else {
+			o1 = &obj1;
+			o2 = &obj2;
+		}
+		if (!(o2->_type & CARRIED))
+			_vm->renderMessage(kStringMustBuyFirst);
+		else {
+			if (!(o1->_type & CARRIED))
+			{
+				_vm->renderImage(1);
+				_vm->renderImage(2 + 128);
+				_currentRoom->getObject(0)->_click = 255;
+			} else
+				_inventory.remove(*o1);
+
+			_vm->renderMessage(kStringInsertChip);
+			if (_state._admission)
+				_state._admission = 2;
+			else
+				_state._admission = 1;
+		}
+	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, DISCMAN, PLAYER)) {
+		switch (_state._admission) {
+		case 1:
+			// fall through
+		case 2:
+			_vm->renderMessage(kStringTransferCD);
+			_state._admission = 2;
+			_vm->playSound(kAudioSuccess2);
+			break;
+		default:
+			_vm->renderMessage(kStringCDNotInserted);
+		}
+	} else if (verb == ACTION_OPEN && obj1._id == PLAYER) {
+		switch (_state._admission) {
+		case 1:
+			_state._admission = 0;
+			playerTakeOut();
+			break;
+		case 2:
+			_state._admission = 3;
+			playerTakeOut();
+			break;
+		default:
+			_vm->renderMessage(kStringChipNotInserted);
+		}
+	} else if (verb == ACTION_OPEN && obj1._id == DISCMAN) {
+		_vm->renderMessage(kStringWhatFor);
+	} else if (verb == ACTION_PRESS && obj1._id == DISCMAN) {
+		_vm->renderMessage(kStringMMCD);
+		playCD();
+	} else if (verb == ACTION_PRESS && obj1._id == PLAYER) {
+		switch (_state._admission) {
+		case 1:
+			_vm->renderMessage(kStringChipEmpty);
+			break;
+		case 2:
+			_vm->renderMessage(kStringListeningToCD);
+			playCD();
+			break;
+		default:
+			_vm->renderMessage(kStringNoChip);
+		}
+	} else if ((verb == ACTION_OPEN || verb == ACTION_USE) &&
+			   obj1._id == BOTTLE && (obj1._type & CARRIED)) {
+		_vm->renderMessage(kStringTipsy);
+		_state._tipsy = true;
+		_state._eventTime = g_system->getMillis() + 60000;
+		_state._eventCallback = kSoberFn;
+	} else if (verb == ACTION_LOOK && obj1._id == MUSCARD) {
+		_vm->setCurrentImage(30);
+		_vm->renderImage(0);
+		//karte_an = true
+		waitOnInput(100000);
+		//karte_an = false
+		_vm->removeMessage();
+		_vm->renderRoom(*_currentRoom);
+		drawGUI();
+	} else
+		return false;
+	return true;
+}
+
+void GameManager2::playCD() {
+	CursorMan.showMouse(false);
+	_vm->playSound(kMusicMadMonkeys);
+	Common::KeyCode k = Common::KEYCODE_INVALID;
+	while(_vm->_sound->isPlaying())
+		if (waitOnInput(1, k))
+			break;
+	_vm->_sound->stop();
+	_vm->removeMessage();
+	CursorMan.showMouse(true);
+}
+
+void GameManager2::handleInput() {
+	bool validCommand = genericInteract(_inputVerb, *_inputObject[0], *_inputObject[1]);
+	if (!validCommand)
+		validCommand = _currentRoom->interact(_inputVerb, *_inputObject[0], *_inputObject[1]);
+	if (!validCommand) {
+		switch (_inputVerb) {
+		case ACTION_LOOK:
+			_vm->renderMessage(_inputObject[0]->_description);
+			break;
+
+		case ACTION_WALK:
+			if (_inputObject[0]->hasProperty(CARRIED)) {
+				// You already carry this.
+				_vm->renderMessage(kStringGenericInteract1);
+			} else if (!_inputObject[0]->hasProperty(EXIT)) {
+				// You're already there.
+				_vm->renderMessage(kStringGenericInteract2);
+			} else if (_inputObject[0]->hasProperty(OPENABLE) && !_inputObject[0]->hasProperty(OPENED)) {
+				// This is closed
+				_vm->renderMessage(kStringGenericInteract3);
+			} else {
+				_lastRoom = _currentRoom;
+				changeRoom(_inputObject[0]->_exitRoom);
+			}
+
+			break;
+
+		case ACTION_TAKE:
+			if (_inputObject[0]->hasProperty(OPENED)) {
+				// You already have that
+				_vm->renderMessage(kStringGenericInteract4);
+			} else if (_inputObject[0]->hasProperty(UNNECESSARY)) {
+				// You do not need that.
+				_vm->renderMessage(kStringGenericInteract5);
+			} else if (!_inputObject[0]->hasProperty(TAKE)) {
+				// You can't take that.
+				_vm->renderMessage(kStringGenericInteract6);
+			} else
+				takeObject(*_inputObject[0]);
+
+			break;
+
+		case ACTION_OPEN:
+			if (!_inputObject[0]->hasProperty(OPENABLE)) {
+				// This can't be opened
+				_vm->renderMessage(kStringGenericInteract7);
+			} else if (_inputObject[0]->hasProperty(OPENED)) {
+				// This is already opened.
+				_vm->renderMessage(kStringGenericInteract8);
+			} else if (_inputObject[0]->hasProperty(CLOSED)) {
+				// This is locked.
+				_vm->renderMessage(kStringGenericInteract9);
+			} else {
+				_vm->renderImage(_inputObject[0]->_section);
+				_inputObject[0]->setProperty(OPENED);
+				byte i = _inputObject[0]->_click;
+				_inputObject[0]->_click  = _inputObject[0]->_click2;
+				_inputObject[0]->_click2 = i;
+				_vm->_sound->play(kAudioTaxiOpen);
+			}
+			break;
+
+		case ACTION_CLOSE:
+			if (!_inputObject[0]->hasProperty(OPENABLE) ||
+				(_inputObject[0]->hasProperty(CLOSED) &&
+				 _inputObject[0]->hasProperty(OPENED))) {
+				// This can't be closed.
+				_vm->renderMessage(kStringGenericInteract10);
+			} else if (!_inputObject[0]->hasProperty(OPENED)) {
+				// This is already closed.
+				_vm->renderMessage(kStringGenericInteract11);
+			} else {
+				_vm->renderImage(invertSection(_inputObject[0]->_section));
+				_inputObject[0]->disableProperty(OPENED);
+				byte i = _inputObject[0]->_click;
+				_inputObject[0]->_click  = _inputObject[0]->_click2;
+				_inputObject[0]->_click2 = i;
+				_vm->_sound->play(kAudioElevator1);
+			}
+			break;
+
+		case ACTION_GIVE:
+			if (_inputObject[0]->hasProperty(CARRIED)) {
+				// Better keep it!
+				_vm->renderMessage(kStringGenericInteract12);
+			}
+			break;
+
+		default:
+			// This is not possible.
+			_vm->renderMessage(kStringGenericInteract13);
+		}
+	}
+}
+
+void GameManager2::executeRoom() {
+	if (_currentRoom == _rooms[PUZZLE_FRONT])
+		puzzleConstruction();
+	if (_state._sirenOn && !_vm->_sound->isPlaying())
+		_vm->_sound->playSiren();
+	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
+		handleInput();
+		if (_mouseClicked) {
+			Common::Event event;
+			event.type = Common::EVENT_MOUSEMOVE;
+			event.mouse = Common::Point(0, 0);
+			_vm->getEventManager()->pushEvent(event);
+			event.type = Common::EVENT_MOUSEMOVE;
+			event.mouse = Common::Point(_mouseX, _mouseY);
+			_vm->getEventManager()->pushEvent(event);
+		}
+
+		resetInputState();
+	}
+
+	if (_guiEnabled) {
+		if (!_vm->_screen->isMessageShown()) {
+			g_system->fillScreen(kColorBlack);
+			_vm->renderRoom(*_currentRoom);
+		}
+		if (_currentRoom->getId() < MUSEUM)
+			drawMapExits();
+		else
+			drawClock();
+		drawInventory();
+		drawStatus();
+		drawCommandBox();
+	}
+
+	if (_vm->_screen->getViewportBrightness() == 0)
+		_vm->paletteFadeIn();
+
+	if (!_currentRoom->hasSeen() && _newRoom) {
+		_newRoom = false;
+		_currentRoom->onEntrance();
+	}
+}
+
+void GameManager2::leaveTaxi() {
+	_currentRoom = _state._previousRoom;
+	_vm->renderRoom(*_currentRoom);
+	_guiEnabled = true;
+}
+
+void GameManager2::taxiUnknownDestination() {
+	_vm->renderImage(invertSection(2));
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(4);
+	waitOnInput(_vm->_textSpeed * 3);
+	_vm->renderImage(invertSection(4));
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(2);
+}
+
+void GameManager2::taxiPayment(int price, int destination) {
+	static int answers[] = {
+		kStringPay,
+		kStringLeaveTaxi
+	};
+	if (dialog(2, _dials, answers, 0)) {
+		leaveTaxi();
+	} else if (_state._money < price) {
+		Common::String t = _vm->getGameString(kStringNotEnoughMoney);
+		_vm->renderMessage(t);
+		waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+		leaveTaxi();
+	} else {
+		takeMoney(-price);
+		_vm->renderImage(invertSection(5));
+		_vm->renderImage(invertSection(6));
+		_vm->renderImage(0);
+		_vm->renderImage(1);
+		_vm->renderImage(3);
+
+		Common::String t = _vm->getGameString(kStringTaxiAccelerating);
+		_vm->renderMessage(t);
+		_vm->playSound(kAudioTaxiLeaving);
+		while(_vm->_sound->isPlaying())
+			wait(1);
+		waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+
+		_vm->paletteFadeOut();
+		_vm->_system->fillScreen(kColorBlack);
+		_vm->_screen->setViewportBrightness(255);
+		_vm->_screen->setGuiBrightness(255);
+		_vm->paletteBrightness();
+
+		Common::String t2 = _vm->getGameString(kString5MinutesLater);
+		_vm->renderMessage(t2);
+		_vm->playSound(kAudioTaxiArriving);
+		while(_vm->_sound->isPlaying())
+			wait(1);
+		waitOnInput((t2.size() + 20) * _vm->_textSpeed / 10);
+		_vm->removeMessage();
+		_vm->paletteFadeOut();
+
+		switch (destination) {
+		case 0:
+			changeRoom(TAXISTAND);
+			break;
+		case 1:
+			changeRoom(STREET);
+			break;
+		case 2:
+			changeRoom(CULTURE_PALACE);
+			break;
+		case 10:
+			changeRoom(CITY1);
+			break;
+		case 11:
+			changeRoom(CITY2);
+			break;
+		}
+	}
+}
+
+void GameManager2::taxi() {
+	_vm->_allowSaveGame = false;
+	static int dest[] = {
+		kStringAirport,
+		kStringDowntown,
+		kStringCulturePalace,
+		kStringEarth,
+		kStringPrivateApartment,
+		kStringLeaveTaxi
+	};
+	Common::String input;
+	int possibility = _state._taxiPossibility;
+
+	_state._previousRoom = _currentRoom;
+	_currentRoom = _rooms[INTRO2];
+	_vm->setCurrentImage(4);
+	_vm->renderImage(0);
+	_vm->renderImage(1);
+	_vm->renderImage(2);
+
+	if (_state._previousRoom == _rooms[TAXISTAND]) possibility += 1;
+	else if (_state._previousRoom == _rooms[STREET]) possibility += 2;
+	else if (_state._previousRoom == _rooms[CULTURE_PALACE]) possibility += 4;
+	int answer;
+	do {
+		_currentRoom->removeSentenceByMask(possibility, 1);
+		switch (answer = dialog(6, _dials, dest, 1)) {
+		case 3:
+			_state._taxiPossibility += 8;
+			possibility += 8;
+			taxiUnknownDestination();
+			break;
+		case 5:
+			leaveTaxi();
+			break;
+		case 4:
+			_vm->renderMessage(kStringAddress);
+			do {
+				edit(input, 101, 70, 18);
+			} while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE) && !_vm->shouldQuit());
+
+			_vm->removeMessage();
+			if (_key.keycode == Common::KEYCODE_ESCAPE) {
+				leaveTaxi();
+				break;
+			}
+			input.toUppercase();
+			if (input == "115AY2,96A" || input == "115AY2,96B")
+				answer = 10;
+			else if (input == "341,105A" || input == "341,105B") {
+				if (_state._addressKnown)
+					answer = 11;
+				else {
+					Common::String t = _vm->getGameString(kStringCheater);
+					_vm->renderMessage(t);
+					waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+					_vm->removeMessage();
+
+					leaveTaxi();
+					break;
+				}
+			} else {
+				answer = 3;
+				input = "";
+				taxiUnknownDestination();
+				break;
+			}
+			_vm->renderImage(invertSection(2));
+			_vm->renderImage(0);
+			_vm->renderImage(1);
+			_vm->renderImage(6);
+			_vm->playSound(kAudioSuccess2);
+			taxiPayment(14, answer);
+			break;
+		default:
+			_vm->renderImage(invertSection(2));
+			_vm->renderImage(0);
+			_vm->renderImage(1);
+			_vm->renderImage(5);
+			taxiPayment(8, answer);
+			break;
+		}
+	_rooms[INTRO2]->addAllSentences(1);
+	} while(answer == 3 && !_vm->shouldQuit());
+	_vm->_allowSaveGame = true;
+
+}
+
+void GameManager2::playerTakeOut() {
+	_vm->renderMessage(kStringRemoveChip);
+	Object *o = _rooms[APARTMENT]->getObject(0);
+	o->_section = 0;
+	takeObject(*o);
+}
+
+void GameManager2::sober() {
+	_state._tipsy = false;
+}
+
+bool GameManager2::talk(int mod1, int mod2, int rest, MessagePosition pos, int id) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	const Common::String& text = _vm->getGameString(id);
+
+	_vm->renderMessage(text, pos);
+	int animation_count = (text.size() + 20) * (10 - rest) * _vm->_textSpeed / 400;
+	_restTime =  (text.size() + 20) * rest * _vm->_textSpeed / 400;
+
+	while (animation_count) {
+		if (mod1)
+			_vm->renderImage(mod1);
+
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		if (mod2)
+			_vm->renderImage(mod2);
+
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		animation_count--;
+	}
+	if (_restTime == 0)
+		_vm->removeMessage();
+
+	return true;
+}
+
+bool GameManager2::talkRest(int mod1, int mod2, int rest) {
+	Common::KeyCode key = Common::KEYCODE_INVALID;
+	while (rest) {
+		_vm->renderImage(mod1);
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		_vm->renderImage(mod2);
+		if (waitOnInput(2, key)) {
+			_vm->removeMessage();
+			return key != Common::KEYCODE_ESCAPE && !_vm->shouldQuit();
+		}
+		rest--;
+	}
+	return true;
+}
+
+void GameManager2::pyramidEnd() {
+	_vm->renderMessage(kStringPyramid0);
+	waitOnInput(_messageDuration);
+	_vm->removeMessage();
+	_vm->paletteFadeOut();
+	_vm->loadGame(kSleepAutosaveSlot);
+	changeRoom(CABIN2);
+	drawGUI();
+	_rooms[CABIN2]->setSectionVisible(kMaxSection - 1, kShownFalse);
+	_rooms[CABIN2]->setSectionVisible(kMaxSection - 2, kShownTrue);
+	_rooms[CABIN2]->setSectionVisible(1, kShownFalse);
+}
+
+void GameManager2::passageConstruction() {
+	static ConstructionEntry constructionTab[9] = {
+		{0, 4, 10, 2, 13},
+		{0, 4, 9,  2, 14},
+		{0, 4, 8,  3,  2},
+		{1, 4, 7,  3,  1},
+		{1, 5, 7,  3,  3},
+		{1, 6, 7,  3,  5},
+		{1, 4, 7,  1,  2},
+		{1, 2, 5,  1,  1},
+		{0, 4, 9,  2, 20}
+	};
+
+	changeRoom(PYR_ENTRANCE);
+	_rooms[PYR_ENTRANCE]->setSectionVisible(1, 
+			!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 0, -1));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(2, 
+			!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 0,  1));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(7, 
+			wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 1,  0));
+
+	if (!_rooms[PYR_ENTRANCE]->isSectionVisible(7)) {
+		_rooms[PYR_ENTRANCE]->getObject(3)->_type = EXIT;
+		_rooms[PYR_ENTRANCE]->getObject(3)->_click = 0;
+		_rooms[PYR_ENTRANCE]->setSectionVisible(3, 
+				!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 1, -1));
+		_rooms[PYR_ENTRANCE]->setSectionVisible(4, 
+				!wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 1,  1));
+		_rooms[PYR_ENTRANCE]->setSectionVisible(8, 
+				wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2,  0));
+		if (!_rooms[PYR_ENTRANCE]->isSectionVisible(8)) {
+			_rooms[PYR_ENTRANCE]->setSectionVisible(5, 
+				   !wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2, -1));
+			_rooms[PYR_ENTRANCE]->setSectionVisible(6, 
+				   !wall(_state._pyraS, _state._pyraZ, _state._pyraDirection, 2,  1));
+		} else {
+			_rooms[PYR_ENTRANCE]->setSectionVisible(5, kShownFalse);
+			_rooms[PYR_ENTRANCE]->setSectionVisible(6, kShownFalse);
+		}
+	} else {
+		_rooms[PYR_ENTRANCE]->getObject(3)->_type = NULLTYPE;
+		_rooms[PYR_ENTRANCE]->getObject(3)->_click = 255;
+		_rooms[PYR_ENTRANCE]->setSectionVisible(3, kShownFalse);
+		_rooms[PYR_ENTRANCE]->setSectionVisible(4, kShownFalse);
+		_rooms[PYR_ENTRANCE]->setSectionVisible(8, kShownFalse);
+	}
+	for (int i = 0; i < 9; i++) {
+		bool b = (_state._pyraE == constructionTab[i]._e &&
+			 _state._pyraS == constructionTab[i]._s &&
+			 _state._pyraZ == constructionTab[i]._z &&
+			 _state._pyraDirection == constructionTab[i]._r);
+		if (constructionTab[i]._a > 12)
+			_rooms[PYR_ENTRANCE]->setSectionVisible(constructionTab[i]._a, b);
+		else if (b)
+			_rooms[PYR_ENTRANCE]->setSectionVisible(constructionTab[i]._a, kShownTrue);
+	}
+
+	_rooms[PYR_ENTRANCE]->setSectionVisible(18, kShownFalse);
+	_rooms[PYR_ENTRANCE]->setSectionVisible(19, kShownFalse);
+	_rooms[PYR_ENTRANCE]->setSectionVisible(21, kShownFalse);
+	_rooms[PYR_ENTRANCE]->getObject(0)->_click = 255;
+
+	if (_state._pyraE == 0 && _state._pyraS == 4 && _state._pyraZ == 10) {
+		switch (_state._pyraDirection) {
+		case 0:
+			_rooms[PYR_ENTRANCE]->setSectionVisible(19, kShownTrue);
+			_rooms[PYR_ENTRANCE]->getObject(0)->_click = 8;
+			break;
+		case 2:
+			_rooms[PYR_ENTRANCE]->setSectionVisible(18, kShownTrue);
+			_rooms[PYR_ENTRANCE]->getObject(0)->_click = 7;
+			break;
+		case 1:
+			_rooms[PYR_ENTRANCE]->setSectionVisible(21, kShownTrue);
+			_rooms[PYR_ENTRANCE]->getObject(0)->_click = 9;
+			break;
+		}
+	}
+	_rooms[PYR_ENTRANCE]->setSectionVisible(9, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(1));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(10, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(2));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(11, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(3));
+	_rooms[PYR_ENTRANCE]->setSectionVisible(12, 
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &
+			!_rooms[PYR_ENTRANCE]->isSectionVisible(4));
+}
+
+byte GameManager2::wall(int s, int z, int direction, int stepsForward, int stepsRight) {
+	static char vertical[2][12][11] = {
+		{
+			{0,0,0,0,0,0,0,0,0,0,0},
+			{0,1,0,0,0,0,0,0,0,0,0},
+			{1,0,1,0,0,0,0,0,0,0,0},
+			{1,0,1,0,1,0,0,0,0,0,0},
+			{0,1,0,0,1,0,0,1,0,0,0},
+			{0,0,1,0,0,0,1,0,1,0,0},
+			{0,0,0,1,1,0,1,0,0,0,0},
+			{0,0,0,1,1,0,0,1,0,0,0},
+			{0,0,0,0,0,1,0,1,0,0,0},
+			{0,0,0,0,0,1,1,0,1,0,0},
+			{0,0,0,0,1,0,0,0,1,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0}
+		},
+		{
+			{0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0},
+			{0,1,0,1,0,0,0,0,0,0,0},
+			{0,1,0,1,1,0,0,0,0,0,0},
+			{1,0,0,0,1,0,0,0,0,0,0},
+			{0,0,0,0,0,1,0,0,1,0,0},
+			{0,0,0,0,0,0,1,1,0,0,1},
+			{0,0,0,0,0,1,0,1,0,0,1},
+			{0,0,0,0,1,0,1,0,1,1,0},
+			{0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0}
+		}
+	};
+
+	static char horizontal[2][11][12] = {
+		{
+			{0,1,1,0,0,0,0,0,0,0,0,0},
+			{0,0,1,0,0,0,0,0,0,0,0,0},
+			{0,1,0,1,1,0,0,0,0,0,0,0},
+			{0,1,1,0,0,0,0,0,0,0,0,0},
+			{0,0,1,0,0,1,1,0,1,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,0,0,0,1,0,0,0,0},
+			{0,0,0,0,1,1,0,0,0,0,0,0},
+			{0,0,0,0,0,1,0,1,1,0,0,0},
+			{0,0,0,0,0,1,1,0,0,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0}
+		},
+		{
+			{0,0,0,0,0,0,0,0,0,0,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0},
+			{0,1,0,0,1,0,0,0,0,0,0,0},
+			{0,0,0,0,1,0,0,0,0,0,0,0},
+			{0,0,1,1,0,0,0,0,0,0,0,0},
+			{0,1,1,0,0,1,0,0,0,0,0,0},
+			{0,0,0,0,0,0,1,0,1,0,0,0},
+			{0,0,0,0,0,1,1,0,0,0,0,0},
+			{0,0,0,0,0,1,0,1,1,0,1,0},
+			{0,0,0,0,0,1,1,0,0,1,0,0},
+			{0,0,0,0,0,0,0,0,0,0,0,0}
+		}
+	};
+	int newR;
+	if (stepsRight) {
+		if (stepsRight > 0)
+			newR = (direction + 1) & 3;
+		else {
+			newR = (direction - 1) & 3;
+			stepsRight = -stepsRight;
+		}
+		switch (direction) {
+		case 0:
+			return wall(s, z - stepsForward, newR, stepsRight, 0);
+		case 2:
+			return wall(s, z + stepsForward, newR, stepsRight, 0);
+		case 1:
+			return wall(s + stepsForward, z, newR, stepsRight, 0);
+		case 3:
+			return wall(s - stepsForward, z, newR, stepsRight, 0);
+		}
+	}
+	switch (direction) {
+	case 0:
+		return vertical  [_state._pyraE][z + 1 - stepsForward][s] == 0;
+	case 2:
+		return vertical  [_state._pyraE][z     + stepsForward][s] == 0;
+	case 1:
+		return horizontal[_state._pyraE][z][s     + stepsForward] == 0;
+	case 3:
+		return horizontal[_state._pyraE][z][s + 1 - stepsForward] == 0;
+	}
+	return 0;
+}
+
+bool GameManager2::move(Action verb, Object &obj) {
+	if (verb == ACTION_WALK && obj._id == CORRIDOR) {
+		switch (_state._pyraDirection) {
+			case 0:
+				_state._pyraZ--;
+				break;
+			case 1:
+				_state._pyraS++;
+				break;
+			case 2:
+				_state._pyraZ++;
+				break;
+			case 3:
+				_state._pyraS--;
+				break;
+		}
+	} else if (verb == ACTION_WALK && obj._id == G_RIGHT) {
+		_state._pyraDirection++;
+		_state._pyraDirection &= 3;
+	} else if (verb == ACTION_WALK && obj._id == G_LEFT) {
+		_state._pyraDirection--;
+		_state._pyraDirection &= 3;
+	} else
+		return false;
+	return true;
+}
+
+void GameManager2::compass() {
+	static int dirs[7] = {
+		kStringDirection1,
+		kStringDirection2,
+		kStringDirection3,
+		kStringDirection4,
+		kStringDirection1,
+		kStringDirection2,
+		kStringDirection3
+	};
+	_vm->renderBox(281, 161, 39, 39, kColorWhite63);
+	_vm->renderBox(295, 180, 13,  3, kColorWhite44);
+	_vm->renderBox(300, 175,  3, 13, kColorWhite44);
+	_vm->renderText(dirs[_state._pyraDirection    ], 299, 163, kColorBlack);
+	_vm->renderText(dirs[_state._pyraDirection + 1], 312, 179, kColorBlack);
+	_vm->renderText(dirs[_state._pyraDirection + 2], 299, 191, kColorBlack);
+	_vm->renderText(dirs[_state._pyraDirection + 3], 283, 179, kColorBlack);
+}
+
+void GameManager2::puzzleConstruction() {
+	_vm->setCurrentImage(12);
+	MSNImage *image = _vm->_screen->getCurrentImage();
+	for (int i = 0; i < 16; i ++) {
+		_puzzleField[i] = 255;
+	}
+	for (int i = 0; i < 15; i++) {
+		image->_section[i + 1].x1 = 95 + (_state._puzzleTab[i] % 4) * 33;
+		image->_section[i + 1].x2 = image->_section[i + 1].x1 + 31;
+		image->_section[i + 1].y1 = 24 + (_state._puzzleTab[i] / 4) * 25;
+		image->_section[i + 1].y2 = image->_section[i + 1].y1 + 23;
+
+		_puzzleField[_state._puzzleTab[i]] = i;
+	}
+}
+
+void GameManager2::alarm() {
+	_vm->_sound->playSiren();
+	_state._sirenOn = true;
+	if (_vm->_screen->isMessageShown())
+		_vm->removeMessage();
+	_vm->renderMessage(kStringMuseum7);
+	_state._eventTime = g_system->getMillis() + 16200;
+	_state._eventCallback = kCaughtFn;
+	_state._alarmOn = true;
+}
+
+void GameManager2::caught() {
+	if (_vm->_screen->isMessageShown())
+		_vm->removeMessage();
+	if        (_currentRoom <  _rooms[MUS1]) {
+	} else if (_currentRoom <= _rooms[MUS2]) {
+		_vm->renderImage( 8); 
+		_vm->renderImage(18);
+	} else if (_currentRoom == _rooms[MUS3]) {
+		_vm->renderImage(12); 
+		_vm->renderImage(30);
+	} else if (_currentRoom == _rooms[MUS4]) {
+		_vm->renderImage( 8); 
+		_vm->renderImage(18);
+	} else if (_currentRoom == _rooms[MUS5]) {
+		_vm->renderImage( 9); 
+		_vm->renderImage(29);
+	} else if (_currentRoom <= _rooms[MUS7]) {
+		_vm->renderImage( 7); 
+		_vm->renderImage(17);
+	} else if (_currentRoom <= _rooms[MUS9]) {
+		_vm->renderImage( 1); 
+		_vm->renderImage( 7);
+	} else if (_currentRoom <= _rooms[MUS11]) {
+		_vm->renderImage( 2); 
+		_vm->renderImage( 8);
+	}
+	caught2();
+}
+
+void GameManager2::caught2() {
+	_vm->renderMessage(kStringMuseum8);
+	_vm->playSound(kAudioCaught);
+	waitOnInput(_messageDuration);
+	_vm->removeMessage();
+	_state._sirenOn = false;
+	_mapOn = false;
+	_state._haste = false;
+	dead(kStringMuseum9);
+}
+
+void GameManager2::drawClock() {
+	int time = (g_system->getMillis() - _state._startTime) / 600;
+	int second = time % 100;
+	Room *r;
+	if (!_mapOn) {
+		_vm->renderBox(281, 161, 39, 39, kColorWhite25);
+		char s[9] = "00";
+		s[1] = time % 10 + 48;
+		time /= 10;
+		s[0] = time % 10 + 48;
+		time /= 10;
+		_vm->renderText(s, 293, 180, kColorWhite99);
+		strcpy(s, " 0:00");
+		s[4] = time % 10 + 48;
+		time /= 10;
+		s[3] = time % 10 + 48;
+		time /= 10;
+		s[1] = time % 10 + 48;
+		time /= 10;
+		if (time)
+			s[0] = time % 10 + 48;
+		_vm->renderText(s, 285, 170, kColorWhite99);
+	}
+	if ((r = _rooms[_securityTab[second / 10]]) == _currentRoom) {
+		//arrow();
+		_state._alarmCracked = false;
+		caught();
+	}
+	for (int i = 0; i < 3; i++) {
+		Object *o = r->getObject(i);
+		if ((o->_id == DOOR || o->_id == ENCRYPTED_DOOR || o->_id == SMALL_DOOR) && 
+				(o->_type & OPENED) && ! _state._alarmOn)
+			alarm();
+	}
+	if (!_state._alarmOn && _currentRoom == _rooms[MUS4] && 
+			second >= 21 && second <= 40)
+		alarm();
+	if (_currentRoom == _rooms[MUS_ENTRANCE] && second >= 22 && second <= 29) {
+		if (!_steps && !_state._alarmCracked) {
+			_steps = true;
+			_vm->renderMessage(kStringMuseum6);
+		}
+	} else _steps = false;
+}
+
+void GameManager2::crack(int time) {
+	_alarmBefore = _state._alarmOn;
+	_cracking = true;
+	_vm->_screen->changeCursor(ResourceManager::kCursorWait);
+	int t = 0;
+	int z;
+	int zv = 0;
+	do {
+		do {
+			wait(1);
+		} while ((z = (g_system->getMillis() - _state._startTime) / 600) == zv);
+		zv = z;
+		drawClock();
+		t++;
+	} while (t < time && _state._alarmOn == _alarmBefore);
+	_cracking = false;
+	_vm->_screen->changeCursor(ResourceManager::kCursorNormal);
+	if (_state._alarmOn == _alarmBefore)
+		_vm->removeMessage();
+}
+
+bool GameManager2::crackDoor(int time) {
+	_vm->renderMessage(kStringMuseum15);
+	crack(time);
+	if (_state._alarmOn != _alarmBefore) {
+		waitOnInput(_messageDuration);
+		_vm->removeMessage();
+		_vm->renderMessage(kStringMuseum16);
+	}
+	return !_state._alarmOn;
+}
+
+void GameManager2::museumDoorInteract(Action verb, Object &obj1, Object &obj2) {
+	static struct {
+		int _r1;
+		int _o1;
+		int _r2;
+		int _o2;
+	} doorTab[11] = {
+		{MUS1, 0, MUS2, 0},
+		{MUS2, 1, MUS3, 0},
+		{MUS3, 1, MUS10, 0},
+		{MUS10, 1, MUS11, 0},
+		{MUS11, 1, MUS7, 1},
+		{MUS7, 0, MUS6, 1},
+		{MUS6, 0, MUS5, 1},
+		{MUS5, 0, MUS4, 0},
+		{MUS5, 2, MUS9, 1},
+		{MUS9, 0, MUS8, 1},
+		{MUS8, 0, MUS1, 1}
+	};
+	Room *r;
+	if (verb == ACTION_OPEN && obj1._id == DOOR) {
+		for (int i = 0; i < 11; i++) {
+			if ((_currentRoom == _rooms[doorTab[i]._r1]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o1)) {
+				r = _rooms[doorTab[i]._r2];
+				r->getObject(doorTab[i]._o2)->_type |= OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownTrue);
+			} else if ((_currentRoom == _rooms[doorTab[i]._r2]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o2)) {
+				r = _rooms[doorTab[i]._r1];
+				r->getObject(doorTab[i]._o1)->_type |= OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownTrue);
+			}
+		}
+	} else if (verb == ACTION_CLOSE && obj1._id == DOOR) {
+		for (int i = 0; i < 11; i++) {
+			if ((_currentRoom == _rooms[doorTab[i]._r1]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o1)) {
+				r = _rooms[doorTab[i]._r2];
+				r->getObject(doorTab[i]._o2)->_type &= ~OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o2)->_section, kShownFalse);
+			} else if ((_currentRoom == _rooms[doorTab[i]._r2]) &&
+				 &obj1 == _currentRoom->getObject(doorTab[i]._o2)) {
+				r = _rooms[doorTab[i]._r1];
+				r->getObject(doorTab[i]._o1)->_type &= ~OPENED;
+				r->setSectionVisible(r->getObject(doorTab[i]._o1)->_section, kShownFalse);
+			}
+		}
+	}
+}
+
+void GameManager2::securityEntrance() {
+	static struct {
+		RoomId _r;
+		int _a1;
+		int _a2;
+	} securityList[11] = {
+		{MUS1 ,11,31},
+		{MUS2 , 7,17},
+		{MUS3 , 7,17},
+		{MUS10, 1, 7},
+		{MUS11, 1, 7},
+		{MUS7 ,10,32},
+		{MUS6 , 8,18},
+		{MUS5 , 8,18},
+		{MUS9 , 2, 8},
+		{MUS8 , 2, 8},
+		{MUS1 , 0, 0}
+	};
+
+	int time = (g_system->getMillis() - _state._startTime) / 600;
+	int second = time % 100;
+
+	if (_rooms[_securityTab[second / 10]] == _currentRoom) {
+		int i;
+		for (i = 0; _currentRoom != _rooms[securityList[i]._r]; i++) {}
+		if (_lastRoom == _rooms[securityList[i + 1]._r]) {
+			_vm->renderImage(securityList[i]._a1);
+			_vm->renderImage(securityList[i]._a2);
+			caught2();
+		} else
+			caught();
+	}
+}
+
+void GameManager2::pressureAlarmEntrance() {
+	_state._pressureCounter = 0;
+	securityEntrance();
+}
+
+void GameManager2::pressureAlarmCount() {
+	if (!(_state._alarmOn ||
+			(_currentRoom == _rooms[MUS22] && _currentRoom->isSectionVisible(6)))) {
+		_state._pressureCounter++;
+		if ((_currentRoom >= _rooms[MUS12] && _state._pressureCounter > 8) || 
+				_state._pressureCounter > 16)
+			alarm();
+	}
+	setAnimationTimer(11);
+}
+
+}
+
diff --git a/engines/supernova/supernova2/state.h b/engines/supernova/supernova2/state.h
new file mode 100644
index 0000000..64d070d
--- /dev/null
+++ b/engines/supernova/supernova2/state.h
@@ -0,0 +1,138 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_STATE_H
+#define SUPERNOVA2_STATE_H
+
+#include "common/events.h"
+#include "common/rect.h"
+#include "common/keyboard.h"
+#include "supernova/room.h"
+#include "supernova/supernova2/rooms.h"
+#include "supernova/sound.h"
+#include "supernova/game-manager.h"
+
+namespace Supernova {
+
+struct ConstructionEntry {
+	int _e;
+	int _s;
+	int _z;
+	int _r;
+	int _a;
+};
+
+struct GameState2 {
+	int16 _money;
+	int32 _startTime;
+	bool _addressKnown;
+	Room *_previousRoom;
+	bool _poleMagnet;
+	char _admission;
+	bool _tipsy;
+	bool _dark;
+	char _elevatorE;
+	char _elevatorNumber;
+	bool _toMuseum;
+	EventFunction _eventCallback;
+	uint32 _eventTime;
+	int16 _pyraE;
+	char _pyraS;
+	char _pyraZ;
+	int16 _pyraDirection;
+	int16 _puzzleTab[15];
+	bool _alarmCracked;
+	bool _alarmOn;
+	bool _haste;
+	byte _pressureCounter;
+	bool _sirenOn;
+	byte _taxiPossibility;
+};
+
+class GameManager2: public GameManager{
+public:
+	GameManager2(SupernovaEngine *vm, Sound *sound);
+	~GameManager2();
+
+	GameState2 _state;
+
+	virtual void updateEvents();
+	virtual void executeRoom();
+	virtual bool serialize(Common::WriteStream *out);
+	virtual bool deserialize(Common::ReadStream *in, int version);
+
+	byte _dials[6];
+
+	//state
+	unsigned char _puzzleField[16];
+	bool _mapOn;
+	bool _steps;
+	bool _cracking;
+	bool _alarmBefore;
+	RoomId _securityTab[10];
+	int _restTime;
+
+	virtual void initState();
+	virtual void initRooms();
+	virtual void destroyRooms();
+	virtual bool canSaveGameStateCurrently();
+	virtual bool genericInteract(Action verb, Object &obj1, Object &obj2);
+	virtual void roomBrightness() {}
+	virtual void drawMapExits();
+	virtual void handleInput();
+	virtual void handleTime();
+	virtual void loadTime() {}
+	virtual void saveTime() {}
+	virtual void takeMoney(int amount);
+	void taxi();
+	void leaveTaxi();
+	void taxiUnknownDestination();
+	void taxiPayment(int price, int destination);
+	void playerTakeOut();
+	void sober();
+	void playCD();
+	bool talk(int mod1, int mod2, int rest, MessagePosition pos, int id);
+	bool talkRest(int mod1, int mod2, int rest);
+	void pyramidEnd();
+	void passageConstruction();
+	byte wall(int s, int z, int direction, int stepsForward, int stepsRight);
+	bool move(Action verb, Object &obj);
+	void compass();
+	void puzzleConstruction();
+	void drawClock();
+	void caught();
+	void caught2();
+	void alarm();
+	void crack(int time);
+	bool crackDoor(int time);
+	void museumDoorInteract(Action verb, Object &obj1, Object &obj2);
+	void securityEntrance();
+	void pressureAlarmCount();
+	void pressureAlarmEntrance();
+
+private:
+	int _prevImgId;
+};
+
+}
+
+#endif // SUPERNOVA2_STATE_H
diff --git a/engines/supernova/supernova2/stringid.h b/engines/supernova/supernova2/stringid.h
new file mode 100644
index 0000000..fe765df
--- /dev/null
+++ b/engines/supernova/supernova2/stringid.h
@@ -0,0 +1,154 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef SUPERNOVA2_STRINGID_H
+#define SUPERNOVA2_STRINGID_H
+
+#include "common/scummsys.h"
+
+namespace Supernova {
+
+enum StringId2 {
+kString23 = 25, kString24,
+kString25, kString26, kString27, kStringTextSpeed, kStringLeaveGame,
+kString30, kString31, kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3,
+kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8,
+kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
+kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
+kStringOutro1, kStringOutro2, kStringOutro3, kStringOutro4, kStringOutro5,
+kStringShout1, kStringShout2, kStringShout3, kStringShout4, kStringShout5,
+kStringShout6, kStringShout7, kStringShout8, kStringShout9, kStringShout10,
+kStringShout11, kStringShout12, kStringShout13, kStringShout14, kStringShout15,
+kStringMuseum8, kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15,
+kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14,
+kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
+kStringMuseum23, kStringMuseum24, kStringMuseum17, kStringMuseum18, kStringMuseum19,
+kStringMuseum20, kStringMuseum21, kStringMuseum22, kStringDinosaur, kStringDinosaurDescription,
+kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
+kStringMainEntrance, kStringCorridor, kStringDinosaurDescription2, kStringDinosaurHead, kStringDinosaurHeadDescription,
+kStringAlarmSystem, kStringSuctionCup, kStringWall, kStringOpening, kStringLetter,
+kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
+kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
+kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
+kStringPyramid12, kStringPyramid13, kStringPyramid14, kStringPyramid15, kStringPyramid17,
+kStringPyramid18, kStringPyramid19, kStringDirection1, kStringDirection2, kStringDirection3,
+kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
+kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
+kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
+kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
+kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
+kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
+kStringOpeningDescription3, kStringStones, kStringPlate, kStringCoffin, kStringExit,
+kStringCreepy, kStringToothbrush, kStringToothbrushDescription1, kStringToothpaste, kStringBall,
+kStringBallDescription, kStringEye, kStringEyeDescription, kStringLooksMetal,
+kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
+kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
+kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD,
+kStringChipEmpty, kStringListeningToCD, kStringNoChip, kStringTipsy, kStringXa,
+kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
+kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
+kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
+kStringOnlyShop, kStringCabinOccupiedSay, kStringTakeMoney, kStringAlreadyPaid, kStringNoMoney,
+kStringPay10Xa, kStringWillPassOut, kStringRest, kStringCypher, kStringWillTakeIt,
+kStringTooExpensive, kStringWouldBuy, kStringMeHorstHummel, kStringHaveMusicChip, kStringGreatMask,
+kStringThreeYears, kStringStrongDrink, kStringMusicDevice, kStringArtusToothbrush, kStringSellInBulk,
+kStringRarityBooks, kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words, kStringNotSale,
+kStringGaveOne, kStringExcited, kStringFromGame, kStringRobust, kStringCheapSwill,
+kStringStickers, kStringDishes, kStringUgly, kStringSellsWell, kStringThatCosts,
+kStringTakeALook, kStringNonsense, kStringImSorry, kStringGoodEvening, kStringHello,
+kStringScaredMe, kStringHowSo, kStringDisguise, kStringWhatDisguise, kStringStopPretending,
+kStringYouDisguised, kStringIAmHorstHummel, kStringGiveItUp, kStringGestures, kStringMovesDifferently,
+kStringHeIsRobot, kStringYouAreCrazy, kStringYouIdiot, kStringShutUp, kStringKnife,
+kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription, kStringSuctionCupDescription,
+kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard,
+kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kStringVehicle,
+kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWalletDescription, kStringDevice,
+kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription,
+kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost, kStringRailing,
+kStringPoster, kStringPosterDescription, kStringCabin, kStringCabinFree, kStringCabinOccupied,
+kStringFeet, kStringFeetDescription, kStringHood, kStringHoodDescription, kString400Xa,
+kString10Xa, kStringSlotDescription1, kStringSlotDescription2, kStringChair, kStringChairDescription,
+kStringScribble, kStringFace, kStringFaceDescription, kStringBooks, kStringDictionary,
+kStringPlant, kStringMask, kStringSnake, kStringCup, kStringJoystick,
+kStringToothbrushDescription, kStringMusic, kStringMusicDescription, kStringBottle, kStringBottleDescription,
+kStringBox, kStringSeller, kStringWhat, kStringNotInformed, kStringHorstHummel,
+kStringNiceWeather, kStringTellTicket, kStringHereIsXa, kString500Xa, kString1000Xa,
+kString5000Xa, kString10000Xa, kStringThankYou, kStringWhatYouOffer, kStringHello2,
+kStringWhatYouWant, kStringWhoAreYou, kStringHorstHummel2, kStringNeverHeard, kStringYouDontKnow,
+kStringImOnTV, kStringIDontKnow, kStringFunny, kStringAha, kStringICan,
+kStringFromWhom, kStringCost, kStringAsYouSay, kStringGetCard, kStringOnlyParticipation,
+kStringWhatForIt, kStringMakeOffer, kStringGoodOffer, kStringGiveCard, kStringIdiot,
+kStringCheckout1, kStringCheckout2, kStringCheckout3, kStringYes, kStringNo,
+kStringCheckout4, kStringCheckout5, kStringCheckout6, kStringCheckout7, kStringCheckout8,
+kStringCheckout9, kStringCheckout10, kStringCheckout11, kStringCheckout12, kStringCheckout13,
+kStringCheckout14, kStringCheckout15, kStringCheckout16, kStringCheckout17, kStringCheckout18,
+kStringCheckout19, kStringCheckout20, kStringCheckout21, kStringCheckout22, kStringCheckout23,
+kStringCheckout24, kStringCheckout25, kStringCheckout26, kStringCheckout27, kStringCheckout28,
+kStringCheckout29, kStringCheckout30, kStringCheckout31, kStringCheckout32, kStringCheckout33,
+kStringCheckout34, kStringCheckout35, kStringCheckout36, kStringCheckout37, kStringCheckout38,
+kStringCheckout39, kStringCheckout40, kStringCheckout41, kStringCheckout42, kStringCheckout43,
+kStringCheckout44, kStringCheckout45, kStringCheckout46, kStringCheckout47, kStringCheckout48,
+kStringCheckout49, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon,
+kStringIWillProof, kStringIWillPerform, kStringAppearance32, kStringAppearance1, kStringAppearance2,
+kStringAppearance3, kStringAppearance4, kStringAppearance5, kStringAppearance6, kStringAppearance7,
+kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11, kStringAppearance12,
+kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17,
+kStringAppearance18, kStringAppearance19, kStringAppearance20, kStringAppearance21, kStringAppearance22,
+kStringAppearance23, kStringAppearance24, kStringAppearance25, kStringAppearance26, kStringAppearance27,
+kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kStringElevator1,
+kStringElevator2, kStringElevator3, kStringElevator4, kStringElevator5, kStringElevator6,
+kStringElevator7, kStringElevator8, kStringElevator9, kStringElevator10, kStringElevator11,
+kStringElevator12, kStringElevator13, kStringElevator14, kStringElevator15, kStringElevator16,
+kStringElevator17, kStringElevator18, kStringElevator19, kStringElevator20, kStringElevator21,
+kStringElevator22, kStringElevator23, kStringElevator24, kStringElevator25, kStringElevator26,
+kStringElevator27, kStringElevator28, kStringElevator29, kStringElevator30, kStringElevator31,
+kStringElevator32, kStringElevator33, kStringElevator34, kStringElevator35, kStringElevator36,
+kStringElevator37, kStringElevator38, kStringElevator39, kStringElevator40, kStringElevator41,
+kStringElevator42, kStringElevator43, kStringElevator44, kStringElevator45, kStringElevator46,
+kStringElevator47, kStringElevator48, kStringElevator49, kStringElevator50, kStringElevator51,
+kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStringElevator56,
+kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
+kStringElevator62, kStringElevator63, kStringElevator64, kStringElevator65, kStringApartment1,
+kStringApartment2, kStringApartment3, kStringApartment4, kStringApartment5, kStringApartment6,
+kStringApartment7, kStringApartment8, kStringShip0, kStringShip1, kStringShip2,
+kStringShip3, kStringShip4, kStringShip5, kStringShip6, kStringShip7,
+kStringShip8, kStringShip9, kStringShip10, kStringShip11, kStringShip12,
+kStringShip13, kStringShip14, kStringShip15, kStringShip16, kStringShip17,
+kStringShip18, kStringShip19, kStringFascinating, kStringTaxis, kStringTaxisDescription,
+kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
+kStringSign3Description, kStringSign4Description, kStringBell, kStringDisplay, kStringKeypad,
+kStringKeypadDescription, kStringChip, kStringChipDescription, kStringHatch, kStringHatchDescription,
+kStringMusicSystem, kStringMusicSystemDescription, kStringSpeakers, kStringSpeakersDescription, kStringPencils,
+kStringPencilsDescription, kStringMetalBlocks, kStringMetalBlocksDescription, kStringImage, kStringImageDescription,
+kStringCabinet, kStringCabinetDescription, kStringElevator, kStringUnderBed, kStringUnderBedDescription,
+kStringKey, kStringKeyDescription, kStringSwitch, kStringHandle, kStringHatch2,
+kStringSpaceSuit, kStringSpaceSuitDescription, kStringCable, kStringCableDescription1, kStringCableDescription2,
+kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
+kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
+kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
+kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
+kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14, 
+kStringMonsterDescription, kStringPyramid16, kStringMuseum11
+};
+}
+
+#endif // SUPERNOVA2_STRINGID_H


Commit: 2f84e6d22aecc96e66477a1e14adba4755cadc63
    https://github.com/scummvm/scummvm/commit/2f84e6d22aecc96e66477a1e14adba4755cadc63
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Refactor sound initialization

Changed paths:
    engines/supernova/resman.cpp
    engines/supernova/resman.h
    engines/supernova/sound.h


diff --git a/engines/supernova/resman.cpp b/engines/supernova/resman.cpp
index 9b89b10..0f104e5 100644
--- a/engines/supernova/resman.cpp
+++ b/engines/supernova/resman.cpp
@@ -44,8 +44,7 @@ struct AudioInfo {
 
 static Common::MemoryReadStream *convertToMod(const char *filename, int version = 1);
 
-static const AudioInfo audioInfo[] = {
-	// Supernova 1
+static const AudioInfo audioInfo1[] = {
 	{44,     0,    -1},
 	{45,     0,    -1},
 	{46,     0,  2510},
@@ -66,9 +65,9 @@ static const AudioInfo audioInfo[] = {
 	{54, 24020, 30030},
 	{54, 30030, 31040},
 	{54, 31040,    -1},
+};
 
-	{0 ,     0,     0},
-	// Supernova 2
+static const AudioInfo audioInfo2[] = {
 	{55,     18230,    -1},
 	{47,     0,     16010},
 	{47,     16010, 17020},
@@ -134,6 +133,7 @@ ResourceManager::~ResourceManager() {
 		for (int i = 0; i < 47; i++)
 			delete _images[i];
 	}
+	delete[] _soundSamples;
 }
 
 void ResourceManager::initSoundFiles1() {
@@ -143,24 +143,25 @@ void ResourceManager::initSoundFiles1() {
 	//     where SS SS (LE uint16) is the size of the sound sample + 2
 	//   - samples end with a footer of 4 bytes: 00 00
 	// Skip those in the buffer
+	_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples1];
 	Common::File file;
 
 	for (int i = 0; i < kAudioNumSamples1; ++i) {
-		if (!file.open(Common::String::format("msn_data.%03d", audioInfo[i]._filenumber))) {
+		if (!file.open(Common::String::format("msn_data.%03d", audioInfo1[i]._filenumber))) {
 			error("File %s could not be read!", file.getName());
 		}
 
 		int length = 0;
 		byte *buffer = nullptr;
 
-		if (audioInfo[i]._offsetEnd == -1) {
+		if (audioInfo1[i]._offsetEnd == -1) {
 			file.seek(0, SEEK_END);
-			length = file.pos() - audioInfo[i]._offsetStart - 10;
+			length = file.pos() - audioInfo1[i]._offsetStart - 10;
 		} else {
-			length = audioInfo[i]._offsetEnd - audioInfo[i]._offsetStart - 10;
+			length = audioInfo1[i]._offsetEnd - audioInfo1[i]._offsetStart - 10;
 		}
 		buffer = new byte[length];
-		file.seek(audioInfo[i]._offsetStart + 6);
+		file.seek(audioInfo1[i]._offsetStart + 6);
 		file.read(buffer, length);
 		file.close();
 
@@ -180,24 +181,25 @@ void ResourceManager::initSoundFiles2() {
 	//     where SS SS (LE uint16) is the size of the sound sample + 2
 	//   - samples end with a footer of 4 bytes: 00 00
 	// Skip those in the buffer
+	_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples2];
 	Common::File file;
 
-	for (int i = 0; i < kAudioNumSamples2 - kAudioNumSamples1 - 1; ++i) {
-		if (!file.open(Common::String::format("ms2_data.%03d", audioInfo[i + kAudioNumSamples1 + 1]._filenumber))) {
+	for (int i = 0; i < kAudioNumSamples2; ++i) {
+		if (!file.open(Common::String::format("ms2_data.%03d", audioInfo2[i]._filenumber))) {
 			error("File %s could not be read!", file.getName());
 		}
 
 		int length = 0;
 		byte *buffer = nullptr;
 
-		if (audioInfo[i + kAudioNumSamples1 + 1]._offsetEnd == -1) {
+		if (audioInfo2[i]._offsetEnd == -1) {
 			file.seek(0, SEEK_END);
-			length = file.pos() - audioInfo[i + kAudioNumSamples1 + 1]._offsetStart - 10;
+			length = file.pos() - audioInfo2[i]._offsetStart - 10;
 		} else {
-			length = audioInfo[i + kAudioNumSamples1 + 1]._offsetEnd - audioInfo[i + kAudioNumSamples1 + 1]._offsetStart - 10;
+			length = audioInfo2[i]._offsetEnd - audioInfo2[i]._offsetStart - 10;
 		}
 		buffer = new byte[length];
-		file.seek(audioInfo[i + kAudioNumSamples1 + 1]._offsetStart + 6);
+		file.seek(audioInfo2[i]._offsetStart + 6);
 		file.read(buffer, length);
 		file.close();
 
@@ -208,7 +210,7 @@ void ResourceManager::initSoundFiles2() {
 	initSiren();
 
 	_musicIntroBuffer.reset(convertToMod("ms2_data.052", 2));
-	_musicMadMonkeysBuffer.reset(convertToMod("ms2_data.056", 2));
+	_musicOutroBuffer.reset(convertToMod("ms2_data.056", 2));
 }
 
 void ResourceManager::initGraphics() {
@@ -262,10 +264,7 @@ void ResourceManager::initImages2() {
 
 Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
 	Audio::SeekableAudioStream *stream;
-	if (_MSPart == 1)
-		stream = _soundSamples[index].get();
-	else if (_MSPart == 2)
-		stream = _soundSamples[index - kAudioNumSamples1 - 1].get();
+	stream = _soundSamples[index].get();
 	stream->rewind();
 
 	return stream;
@@ -277,8 +276,7 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 		_musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get()));
 		return _musicIntro.get();
 	case kMusicMadMonkeys:
-		_musicMadMonkeys.reset(Audio::makeProtrackerStream(_musicMadMonkeysBuffer.get()));
-		return _musicMadMonkeys.get();
+		// fall through
 	case kMusicOutro:
 		_musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get()));
 		return _musicOutro.get();
diff --git a/engines/supernova/resman.h b/engines/supernova/resman.h
index 9cbf83a..4ae617e 100644
--- a/engines/supernova/resman.h
+++ b/engines/supernova/resman.h
@@ -70,14 +70,12 @@ private:
 	byte *generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table);
 
 private:
-	Common::ScopedPtr<Audio::SeekableAudioStream> _soundSamples[kAudioNumSamples1];
+	Common::ScopedPtr<Audio::SeekableAudioStream> *_soundSamples;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicIntroBuffer;
 	Common::ScopedPtr<Common::MemoryReadStream> _musicOutroBuffer;
-	Common::ScopedPtr<Common::MemoryReadStream> _musicMadMonkeysBuffer;
 	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
 	Common::ScopedPtr<Audio::AudioStream> _musicOutro;
 	Common::ScopedPtr<Audio::AudioStream> _sirenStream;
-	Common::ScopedPtr<Audio::AudioStream> _musicMadMonkeys;
 	int _MSPart;
 	int _audioRate;
 	MSNImage *_images[kNumImageFiles];
diff --git a/engines/supernova/sound.h b/engines/supernova/sound.h
index c0ca635..55d8e0d 100644
--- a/engines/supernova/sound.h
+++ b/engines/supernova/sound.h
@@ -55,7 +55,7 @@ enum AudioId {
 	kAudioNumSamples1,
 
 	// Supernova 2
-	kAudioIntroDing,
+	kAudioIntroDing = 0,
 	kAudioSuccess2,
 	kAudioTaxiOpen,
 	kAudioTaxiLeaving,
@@ -78,10 +78,9 @@ enum AudioId {
 };
 
 enum MusicId {
-	kMusicIntro = 49,
-	kMusicIntro2 = 52,
-	kMusicOutro = 52,
-	kMusicMadMonkeys = 51
+	kMusicIntro,
+	kMusicOutro,
+	kMusicMadMonkeys
 };
 
 class Sound {


Commit: b1f37566ea02a3e55fbe7d79e4d39d3655ca16de
    https://github.com/scummvm/scummvm/commit/b1f37566ea02a3e55fbe7d79e4d39d3655ca16de
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Refactor game-manager

Changed paths:
    engines/supernova/game-manager.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index 6aae050..cefc41d 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -770,22 +770,21 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 	uint cursorIndex = input.size();
 	// NOTE: Pixels for char needed = kFontWidth + 2px left and right side bearing
 	int overdrawWidth;
+	Color background = kColorBlack;
 
-	if (_vm->_MSPart == 1)
+	if (_vm->_MSPart == 1) {
 		overdrawWidth = ((int)((length + 1) * (kFontWidth + 2)) > (kScreenWidth - x)) ?
 						kScreenWidth - x : (length + 1) * (kFontWidth + 2);
-	else if (_vm->_MSPart == 2)
+		background = kColorDarkBlue;
+	} else if (_vm->_MSPart == 2) {
 		overdrawWidth = ((int)((length + 1) * (kFontWidth2 + 2)) > (kScreenWidth - x)) 
 			? kScreenWidth - x : (length + 1) * (kFontWidth2 + 2);
+		background = kColorWhite35;
+	}
 	_guiEnabled = false;
 	while (isEditing) {
 		_vm->_screen->setTextCursorPos(x, y);
 		_vm->_screen->setTextCursorColor(kColorWhite99);
-		Color background = kColorBlack;
-		if (_vm->_MSPart == 1)
-			background = kColorDarkBlue;
-		else if (_vm->_MSPart == 2)
-			background = kColorWhite35;
 		_vm->renderBox(x, y - 1, overdrawWidth, 9, background);
 		for (uint i = 0; i < input.size(); ++i) {
 			// Draw char highlight depending on cursor position


Commit: ab4af5c61483c90d4ee9479a2e2ed4130a2cd90e
    https://github.com/scummvm/scummvm/commit/ab4af5c61483c90d4ee9479a2e2ed4130a2cd90e
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add info, doc, help screens for MS2

Changed paths:
    devtools/create_supernova/gametext.h
    devtools/create_supernova2/gametext.h
    dists/engine-data/supernova.dat
    dists/engine-data/supernova2.dat
    engines/supernova/game-manager.cpp
    engines/supernova/msn_def.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova1/rooms.h
    engines/supernova/supernova1/stringid.h
    engines/supernova/supernova2/rooms.cpp
    engines/supernova/supernova2/stringid.h


diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 1963d5e..2e7f8d3 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -64,6 +64,17 @@ const char *gameText[] = {
 	"Es ist nichts Besonderes daran.",       // kStringDefaultDescription
 	"|", // kStringDialogSeparator
 	"Gespr\204ch beenden", // kStringConversationEnd
+	"F1    Hilfe",  // kStringHelpOverview1
+	"F2    Anleitung",  // kStringHelpOverview2
+	"F3    Programminformationen",  //kStringHelpOverview3
+	"F4    Textgeschwindigkeit",    //kStringHelpOverview4
+	"F5    Laden / Speichern",  // kStringHelpOverview5
+	"ESC   Vorspann \201berspringen",   // kStringHelpOverview6
+	"Alt-X Programm abbrechen",     // kStringHelpOverview7
+	"Textgeschwindigkeit:", // kStringTextSpeed
+	"Spiel abbrechen?", // kStringLeaveGame
+	"Ja", // kStringYes
+	"Nein", // kStringNo
 	// 20
 	"V2.02",            // kStringTitleVersion
 	"Teil 1:",          // kStringTitle1
@@ -786,7 +797,6 @@ const char *gameText[] = {
 	"Und jetzt raus mit Ihnen!", // kStringSupernova7
 	"Zehn Minuten sp\204ter ...", // kStringSupernova8
 	// 625
-	"Textgeschwindigkeit:", // kStringTextSpeed
 	"Was war das f\201r ein Ger\204usch?", // kStringGuardNoticed1
 	"Ich werde mal nachsehen.", // kStringGuardNoticed2
 	"Guten Tag, hier ist Horst Hummel.", // kStringTelomat1
@@ -816,17 +826,6 @@ const char *gameText[] = {
 	"Passwort:", // kStringTelomat21
 	"Deine Armbanduhr piepst,|die Alarmzeit ist erreicht.", // kStringAlarm
 	// 650
-	"Spiel abbrechen?", // kStringLeaveGame
-	"Ja", // kStringYes
-	"Nein", // kStringNo
-	"F1    Hilfe",  // kStringHelpOverview1
-	"F2    Anleitung",  // kStringHelpOverview2
-	// 655
-	"F3    Programminformationen",  //kStringHelpOverview3
-	"F4    Textgeschwindigkeit",    //kStringHelpOverview4
-	"F5    Laden / Speichern",  // kStringHelpOverview5
-	"ESC   Vorspann \201berspringen",   // kStringHelpOverview6
-	"Alt-X Programm abbrechen",     // kStringHelpOverview7
 	// 660
 	NULL
 };
diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index f71c21b..da187e9 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -65,17 +65,24 @@ const char *gameText[] = {
 "Es ist nichts Besonderes daran.",    //There's nothing special about it.
 "|", //Dialog separator
 "Gespr\204ch beenden",    //End of conversation
+"   F1 Hilfe",  // kStringHelpOverview1
+"   F2 Anleitung",  // kStringHelpOverview2
+"   F3 Programminformationen",  //kStringHelpOverview3
+"   F4 Textgeschwindigkeit",    //kStringHelpOverview4
+"   F5 Laden/Speichern",  // kStringHelpOverview5
+"  ESC Vorspann \201berspringen",   // kStringHelpOverview6
+"Alt X Spiel beenden",     // kStringHelpOverview7
+"Textgeschwindigkeit:",    //Text speed:
+"Spiel abbrechen?",    //Leave game?
+"Ja",    //Yes
+"Nein",    //No
 "Laden",    //Load
 "Speichern",    //Save
 // 25
 "Zur\201ck",    //Back
 "Neustart",    //Restart
 "Schreibfehler",    //write error
-"Textgeschwindigkeit:",    //Text speed:
-"Spiel abbrechen?",    //Leave game?
 // 30
-"Ja",    //Yes
-"Nein",    //No
 "Das tr\204gst du doch bei dir.",    //You already carry this.
 "Du bist doch schon da.",    //You are already there.
 "Das ist geschlossen.",    //This is closed.
diff --git a/dists/engine-data/supernova.dat b/dists/engine-data/supernova.dat
index 839b3b6..63e6bdb 100644
Binary files a/dists/engine-data/supernova.dat and b/dists/engine-data/supernova.dat differ
diff --git a/dists/engine-data/supernova2.dat b/dists/engine-data/supernova2.dat
index decb910..ead25f6 100644
Binary files a/dists/engine-data/supernova2.dat and b/dists/engine-data/supernova2.dat differ
diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index cefc41d..8296e27 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -225,15 +225,24 @@ void GameManager::processInput(Common::KeyState &state) {
 	switch (state.keycode) {
 	case Common::KEYCODE_F1:
 		// help
-		_vm->showHelpScreen();
+		if (_vm->_MSPart == 1)
+			_vm->showHelpScreen1();
+		else if (_vm->_MSPart == 2)
+			_vm->showHelpScreen2();
 		break;
 	case Common::KEYCODE_F2:
 		// show game manual
-		_vm->showTextReader("msn.doc");
+		if (_vm->_MSPart == 1)
+			_vm->showTextReader("msn.doc");
+		else if (_vm->_MSPart == 2)
+			_vm->showTextReader("ms2.doc");
 		break;
 	case Common::KEYCODE_F3:
 		// show game info
-		_vm->showTextReader("msn.inf");
+		if (_vm->_MSPart == 1)
+			_vm->showTextReader("msn.inf");
+		else if (_vm->_MSPart == 2)
+			_vm->showTextReader("ms2.inf");
 		break;
 	case Common::KEYCODE_F4:
 		_vm->setTextSpeed();
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index eebffc3..70d167e 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -186,7 +186,8 @@ enum StringId {
 	kStringCommandGo = 0, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
 	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
 	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
-	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kStringDefaultDescription, kStringDialogSeparator, kStringConversationEnd
+	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kStringDefaultDescription, kStringDialogSeparator, kStringConversationEnd, kStringHelpOverview1, kStringHelpOverview2,
+	kStringHelpOverview3, kStringHelpOverview4, kStringHelpOverview5, kStringHelpOverview6, kStringHelpOverview7, kStringTextSpeed, kStringLeaveGame, kStringYes, kStringNo
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 4ff5434..9d7faf8 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -455,7 +455,7 @@ void SupernovaEngine::setTextSpeed() {
 	_gm->animationOn();
 }
 
-void SupernovaEngine::showHelpScreen() {
+void SupernovaEngine::showHelpScreen1() {
 	if (_screen->isMessageShown())
 		_screen->removeMessage();
 	_gm->animationOff();
@@ -479,6 +479,31 @@ void SupernovaEngine::showHelpScreen() {
 	_gm->animationOn();
 }
 
+void SupernovaEngine::showHelpScreen2() {
+	if (_screen->isMessageShown())
+		_screen->removeMessage();
+	_gm->animationOff();
+	_gm->saveTime();
+
+	paletteFadeOut();
+	setCurrentImage(27);
+	renderImage(0);
+	renderBox(10, 70, 192, 100, kColorWhite35);
+	renderText(kStringHelpOverview1, 15, 80, kColorWhite99);
+	renderText(kStringHelpOverview2, 15, 92, kColorWhite99);
+	renderText(kStringHelpOverview3, 15, 104, kColorWhite99);
+	renderText(kStringHelpOverview4, 15, 116, kColorWhite99);
+	renderText(kStringHelpOverview5, 15, 128, kColorWhite99);
+	renderText(kStringHelpOverview6, 15, 140, kColorWhite99);
+	renderText(kStringHelpOverview7, 15, 152, kColorWhite99);
+	paletteFadeIn();
+	_gm->getKeyInput();
+
+	paletteFadeOut();
+	_gm->loadTime();
+	_gm->animationOn();
+}
+
 Common::Error SupernovaEngine::showTextReader(const char *filename) {
 	Common::File file;
 
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 7054fcd..b357f6e 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -102,7 +102,8 @@ public:
 	void setTextSpeed();
 	const Common::String &getGameString(int idx) const;
 	void setGameString(int idx, const Common::String &string);
-	void showHelpScreen();
+	void showHelpScreen1();
+	void showHelpScreen2();
 	Common::Error showTextReader(const char *filename);
 
 	// forwarding calls
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index 7190a75..f39cbb8 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -27,6 +27,7 @@
 #include "supernova/screen.h"
 #include "supernova/supernova.h"
 #include "supernova/supernova1/state.h"
+#include "supernova/supernova1/stringid.h"
 
 namespace Supernova {
 
diff --git a/engines/supernova/supernova1/rooms.h b/engines/supernova/supernova1/rooms.h
index 0b0dbc4..d45936b 100644
--- a/engines/supernova/supernova1/rooms.h
+++ b/engines/supernova/supernova1/rooms.h
@@ -26,7 +26,6 @@
 #include "common/str.h"
 
 #include "supernova/msn_def.h"
-#include "supernova/supernova1/stringid.h"
 #include "supernova/room.h"
 
 namespace Common {
diff --git a/engines/supernova/supernova1/stringid.h b/engines/supernova/supernova1/stringid.h
index 7f3c1f1..81f9277 100644
--- a/engines/supernova/supernova1/stringid.h
+++ b/engines/supernova/supernova1/stringid.h
@@ -28,7 +28,7 @@
 namespace Supernova {
 
 enum StringId1 {
-	kStringTitleVersion = 25, kStringTitle1, kStringTitle2, kStringTitle3, kStringIntro1,
+	kStringTitleVersion = 36, kStringTitle1, kStringTitle2, kStringTitle3, kStringIntro1,
 	kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5, kStringIntro6,
 	kStringIntro7, kStringIntro8, kStringIntro9, kStringIntro10, kStringIntro11,
 	kStringIntro12, kStringIntro13, kStringBroken, kStringTakeMessage,
@@ -169,15 +169,12 @@ enum StringId1 {
 	kStringGenericInteract_43, kStringSupernova1, kStringSupernova2, kStringSupernova3,
 	kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8,
 	// 625
-	kStringTextSpeed, kStringGuardNoticed1, kStringGuardNoticed2, kStringTelomat1, kStringTelomat2,
+	kStringGuardNoticed1, kStringGuardNoticed2, kStringTelomat1, kStringTelomat2,
 	kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
 	kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
 	kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
 	kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm,
 	// 650
-	kStringLeaveGame, kStringYes, kStringNo, kStringHelpOverview1, kStringHelpOverview2,
-	kStringHelpOverview3, kStringHelpOverview4, kStringHelpOverview5, kStringHelpOverview6, kStringHelpOverview7,
-
 	// Add two placeholder strings at the end for variable text
 	kStringPlaceholder1, kStringPlaceholder2,
 
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index 01ccb59..9399444 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -973,8 +973,8 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 		kStringCheckout3
 	};
 	static int dialCheckout2[2] = {
-		kStringYes,
-		kStringNo
+		kStringYes2,
+		kStringNo2
 	};
 	static int dialStage1[3] = {
 		kStringCheckout4,
@@ -1116,7 +1116,7 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 				switch (_gm->dialog(3, _gm->_dials, dialCheckout1, 1)) {
 				case 0:
 					_gm->reply(kStringCheckout40, 1, 1 + 128);
-					_gm->say(kStringNo);
+					_gm->say(kStringNo2);
 					_gm->reply(kStringCheckout41, 1, 1 + 128);
 					_gm->say(kStringCheckout42);
 					break;
@@ -1128,7 +1128,7 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 								*_gm->_rooms[CULTURE_PALACE]->getObject(4),
 								*_gm->_rooms[CHECKOUT]->getObject(2));
 					} else {
-						_gm->say(kStringNo);
+						_gm->say(kStringNo2);
 						_gm->reply(kStringCheckout45, 1, 1 + 128);
 						_gm->say(kStringCheckout46);
 					}
@@ -1624,7 +1624,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderImage(0);
 				_vm->paletteFadeIn();
 				_gm->reply(kStringElevator15, 1, 1 + 128);
-				_gm->say(kStringYes);
+				_gm->say(kStringYes2);
 				_gm->reply(kStringElevator16, 1, 1 + 128);
 				_gm->reply(kStringElevator17, 1, 1 + 128);
 				if (_gm->dialog(2, _gm->_dials, dialBoss1, 0)) {
diff --git a/engines/supernova/supernova2/stringid.h b/engines/supernova/supernova2/stringid.h
index fe765df..4254031 100644
--- a/engines/supernova/supernova2/stringid.h
+++ b/engines/supernova/supernova2/stringid.h
@@ -28,9 +28,9 @@
 namespace Supernova {
 
 enum StringId2 {
-kString23 = 25, kString24,
-kString25, kString26, kString27, kStringTextSpeed, kStringLeaveGame,
-kString30, kString31, kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3,
+kString23 = 36, kString24,
+kString25, kString26, kString27,
+kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3,
 kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8,
 kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
 kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
@@ -97,7 +97,7 @@ kStringWhatYouWant, kStringWhoAreYou, kStringHorstHummel2, kStringNeverHeard, kS
 kStringImOnTV, kStringIDontKnow, kStringFunny, kStringAha, kStringICan,
 kStringFromWhom, kStringCost, kStringAsYouSay, kStringGetCard, kStringOnlyParticipation,
 kStringWhatForIt, kStringMakeOffer, kStringGoodOffer, kStringGiveCard, kStringIdiot,
-kStringCheckout1, kStringCheckout2, kStringCheckout3, kStringYes, kStringNo,
+kStringCheckout1, kStringCheckout2, kStringCheckout3, kStringYes2, kStringNo2,
 kStringCheckout4, kStringCheckout5, kStringCheckout6, kStringCheckout7, kStringCheckout8,
 kStringCheckout9, kStringCheckout10, kStringCheckout11, kStringCheckout12, kStringCheckout13,
 kStringCheckout14, kStringCheckout15, kStringCheckout16, kStringCheckout17, kStringCheckout18,


Commit: 714a4f909ba014f3f65ac278cead70d846ff7dc9
    https://github.com/scummvm/scummvm/commit/714a4f909ba014f3f65ac278cead70d846ff7dc9
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Refactor graphics

Changed paths:
    engines/supernova/graphics.cpp


diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index a317672..af3a1b3 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -258,31 +258,19 @@ bool MSNImage::loadSections() {
 		Graphics::Surface *surface = new Graphics::Surface;
 		_sectionSurfaces.push_back(surface);
 
-		if (isNewspaper) {
+		if (isNewspaper || isCypheredText) {
+			Color color1 = isNewspaper ? kColorWhite63 : kColorWhite44;
 			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
 			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
 			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
-				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite63 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack;
-			}
-		} else if (isCypheredText) {
-			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
-			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
-			for (int i = 0; i < imageWidth * imageHeight / 8; ++i) {
-				*surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x20) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x10) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x08) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x04) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x02) ? kColorWhite44 : kColorBlack;
-				*surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite44 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x80) ? color1 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x40) ? color1 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x20) ? color1 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x10) ? color1 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x08) ? color1 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x04) ? color1 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x02) ? color1 : kColorBlack;
+				*surfacePixels++ = (_encodedImage[i] & 0x01) ? color1 : kColorBlack;
 			}
 		} else {
 			uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow;


Commit: 0912b6a48d8ba9466cd0eaad89448be84a214b87
    https://github.com/scummvm/scummvm/commit/0912b6a48d8ba9466cd0eaad89448be84a214b87
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Implement lazy loading of resources

Changed paths:
    engines/supernova/resman.cpp
    engines/supernova/resman.h


diff --git a/engines/supernova/resman.cpp b/engines/supernova/resman.cpp
index 0f104e5..dce654d 100644
--- a/engines/supernova/resman.cpp
+++ b/engines/supernova/resman.cpp
@@ -118,9 +118,9 @@ ResourceManager::ResourceManager(int MSPart)
 	: _audioRate(11931)
 	, _MSPart(MSPart) {
 	if (MSPart == 1)
-		initSoundFiles1();
+		_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples1];
 	else if (MSPart == 2)
-		initSoundFiles2();
+		_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples2];
 	initGraphics();
 }
 
@@ -134,83 +134,7 @@ ResourceManager::~ResourceManager() {
 			delete _images[i];
 	}
 	delete[] _soundSamples;
-}
-
-void ResourceManager::initSoundFiles1() {
-	// Sound
-	// Note:
-	//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
-	//     where SS SS (LE uint16) is the size of the sound sample + 2
-	//   - samples end with a footer of 4 bytes: 00 00
-	// Skip those in the buffer
-	_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples1];
-	Common::File file;
-
-	for (int i = 0; i < kAudioNumSamples1; ++i) {
-		if (!file.open(Common::String::format("msn_data.%03d", audioInfo1[i]._filenumber))) {
-			error("File %s could not be read!", file.getName());
-		}
-
-		int length = 0;
-		byte *buffer = nullptr;
-
-		if (audioInfo1[i]._offsetEnd == -1) {
-			file.seek(0, SEEK_END);
-			length = file.pos() - audioInfo1[i]._offsetStart - 10;
-		} else {
-			length = audioInfo1[i]._offsetEnd - audioInfo1[i]._offsetStart - 10;
-		}
-		buffer = new byte[length];
-		file.seek(audioInfo1[i]._offsetStart + 6);
-		file.read(buffer, length);
-		file.close();
-
-		byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
-		_soundSamples[i].reset(Audio::makeRawStream(buffer, length, _audioRate,
-													streamFlag, DisposeAfterUse::YES));
-	}
-
-	_musicIntroBuffer.reset(convertToMod("msn_data.052"));
-	_musicOutroBuffer.reset(convertToMod("msn_data.049"));
-}
-
-void ResourceManager::initSoundFiles2() {
-	// Sound
-	// Note:
-	//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
-	//     where SS SS (LE uint16) is the size of the sound sample + 2
-	//   - samples end with a footer of 4 bytes: 00 00
-	// Skip those in the buffer
-	_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples2];
-	Common::File file;
-
-	for (int i = 0; i < kAudioNumSamples2; ++i) {
-		if (!file.open(Common::String::format("ms2_data.%03d", audioInfo2[i]._filenumber))) {
-			error("File %s could not be read!", file.getName());
-		}
-
-		int length = 0;
-		byte *buffer = nullptr;
-
-		if (audioInfo2[i]._offsetEnd == -1) {
-			file.seek(0, SEEK_END);
-			length = file.pos() - audioInfo2[i]._offsetStart - 10;
-		} else {
-			length = audioInfo2[i]._offsetEnd - audioInfo2[i]._offsetStart - 10;
-		}
-		buffer = new byte[length];
-		file.seek(audioInfo2[i]._offsetStart + 6);
-		file.read(buffer, length);
-		file.close();
-
-		byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
-		_soundSamples[i].reset(Audio::makeRawStream(buffer, length, _audioRate,
-													streamFlag, DisposeAfterUse::YES));
-	}
-	initSiren();
-
-	_musicIntroBuffer.reset(convertToMod("ms2_data.052", 2));
-	_musicOutroBuffer.reset(convertToMod("ms2_data.056", 2));
+	delete[] _images;
 }
 
 void ResourceManager::initGraphics() {
@@ -244,25 +168,100 @@ void ResourceManager::initCursorGraphics() {
 }
 
 void ResourceManager::initImages1() {
-	for (int i = 0; i < 44; ++i) {
-		_images[i] = new MSNImage(_MSPart);
-		if (!_images[i]->init(i))
-			error("Failed reading image file msn_data.%03d", i);
+	_images = new MSNImage *[kNumImageFiles1];
+	for (int i = 0; i < kNumImageFiles1; ++i) {
+		_images[i] = nullptr;
 	}
-	_images[44] = new MSNImage(_MSPart);
-	if (!_images[44]->init(55))
-			error("Failed reading image file msn_data.055");
 }
 
 void ResourceManager::initImages2() {
-	for (int i = 0; i < 47; ++i) {
-		_images[i] = new MSNImage(_MSPart);
-		if (!_images[i]->init(i))
-			error("Failed reading image file ms2_data.%03d", i);
+	_images = new MSNImage *[kNumImageFiles2];
+	for (int i = 0; i < kNumImageFiles2; ++i) {
+		_images[i] = nullptr;
+	}
+}
+
+// Sound
+// Note:
+//   - samples start with a header of 6 bytes: 01 SS SS 00 AD 00
+//     where SS SS (LE uint16) is the size of the sound sample + 2
+//   - samples end with a footer of 4 bytes: 00 00
+// Skip those in the buffer
+void ResourceManager::loadSound1(AudioId id) {
+	Common::File file;
+	if (!file.open(Common::String::format("msn_data.%03d", audioInfo1[id]._filenumber))) {
+		error("File %s could not be read!", file.getName());
+	}
+
+	int length = 0;
+	byte *buffer = nullptr;
+
+	if (audioInfo1[id]._offsetEnd == -1) {
+		file.seek(0, SEEK_END);
+		length = file.pos() - audioInfo1[id]._offsetStart - 10;
+	} else {
+		length = audioInfo1[id]._offsetEnd - audioInfo1[id]._offsetStart - 10;
+	}
+	buffer = new byte[length];
+	file.seek(audioInfo1[id]._offsetStart + 6);
+	file.read(buffer, length);
+	file.close();
+
+	byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
+	_soundSamples[id].reset(Audio::makeRawStream(buffer, length, _audioRate,
+												streamFlag, DisposeAfterUse::YES));
+}
+
+void ResourceManager::loadSound2(AudioId id) {
+	Common::File file;
+	if (!file.open(Common::String::format("ms2_data.%03d", audioInfo2[id]._filenumber))) {
+		error("File %s could not be read!", file.getName());
+	}
+
+	int length = 0;
+	byte *buffer = nullptr;
+
+	if (audioInfo2[id]._offsetEnd == -1) {
+		file.seek(0, SEEK_END);
+		length = file.pos() - audioInfo2[id]._offsetStart - 10;
+	} else {
+		length = audioInfo2[id]._offsetEnd - audioInfo2[id]._offsetStart - 10;
+	}
+	buffer = new byte[length];
+	file.seek(audioInfo2[id]._offsetStart + 6);
+	file.read(buffer, length);
+	file.close();
+
+	byte streamFlag = Audio::FLAG_UNSIGNED | Audio::FLAG_LITTLE_ENDIAN;
+	_soundSamples[id].reset(Audio::makeRawStream(buffer, length, _audioRate,
+												streamFlag, DisposeAfterUse::YES));
+}
+
+void ResourceManager::loadImage(int filenumber) {
+	if (_MSPart == 1) {
+		if (filenumber < 44) {
+			_images[filenumber] = new MSNImage(_MSPart);
+			if (!_images[filenumber]->init(filenumber))
+				error("Failed reading image file msn_data.%03d", filenumber);
+		} else {
+			_images[44] = new MSNImage(_MSPart);
+			if (!_images[44]->init(filenumber))
+				error("Failed reading image file msn_data.%03d", filenumber);
+		}
+	} else if (_MSPart == 2) {
+		_images[filenumber] = new MSNImage(_MSPart);
+		if (!_images[filenumber]->init(filenumber))
+			error("Failed reading image file ms2_data.%03d", filenumber);
 	}
 }
 
 Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
+	if (!_soundSamples[index]) {
+		if (_MSPart == 1)
+			loadSound1(index);
+		else if (_MSPart == 2)
+			loadSound2(index);
+	}
 	Audio::SeekableAudioStream *stream;
 	stream = _soundSamples[index].get();
 	stream->rewind();
@@ -273,11 +272,23 @@ Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
 Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	switch (index) {
 	case kMusicIntro:
+		if (!_musicIntroBuffer) {
+			if (_MSPart == 1)
+				_musicIntroBuffer.reset(convertToMod("msn_data.052", 1));
+			else if (_MSPart == 2)
+				_musicIntroBuffer.reset(convertToMod("ms2_data.052", 2));
+		}
 		_musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get()));
 		return _musicIntro.get();
 	case kMusicMadMonkeys:
 		// fall through
 	case kMusicOutro:
+		if (!_musicOutroBuffer) {
+			if (_MSPart == 1)
+				_musicOutroBuffer.reset(convertToMod("msn_data.049", 1));
+			else if (_MSPart == 2)
+				_musicOutroBuffer.reset(convertToMod("ms2_data.056", 2));
+		}
 		_musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get()));
 		return _musicOutro.get();
 	default:
@@ -286,24 +297,27 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 }
 
 Audio::AudioStream *ResourceManager::getSirenStream() {
+	if (!_sirenStream)
+		initSiren();
 	return _sirenStream.get();
 }
 
 MSNImage *ResourceManager::getImage(int filenumber) {
-	if (_MSPart == 1) {
-		if (filenumber < 44)
-			return _images[filenumber];
-		else if (filenumber == 55)
-			return _images[44];
-		else
-			return nullptr;
-	} else if (_MSPart == 2) {
-		if (filenumber < 47)
-			return _images[filenumber];
-		else
-			return nullptr;
+	//check array boundaries
+	if (_MSPart == 1 && filenumber > 43 && filenumber != 55)
+		return nullptr;
+	if (_MSPart == 2 && filenumber > 46)
+		return nullptr;
+
+	if (filenumber == 55) {
+		if (!_images[44])
+			loadImage(filenumber);
+		return _images[44];
+	} else {
+		if (!_images[filenumber])
+			loadImage(filenumber);
+		return _images[filenumber];
 	}
-	else return nullptr;
 }
 
 const byte *ResourceManager::getImage(CursorId id) const {
diff --git a/engines/supernova/resman.h b/engines/supernova/resman.h
index 4ae617e..fa37d64 100644
--- a/engines/supernova/resman.h
+++ b/engines/supernova/resman.h
@@ -45,7 +45,8 @@ public:
 	};
 
 public:
-	static const int kNumImageFiles = 47;
+	static const int kNumImageFiles1 = 45;
+	static const int kNumImageFiles2 = 47;
 
 public:
 	ResourceManager(int MSPart);
@@ -60,12 +61,13 @@ public:
 	int getAudioRate();
 
 private:
-	void initSoundFiles1();
-	void initSoundFiles2();
 	void initGraphics();
 	void initCursorGraphics();
 	void initImages1();
 	void initImages2();
+	void loadImage(int filenumber);
+	void loadSound1(AudioId id);
+	void loadSound2(AudioId id);
 	void initSiren();
 	byte *generateTone(byte *buffer, int frequency, int length, int audioRate, Common::SineTable &table);
 
@@ -78,7 +80,7 @@ private:
 	Common::ScopedPtr<Audio::AudioStream> _sirenStream;
 	int _MSPart;
 	int _audioRate;
-	MSNImage *_images[kNumImageFiles];
+	MSNImage **_images;
 	byte _cursorNormal[256];
 	byte _cursorWait[256];
 };


Commit: a637cea700b17cd2e11071ca603a8959ce477303
    https://github.com/scummvm/scummvm/commit/a637cea700b17cd2e11071ca603a8959ce477303
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Remove unused getImage(CursorId)

Changed paths:
    engines/supernova/resman.cpp
    engines/supernova/resman.h


diff --git a/engines/supernova/resman.cpp b/engines/supernova/resman.cpp
index dce654d..e827ba3 100644
--- a/engines/supernova/resman.cpp
+++ b/engines/supernova/resman.cpp
@@ -320,17 +320,6 @@ MSNImage *ResourceManager::getImage(int filenumber) {
 	}
 }
 
-const byte *ResourceManager::getImage(CursorId id) const {
-	switch (id) {
-	case kCursorNormal:
-		return _cursorNormal;
-	case kCursorWait:
-		return _cursorWait;
-	default:
-		return nullptr;
-	}
-}
-
 // Generate a tone which minimal length is the length and ends at the end
 // of sine period
 // NOTE: Size of the SineTable has to be the same as audioRate and a multiple of 4
@@ -562,7 +551,6 @@ int ResourceManager::getAudioRate() {
 	return _audioRate;
 }
 
-//TODO: leave only one function for getting Cursor image
 const byte *ResourceManager::getCursor(CursorId id) const {
 	switch (id) {
 	case kCursorNormal:
diff --git a/engines/supernova/resman.h b/engines/supernova/resman.h
index fa37d64..9a4f739 100644
--- a/engines/supernova/resman.h
+++ b/engines/supernova/resman.h
@@ -56,7 +56,6 @@ public:
 	Audio::AudioStream *getSoundStream(MusicId index);
 	Audio::AudioStream *getSirenStream();
 	MSNImage *getImage(int filenumber);
-	const byte *getImage(CursorId id) const;
 	const byte *getCursor(CursorId id) const;
 	int getAudioRate();
 


Commit: 9cac9a8592fb100946728f2c77828f4b6110d77e
    https://github.com/scummvm/scummvm/commit/9cac9a8592fb100946728f2c77828f4b6110d77e
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix bugs

Fix GUI not working after leaving text edit field

Forbid showing help, info, doc screens, when GUI isn't alowed,
this should mimic the original game better and also resolves
some issues.

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/supernova.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index 8296e27..b5bbe2e 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -225,6 +225,8 @@ void GameManager::processInput(Common::KeyState &state) {
 	switch (state.keycode) {
 	case Common::KEYCODE_F1:
 		// help
+		if (!_guiEnabled)
+			return;
 		if (_vm->_MSPart == 1)
 			_vm->showHelpScreen1();
 		else if (_vm->_MSPart == 2)
@@ -232,6 +234,8 @@ void GameManager::processInput(Common::KeyState &state) {
 		break;
 	case Common::KEYCODE_F2:
 		// show game manual
+		if (!_guiEnabled)
+			return;
 		if (_vm->_MSPart == 1)
 			_vm->showTextReader("msn.doc");
 		else if (_vm->_MSPart == 2)
@@ -239,12 +243,16 @@ void GameManager::processInput(Common::KeyState &state) {
 		break;
 	case Common::KEYCODE_F3:
 		// show game info
+		if (!_guiEnabled)
+			return;
 		if (_vm->_MSPart == 1)
 			_vm->showTextReader("msn.inf");
 		else if (_vm->_MSPart == 2)
 			_vm->showTextReader("ms2.inf");
 		break;
 	case Common::KEYCODE_F4:
+		if (!_guiEnabled)
+			return;
 		_vm->setTextSpeed();
 		break;
 	case Common::KEYCODE_F5:
@@ -850,6 +858,7 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 			break;
 		}
 	}
+	_guiEnabled = true;
 }
 
 void GameManager::takeMoney(int amount) {
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 9d7faf8..0324e88 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -475,6 +475,7 @@ void SupernovaEngine::showHelpScreen1() {
 	_gm->getKeyInput();
 
 	paletteFadeOut();
+
 	_gm->loadTime();
 	_gm->animationOn();
 }
@@ -500,6 +501,7 @@ void SupernovaEngine::showHelpScreen2() {
 	_gm->getKeyInput();
 
 	paletteFadeOut();
+
 	_gm->loadTime();
 	_gm->animationOn();
 }


Commit: 8125f7b67d2162ada117276fc7d65eb9bc8562f9
    https://github.com/scummvm/scummvm/commit/8125f7b67d2162ada117276fc7d65eb9bc8562f9
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix street animation.

Street animation was changing memory that it shouldn't, so
going into the kiosk resulted in a segfault.
Also remove 2 debug lines from supernova2/state.cpp

Changed paths:
    engines/supernova/room.cpp
    engines/supernova/supernova2/state.cpp


diff --git a/engines/supernova/room.cpp b/engines/supernova/room.cpp
index 487aeee..404ad02 100644
--- a/engines/supernova/room.cpp
+++ b/engines/supernova/room.cpp
@@ -127,7 +127,10 @@ RoomId Room::getId() const {
 }
 
 void Room::setSectionVisible(uint section, bool visible) {
-	_shown[section] = visible ? kShownTrue : kShownFalse;
+	if (section < kMaxSection)
+		_shown[section] = visible ? kShownTrue : kShownFalse;
+	else
+		_shown[section - 128] = visible ? kShownFalse : kShownTrue;
 }
 
 bool Room::isSectionVisible(uint index) const {
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index 1bafec8..b280b77 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -133,8 +133,6 @@ bool GameManager2::deserialize(Common::ReadStream *in, int version) {
 	for (int i = 0; i < NUMROOMS2; ++i) {
 		_rooms[i]->deserialize(in, version);
 	}
-	delete _rooms[BST_DOOR];
-	_rooms[BST_DOOR] = new BstDoor(_vm, this);
 	_lastRoom = _rooms[lastRoomId];
 	changeRoom(curRoomId);
 


Commit: 01d601b23775d5db2af45df78eb2dca4cac9a22c
    https://github.com/scummvm/scummvm/commit/01d601b23775d5db2af45df78eb2dca4cac9a22c
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Reformat StringId enums and gametext.h

Changed paths:
    devtools/create_supernova/gametext.h
    devtools/create_supernova2/gametext.h
    engines/supernova/msn_def.h
    engines/supernova/supernova1/stringid.h
    engines/supernova/supernova2/stringid.h


diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 2e7f8d3..79bc430 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -59,774 +59,774 @@ const char *gameText[] = {
 	"Benutze ",     // kStringStatusCommandUse
 	"Rede mit ",    // kStringStatusCommandTalk
 	"Gib ",         // kStringStatusCommandGive
+	// 20
 	" an ", // kPhrasalVerbParticleGiveTo
 	" mit ", // kPhrasalVerbParticleUseWith
 	"Es ist nichts Besonderes daran.",       // kStringDefaultDescription
 	"|", // kStringDialogSeparator
 	"Gespr\204ch beenden", // kStringConversationEnd
+	// 25
 	"F1    Hilfe",  // kStringHelpOverview1
 	"F2    Anleitung",  // kStringHelpOverview2
 	"F3    Programminformationen",  //kStringHelpOverview3
 	"F4    Textgeschwindigkeit",    //kStringHelpOverview4
 	"F5    Laden / Speichern",  // kStringHelpOverview5
+	// 30
 	"ESC   Vorspann \201berspringen",   // kStringHelpOverview6
 	"Alt-X Programm abbrechen",     // kStringHelpOverview7
 	"Textgeschwindigkeit:", // kStringTextSpeed
 	"Spiel abbrechen?", // kStringLeaveGame
 	"Ja", // kStringYes
+	// 35
 	"Nein", // kStringNo
-	// 20
 	"V2.02",            // kStringTitleVersion
 	"Teil 1:",          // kStringTitle1
 	"Das Schicksal",    // kStringTitle2
 	"des Horst Hummel", // kStringTitle3
+	// 40
 	"^(C) 1994 Thomas und Steffen Dingel#",  // kStringIntro1
-	// 25
 	"Story und Grafik:^ Thomas Dingel#",     // kStringIntro2
 	"Programmierung:^ Steffen Dingel#",      // kStringIntro3
 	"Musik:^ Bernd Hoffmann#",               // kStringIntro4
 	"Getestet von ...#",                     // kStringIntro5
+	// 45
 	"^Matthias Neef#",                       // kStringIntro6
-	// 30
 	"^Sascha Otterbach#",                    // kStringIntro7
 	"^Thomas Mazzoni#",                      // kStringIntro8
 	"^Matthias Klein#",                      // kStringIntro9
 	"^Gerrit Rothmaier#",                    // kStringIntro10
+	// 50
 	"^Thomas Hassler#",                      // kStringIntro11
-	// 35
 	"^Rene Koch#",                           // kStringIntro12
 	"\233",                                  // kStringIntro13
 	"Hmm, er scheint kaputt zu sein.",       // kStringBroken
 	"Das mu\341t du erst nehmen.",              // kStringTakeMessage
-	// 40
+	// 55
 	"Keycard",                               // kStringKeycard
 	"Die Keycard f\224r deine Schr\204nke.", // kStringKeycardDescription
 	"Taschenmesser",                         // kStringKnife
 	"Es ist nicht mehr das sch\204rfste.",   // kStringKnifeDescription
 	"Armbanduhr",                            // kStringWatch
-	// 45
+	// 60
 	"Discman",                               // kStringDiscman
 	"Es ist eine \"Mad Monkeys\"-CD darin.", // kStringDiscmanDescription
 	"Luke",                                  // kStringHatch
 	"Knopf",                                 // kStringButton
 	"Er geh\224rt zu der gro\341en Luke.",   // kStringHatchButtonDescription
-	// 50
+	// 65
 	"Leiter",                                // kStringLadder
 	"Ausgang",                               // kStringExit
 	"Sie f\201hrt ins Cockpit.",             // kStringCockpitHatchDescription
 	"Sie f\201hrt zur K\201che.",            // kStringKitchenHatchDescription
 	"Sie f\201hrt zu den Tiefschlafkammern.", // kStringStasisHatchDescription
-	// 55
+	// 70
 	"Dies ist eine der Tiefschlafkammern.",  // kStringStasisHatchDescription2
 	"Schlitz",                               // kStringSlot
 	"Es ist ein Keycard-Leser.",             // kStringSlotDescription
 	"Gang",                                  // kStringCorridor
 	"Computer",                              // kStringComputer
-	// 60
+	// 75
 	"ZWEIUNDVIERZIG",                        // kStringComputerPassword
 	"Instrumente",                           // kStringInstruments
 	"Hmm, sieht ziemlich kompliziert aus.",  // kStringInstrumentsDescription1
 	"Monitor",                               // kStringMonitor
 	"Dieser Monitor sagt dir nichts.",       // kStringMonitorDescription
-	// 65
+	// 80
 	"Bild",                                  // kStringImage
 	"Herb!",                                 // kStringGenericDescription1
 	"Toll!",                                 // kStringGenericDescription2
 	"Genial!",                               // kStringGenericDescription3
 	"Es scheint noch nicht fertig zu sein.", // kStringGenericDescription4
-	// 70
+	// 85
 	"Magnete",                               // kStringMagnete
 	"Damit werden Sachen auf|dem Tisch festgehalten.", // kStringMagneteDescription
 	"Stift",                                 // kStringPen
 	"Ein Kugelschreiber.",                   // kStringPenDescription
 	"Schrank",                               // kStringShelf
-	// 75
+	// 90
 	"Fach",                                  // kStringCompartment
 	"Steckdose",                             // kStringSocket
 	"Toilette",                              // kStringToilet
 	"Pistole",                               // kStringPistol
 	"Es ist keine Munition drin.",           // kStringPistolDescription
-	// 80
+	// 95
 	"B\201cher",                             // kStringBooks
 	"Lauter wissenschaftliche B\201cher.",   // kStringBooksDescription
 	"Kabelrolle",                            // kStringSpool
 	"Da sind mindestens zwanzig Meter drauf.", // kStringSpoolDescription
 	"Buch",                                  // kStringBook
-	// 85
+	// 100
 	"Unterw\204sche",                        // kStringUnderwear
 	"Ich habe keine Lust, in|der Unterw\204sche des|Commanders rumzuw\201hlen.", // kStringUnderwearDescription
 	"Kleider",                               // kStringClothes
 	"Krimskram",                             // kStringJunk
 	"Es ist nichts brauchbares dabei.",      // kStringJunkDescription
-	// 90
+	// 105
 	"Ordner",                                // kStringFolders
 	"Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts wichtiges drin.", // kStringFoldersDescription
 	"Poster",                                // kStringPoster
 	"Ein Poster von \"Big Boss\".",          // kStringPosterDescription1
 	"Ein Poster von \"Rock Desaster\".",     // kStringPosterDescription2
-	// 95
+	// 110
 	"Box",                                   // kStringSpeaker
 	"Schallplatte",                          // kStringRecord
 	"Die Platte ist von \"Big Boss\".",      // kStringRecordDescription
 	"Schallplattenst\204nder",               // kStringRecordStand
 	"Du hast jetzt keine Zeit, in|der Plattensammlung rumzust\224bern.", // kStringRecordStandDescription
-	// 100
+	// 115
 	"Plattenspieler",                        // kStringTurntable
 	"Sieht aus, als k\204me|er aus dem Museum.", // kStringTurntableDescription
 	"Leitung",                               // kStringWire
 	"Stecker",                               // kStringPlug
 	"Manche Leute haben schon|einen komischen Geschmack.", // kStringImageDescription1
-	// 105
+	// 120
 	"Zeichenger\204te",                      // kStringDrawingInstruments
 	"Auf dem Zettel sind lauter|unverst\204ndliche Skizzen und Berechnungen.|(Jedenfalls f\201r dich unverst\204ndlich.)", // kStringDrawingInstrumentsDescription
 	"Schachspiel",                           // kStringChessGame
 	"Es macht wohl Spa\341, an|der Decke Schach zu spielen.", // kStringChessGameDescription1
 	"Tennisschl\204ger",                     // kStringTennisRacket
-	// 110
+	// 125
 	"Fliegt Boris Becker auch mit?",         // kStringTennisRacketDescription
 	"Tennisball",                            // kStringTennisBall
 	"Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft.", // kStringChessGameDescription2
 	"Bett",                                  // kStringBed
 	"Das ist dein Bett. Toll, nicht wahr?",  // kStringBedDescription
-	// 115
+	// 130
 	"Das ist eins deiner drei F\204cher.",   // kStringCompartmentDescription
 	"Alben",                                 // kStringAlbums
 	"Deine Briefmarkensammlung.",            // kStringAlbumsDescription
 	"Seil",                                  // kStringRope
 	"Es ist ungef\204hr 10 m lang und 4 cm dick.", // kStringRopeDescription
-	// 120
+	// 135
 	"Das ist dein Schrank.",                 // kStringShelfDescription
 	"Es sind Standard-Weltraum-Klamotten.",  // kStringClothesDescription
 	"Str\201mpfe",                           // kStringSocks
 	"Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams.", // kStringBookHitchhiker
 	"Klo",                                   // kStringBathroom
-	// 125
+	// 140
 	"Ein Klo mit Saugmechanismus.",          // kStringBathroomDescription
 	"Dusche",                                // kStringShower
 	"Das ist eine Luke !!!",                 // kStringHatchDescription1
 	"Dies ist eine Luke !!!",                // kStringHatchDescription2
 	"Helm",                                  // kStringHelmet
-	// 130
+	// 145
 	"Es ist der Helm zum Raumanzug.",        // kStringHelmetDescription
 	"Raumanzug",                             // kStringSuit
 	"Der einzige Raumanzug, den die|anderen hiergelassen haben ...", // kStringSuitDescription
 	"Versorgung",                            // kStringLifeSupport
 	"Es ist der Versorgungsteil zum Raumanzug.", // kStringLifeSupportDescription
-	// 135
+	// 150
 	"Schrott",                               // kStringScrap
 	"Da ist eine L\201sterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme sie mit.", // kStringScrapDescription1
 	"L\201sterklemme",                       // kStringTerminalStrip
 	"Junge, Junge! Die Explosion hat ein|ganz sch\224nes Durcheinander angerichtet.", // kStringScrapDescription2
 	"Reaktor",                               // kStringReactor
-	// 140
+	// 155
 	"Das war einmal der Reaktor.",           // kStringReactorDescription
 	"D\201se",                               // kStringNozzle
 	"blauer K\201rbis",                      // kStringPumpkin
 	"Keine Ahnung, was das ist.",            // kStringPumpkinDescription
 	"Landef\204hre",                         // kStringLandingModule
-	// 145
+	// 160
 	"Sie war eigentlich f\201r Bodenuntersuchungen|auf Arsano 3 gedacht.", // kStringLandingModuleDescription
 	"Sie f\201hrt nach drau\341en.",        // kStringHatchDescription3
 	"Generator",                            // kStringGenerator
 	"Er versorgt das Raumschiff mit Strom.", // kStringGeneratorDescription
 	"Ein St\201ck Schrott.",                 // kStringScrapDescription3
-	// 150
+	// 165
 	"Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand gedr\201ckt werden.", // kSafetyButtonDescription
 	"Tastatur",                              // kStringKeyboard
 	"langes Kabel mit Stecker",              // kStringGeneratorWire
 	"leere Kabelrolle",                      // kStringEmptySpool
 	"Keycard des Commanders",                // kStringKeycard2
-	// 155
+	// 170
 	"Hey, das ist die Keycard des Commanders!|Er mu\341 sie bei dem \201berst\201rzten|Aufbruch verloren haben.", // kStringKeycard2Description
 	"Klappe",                                // kStringTrap
 	"Spannungmessger\204t",                  // kStringVoltmeter
 	"Klemme",                                // kStringClip
 	"Sie f\201hrt vom Generator zum Spannungmessger\204t.", // kStringWireDescription
-	// 160
+	// 175
 	"Stein",                                 // kStringStone
 	"Loch",                                  // kStringCaveOpening
 	"Es scheint eine H\224hle zu sein.",     // kStringCaveOpeningDescription
 	"Hier bist du gerade hergekommen.",      // kStringExitDescription
 	"H\224hle",                              // kStringCave
-	// 165
+	// 180
 	"Schild",                                // kStringSign
 	"Diese Schrift kannst du nicht lesen.",  // kStringSignDescription
 	"Eingang",                               // kStringEntrance
 	"Stern",                                 // kStringStar
 	"Raumschiff",                            // kStringSpaceshift
-	// 170
+	// 185
 	"Portier",                               // kStringPorter
 	"Du siehst doch selbst, wie er aussieht.", // kStringPorterDescription
 	"T\201r",                                // kStringDoor
 	"Kaugummi",                              // kStringChewingGum
 	"Gummib\204rchen",                       // kStringGummyBears
-	// 175
+	// 190
 	"Schokokugel",                           // kStringChocolateBall
 	"\232berraschungsei",                    // kStringEgg
 	"Lakritz",                               // kStringLiquorice
 	"Tablette",                              // kStringPill
 	"Die Plastikh\201lle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, kannst du nicht lesen.", // kStringPillDescription
-	// 180
+	// 195
 	"Automat",                               // kStringVendingMachine
 	"Sieht aus wie ein Kaugummiautomat.",    // kStringVendingMachineDescription
 	"Die Toiletten sind denen|auf der Erde sehr \204hnlich.", // kStringToiletDescription
 	"Treppe",                                // kStringStaircase
 	"M\201nzen",                             // kStringCoins
-	// 185
+	// 200
 	"Es sind seltsame|K\224pfe darauf abgebildet.", // kStringCoinsDescription
 	"Tablettenh\201lle",                     // kStringTabletPackage
 	"Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k\224nnen,|hat die Tablette gewirkt.\"", // kStringTabletPackageDescription
 	"Stuhl",                                 // kStringChair
 	"Schuhe",                                // kStringShoes
-	// 190
+	// 205
 	"Wie ist der denn mit|Schuhen hier reingekommen?", // kStringShoesDescription
 	"Froschgesicht",                         // kStringFrogFace
 	"Gekritzel",                             // kStringScrible
 	"\"Mr Spock was here\"",                 // kStringScribleDescription
 	"Brieftasche",                           // kStringWallet
-	// 195
+	// 210
 	"Speisekarte",                           // kStringMenu
 	"\"Heute empfehlen wir:|Fonua Opra mit Ulk.\"", // kStringMenuDescription
 	"Tasse",                                 // kStringCup
 	"Sie enth\204lt eine gr\201nliche Fl\201ssigkeit.", // kStringCupDescription
 	"10-Buckazoid-Schein",                   // kStringBill
-	// 200
+	// 215
 	"Nicht gerade sehr viel Geld.",          // kStringBillDescription
 	"Keycard von Roger",                     // kStringKeycard3
 	"Anzeige",                               // kStringAnnouncement
 	"Hmm, seltsame Anzeigen.",               // kStringAnnouncementDescription
 	"Roger W.",                              // kStringRoger
-	// 205
+	// 220
 	"Ufo",                                   // kStringUfo
 	"Der Eingang scheint offen zu sein.",    // kStringUfoDescription
 	"Tablett",                               // kStringTray
 	"Es ist irgendein Fra\341 und|etwas zu Trinken darauf.", // kStringTrayDescription
 	"Stange",                                // kStringLamp
-	// 210
+	// 225
 	"Es scheint eine Lampe zu sein.",        // kStringLampDescription
 	"Augen",                                 // kStringEyes
 	"Es ist nur ein Bild.",                  // kStringEyesDescription
 	"Sieht etwas anders aus als auf der Erde.", // kStringSocketDescription
 	"Metallblock",                           // kStringMetalBlock
-	// 215
+	// 230
 	"Er ist ziemlich schwer.",               // kStringMetalBlockDescription
 	"Roboter",                               // kStringRobot
 	"Den hast du erledigt.",                 // kStringRobotDescription
 	"Tisch",                                 // kStringTable
 	"Ein kleiner Metalltisch.",              // kStringTableDescription
-	// 220
+	// 235
 	"Zellent\201r",                          // kStringCellDoor
 	"Hier warst du eingesperrt.",            // kStringCellDoorDescription
 	"Laptop",                                // kStringLaptop
 	"Armbanduhr",                            // kStringWristwatch
 	"S\204ule",                              // kStringPillar
-	// 225
+	// 240
 	"Auf einem Schild an der T\201r steht \"Dr. Alab Hansi\".", // kStringDoorDescription1
 	"Auf einem Schild an der T\201r steht \"Saval Lun\".", // kStringDoorDescription2
 	"Auf einem Schild an der T\201r steht \"Prof. Dr. Ugnul Tschabb\".", // kStringDoorDescription3
 	"Auf einem Schild an der T\201r steht \"Alga Hurz Li\".", // kStringDoorDescription4
 	"Diese T\201r w\201rde ich lieber|nicht \224ffnen. Nach dem Schild zu|urteilen, ist jemand in dem Raum.", // kStringDontEnter
-	// 230
+	// 245
 	"Axacussaner",                           // kStringAxacussan
 	"Du m\201\341test ihn irgendwie ablenken.", // kStringAxacussanDescription
 	"Komisches Bild.",                       // kStringImageDescription2
 	"Karte",                                 // kStringMastercard
 	"Darauf steht: \"Generalkarte\".",       // kStringMastercardDescription
-	// 235
+	// 250
 	"Lampe",                                 // kStringLamp2
 	"Seltsam!",                              // kStringGenericDescription5
 	"Geld",                                  // kStringMoney
 	"Es sind 500 Xa.",                       // kStringMoneyDescription1
 	"Schlie\341fach",                           // kStringLocker
-	// 240
+	// 255
 	"Es hat ein elektronisches Zahlenschlo\341.", // kStringLockerDescription
 	"Brief",                                 // kStringLetter
 	"W\201rfel",                             // kStringCube
 	"Sonderbar!",                            // kStringGenericDescription6
 	"Affenstark!",                           // kStringGenericDescription7
-	// 245
+	// 260
 	"Komisches Ding",                        // kStringStrangeThing
 	"Wundersam",                             // kStringGenericDescription8
 	"Es ist ein Axacussanerkopf auf dem Bild.", // kStringImageDescription3
 	"Pflanze",                               // kStringPlant
 	"Figur",                                 // kStringStatue
-	// 250
+	// 265
 	"Stark!",                                // kStringStatueDescription
 	"Sie ist den Pflanzen auf der Erde sehr \204hnlich.", // kStringPlantDescription
 	"Er funktioniert nicht.",                // kStringComputerDescription
 	"Graffiti",                              // kStringGraffiti
 	"Seltsamer B\201roschmuck!",             // kStringGraffitiDescription
-	// 255
+	// 270
 	"Es sind 350 Xa.",                       // kStringMoneyDescription2
 	"Dschungel",                             // kStringJungle
 	"Lauter B\204ume.",                      // kStringJungleDescription
 	"^             E#N#D#E ...########",     // kStringOutro1
 	"#       ... des ersten Teils!########", // kStringOutro2
-	// 260
+	// 275
 	"#########",                             // kStringOutro3
 	"^Aber:#",                               // kStringOutro4
 	"Das Abenteuer geht weiter, ...##",      // kStringOutro5
 	"... wenn Sie sich f\201r 30,- DM registrieren lassen!##", // kStringOutro6
 	"(Falls Sie das nicht schon l\204ngst getan haben.)##", // kStringOutro7
-	// 265
+	// 280
 	"In^ Teil 2 - Der Doppelg\204nger^ erwarten Sie:##", // kStringOutro8
 	"Knifflige Puzzles,##",                  // kStringOutro9
 	"noch mehr Grafik und Sound,##",         // kStringOutro10
 	"ein perfekt geplanter Museumseinbruch,##", // kStringOutro11
 	"das Virtual-Reality-Spiel \"Indiana Joe\"##", // kStringOutro12
-	// 270
+	// 285
 	"und vieles mehr!##",                     // kStringOutro13
 	"\233",                                   // kStringOutro14
 	"Leitung mit Stecker",                    // kStringWireAndPlug
 	"Leitung mit L\201sterklemme",            // kStringWireAndClip
 	"langes Kabel mit Stecker",               // kStringWireAndPlug2
-	// 275
+	// 290
 	"Darauf steht:|\"Treffpunkt Galactica\".", // kStringSignDescription2
 	"M\201nze",                               // kStringCoin
 	"Darauf steht:|\"Zutritt nur f\201r Personal\".", // kStringDoorDescription5
 	"Darauf steht:|\"Toilette\".",            // kStringDoorDescription6
 	"Es ist die Keycard des Commanders.",     // kStringKeycard2Description2
-	// 280
+	// 295
 	"Kabelrolle mit L\201sterklemme",         // kSringSpoolAndClip
 	"Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ...", // kStringIntroCutscene1
 	"Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!", // kStringIntroCutscene2
 	"Ok, Sir.",                               // kStringIntroCutscene3
 	"Geschwindigkeit:",                       // kStringIntroCutscene4
-	// 285
+	// 300
 	"Zweitausend hpm",                        // kStringIntroCutscene5
 	"Dreitausend",                            // kStringIntroCutscene6
 	"Viertausend",                            // kStringIntroCutscene7
 	"F\201nftausend",                         // kStringIntroCutscene8
 	"Sechstausend",                           // kStringIntroCutscene9
-	// 290
+	// 305
 	"Siebentausend",                          // kStringIntroCutscene10
 	"Achttau...",                             // kStringIntroCutscene11
 	"Was war das?",                           // kStringIntroCutscene12
 	"Keine Ahnung, Sir.",                     // kStringIntroCutscene13
 	"Ingenieur an Commander, bitte kommen!",  // kStringIntroCutscene14
-	// 295
+	// 310
 	"Was ist los?",                           // kStringIntroCutscene15
 	"Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich schaue sofort nach, woran es liegt.", // kStringIntroCutscene16
 	"Schei\341e, der Ionenantrieb ist explodiert!|Die Teile sind \201ber den ganzen|Maschinenraum verstreut.", // kStringIntroCutscene17
 	"Ach, du meine G\201te!|Gibt es irgendeine M\224glichkeit,|den Schaden schnell zu beheben?", // kStringIntroCutscene18
 	"Nein, Sir. Es sieht schlecht aus.",      // kStringIntroCutscene19
-	// 300
+	// 315
 	"Hmm, die Erde zu alarmieren, w\201rde zu lange dauern.", // kStringIntroCutscene20
 	"Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!", // kStringIntroCutscene21
 	"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum Notraumschiff!", // kStringIntroCutscene22
 	"Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!", // kStringIntroCutscene23
 	"Captain, bereiten Sie alles f\201r den Start vor!|Wir m\201ssen zur\201ck zur Erde!", // kStringIntroCutscene24
-	// 305
+	// 320
 	"Eine Stunde sp\204ter ...",              // kStringIntroCutscene25
 	"Die Besatzung hat die \"Supernova\" verlassen.", // kStringIntroCutscene26
 	"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne Mannschaft.", // kStringIntroCutscene27
 	"Das ist das kl\204gliche Ende|der Mission Supernova.", // kStringIntroCutscene28
 	"Sie k\224nnen jetzt ihren Computer ausschalten.", // kStringIntroCutscene29
-	// 310
+	// 325
 	"Halt!",                                  // kStringIntroCutscene30
 	"Warten Sie!",                            // kStringIntroCutscene31
 	"Es regt sich etwas im Schiff.",          // kStringIntroCutscene32
 	"Uuuuaaaahhhhh",                          // kStringIntroCutscene33
 	"Huch, ich bin ja gefesselt!|Wo bin ich?", // kStringIntroCutscene34
-	// 315
+	// 330
 	"Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem Raumschiff hier.", // kStringIntroCutscene35
 	"Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett geschmissen?", // kStringIntroCutscene36
 	"Ich werde mal nachsehen.",               // kStringIntroCutscene37
 	"Autsch!",                                // kStringIntroCutscene38
 	"Schei\341etagenbett!",                   // kStringIntroCutscene39
-	// 320
+	// 335
 	"Erst mal den Lichtschalter finden.",     // kStringIntroCutscene40
 	"Hmm, gar nicht so einfach|bei Schwerelosigkeit.", // kStringIntroCutscene41
 	"Ah, hier ist er.",                       // kStringIntroCutscene42
 	"In der K\201che warst du schon|oft genug, im Moment hast|du keinen Appetit.", // kStringShipHall1
 	"Flugziel erreicht", // kStringShipSleepCabin1
-	// 325
+	// 340
 	"Energie ersch\224pft", // kStringShipSleepCabin2
 	"Tiefschlafprozess abgebrochen", // kStringShipSleepCabin3
 	"Schlafdauer in Tagen:", // kStringShipSleepCabin4
 	"Bitte legen Sie sich in die angezeigte Schlafkammer.", // kStringShipSleepCabin5
 	"Bitte Passwort eingeben:", // kStringShipSleepCabin6
-	// 330
+	// 345
 	"Schlafdauer in Tagen:", // kStringShipSleepCabin7
 	"Bitte legen Sie sich in die angezeigte Schlafkammer.", // kStringShipSleepCabin8
 	"Falsches Passwort", // kStringShipSleepCabin9
 	"Es w\201rde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist.", // kStringShipSleepCabin10
 	"Dazu mu\341t du erst den Raumanzug ausziehen.", // kStringShipSleepCabin11
-	// 335
+	// 350
 	"Was war das?", // kStringShipSleepCabin12
 	"Achtung", // kStringShipSleepCabin13
 	"Du wachst mit brummendem Sch\204del auf|und merkst, da\341 du nur getr\204umt hast.", // kStringShipSleepCabin14
 	"Beim Aufprall des Raumschiffs|mu\341t du mit dem Kopf aufgeschlagen|und bewu\341tlos geworden sein.", // kStringShipSleepCabin15
 	"Was steht dir jetzt wohl wirklich bevor?", // kStringShipSleepCabin16
-	// 340
+	// 355
 	"Geschwindigkeit: ", // kStringShipCockpit1
 	"8000 hpm", // kStringShipCockpit2
 	"0 hpm", // kStringShipCockpit3
 	"Ziel: Arsano 3", // kStringShipCockpit4
 	"Entfernung: ", // kStringShipCockpit5
-	//345
+	// 360
 	" Lichtjahre", // kStringShipCockpit6
 	"Dauer der Reise bei momentaner Geschwindigkeit:", // kStringShipCockpit7
 	" Tage", // kStringShipCockpit8
 	"Vergi\341 nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein Raumschiff fliegt.", // kStringShipCockpit9
 	"Achtung: Triebwerke funktionsunf\204hig", // kStringShipCockpit10
-	//350
+	// 365
 	"Energievorrat ersch\224pft", // kStringShipCockpit11
 	"Notstromversorgung aktiv", // kStringShipCockpit12
 	"Was?! Keiner im Cockpit!|Die sind wohl verr\201ckt!", // kStringShipCockpit13
 	"Du hast die Platte schon aufgelegt.", // kStringShipCabinL3_1
 	"Es ist doch gar keine Platte aufgelegt.", // kStringShipCabinL3_2
-	//355
+	// 370
 	"Die Platte scheint einen Sprung zu haben.", // kStringShipCabinL3_3
 	"Schneid doch besser ein|l\204ngeres St\201ck Kabel ab!", // kStringShipCabinL3_4
 	"Das ist befestigt.", // kStringShipCabinL3_5
 	"Zu niedriger Luftdruck soll ungesund sein.", // kStringShipAirlock1
 	"Er zeigt Null an.", // kStringShipAirlock2
-	//360
+	// 375
 	"Er zeigt Normaldruck an.", // kStringShipAirlock3
 	"Komisch, es ist nur|noch ein Raumanzug da.", // kStringShipAirlock4
 	"Du mu\341t erst hingehen.", // kStringShipHold1
 	"Das Kabel ist im Weg.", // kStringCable1
 	"Das Kabel ist schon ganz|richtig an dieser Stelle.", // kStringCable2
-	//365
+	// 380
 	"Womit denn?", // kStringCable3
 	"Die Leitung ist zu kurz.", // kStringCable4
 	"Was ist denn das f\201r ein Chaos?|Und au\341erdem fehlt das Notraumschiff!|Jetzt wird mir einiges klar.|Die anderen sind gefl\201chtet,|und ich habe es verpennt.", // kStringShipHold2
 	"Es ist nicht spitz genug.", // kStringShipHold3
 	"Du wirst aus den Anzeigen nicht schlau.", // kStringShipHold4
-	//370
+	// 385
 	"La\341 lieber die Finger davon!", // kStringShipHold5
 	"An dem Kabel ist doch gar kein Stecker.", // kStringShipHold6
 	"Du solltest die Luke vielleicht erst \224ffnen.", // kStringShipHold7
 	"Das Seil ist im Weg.", // kStringShipHold8
 	"Das ist geschlossen.", // kStringShipHold9
-	//375
+	// 390
 	"Das geht nicht.|Die Luke ist mindestens|5 Meter \201ber dem Boden.", // kStringShipHold10
 	"Was n\201tzt dir der Anschlu\341|ohne eine Stromquelle?!", // kStringShipHold11
 	"Die Spannung ist auf Null abgesunken.", // kStringShipHold12
 	"Es zeigt volle Spannung an.", // kStringShipHold13
 	"Du mu\341t die Luke erst \224ffnen.", // kStringShipHold14
-	//380
+	// 395
 	"Das Seil ist hier schon ganz richtig.", // kStringShipHold15
 	"Das Kabel ist zu kurz.", // kStringShipHold16
 	"Die Raumschiffe sind alle verschlossen.", // kStringArsanoMeetup1
 	"Unsinn!", // kStringArsanoMeetup2
 	"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt Galactica\".", // kStringArsanoMeetup3
-	//385
+	// 400
 	"Durch deinen Helm kannst|du nicht sprechen.", // kStringArsanoEntrance1
 	"Wo soll ich die Schuhe ablegen?", // kStringArsanoEntrance2
 	"Was, das wissen Sie nicht?", // kStringArsanoEntrance3
 	"Sie befinden sich im Restaurant|\"Treffpunkt Galactica\".", // kStringArsanoEntrance4
 	"Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur Stelle.", // kStringArsanoEntrance5
-	//390
+	// 405
 	"Wenn Sie meinen.", // kStringArsanoEntrance6
 	"In der Toilette gibt es|Schlie\341f\204cher f\201r Schuhe.", // kStringArsanoEntrance7
 	"Wenn Sie das Lokal betreten|wollen, m\201ssen Sie erst|ihre Schuhe ausziehen.", // kStringArsanoEntrance8
 	"Wollen Sie, da\341 ich Sie rau\341schmei\341e?", // kStringArsanoEntrance9
 	"Hhius otgfh Dgfdrkjlh Fokj gf.", // kStringArsanoEntrance10
-	//395
+	// 410
 	"Halt!", // kStringArsanoEntrance11
 	"Uhwdejkt!", // kStringArsanoEntrance12
 	"Sie m\201ssen erst ihre Schuhe ausziehen, Sie Trottel!", // kStringArsanoEntrance13
 	"Was f\204llt ihnen ein!|Sie k\224nnen doch ein Lokal|nicht mit Schuhen betreten!", // kStringArsanoEntrance14
 	"Fragen Sie nicht so doof!", // kStringArsanoEntrance15
-	// 400
+	// 415
 	"Das w\201rde ich an ihrer|Stelle nicht versuchen!", // kStringArsanoEntrance16
 	"Du ziehst deine Schuhe|aus und legst sie in|eins der Schlie\341f\204cher.", // kStringArsanoEntrance17
 	"Du ziehst deine Schuhe wieder an.", // kStringArsanoEntrance18
 	"Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts.", // kStringArsanoEntrance19
 	"Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen.", // kStringArsanoEntrance20
-	// 405
+	// 420
 	"Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!", // kStringArsanoEntrance21
 	"In einem der Schlie\341f\204cher,|die sich auch im Raum befinden,|findest du einige M\201nzen.", // kStringArsanoEntrance22
 	"Mach doch zuerst das Fach leer!", // kStringArsanoEntrance23
 	"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur f\201r Personal\".", // kStringArsanoEntrance24
 	"Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\".", // kStringArsanoEntrance25
-	// 410
+	// 425
 	"Du ziehst den Raumanzug wieder an.", // kStringArsanoEntrance26
 	"Nicht so gewaltt\204tig!", // kStringArsanoEntrance27
 	"Wo bin ich hier?", // kStringArsanoDialog1
 	"Sch\224nes Wetter heute, nicht wahr?", // kStringArsanoDialog2
 	"W\201rden Sie mich bitte durchlassen.", // kStringArsanoDialog3
-	// 415
+	// 430
 	"Hey Alter, la\341 mich durch!", // kStringArsanoDialog4
 	"Was haben Sie gesagt?", // kStringArsanoDialog5
 	"Sprechen Sie bitte etwas deutlicher!", // kStringArsanoDialog6
 	"Wieso das denn nicht?", // kStringArsanoDialog7
 	"Wo soll ich die Schuhe ablegen?", // kStringArsanoDialog8
-	// 420
+	// 435
 	"Schwachsinn! Ich gehe jetzt nach oben!", // kStringArsanoDialog9
 	"K\224nnten Sie mir ein Gericht empfehlen?", // kStringDialogArsanoRoger1
 	"Wie lange dauert es denn noch bis zur Supernova?", // kStringDialogArsanoRoger2
 	"Sie kommen mir irgendwie bekannt vor.", // kStringDialogArsanoRoger3
-	// 425
 	"Was wollen Sie von mir?", // kStringDialogArsanoMeetup3_1
+	// 440
 	"Hilfe!!", // kStringDialogArsanoMeetup3_2
 	"Warum sprechen Sie meine Sprache?", // kStringDialogArsanoMeetup3_3
 	"Ja, ich bin einverstanden.", // kStringDialogArsanoMeetup3_4
 	"Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen.", // kStringDialogArsanoMeetup3_5
-	// 430
 	"Darf ich hier Platz nehmen?", // kStringArsanoRoger1
+	// 445
 	"Klar!", // kStringArsanoRoger2
 	"Hey, Witzkeks, la\341 die Brieftasche da liegen!", // kStringArsanoRoger3
 	"Das ist nicht deine.", // kStringArsanoRoger4
 	"Roger ist im Moment nicht ansprechbar.", // kStringArsanoRoger5
-	// 435
 	"Bestellen Sie lieber nichts!", // kStringArsanoRoger6
+	// 450
 	"Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen.", // kStringArsanoRoger7
 	"Noch mindestens zwei Stunden.", // kStringArsanoRoger8
 	"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben k\224nnen?", // kStringArsanoRoger9
 	"Hmm ... im Moment f\204llt mir nichts ein, aber vielleicht|hat der Spieler des Adventures ja eine Idee.", // kStringArsanoRoger10
-	// 440
 	"Nein, Sie m\201ssen sich irren.|Ich kenne Sie jedenfalls nicht.", // kStringArsanoRoger11
+	// 455
 	"Aber ihre Kleidung habe ich irgendwo schon mal gesehen.", // kStringArsanoRoger12
 	"Ja? Komisch.", // kStringArsanoRoger13
 	"Jetzt wei\341 ich's. Sie sind Roger W. !", // kStringArsanoRoger14
 	"Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir.", // kStringArsanoRoger15
-	// 445
 	"Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde.", // kStringArsanoRoger16
+	// 460
 	"\216h ... ach so.", // kStringArsanoRoger17
 	"Wann kommt denn das n\204chste SQ-Abenteuer raus?", // kStringArsanoRoger18
 	"SQ 127 m\201\341te in einem Monat erscheinen.", // kStringArsanoRoger19
 	"Was, Teil 127 ??", // kStringArsanoRoger20
-	// 450
 	"Bei uns ist gerade Teil 8 erschienen.", // kStringArsanoRoger21
+	// 465
 	"Hmm ... von welchem Planeten sind Sie denn?", // kStringArsanoRoger22
 	"Von der Erde.", // kStringArsanoRoger23
 	"Erde? Nie geh\224rt.", // kStringArsanoRoger24
 	"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre sp\204ter hingelangen.", // kStringArsanoRoger25
-	// 455
 	"\216h ... kann sein.", // kStringArsanoRoger26
+	// 470
 	"Aber eins m\201ssen Sie mir erkl\204ren!", // kStringArsanoRoger27
 	"Wieso sehen Sie mir so verdammt \204hnlich, wenn|Sie nicht von Xenon stammen, wie ich?", // kStringArsanoRoger28
 	"Keine Ahnung. Bis jetzt dachte ich immer, Sie w\204ren ein|von Programmierern auf der Erde erfundenes Computersprite.", // kStringArsanoRoger29
 	"Was? Lachhaft!", // kStringArsanoRoger30
-	// 460
 	"Wie erkl\204ren Sie sich dann,|da\341 ich ihnen gegen\201bersitze?", // kStringArsanoRoger31
+	// 475
 	"Ja, das ist in der Tat seltsam.", // kStringArsanoRoger32
 	"Halt, jetzt wei\341 ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games\" und wollen mich verunsichern.", // kStringArsanoRoger33
 	"Nein, ich bin nur ein Ahnungsloser Koch von der Erde.", // kStringArsanoRoger34
 	"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir zu bunt!", // kStringArsanoRoger35
-	// 465
 	"Eine Partie Schach! Das ist eine gute Idee.", // kStringArsanoRoger36
+	// 480
 	"Schach? Was ist das denn?", // kStringArsanoRoger37
 	"Schach ist ein interessantes Spiel.|Ich werde es Ihnen erkl\204ren.", // kStringArsanoRoger38
 	"Knapp zwei Stunden sp\204ter ...", // kStringArsanoRoger39
 	"Roger W. steht kurz vor dem Schachmatt|und gr\201belt nach einem Ausweg.", // kStringArsanoRoger40
-	// 470
 	"Du tippst auf den Tasten herum,|aber es passiert nichts.", // kStringArsanoGlider1
+	// 485
 	"Alle Raumschiffe haben|den Planeten verlassen.", // kStringArsanoMeetup2_1
 	"Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ...", // kStringArsanoMeetup2_2
 	"Was wollen Sie denn schon wieder?", // kStringArsanoMeetup2_3
 	"Nein.", // kStringArsanoMeetup2_4
-	// 475
 	"Haben Sie zuf\204llig meine Brieftasche gesehen?|Ich mu\341 Sie irgendwo verloren haben.", // kStringArsanoMeetup2_5
+	// 490
 	"Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist.", // kStringArsanoMeetup2_6
 	"Oh! Vielen Dank.", // kStringArsanoMeetup2_7
 	"Wo ist denn Ihr Raumschiff?|Soll ich Sie ein St\201ck mitnehmen?", // kStringArsanoMeetup2_8
 	"Wo wollen Sie denn hin?", // kStringArsanoMeetup2_9
-	// 480
 	"Ok, steigen Sie ein!", // kStringArsanoMeetup2_10
+	// 495
 	"Wie Sie wollen.", // kStringArsanoMeetup2_11
 	"Huch, du lebst ja noch!", // kStringArsanoMeetup2_12
 	"Das w\201rde ich jetzt nicht tun, schlie\341lich|steht Roger W. neben seinem Schiff.", // kStringArsanoMeetup2_13
 	"Ich glaube, er wacht auf.", // kStringArsanoMeetup3_1
-	// 485
 	"Ja, sieht so aus.", // kStringArsanoMeetup3_2
+	// 500
 	"Sie befinden sich im Raumschiff \"Dexxa\".", // kStringArsanoMeetup3_3
 	"Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie Sie,|n\204mlich zur Erforschung der Supernova.", // kStringArsanoMeetup3_4
 	"Sie k\224nnen beruhigt sein, wir wollen Ihnen nur helfen.", // kStringArsanoMeetup3_5
 	"Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?", // kStringArsanoMeetup3_6
-	// 490
 	"Das war eine Schreckreaktion.", // kStringArsanoMeetup3_7
+	// 505
 	"Schlie\341lich ist es f\201r uns das erste Mal,|da\341 wir auf eine fremde Intelligenz treffen.", // kStringArsanoMeetup3_8
 	"Wie wir festgestellt haben, ist|Ihr Raumschiff v\224llig zerst\224rt.", // kStringArsanoMeetup3_9
 	"Wahrscheinlich k\224nnen Sie nicht|mehr auf ihren Heimatplaneten zur\201ck.", // kStringArsanoMeetup3_10
 	"Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen.", // kStringArsanoMeetup3_11
-	// 495
 	"Sind Sie sich da wirklich sicher?", // kStringArsanoMeetup3_12
+	// 510
 	"Wenn ich es mir genau \201berlege,|fliege ich doch lieber mit.", // kStringArsanoMeetup3_13
 	"Gut, wir nehmen Sie unter der|Bedingung mit, da\341 wir Sie jetzt|sofort in Tiefschlaf versetzen d\201rfen.", // kStringArsanoMeetup3_14
 	"Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt.", // kStringArsanoMeetup3_15
 	"Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt.", // kStringArsanoMeetup3_16
-	// 500
 	"Sind Sie damit einverstanden?", // kStringArsanoMeetup3_17
+	// 515
 	"Gut, haben Sie noch irgendwelche Fragen?", // kStringArsanoMeetup3_18
 	"Keine Panik!", // kStringArsanoMeetup3_19
 	"Wir tun Ihnen nichts.", // kStringArsanoMeetup3_20
 	"Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere.", // kStringArsanoMeetup3_21
-	// 505
 	"Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen.", // kStringArsanoMeetup3_22
+	// 520
 	"Was? Sie haben in mein Gehirn eingegriffen?", // kStringArsanoMeetup3_23
 	"Keine Angst, wir haben sonst nichts ver\204ndert.", // kStringArsanoMeetup3_24
 	"Ohne diesen Eingriff w\204ren|Sie verloren gewesen.", // kStringArsanoMeetup3_25
 	"Ich habe keine weiteren Fragen mehr.", // kStringArsanoMeetup3_26
-	// 510
 	"Gut, dann versetzen wir Sie jetzt in Tiefschlaf.", // kStringArsanoMeetup3_27
+	// 525
 	"Gute Nacht!", // kStringArsanoMeetup3_28
 	"Du wachst auf und findest dich in|einem geschlossenen Raum wieder.", // kStringAxacussCell_1
 	"Du dr\201ckst den Knopf,|aber nichts passiert.", // kStringAxacussCell_2
 	"Das ist befestigt.", // kStringAxacussCell_3
-	// 515
 	"Bei deinem Fluchtversuch hat|dich der Roboter erschossen.", // kStringAxacussCell_4
+	// 530
 	"Du i\341t etwas, aber|es schmeckt scheu\341lich.", // kStringAxacussCell_5
 	"Ok.", // kStringOk
 	"Ach, Ihnen geh\224rt die. Ich habe sie eben im Sand gefunden.", // kStringDialogArsanoMeetup2_1
 	"Nein, tut mir leid.", // kStringDialogArsanoMeetup2_2
-	// 520
 	"Nein, danke. Ich bleibe lieber hier.", // kStringDialogArsanoMeetup2_3
+	// 535
 	"Ja, das w\204re gut.", // kStringDialogArsanoMeetup2_4
 	"Zur Erde.", // kStringDialogArsanoMeetup2_5
 	"Zum Pr\204sident der Galaxis.", // kStringDialogArsanoMeetup2_6
 	"Nach Xenon.", // kStringDialogArsanoMeetup2_7
-	// 525
 	"Mir egal, setzen Sie mich irgendwo ab!", // kStringDialogArsanoMeetup2_8
+	// 540
 	"Ich habe gerade Ihre Brieftasche gefunden!", // kStringDialogArsanoMeetup2_9
 	"Sie lag da dr\201ben hinter einem Felsen.", // kStringDialogArsanoMeetup2_10
 	"Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben.", // kStringDialogArsanoMeetup2_11
 	"\216h ... nein, mein Name ist M\201ller.", // kStringDialogAxacussCorridor5_1
-	// 530
 	"Oh, ich habe mich im Gang vertan.", // kStringDialogAxacussCorridor5_2
+	// 545
 	"W\201rden Sie mich bitte zum Fahrstuhl lassen?", // kStringDialogAxacussCorridor5_3
 	"Ich gehe wieder.", // kStringDialogAxacussCorridor5_4
 	"Dann gehe ich eben wieder.", // kStringDialogAxacussCorridor5_5
 	"Ach, halten Sie's Maul, ich gehe trotzdem!", // kStringDialogAxacussCorridor5_6
-	// 535
 	"Wenn Sie mich durchlassen gebe ich Ihnen %d Xa.",  // kStringDialogAxacussCorridor5_7
+	// 550
 	"Hallo!", // kStringDialogX1
 	"Guten Tag!", // kStringDialogX2
 	"Ich bin's, Horst Hummel.", // kStringDialogX3
 	"Sie schon wieder?", // kStringAxacussCorridor5_1
-	// 540
 	"Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!", // kStringAxacussCorridor5_2
+	// 555
 	"Sehr witzig!", // kStringAxacussCorridor5_3
 	"Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner.", // kStringAxacussCorridor5_4
 	"Nein!", // kStringAxacussCorridor5_5
 	"Das m\201\341te schon ein bi\341chen mehr sein.", // kStringAxacussCorridor5_6
-	// 545
 	"Ok, dann machen Sie da\341 Sie wegkommen!", // kStringAxacussCorridor5_7
+	// 560
 	"Du stellst dich hinter die S\204ule.", // kStringAxacussBcorridor_1
 	"Welche Zahlenkombination willst|du eingeben?", // kStringAxacussOffice1_1
 	"Hmm, das haut nicht ganz hin,|aber irgendwie mu\341 die Zahl|mit dem Code zusammenh\204ngen.", // kStringAxacussOffice1_2
 	"Das war die falsche Kombination.", // kStringAxacussOffice1_3
-	// 550
 	"Streng geheim", // kStringAxacussOffice1_4
+	// 565
 	"418-98", // kStringAxacussOffice1_5
 	"Sehr geehrter Dr. Hansi,", // kStringAxacussOffice1_6
 	"Ich mu\341 Ihren Roboterexperten ein Lob aussprechen. Die", // kStringAxacussOffice1_7
 	"Imitation von Horst Hummel ist perfekt gelungen, wie ich", // kStringAxacussOffice1_8
-	// 555
 	"heute bei der \232bertragung des Interviews feststellen", // kStringAxacussOffice1_9
+	// 570
 	"konnte. Dem Aufschwung Ihrer Firma durch die Werbe-", // kStringAxacussOffice1_10
 	"kampagne mit dem falschen Horst Hummel d\201rfte ja jetzt", // kStringAxacussOffice1_11
 	"nichts mehr im Wege stehen.", // kStringAxacussOffice1_12
 	"PS: Herzlichen zum Geburtstag!", // kStringAxacussOffice1_13
-	// 560
 	"Hochachtungsvoll", // kStringAxacussOffice1_14
+	// 575
 	"Commander Sumoti", // kStringAxacussOffice1_15
 	"Nicht zu fassen!", // kStringAxacussOffice1_16
 	"Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit.", // kStringAxacussOffice3_1
 	"Jetzt verschwinden Sie endlich!", // kStringAxacussElevator_1
-	// 565
 	"Huch, ich habe mich vertan.", // kStringAxacussElevator_2
+	// 580
 	"Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein Geb\204ude.", // kStringAxacussElevator_3
 	"Du h\204ttest besser vorher|den Stecker rausgezogen.", // kStringShock
 	"Der Axacussaner hat dich erwischt.", // kStringShot
 	"Das ist schon geschlossen.", // kStringCloseLocker_1
-	// 570
 	"Irgendwie ist ein Raumhelm|beim Essen unpraktisch.", // kStringIsHelmetOff_1
+	// 585
 	"Schmeckt ganz gut.", // kStringGenericInteract_1
 	"Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt.", // kStringGenericInteract_2
 	"Du hast es doch schon ge\224ffnet.", // kStringGenericInteract_3
 	"In dem Ei ist eine Tablette|in einer Plastikh\201lle.", // kStringGenericInteract_4
-	// 575
 	"Du i\341t die Tablette und merkst,|da\341 sich irgendetwas ver\204ndert hat.", // kStringGenericInteract_5
+	// 590
 	"Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie diese Schrift jetzt|lesen k\224nnen, hat die Tablette gewirkt.\"", // kStringGenericInteract_6
 	"Das mu\341t du erst nehmen.", // kStringGenericInteract_7
 	"Sie ist leer.", // kStringGenericInteract_8
 	"Du findest 10 Buckazoids und eine Keycard.", // kStringGenericInteract_9
-	// 580
 	"Es ist eine Art elektronische Zeitung.", // kStringGenericInteract_10
+	// 595
 	"Halt, hier ist ein interessanter Artikel.", // kStringGenericInteract_11
 	"Hmm, irgendwie komme|ich mir verarscht vor.", // kStringGenericInteract_12
-	// 585
 	"Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen der Alarmzeit.|Uhrzeit: %s   Alarmzeit: %s", // kStringGenericInteract_13
 	"Neue Alarmzeit (hh:mm) :", // kStringGenericInteract_14
 	"Die Luft hier ist atembar,|du ziehst den Anzug aus.", // kStringGenericInteract_15
+	// 600
 	"Hier drinnen brauchtst du deinen Anzug nicht.", // kStringGenericInteract_16
 	"Du mu\341t erst den Helm abnehmen.", // kStringGenericInteract_17
-	// 590
 	"Du mu\341t erst den Versorgungsteil abnehmen.", // kStringGenericInteract_18
 	"Du ziehst den Raumanzug aus.", // kStringGenericInteract_19
 	"Du ziehst den Raumanzug an.", // kStringGenericInteract_20
+	// 605
 	"Die Luft hier ist atembar,|du ziehst den Anzug aus.", // kStringGenericInteract_21
 	"Hier drinnen brauchtst du deinen Anzug nicht.", // kStringGenericInteract_22
-	// 595
 	"Den Helm h\204ttest du|besser angelassen!", // kStringGenericInteract_23
 	"Du ziehst den Helm ab.", // kStringGenericInteract_24
 	"Du ziehst den Helm auf.", // kStringGenericInteract_25
+	// 610
 	"Du mu\341t erst den Anzug anziehen.", // kStringGenericInteract_26
 	"Den Versorgungsteil h\204ttest du|besser nicht abgenommen!", // kStringGenericInteract_27
-	// 600
 	"Du nimmst den Versorgungsteil ab.", // kStringGenericInteract_28
 	"Du ziehst den Versorgungsteil an.", // kStringGenericInteract_29
 	"Die Leitung ist hier unn\201tz.", // kStringGenericInteract_30
+	// 615
 	"Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende des Universums\".", // kStringGenericInteract_31
 	"Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht.", // kStringGenericInteract_32
-	// 605
 	"Das tr\204gst du doch bei dir.", // kStringGenericInteract_33
 	"Du bist doch schon da.", // kStringGenericInteract_34
 	"Das hast du doch schon.", // kStringGenericInteract_35
+	// 620
 	"Das brauchst du nicht.", // kStringGenericInteract_36
 	"Das kannst du nicht nehmen.", // kStringGenericInteract_37
-	// 610
 	"Das l\204\341t sich nicht \224ffnen.", // kStringGenericInteract_38
 	"Das ist schon offen.", // kStringGenericInteract_39
 	"Das ist verschlossen.", // kStringGenericInteract_40
+	// 625
 	"Das l\204\341t sich nicht schlie\341en.", // kStringGenericInteract_41
 	"Behalt es lieber!", // kStringGenericInteract_42
-	// 615
 	"Das geht nicht.", // kStringGenericInteract_43
 	"Du hast das komische Gef\201hl,|da\341 drau\341en etwas passiert,|und eilst zum Restaurant.", // kStringSupernova1
 	"Da! Die Supernova!", // kStringSupernova2
+	// 630
 	"Zwei Minuten sp\204ter ...", // kStringSupernova3
-	// 620
 	"Hey, was machen Sie in meinem Raumschiff?!", // kStringSupernova4
 	"Geben Sie mir sofort meine Brieftasche wieder!", // kStringSupernova5
 	"Versuchen Sie das ja nicht nochmal!", // kStringSupernova6
 	"Und jetzt raus mit Ihnen!", // kStringSupernova7
+	// 635
 	"Zehn Minuten sp\204ter ...", // kStringSupernova8
-	// 625
 	"Was war das f\201r ein Ger\204usch?", // kStringGuardNoticed1
 	"Ich werde mal nachsehen.", // kStringGuardNoticed2
 	"Guten Tag, hier ist Horst Hummel.", // kStringTelomat1
 	"Hier ist %s. K\224nnen Sie mal gerade kommen?", // kStringTelomat2
-	// 630
+	// 640
 	"Es ist sehr wichtig.", // kStringTelomat3
 	"Vom Mars.", // kStringTelomat4
 	"Vom Klo.", // kStringTelomat5
 	"Das werde ich kaum erz\204hlen.", // kStringTelomat6
 	"1 B\201romanager", // kStringTelomat7
-	// 635
+	// 645
 	"2 Telomat", // kStringTelomat8
 	"3 ProText", // kStringTelomat9
 	"4 Calculata", // kStringTelomat10
 	"Bitte w\204hlen", // kStringTelomat11
 	"Geben Sie den gew\201nschten Namen ein:",  // kStringTelomat12
-	// 640
+	// 650
 	"(Vor- und Nachname)",  // kStringTelomat13
 	"Name unbekannt", // kStringTelomat14
 	"Verbindung unm\224glich", // kStringTelomat15
 	"Verbindung wird hergestellt", // kStringTelomat16
 	"%s am Apparat.", // kStringTelomat17
-	// 645
+	// 655
 	"Huch, Sie h\224ren sich aber|nicht gut an. Ich komme sofort.", // kStringTelomat18
 	"Horst Hummel! Von wo rufen Sie an?", // kStringTelomat19
 	"Hmm, keine Antwort.", // kStringTelomat20
 	"Passwort:", // kStringTelomat21
 	"Deine Armbanduhr piepst,|die Alarmzeit ist erreicht.", // kStringAlarm
-	// 650
-	// 660
 	NULL
 };
 
diff --git a/devtools/create_supernova2/gametext.h b/devtools/create_supernova2/gametext.h
index da187e9..bc3b217 100644
--- a/devtools/create_supernova2/gametext.h
+++ b/devtools/create_supernova2/gametext.h
@@ -35,756 +35,759 @@
 // And in the engine add a StringId enum with all the Ids = index in this array.
 
 const char *gameText[] = {
-// 0
-"Gehe",    //Go
-"Schau",    //Look
-"Nimm",    //Take
-"\231ffne",    //Open
-"Schlie\341e",    //Close
-// 5
-"Dr\201cke",    //Push
-"Ziehe",    //Pull
-"Benutze",    //Use
-"Rede",    //Talk
-"Gib",    //Give
-// 10
-"Gehe zu ",    //Go to 
-"Schau ",    //Look at 
-"Nimm ",    //Take 
-"\231ffne ",    //Open 
-// 15
-"Schlie\341e ",    //Close 
-"Dr\201cke ",    //Push 
-"Ziehe ",    //Pull 
-"Benutze ",    //Use 
-"Rede mit ",    //Talk to 
-// 20
-"Gib ",    //Give 
-" an ",    // to 
-" mit ",    // with 
-"Es ist nichts Besonderes daran.",    //There's nothing special about it.
-"|", //Dialog separator
-"Gespr\204ch beenden",    //End of conversation
-"   F1 Hilfe",  // kStringHelpOverview1
-"   F2 Anleitung",  // kStringHelpOverview2
-"   F3 Programminformationen",  //kStringHelpOverview3
-"   F4 Textgeschwindigkeit",    //kStringHelpOverview4
-"   F5 Laden/Speichern",  // kStringHelpOverview5
-"  ESC Vorspann \201berspringen",   // kStringHelpOverview6
-"Alt X Spiel beenden",     // kStringHelpOverview7
-"Textgeschwindigkeit:",    //Text speed:
-"Spiel abbrechen?",    //Leave game?
-"Ja",    //Yes
-"Nein",    //No
-"Laden",    //Load
-"Speichern",    //Save
-// 25
-"Zur\201ck",    //Back
-"Neustart",    //Restart
-"Schreibfehler",    //write error
-// 30
-"Das tr\204gst du doch bei dir.",    //You already carry this.
-"Du bist doch schon da.",    //You are already there.
-"Das ist geschlossen.",    //This is closed.
-// 35
-"Das hast du doch schon.",    //You already have that.
-"Das brauchst du nicht.",    //You don't need that.
-"Das kannst du nicht nehmen.",    //You can't take that.
-"Das l\204\341t sich nicht \224ffnen.",    //This cannot be opened.
-"Das ist schon offen.",    //This is already opened.
-// 40
-"Das ist verschlossen.",    //This is locked.
-"Das l\204\341t sich nicht schlie\341en.",    //This cannot be closed.
-"Das ist schon geschlossen.",    //This is already closed.
-"Behalt es lieber!",    //Better keep it!
-"Das geht nicht.",    //You can't do that.
-// 45
-"^(C) 1994 Thomas und Steffen Dingel#",    //^(C) 1994 Thomas and Steffen Dingel#
-"Story und Grafik:^ Thomas Dingel#",    //Story and Graphics:^ Thomas Dingel#
-"Programmierung:^ Steffen Dingel#",    //Programming:^ Steffen Dingel#
-"Musik:^ Bernd Hoffmann#",    //Music:^ Bernd Hoffmann#
-"Getestet von ...#",    //Tested by ...#
-// 50
-"^Das war's.#",    //^That's it.#
-"^Schlu\341!#",    //^Over!#
-"^Ende!#",    //^End!#
-"^Aus!#",    //^Done!#
-"^Tsch\201\341!#",    //^Bye!#
-// 55
-"Oh!",    //Oh!
-"Nicht schlecht!",    //Not bad!
-"Supersound!",    //Supersound!
-"Klasse!",    //Great!
-"Nicht zu fassen!",    //I can't believe it!
-// 60
-"Super, ey!",    //Dope, yo!
-"Fantastisch!",    //Fantastic!
-"Umwerfend!",    //Stunning!
-"Genial!",    //Brilliant!
-"Spitze!",    //Awesome!
-// 65
-"Jawoll!",    //Alright!
-"Hervorragend!",    //Outstanding!
-"Ultragut!",    //Ultra-good!
-"Megacool!",    //Mega cool!
-"Yeah!",    //Yeah!
-// 70
-"Ein W\204chter betritt den Raum.|Du wirst verhaftet.",    //A guard enters the room.|You are getting arrested.
-"Die n\204chsten paar Jahre|verbringst du im Knast.",    //You will spend the next|few years in jail.
-"Es wird Alarm ausgel\224st.",    //The alarm is about to be set off.
-"Du h\224rst Schritte.",    //You are hearing footsteps.
-"Um das Schloss zu \224ffnen,|brauchst du einige Zeit.",    //You will take some time,|to pick that lock.
-// 75
-"Du ger\204tst in Panik|und ziehst die Keycard|aus der T\201r.",    //You are panicking|and remove the keycard|from the door.
-"Du hast deinen Auftrag|noch nicht ausgef\201hrt.",    //You have not completed|your task yet.
-"Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du dich, zu fliehen.",    //Although you haven't|disabled the alarm yet,|you decide to escape.
-"Du entledigst dich der Einbruchswerkzeuge|und nimmst ein Taxi zum Kulturpalast.",    //You get rid of your burglar tools|and take a cab to the Palace of Culture.
-"Diese T\201r brauchst|du nicht zu \224ffnen.",    //You don't need|to open this door.
-// 80
-"Uff, es hat geklappt!",    //Phew, it worked!
-"Zur\201ck im Quartier der Gangster ...",    //Back in the gangsters' hideout ...
-"Das lief ja wie am Schn\201rchen!",    //Everything went like clockwork!
-"Hier, dein Anteil von 30000 Xa.",    //Here, your share of 30000 Xa.
-"Wo ist denn der Saurierkopf?",    //Where's the dinosaur skull?
-// 85
-"Dazu hatte ich keine Zeit mehr.",    //I didn't have enough time for that.
-"Was? Du spinnst wohl!|Dann kriegst du auch deinen|Anteil nicht. Raus!",    //What? You're nuts!|Then you won't get your|share. Beat it!
-"Der Sauger ist schon dort.",    //The suction cup is already there.
-"Du heftest den Sauger an die Wand|und h\204lst dich daran fest.",    //You attach the suction cup to the wall|and hold on to it.
-"Du stellst dich auf den|Boden nimmst den Sauger|wieder von der Wand",    //You stand on the floor|then remove the suction cup from the wall
-// 90
-"Die Alarmanlage ist|schon ausgeschaltet.",    //The alarm system is|already switched off.
-"Um die Anlage abzuschalten,|brauchst du einige Zeit.",    //To turn off the system,|you need some time.
-"Die Alarmanlage ist jetzt ausgeschaltet.",    //The alarm system is now switched off.
-"Saurier",    //Dinosaur
-"Du hast jetzt besseres zu tun,|als das Ding anzuschauen.",    //You have better things to do now|than look at that thing.
-// 95
-"Eingang",    //Entrance
-"T\201r",    //Door
-"Strasse zum Stadtzentrum",    //Road to the city center
-"Kamera",    //Security camera
-"Hoffentlich bemerkt dich niemand.",    //Hopefully nobody will notice you.
-// 100
-"Haupteingang",    //Main entrance
-"Gang",    //Corridor
-"Ziemlich gro\341.",    //Quite large.
-"Saurierkopf",    //Dinosaur head
-"Dies ist der Kopf,|den du suchst.",    //This is the head|you're looking for.
-// 105
-"Alarmanlage",    //Alarm system
-"Sauger",    //Suction cup
-"Wand",    //Wall
-"Loch",    //Opening
-"Buchstabe",    //Letter
-// 110
-"Sie ist sehr massiv.",    //It is very massive.
-"Hmm, X und Y, irgendwo|habe ich die Buchstaben|schon gesehen.",    //Hmm, X and Y|I have seen these letters|somewhere before.
-"Deine Zeit ist um, Fremder!",    //Your Time is up, Stranger!
-"Du hast das Seil|doch schon festgebunden.",    //You already tied the rope.
-"Das w\201rde wenig bringen.",    //That would have little effect.
-// 115
-"Sonnenstich, oder was?",    //Sunstroke, or what?
-"Du merkst, da\341 der Boden|unter dir nachgibt, und|springst zur Seite.",    //You notice that the ground|is giving way under you,|and you leap aside.
-"Puzzleteil",    //Puzzle piece
-"Neben diesem Stein|ist kein freies Feld.",    //There's no free square|next to this stone.
-"Du spielst gerade ein|Adventure, kein Rollenspiel!",    //You are currently playing an|Adventure, not a Role-Playing Game!
-// 120
-"Du kannst das Seil|nirgends befestigen.",    //There's nowhere|to attach the rope.
-"Es pa\341t nicht|zwischen die Steine.",    //It does not fit|between the stones.
-"Das ist doch|oben festgebunden!",    //That is already|tied up above!
-"Hey, das ist|mindestens 10 Meter tief!",    //Hey, that is|at least 10 meters deep!
-"In dem Schlitz|ist nichts mehr.",    //There is nothing|left in the slot.
-// 125
-"Das ist mindestens 5 Meter tief!",    //That is at least 5 meters deep!
-"Du versuchst, den Sarg zu|\224ffnen, aber der Deckel bewegt|sich keinen Millimeter.",    //You try to open the coffin,|but the lid does not|move a millimeter.
-"Du hast die Kugel schon gedr\201ckt.",    //You have already|pushed the ball.
-"Die Kugel bewegt sich ein St\201ck.",    //The ball moves a bit.
-"Herzlichen Gl\201ckwunsch!",    //Congratulations!
-// 130
-"Sie haben das Spiel gel\224st|und gewinnen 400 Xa!",    //You solved the game|and won 400 Xa!
-"Vielen Dank f\201r die Benutzung eines|VIRTUAL-REALITY-SYSTEMS-Produkts!",    //Thank you for using a|VIRTUAL-REALITY-SYSTEMS product!
-"N",    //N
-"O",    //E
-"S",    //S
-// 135
-"W",    //W
-"Seil",    //Rope
-"Schild",    //Sign
-"Darauf steht:|\"Willst du finden das|richtige Loch, so wage|dich in die Pyramide!\".",    //It reads:|"Want to find|the right hole? Then dare|to enter the pyramid!".
-"Es ist eine kleine \231ffnung.",    //It is a small opening.
-// 140
-"Pyramide",    //Pyramid
-"Komisch! Was soll eine Pyramide|bei den Axacussanern? Deine|eigenen Gedanken scheinen|den Spielverlauf zu beeinflussen.",    //Weird! What is a pyramid doing|at the Axacussians? Your own thoughts seem to influence|the course of the game.
-"Sonne",    //Sun
-"Sch\224n!",    //Nice!
-"\"Hallo Fremder, wenn du diesen|Raum betreten hast, bleibt|dir nur noch eine Stunde Zeit,|um deine Aufgabe zu erf\201llen!\"",    //"Hello, Stranger, when you enter|this room, you have only an hour|to accomplish your task!"
-// 145
-"rechte Seite",    //right side
-"linke Seite",    //left side
-"Knopf",    //Button
-"Schrift",    //Inscription
-"Tomate",    //Tomato
-// 150
-"Komisch!",    //Funny!
-"Messer",    //Knife
-"Es ist ein relativ stabiles Messer.",    //It is a relatively sturdy knife.
-"Monster",    //Monster
-"Es ist dick und|ungef\204hr 15 Meter lang.",    //It is thick and|about 15 meters long.
-// 155
-"Augen",    //Eyes
-"Mund",    //Mouth
-"Es ist nur eine Statue.",    //It's just a statue.
-"Zettel",    //Note
-"Darauf steht:|\"Wenn du fast am Ziel|bist, tu folgendes:|Sauf!\"",    //It reads:|"When you're almost there,|do the following:|Drink!"
-// 160
-"Es ist ca. 10 Meter tief.",    //It is about 10 meters deep.
-"Oben siehst du helles Licht.",    //Above you is a bright light.
-"Darauf steht:|\"Ruhe eine Minute im Raum|zwischen den Monstern,|und du wirst belohnt!\"",    //It reads:|"Rest a minute in the room|between the monsters,|and you'll be rewarded!"
-"Schlitz",    //Slot
-"Du kommst mit den|H\204nden nicht rein.",    //You cannot get in|with your hands.
-// 165
-"Es ist ca. 5 Meter tief.",    //It is about 5 meters deep.
-"Steine",    //Stones
-"Platte",    //Plate
-"Sarg",    //Coffin
-"Ausgang",    //Exit
-// 170
-"Unheimlich!",    //Creepy!
-"Zahnb\201rste",    //Toothbrush
-"Die Sache mit der|Artus GmbH scheint dir zu|Kopf gestiegen zu sein.",    //The thing with the|Artus GmbH seems to have|gotten to your head.
-"Zahnpastatube",    //Toothpaste
-"Kugel",    //Ball
-// 175
-"Hmm, die Kugel sieht lose aus.",    //Hmm, the ball looks loose.
-"Auge",    //Eye
-"Irgendwas stimmt damit nicht.",    //Something is wrong with that.
-"Sieht nach Metall aus.",    //It looks like metal.
-// 180
-"Ein Taxi kommt angerauscht,|du steigst ein.",    //A taxi arrives, and you get in.
-"Du dr\201ckst auf den Knopf, aber nichts passiert",    //You press the button, but nothing happens
-"Es ist leer.",    //It is empty.
-"Du findest ein kleines Ger\204t,|einen Ausweis und einen Xa.",    //You find a small device,|an ID card and a Xa.
-"Du heftest den|Magnet an die Stange.",    //You attach the|magnet to the pole.
-// 185
-"Stange mit Magnet",    //Pole with magnet
-"Raffiniert!",    //Cunning!
-"Du mu\341t das|Ger\204t erst kaufen.",    //You must buy|this device first.
-"Du legst den Chip|in das Ger\204t ein.",    //You insert the chip|into the device.
-"Du \201berspielst die CD|auf den Musikchip.",    //You transfer the CD|to the Music chip.
-// 190
-"Ohne einen eingelegten|Musikchip kannst du auf dem|Ger\204t nichts aufnehmen.",    //Without an inserted|music chip, you can not|record on the device.
-"Du nimmst den Chip|aus dem Ger\204t.",    //You remove the chip|from the device.
-"Es ist kein Chip eingelegt.",    //There is no chip inserted.
-"Wozu? Du hast sowieso nur die eine CD.",    //What for? You only have one CD anyway.
-"Die \"Mad Monkeys\"-CD. Du hast|sie schon tausendmal geh\224rt.",    //The "Mad Monkeys" CD.|You've heard them a thousand times.
-// 195
-"Du h\224rst nichts.|Der Chip ist unbespielt.",    //All you hear is silence.|The chip is empty.
-"Du h\224rst dir den Anfang|der \201berspielten CD an.",    //You are listening to the beginning|of the copied CD.
-"Es ist kein Chip einglegt.",    //There is no chip inserted.
-"Du trinkst etwas von den Zeug, danach|f\201hlst du dich leicht beschwipst.",    //You drink some of the stuff,|then begin to feel slightly tipsy.
-"%d Xa",    //%d Xa
-// 200
-"Als du ebenfalls aussteigst haben|die anderen Passagiere das|Fluggel\204nde bereits verlassen.",    //When you get off the plane|the other passengers|have already left the airport.
-"Flughafen",    //Airport
-"Stadtzentrum",    //Downtown
-"Kulturpalast",    //Palace of Culture
-"Erde",    //Earth
-// 205
-"Privatwohnung",    //Private apartment
-"(Taxi verlassen)",    //(Leave the taxi)
-"(Bezahlen)",    //(Pay)
-"Adresse:|                              ",    //Address:|                              
-"Fuddeln gilt nicht!|Zu diesem Zeitpunkt kannst du diese|Adresse noch gar nicht kennen!",    //Fiddling with the system doesn't work!|At this time you can not|even know this address!
-// 210
-"Du hast nicht|mehr genug Geld.",    //You do not|have enough money left.
-"Du merkst, da\341 das Taxi stark beschleunigt.",    //You notice the taxi is accelerating rapidly.
-"F\201nf Minuten sp\204ter ...",    //Five minutes later ...
-"Du hast doch schon eine Stange",    //You already have a pole
-"Du s\204gst eine der Stangen ab.",    //You saw off one of the poles.
-// 215
-"Du betrittst das einzige|offene Gesch\204ft, das|du finden kannst.",    //You enter the only|open shop that|you can find.
-"Die Kabine ist besetzt.",    //The cabin is occupied.
-"He, nimm erstmal das Geld|aus dem R\201ckgabeschlitz!",    //Hey, take the money|from the return slot!
-"Du hast doch schon bezahlt.",    //You have already paid.
-"Du hast nicht mehr genug Geld.",    //You do not have enough money left.
-// 220
-"Du wirfst 10 Xa in den Schlitz.",    //You put 10 Xa in the slot.
-"Dir wird schwarz vor Augen.",    //You are about to pass out.
-"Du ruhst dich eine Weile aus.",    //You rest for a while.
-"An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ...\"",    //On the Wall is:|"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
-"Ok, ich nehme es.",    //OK, I'll take it.
-// 225
-"Nein danke, das ist mir zu teuer.",    //No thanks, that's too expensive for me.
-"Ich w\201rde gern etwas kaufen.",    //I would like to buy something.
-"Ich bin's, Horst Hummel.",    //It's me, Horst Hummel.
-"Haben Sie auch einen Musikchip f\201r das Ger\204t?",    //Do you have a music chip for the device?
-"Eine tolle Maske, nicht wahr?",    //It's a great mask, right?
-// 230
-"Komisch, da\341 sie schon drei Jahre da steht.",    //Strange that it has been there for three years.
-"Ein starker Trunk. Zieht ganz sch\224n rein.",    //A strong drink. It hits you pretty hard.
-"Ein Abspiel- und Aufnahmeger\204t f\201r die neuen Musikchips.",    //A playback and recording device for the new music chips.
-"Eine ARTUS-Zahnb\201rste. Der letzte Schrei.",    //An ARTUS toothbrush. The latest craze.
-"Verkaufe ich massenhaft, die Dinger.",    //I sell these things in bulk.
-// 235
-"Das sind echte Rarit\204ten. B\201cher in gebundener Form.",    //These are real rarities. Books in bound form.
-"Die Encyclopedia Axacussana.",    //The Encyclopedia Axacussana.
-"Das gr\224\341te erh\204ltliche Lexikon auf 30 Speicherchips.",    //The largest available dictionary on 30 memory chips.
-"\232ber 400 Trilliarden Stichw\224rter.",    //Over 400 sextillion keywords.
-"Die ist nicht zu verkaufen.",    //It is not for sale.
-// 240
-"So eine habe ich meinem Enkel zum Geburtstag geschenkt.",    //I gave one to my grandson for his birthday.
-"Er war begeistert von dem Ding.",    //He was excited about this thing.
-"Der stammt aus einem bekannten Computerspiel.",    //It comes from a well-known computer game.
-"Robust, handlich und stromsparend.",    //Sturdy, handy and energy-saving.
-"Irgendein lasches Ges\224ff.",    //Some cheap swill.
-// 245
-"Das sind Protestaufkleber gegen die hohen Taxigeb\201hren.",    //These are stickers protesting the high taxi fees.
-"Das ist Geschirr aus der neuen Umbina-Kollektion.",    //These are dishes from the new Umbina-Collection.
-"H\204\341lich, nicht wahr?",    //Ugly, right?
-"Aber verkaufen tut sich das Zeug gut.",    //But this stuff sells well.
-"Das kostet %d Xa.",    //That costs %d Xa.
-// 250
-"Schauen Sie sich ruhig um!",    //Take a look around!
-"Unsinn!",    //Nonsense!
-"Tut mir leid, die sind|schon alle ausverkauft.",    //I'm very sorry,|they are already sold out.
-"Guten Abend.",    //Good evening.
-"Hallo.",    //Hello.
-// 255
-"Huch, Sie haben mich aber erschreckt!",    //Yikes, you scared me!
-"Wieso?",    //How so?
-"Ihre Verkleidung ist wirklich t\204uschend echt.",    //Your disguise is deceptively real-looking.
-"Welche Verkleidung?",    //What disguise?
-"Na, tun Sie nicht so!",    //Stop pretending you don't know!
-// 260
-"Sie haben sich verkleidet wie der Au\341erirdische,|dieser Horst Hummel, oder wie er hei\341t.",    //You disguised yourself as that extraterrestrial guy,|Horst Hummel, or whatever his name is.
-"Ich BIN Horst Hummel!",    //I AM Horst Hummel!
-"Geben Sie's auf!",    //Give it up!
-"An Ihrer Gestik merkt man, da\341 Sie|ein verkleideter Axacussaner sind.",    //You can tell from your gestures that you are|a disguised Axacussan.
-"Der echte Hummel bewegt sich|anders, irgendwie ruckartig.",    //The real Hummel moves|differently, kind of jerky.
-// 265
-"Weil er ein Roboter ist! ICH bin der Echte!",    //Because he is a robot! I am the real one!
-"Ach, Sie spinnen ja!",    //Oh, you are crazy!
-"Sie Trottel!!!",    //You Idiot!!!
-"Seien Sie still, oder ich werfe Sie raus!",    //Shut up or I'll kick you out!
-"Taschenmesser",    //Pocket knife
-// 270
-"Hey, da ist sogar eine S\204ge dran.",    //Hey, there's even a saw on it.
-"20 Xa",    //20 Xa
-"Discman",    //Discman
-"Da ist noch die \"Mad Monkeys\"-CD drin.",    //The "Mad Monkeys" CD is still in there.
-"Mit dem Ding sollst du dich|an der Wand festhalten.",    //You should hold onto the wall|using that thing.
-// 275
-"Spezialkeycard",    //Special keycard
-"Damit sollst du die|T\201ren knacken k\224nnen.",    //With that you should be able to crack the doors.
-"Alarmknacker",    //Alarm cracker
-"Ein kleines Ger\204t, um|die Alarmanlage auszuschalten.",    //A small device|to turn off the alarm.
-"Karte",    //Keycard
-// 280
-"Raumschiff",    //Spaceship
-"Damit bist du hierhergekommen.",    //You came here with it.
-"Fahrzeuge",    //Vehicles
-"Du kannst von hier aus nicht erkennen,|was das f\201r Fahrzeuge sind.",    //You cannot tell from here|what those vehicles are.
-"Fahrzeug",    //Vehicle
-// 285
-"Es scheint ein Taxi zu sein.",    //It seems to be a taxi.
-"Komisch, er ist verschlossen.",    //Funny, it is closed.
-"Portemonnaie",    //Wallet
-"Das mu\341 ein Axacussaner|hier verloren haben.",    //This must have been|lost by an Axacussan.
-"Ger\204t",    //Device
-// 290
-"Auf dem Ger\204t steht: \"Taxi-Call\".|Es ist ein kleiner Knopf daran.",    //The device says "Taxi Call."|There is a small button on it.
-"Ausweis",    //ID card
-"Auf dem Ausweis steht:|  Berta Tschell|  Axacuss City|  115AY2,96A,32",    //On the card it reads: | Berta Tschell | Axacuss City | 115AY2,96A,32
-"Treppe",    //Staircase
-"Sie f\201hrt zu den Gesch\204ften.",    //It leads to the shops.
-// 295
-"Gesch\204ftsstra\341e im Hintergrund",    //Business street in the background
-"Die Stra\341e scheint kein Ende zu haben.",    //The road seems to have no end.
-"Stange",    //Rod
-"Pfosten",    //Post
-"Gel\204nder",    //Railing
-// 300
-"Plakat",    //Poster
-"Musik Pur - Der Musikwettbewerb!|Heute im Kulturpalast|Hauptpreis:|Fernsehauftritt mit Horst Hummel|Sponsored by Artus GmbH",    //Pure Music - The Music Competition!|Today at the Palace of Culture|Main Prize:|Television appearance with Horst Hummel|Sponsored by Artus GmbH
-"Kabine",    //Cabin
-"Sie ist frei!",    //It is free!
-"Sie ist besetzt.",    //It is occupied.
-// 305
-"F\201\341e",    //Feet
-"Komisch, die|F\201\341e scheinen|erstarrt zu sein.",    //Strange, the|feet seem to be frozen.
-"Haube",    //Hood
-"Sieht aus wie beim Fris\224r.",    //Looks like the hairdresser.
-"400 Xa",    //400 Xa
-// 310
-"10 Xa",    //10 Xa
-"Dar\201ber steht:|\"Geldeinwurf: 10 Xa\".",    //It says:|"Coins: 10 Xa".
-"Dar\201ber steht:|\"Gewinnausgabe / Geldr\201ckgabe\".",    //It says:|"Prize / Money Return".
-"Stuhl",    //Chair
-"Etwas Entspannung k\224nntest du jetzt gebrauchen.",    //You could use some relaxation right about now.
-// 315
-"Gekritzel",    //Scribble
-"Gesicht",    //Face
-"Nicht zu fassen! Die|W\204nde sind genauso beschmutzt|wie auf der Erde.",    //Unbelievable! The walls|are just as dirty|as those on Earth.
-"B\201cher",    //Books
-"Lexikon",    //Dictionary
-// 320
-"Pflanze",    //Plant
-"Maske",    //Mask
-"Schlange",    //Snake
-"Becher",    //Cup
-"Joystick",    //Joystick
-// 325
-"Eine normale Zahnb\201rste,|es steht nur \"Artus\" darauf.",    //An ordinary toothbrush.|It says "Artus" on it.
-"Musikger\204t",    //Music device
-"Ein Ger\204t zum Abspielen und|Aufnehmen von Musikchips.|Es ist ein Mikrofon daran.",    //A device for playing and recording music chips.|There is a microphone on it.
-"Flasche",    //Bottle
-"Auf dem Etikett steht:|\"Enth\204lt 10% Hyperalkohol\".",    //The label says: "Contains 10% hyperalcohol".
-// 330
-"Kiste",    //Box
-"Verk\204ufer",    //Seller
-"Was? Daf\201r wollen Sie die Karte haben?",    //What? Do you want the card for that?
-"Sie sind wohl nicht ganz \201ber|die aktuellen Preise informiert!",    //You are probably not completely|informed about the current prices!
-"Ich bin's, Horst Hummel!",    //It's me, Horst Hummel!
-// 335
-"Sch\224nes Wetter heute!",    //Nice weather today!
-"K\224nnen Sie mir sagen, von wem ich eine Eintrittskarte f\201r den Musikwettbewerb kriegen kann?",    //Can you tell me who can get me a ticket for the music contest?
-"Ok, hier haben Sie den Xa.",    //OK, here is the Xa.
-"Ich biete Ihnen 500 Xa.",    //I offer you 500 Xa.
-"Ich biete Ihnen 1000 Xa.",    //I offer you 1000 Xa.
-// 340
-"Ich biete Ihnen 5000 Xa.",    //I offer you 5000 Xa.
-"Ich biete Ihnen 10000 Xa.",    //I offer you 10000 Xa.
-"Vielen Dank f\201r Ihren Kauf!",    //Thank you for your purchase!
-"Was bieten Sie mir|denn nun f\201r die Karte?",    //What will you offer me|for the card?
-"Hallo, Sie!",    //Hello to you!
-// 345
-"Was wollen Sie?",    //What do you want?
-"Wer sind Sie?",    //Who are you?
-"Horst Hummel!",    //Horst Hummel!
-"Kenne ich nicht.",    //Never heard of him.
-"Was, Sie kennen den ber\201hmten Horst Hummel nicht?",    //What, you don't know the famous Horst Hummel?
-// 350
-"Ich bin doch der, der immer im Fernsehen zu sehen ist.",    //I'm the guy who is always on TV.
-"Ich kenne Sie wirklich nicht.",    //I really do not know you.
-"Komisch.",    //Funny.
-"Aha.",    //Aha.
-"Ja, kann ich.",    //Yes, I can.
-// 355
-"Von wem denn?",    //From whom?
-"Diese Information kostet einen Xa.",    //This information costs a Xa.
-"Wie Sie meinen.",    //As you say.
-"Sie k\224nnen die Karte von MIR bekommen!",    //You can get the card from ME!
-"Aber nur eine Teilnahmekarte,|keine Eintrittskarte.",    //But only a participation ticket,|not an entrance ticket.
-// 360
-"Was wollen Sie daf\201r haben?",    //What do you want for it?
-"Machen Sie ein Angebot!",    //Make an offer!
-"Das ist ein gutes Angebot!",    //That's a good offer!
-"Daf\201r gebe ich Ihnen meine|letzte Teilnahmekarte!",    //For that I give you my|last participation card!
-"(Dieser Trottel!)",    //(That Idiot!)
-// 365
-"Ich w\201rde gern beim Musikwettbewerb zuschauen.",    //I would like to watch the music competition.
-"Ich w\201rde gern am Musikwettbewerb teilnehmen.",    //I would like to participate in the music competition.
-"Wieviel Uhr haben wir?",    //What time is it?
-"Ja.",    //Yes.
-"Nein.",    //No.
-// 370
-"Hallo, Leute!",    //Hi guys!
-"Hi, Fans!",    //Hi, fans!
-"Gute Nacht!",    //Good night!
-"\216h, wie geht es euch?",    //Uh, how are you?
-"Sch\224nes Wetter heute.",    //Nice weather today.
-// 375
-"Hmm ...",    //Hmm ...
-"Tja ...",    //Well ...
-"Also ...",    //So ...
-"Ok, los gehts!",    //OK let's go!
-"Ich klimper mal was auf dem Keyboard hier.",    //I'll fix something on the keyboard here.
-// 380
-"Halt, sie sind doch schon drangewesen!",    //Stop, you have already been on it!
-"He, Sie! Haben Sie|eine Eintrittskarte?",    //Hey, you! Do you have|a ticket?
-"Ja nat\201rlich, hier ist meine Teilnahmekarte.",    //Yes of course, here is my participation ticket.
-"Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten k\224nnen.",    //You are a participant!|Please ask at the checkout|when you can go on stage.
-"\216h, nein.",    //Uh, no.
-// 385
-"He, wo ist Ihr Musikchip?",    //Hey, where's your music chip?
-"Laber nicht!",    //Stop talking!
-"Fang an!",    //Get started!
-"Einen Moment, ich mu\341 erstmal \201berlegen, was ich|euch spiele.",    //One moment, I have to think about what I'm playing for you.
-"Anfangen!!!",    //Begin!!!
-// 390
-"Nun denn ...",    //Well then ...
-"Raus!",    //Out!
-"Buh!",    //Boo!
-"Aufh\224ren!",    //Stop!
-"Hilfe!",    //Help!
-// 395
-"Ich verziehe mich lieber.",    //I'd prefer to get lost.
-"Mist, auf dem Chip war|gar keine Musik drauf.",    //Damn, there was no music on the chip at all.
-"Das ging ja voll daneben!",    //That went completely wrong!
-"Du n\204herst dich der B\201hne,|aber dir wird mulmig zumute.",    //You approach the stage,|but you feel queasy.
-"Du traust dich nicht, vor|so vielen Menschen aufzutreten|und kehrst wieder um.",    //You do not dare to appear|in front of so many people|and turn around.
-// 400
-"Oh, Sie sind Teilnehmer!|Dann sind Sie aber sp\204t dran.",    //Oh, you are a participant!|But you are late.
-"Spielen Sie die Musik live?",    //Do you play the music live?
-"Dann geben Sie bitte Ihren Musikchip ab!|Er wird bei Ihrem Auftritt abgespielt.",    //Then please submit your music chip!|It will be played during your performance.
-"Oh, Sie sind sofort an der Reihe!|Beeilen Sie sich! Der B\201hneneingang|ist hinter dem Haupteingang rechts.",    //Oh, it's your turn!|Hurry! The stage entrance|is to the right behind the main entrance.
-"Habe ich noch einen zweiten Versuch?",    //Can I have another try?
-// 405
-"Nein!",    //No!
-"Haben Sie schon eine Eintrittskarte?",    //Do you already have a ticket?
-"Tut mir leid, die Karten|sind schon alle ausverkauft.",    //I'm sorry, the tickets|are already sold out.
-"Mist!",    //Crap!
-"Haben Sie schon eine Teilnahmekarte?",    //Do you already have a participation ticket?
-// 410
-"Ja, hier ist sie.",    //Yes, here it is.
-"Tut mir leid, die Teilnahmekarten|sind schon alle ausverkauft.",    //I'm sorry, the participation tickets|are already sold out.
-"Schei\341e!",    //Crap!
-"Das kann ich Ihnen|leider nicht sagen.",    //I can not tell you that.
-"Wo ist denn nun Ihr Musikchip?",    //Where is your music chip?
-// 415
-"Jetzt beeilen Sie sich doch!",    //Now hurry up!
-"Huch, Sie sind hier bei einem Musik-,|nicht bei einem Imitationswettbewerb",    //Huh, you're here at a music contest,|not at an imitation contest
-"Imitationswettbewerb?|Ich will niemanden imitieren.",    //Imitation contest?|I do not want to imitate anyone.
-"Guter Witz, wieso sehen Sie|dann aus wie Horst Hummel?",    //Good joke. Then why do you look like Horst Hummel?
-"Na, nun h\224ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht.",    //Oh come on! Your disguise isn't that perfect.
-// 420
-"Ich werde Ihnen beweisen, da\341 ich Horst Hummel bin,|indem ich diesen Wettbewerb hier gewinne.",    //I will prove to you that I am Horst Hummel|by winning this competition.
-"Dann kann ich in dieser verdammten Fernsehshow|auftreten.",    //Then I can perform in this|damn TV show.
-"Du hampelst ein bi\341chen zu|der Musik vom Chip herum.|Die Leute sind begeistert!",    //You're rocking a little bit|to the music from the chip.|The audience is excited!
-"Guten Abend. Diesmal haben wir|einen besonderen Gast bei uns.",    //Good evening. This time we have|a special guest with us.
-"Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort vor allem durch seine|Verkleidung aufgefallen war.",    //He is the winner of yesterday's music competition in the Palace of Culture.|He was particularly noteworthy|because of his disguise.
-// 425
-"Sie haben das Wort!",    //You have the floor!
-"Nun ja, meine erste Frage lautet: ...",    //Well, my first question is ...
-"Warum haben Sie sich sofort nach|Ihrer Landung entschlossen, f\201r|die Artus-GmbH zu arbeiten?",    //Why did you decide immediately|after your arrival to work for|Artus GmbH?
-"Es war meine freie Entscheidung.|Die Artus-GmbH hat mir einfach gefallen.",    //It was a decision I made on my own.|I just decided I liked Artus-GmbH.
-"Wieso betonen Sie, da\341 es|Ihre freie Entscheidung war?|Haben Sie Angst, da\341 man Ihnen|nicht glaubt?",    //Why do you stress that|it was your own decision?|Are you afraid that nobody will believe you otherwise?
-// 430
-"Also, ich mu\341 doch sehr bitten!|Was soll diese unsinnige Frage?",    //How dare you!|What is with this nonsensical question?
-"Ich finde die Frage wichtig.|Nun, Herr Hummel, was haben|Sie dazu zu sagen?",    //I think the question is important.|Well, Mr. Hummel, what do you have to say?
-"Auf solch eine Frage brauche|ich nicht zu antworten!",    //I don't feel that I have|to answer such a question!
-"Gut, dann etwas anderes ...",    //Alright, something else then ...
-"Sie sind von Beruf Koch.|Wie hie\341 das Restaurant,|in dem Sie auf der Erde|gearbeitet haben?",    //You are a chef by profession.|What was the name of the restaurant|where you worked|on Earth?
-// 435
-"Hmm, da\341 wei\341 ich nicht mehr.",    //Hmm, I do not remember that.
-"Sie wollen mir doch nicht weismachen,|da\341 Sie den Namen vergessen haben!",    //Do you really expect me to believe you cannot remember the name?
-"Schlie\341lich haben Sie|zehn Jahre dort gearbeitet!",    //After all, you worked there for ten years!
-"Woher wollen Sie das wissen?",    //How do you know that?
-"Nun, ich komme von der Erde,|im Gegensatz zu Ihnen!",    //Well, I come from Earth,|unlike you!
-// 440
-"Langsam gehen Sie zu weit!",    //Now you've gone too far!
-"Sie sind ein Roboter!|Das merkt man schon an|Ihrer dummen Antwort!|Sie sind nicht optimal|programmiert!",    //You are a robot!|It is obvious from|your stupid answer!|You are not even programmed|correctly!
-"Wenn Sie jetzt nicht mit Ihren|Beleidigungen aufh\224ren, mu\341 ich|Ihnen das Mikrofon abschalten!",    //If you do not stop right now|with your insults, I will have|to turn off the microphone!
-"Ich bin der echte Horst Hummel,|und hier ist der Beweis!",    //I am the real Horst Hummel,|and here is the proof!
-"Am n\204chsten Morgen sind alle|Zeitungen voll mit deiner spektakul\204ren|Enth\201llung des Schwindels.",    //The next morning, all the papers|are full of your spectacular|revelation of fraud.
-// 445
-"Die Manager der Artus-GmbH und Commander|Sumoti wurden sofort verhaftet.",    //The managers of Artus-GmbH and Commander|Sumoti were arrested immediately.
-"Nach dem Stre\341 der letzten Tage,|entscheidest du dich, auf die|Erde zur\201ckzukehren.",    //After these stressful last few days|you decide to return to Earth.
-"W\204hrend du dich vor Interviews|kaum noch retten kannst, ...",    //While you can barely save|yourself from interviews, ...
-"... arbeiten die Axacussanischen|Techniker an einem Raumschiff,|das dich zur Erde zur\201ckbringen soll.",    //... the Axacussan|technicians are working on a spaceship|to bring you back to Earth.
-"Eine Woche sp\204ter ist der|Tag des Starts gekommen.",    //One week later, the day of the launch has arrived.
-// 450
-"Zum dritten Mal in deinem|Leben verbringst du eine lange|Zeit im Tiefschlaf.",    //For the third time in your life,|you spend a long time|in deep sleep.
-"Zehn Jahre sp\204ter ...",    //Ten years later ...
-"Du wachst auf und beginnst,|dich schwach an deine|Erlebnisse zu erinnern.",    //You wake up and begin|to faintly remember|your experiences.
-"Um dich herum ist alles dunkel.",    //Everything is dark around you.
-"Sie zeigt %d an.",    //It displays %d.
-// 455
-"Ich interessiere mich f\201r den Job, bei dem man \201ber Nacht",    //I'm interested in the job where you can get
-"reich werden kann.",    //rich overnight.
-"Ich verkaufe frische Tomaten.",    //I sell fresh tomatoes.
-"Ich bin der Klempner. Ich soll hier ein Rohr reparieren.",    //I am the plumber. I'm supposed to fix a pipe here.
-"Ja, h\224rt sich gut an.",    //Yes, it sounds good.
-// 460
-"Krumme Gesch\204fte? F\201r wen halten Sie mich? Auf Wiedersehen!",    //Crooked business? Who do you think I am? Goodbye!
-"\216h - k\224nnten Sie mir das Ganze nochmal erkl\204ren?",    //Uh - could you explain that to me again?
-"Wie gro\341 ist mein Anteil?",    //How big is my share?
-"Machen Sie es immer so, da\341 Sie Ihre Komplizen \201ber ein Graffitti anwerben?",    //Do you always use graffiti to recruit your accomplices?
-"Hmm, Moment mal, ich frage den Boss.",    //Hmm wait, I will ask the boss.
-// 465
-"Kurze Zeit sp\204ter ...",    //A short while later ...
-"Ok, der Boss will dich sprechen.",    //OK, the boss wants to talk to you.
-"Du betrittst die Wohnung und|wirst zu einem Tisch gef\201hrt.",    //You enter the apartment and are led to a table.
-"Hmm, du willst dir also|etwas Geld verdienen?",    //Hmm, so you want to earn some money?
-"Nun ja, wir planen|einen n\204chtlichen Besuch|eines bekannten Museums.",    //Well, we're planning|a nightly visit|to a well-known museum.
-// 470
-"Wie sieht's aus, bist du interessiert?",    //So, are you interested?
-"Halt, warte!",    //Stop, wait!
-"\232berleg's dir, es springen|30000 Xa f\201r dich raus!",    //Think about it, your share would be|30000 Xa!
-"30000?! Ok, ich mache mit.",    //30000?! Alright, count me in.
-"Gut, dann zu den Einzelheiten.",    //Good, now then to the details.
-// 475
-"Bei dem Museum handelt es|sich um das Orzeng-Museum.",    //The museum in question is|the Orzeng Museum.
-"Es enth\204lt die wertvollsten|Dinosaurierfunde von ganz Axacuss.",    //It contains the most valuable|dinosaur discoveries of Axacuss.
-"Wir haben es auf das Sodo-Skelett|abgesehen. Es ist weltber\201hmt.",    //We're aiming to get the Sodo skeleton.|It is world-famous.
-"Alle bekannten Pal\204ontologen haben|sich schon damit besch\204ftigt.",    //All known paleontologists|have already dealt with it.
-"Der Grund daf\201r ist, da\341 es allen|bis jetzt bekannten Erkenntnissen|\232ber die Evolution widerspricht.",    //The reason for this is that it contradicts all known|knowledge about evolution.
-// 480
-"Irgendein verr\201ckter Forscher|bietet uns 200.000 Xa,|wenn wir ihm das Ding beschaffen.",    //Some crazy researcher|will give us 200,000 Xa|if we retrieve that thing for him.
-"So, jetzt zu deiner Aufgabe:",    //So, now to your task:
-"Du dringst durch den Nebeneingang|in das Geb\204ude ein.",    //You enter the building through|the side entrance.
-"Dort schaltest du die Alarmanlage aus,|durch die das Sodo-Skelett gesichert wird.",    //There you switch off the alarm system,|which secures the Sodo skeleton.
-"Wir betreten einen anderen Geb\204udeteil|und holen uns das Gerippe.",    //We'll enter another part of the building|and fetch the skeleton.
-// 485
-"Deine Aufgabe ist nicht leicht.|Schau dir diesen Plan an.",    //Your task is not easy.|Look at this plan.
-"Unten siehst du die kleine Abstellkammer,|durch die du in die Austellungsr\204ume kommst.",    //Below you can see the small storage room,|through which you come to the showrooms.
-"Bei der mit Y gekennzeichneten|Stelle ist die Alarmanlage.",    //The alarm system is at the location marked Y.
-"Bei dem X steht ein gro\341er Dinosaurier|mit einem wertvollen Sch\204del.|Den Sch\204del nimmst du mit.",    //The X marks the spot with a big dinosaur|with a valuable skull.|You will take the skull with you.
-"Nun zu den Problemen:",    //Now for the problems:
-// 490
-"Die wei\341 gekennzeichneten|T\201ren sind verschlossen.",    //The marked white doors|are locked.
-"Sie m\201ssen mit einer Spezialkeycard ge\224ffnet|werden, was jedoch einige Zeit dauert.",    //They have to be opened with a special keycard,|which can take a while.
-"Au\341erdem gibt es in den auf der Karte|farbigen R\204umen einen Druck-Alarm.",    //In addition, there are pressure alarms|in the rooms which are colored on the map.
-"Du darfst dich dort nicht l\204nger|als 16 bzw. 8 Sekunden aufhalten,|sonst wird Alarm ausgel\224st.",    //You can not stay there longer than|16 or 8 seconds,|or the alarm will go off.
-"Im Raum oben rechts ist|eine Kamera installiert.",    //In the room at the top right|there is a camera installed.
-// 495
-"Diese wird jedoch nur von|der 21. bis zur 40. Sekunde|einer Minute \201berwacht.",    //However, it is only monitored|between the 21st and the 40th second|of every minute.
-"Das gr\224\341te Problem ist der W\204chter.",    //The biggest problem is the guard.
-"Er braucht f\201r seine Runde genau|eine Minute, ist also ungef\204hr|zehn Sekunden in einem Raum.",    //He needs exactly one minute for his round,|so he is in each room|for about ten seconds.
-"Du m\201\341test seine Schritte h\224ren k\224nnen,|wenn du in der Abstellkammer bist|und der W\204chter dort vorbeikommt.",    //You should be able to hear his footsteps|if you are in the closet|and the guard passes by.
-"Wenn du es bis zur Alarmanlage|geschafft hast, h\204ngst du dich|mit dem Sauger an die Wand,|damit du keinen Druck-Alarm ausl\224st.",    //If you make it to the alarm system,|you'll use the sucker to hang on the wall|to avoid triggering the pressure alarm.
-// 500
-"Die Alarmanlage schaltest du|mit einem speziellen Ger\204t aus.",    //You switch off the alarm system|with a special device.
-"Wenn du das geschafft hast, nichts|wie raus! Aber keine Panik,|du darfst keinen Alarm ausl\224sen.",    //Once you're done, get out of there!|But do not panic!|You must not set off the alarm.
-"So, noch irgendwelche Fragen?",    //So, any more questions?
-"Also gut.",    //All right then.
-"Du bekommst 30000 Xa.",    //You get 30,000 Xa.
-// 505
-"Ja, die Methode hat sich bew\204hrt.",    //Yes, that method has proven itself worthy.
-"Hast du sonst noch Fragen?",    //Do you have any questions?
-"Nachdem wir alles gekl\204rt|haben, kann es ja losgehen!",    //Now that we are on the same page we can get started!
-"Zur vereinbarten Zeit ...",    //At the agreed upon time ...
-"Du stehst vor dem Orzeng Museum,|w\204hrend die Gangster schon in einen|anderen Geb\204uderteil eingedrungen sind.",    //You stand in front of the Orzeng Museum,|while the gangsters have already penetrated|into another part of the building.
-// 510
-"Wichtiger Hinweis:|Hier ist die letzte M\224glichkeit,|vor dem Einbruch abzuspeichern.",    //Important note:|Here is the last possibility to save|before the break-in.
-"Wenn Sie das Museum betreten haben,|k\224nnen Sie nicht mehr speichern!",    //Once you enter the museum|you will not be able to save!
-"Stecken Sie sich Ihre|Tomaten an den Hut!",    //You can keep your tomatoes!
-"Das kann ja jeder sagen!",    //Anyone can say that!
-"Niemand \224ffnet.",    //Nobody answers.
-// 515
-"Welche Zahl willst du eingeben:      ",    //What number do you want to enter:      
-"Falsche Eingabe",    //Invalid input
-"Der Aufzug bewegt sich.",    //The elevator is moving.
-"Die Karte wird|nicht angenommen.",    //The card|is not accepted.
-"Da ist nichts mehr.",    //There is nothing left.
-// 520
-"Da ist ein Schl\201ssel unter dem Bett!",    //There's a key under the bed!
-"Hey, da ist etwas unter dem|Bett. Nach dem Ger\204usch zu|urteilen, ist es aus Metall.",    //Hey, there is something under the|bed. Judging by the noise,|it is made of metal.
-"Mist, es gelingt dir nicht,|den Gegenstand hervorzuholen.",    //Damn, you do not succeed in getting the object out.
-"Die Klappe ist schon offen.",    //The flap is already open.
-"Der Schl\201sssel pa\341t nicht.",    //The key does not fit.
-// 525
-"Du steckst den Chip in die|Anlage, aber es passiert nichts.|Die Anlage scheint kaputt zu sein.",    //You put the chip in the stereo,|but nothing happens.|The stereo seems to be broken.
-"Es passiert nichts. Das Ding|scheint kaputt zu sein.",    //Nothing happens. The thing|seems to be broken.
-"Hochspannung ist ungesund, wie du aus|Teil 1 eigentlich wissen m\201\341test!",    //High voltage is unhealthy, as you|should already know|from Part 1!
-"Es h\204ngt ein Kabel heraus.",    //A cable hangs out.
-"Irgendetwas hat hier|nicht ganz funktioniert.",    //Something did not|quite work out here.
-// 530
-"Du ziehst den Raumanzug an.",    //You put on your space suit.
-"Du ziehst den Raumanzug aus.",    //You take off your space suit.
-"Das ist schon verbunden.",    //That is already connected.
-"Die Leitung ist hier|schon ganz richtig.",    //The cable is already|at the right place.
-"Roger W.! Wie kommen Sie denn hierher?",    //Roger W.! How did you get here?
-// 535
-"Ach, sieh mal einer an! Sie schon wieder!",    //Oh, look at that! It's you again!
-"Wo haben Sie denn|Ihr Schiff gelassen?",    //Where did you|leave your ship?
-"Schauen Sie mal hinter mich auf|den Turm! Da oben h\204ngt es.",    //Take a look behind me, up on|the tower! It's up there.
-"Ich hatte es scheinbar etwas zu|eilig, aber ich mu\341te unbedingt|zu den Dreharbeiten nach Xenon!",    //Apparently I was too much in a hurry,|but I had to be at the film shooting in Xenon!
-"Mich wundert, da\341 es die Leute|hier so gelassen nehmen.",    //I am surprised that people|here take things so calmly.
-// 540
-"Die tun gerade so, als ob der Turm|schon immer so schr\204g gestanden h\204tte!",    //They are pretending that the tower|has always been that slanted!
-"Hat er auch, schon seit|mehreren Jahrhunderten!",    //It has, for|several centuries, actually!
-"\216h ... ach so. Und von wo|kommen Sie? Sie hatten's ja|wohl auch ziemlich eilig.",    //Uh ... I see. And where are you coming from? It seems you were in quite a hurry as well.
-"Ich komme von Axacuss.",    //I come from Axacuss.
-"Hmm, was mach ich jetzt blo\341?",    //Hmm, what am I going to do now?
-// 545
-"Ich kenne ein gutes Cafe nicht|weit von hier, da k\224nnen|wir uns erstmal erholen.",    //I know a good cafe not far from here,|where we can get some rest.
-"Ok, einverstanden.",    //OK, I agree.
-"Faszinierend!",    //Fascinating!
-"Taxis",    //Taxis
-"Hier ist ja richtig was los!",    //There seems to be something really going on here!
-// 550
-"Axacussaner",    //Axacussan
-"Teilnahmekarte",    //Participation card
-"Axacussanerin",    //Axacussian
-"Darauf steht:|\"115AY2,96A\"",    //It reads:|"115AY2,96A"
-"Darauf steht:|\"115AY2,96B\"",    //It reads:|"115AY2,96B"
-// 555
-"Darauf steht:|\"341,105A\"",    //It reads:|"341,105A"
-"Darauf steht:|\"341,105B\"",    //It reads:|"341,105B"
-"Klingel",    //Bell
-"Anzeige",    //Display
-"Tastenblock",    //Keypad
-// 560
-"Es sind Tasten von 0 bis 9 darauf.",    //There are keys from 0 to 9 on it.
-"Chip",    //Chip
-"Es ist ein Musikchip!",    //It's a music chip!
-"Klappe",    //Hatch
-"Sie ist mit einem altmodischen|Schlo\341 verschlossen.",    //It is secured with an old-fashioned lock.
-// 565
-"Musikanlage",    //Music system
-"Toll, eine in die Wand|integrierte Stereoanlage.",    //Great, a built-in stereo|in the wall.
-"Boxen",    //Speakers
-"Ganz normale Boxen.",    //Ordinary speakers.
-"Stifte",    //Pencils
-// 570
-"Ganz normale Stifte.",    //Ordinary pencils.
-"Metallkl\224tzchen",    //Metal blocks
-"Es ist magnetisch.",    //It is magnetic.
-"Bild",    //Image
-"Ein ungew\224hnliches Bild.",    //An unusual picture.
-// 575
-"Schrank",    //Cabinet
-"Er ist verschlossen",    //It is closed
-"Aufzug",    //Elevator
-"unter Bett",    //under bed
-"Unter dem Bett sind bestimmt wichtige|Dinge zu finden, nur kommst du nicht darunter.|Du br\204uchtest einen Stock oder so etwas.",    //Under the bed are certainly important|things to find, only you cannot reach underneath.|You need a stick or something.
-// 580
-"Schl\201ssel",    //Key
-"Ein kleiner Metallschl\201ssel.",    //A small metal key.
-"Schalter",    //Switch
-"Griff",    //Handle
-"Luke",    //Hatch
-// 585
-"Raumanzug",    //Space suit
-"Ein zusammenfaltbarer Raumanzug.",    //A collapsible spacesuit.
-"Leitung",    //Cable
-"Irgendetwas scheint hier|kaputtgegangen zu sein.",    //Something seems to|have broken here.
-"Sie h\204ngt lose von der Decke runter.",    //It hangs loose from the ceiling.
-// 590
-"Zur Erinnerung:|Dir ist es gelungen, aus den|Artus-Geheimb\201ros zu fliehen.",    //Reminder:|You managed to escape from the|Artus-GmbH secret offices.
-"Nun befindest du dich in|einem Passagierraumschiff,|das nach Axacuss City fliegt.",    //Now you are in a passenger|spaceship that|flies to Axacuss City.
-"W\204hrend des Fluges schaust du dir|das axacussanische Fernsehprogramm an.|Du st\224\341t auf etwas Interessantes ...",    //During the flight, you watch the|Axacussan TV program.|You come across something interesting ...
-"Herzlich willkommen!",    //Welcome!
-"Heute zu Gast ist Alga Lorch.|Sie wird Fragen an den Erdling|Horst Hummel stellen.",    //Alga Lorch will be present today.|She will ask questions to the Earthling|Horst Hummel.
-// 595
-"Horst wird alle Fragen|beantworten, soweit es|ihm m\224glich ist.",    //Horst will answer all|questions as fully|as possible.
-"Sie haben das Wort, Frau Lorch!",    //You have the floor, Mrs Lorch!
-"Herr Hummel, hier ist meine erste Frage: ...",    //Mr. Hummel, here is my first question: ...
-"Sie sind nun ein ber\201hmter Mann auf Axacuss.|Aber sicher vermissen Sie auch Ihren Heimatplaneten.",    //You are now a famous man on Axacuss.|But surely you miss your home planet.
-"Wenn Sie w\204hlen k\224nnten, w\201rden Sie lieber|ein normales Leben auf der Erde f\201hren,|oder finden Sie das Leben hier gut?",    //If you could choose, would you prefer|to lead a normal life on Earth,|or do you find life here good?
-// 600
-"Ehrlich gesagt finde ich es sch\224n,|ber\201hmt zu sein. Das Leben ist|aufregender als auf der Erde.",    //Honestly, I think it's nice to be|famous. Life is more exciting here|than on Earth.
-"Au\341erdem sind die Leute von der|Artus GmbH hervorragende Freunde.",    //In addition, the people of|Artus GmbH are excellent friends.
-"Nun ja, planen Sie denn trotzdem,|irgendwann auf die Erde zur\201ckzukehren?",    //Well, are you still planning|to return to Earth someday?
-"Das kann ich Ihnen zum jetzigen|Zeitpunkt noch nicht genau sagen.",    //At this point in time,|I haven't made up my mind, yet.
-"Aber ich versichere Ihnen, ich|werde noch eine Weile hierbleiben.",    //But I assure you,|I will stay here for a while.
-// 605
-"Aha, mich interessiert au\341erdem,|ob es hier auf Axacuss etwas gibt,|das Sie besonders m\224gen.",    //I see. I'm also interested in|whether there's anything here on Axacuss that you particularly like.
-"Oh mir gef\204llt der ganze Planet,|aber das Beste hier sind die|hervorragenden Artus-Zahnb\201rsten!",    //Oh I like the whole planet,|but the best thing here are the|extraordinary Artus toothbrushes!
-"Zahnb\201rsten von solcher Qualit\204t|gab es auf der Erde nicht.",    //Toothbrushes of such quality|do not exist on Earth.
-"\216h, ach so.",    //Um, I see.
-"Pl\224tzlich lenkt dich eine|Lautsprecherstimme vom Fernseher ab.",    //Suddenly, a speaker's voice|distracts you from the television.
-// 610
-"\"Sehr geehrte Damen und Herren,|wir sind soeben auf dem Flughafen|von Axacuss City gelandet.\"",    //"Ladies and Gentlemen,|We just landed at the airport|at Axacuss City."
-"\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das Raumschiff! Auf Wiedersehen!\"",    //"I hope you had a nice flight.|Please leave the spaceship! Goodbye!"
-"W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.",    //While the other passengers|are disembarking, you are trying|to handle the shock.
-"\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
-"\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"", //"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
-"Sieht gef\204hrlich aus!", //Looks dangerous
-"Das Auge ist schon offen.", //This Eye is already opened
-"Es gelingt dir, zu fliehen.", //You manage to escape
-NULL
+	// 0
+	"Gehe",    //Go
+	"Schau",    //Look
+	"Nimm",    //Take
+	"\231ffne",    //Open
+	"Schlie\341e",    //Close
+	// 5
+	"Dr\201cke",    //Push
+	"Ziehe",    //Pull
+	"Benutze",    //Use
+	"Rede",    //Talk
+	"Gib",    //Give
+	// 10
+	"Gehe zu ",    //Go to 
+	"Schau ",    //Look at 
+	"Nimm ",    //Take 
+	"\231ffne ",    //Open 
+	"Schlie\341e ",    //Close 
+	// 15
+	"Dr\201cke ",    //Push 
+	"Ziehe ",    //Pull 
+	"Benutze ",    //Use 
+	"Rede mit ",    //Talk to 
+	"Gib ",    //Give 
+	// 20
+	" an ",    // to 
+	" mit ",    // with 
+	"Es ist nichts Besonderes daran.",    //There's nothing special about it.
+	"|", //Dialog separator
+	"Gespr\204ch beenden",    //End of conversation
+	// 25
+	"   F1 Hilfe",  // kStringHelpOverview1
+	"   F2 Anleitung",  // kStringHelpOverview2
+	"   F3 Programminformationen",  //kStringHelpOverview3
+	"   F4 Textgeschwindigkeit",    //kStringHelpOverview4
+	"   F5 Laden/Speichern",  // kStringHelpOverview5
+	// 30
+	"  ESC Vorspann \201berspringen",   // kStringHelpOverview6
+	"Alt X Spiel beenden",     // kStringHelpOverview7
+	"Textgeschwindigkeit:",    //Text speed:
+	"Spiel abbrechen?",    //Leave game?
+	"Ja",    //Yes
+	// 35
+	"Nein",    //No
+	"Laden",    //Load
+	"Speichern",    //Save
+	"Zur\201ck",    //Back
+	"Neustart",    //Restart
+	// 40
+	"Schreibfehler",    //write error
+	"Das tr\204gst du doch bei dir.",    //You already carry this.
+	"Du bist doch schon da.",    //You are already there.
+	"Das ist geschlossen.",    //This is closed.
+	"Das hast du doch schon.",    //You already have that.
+	// 45
+	"Das brauchst du nicht.",    //You don't need that.
+	"Das kannst du nicht nehmen.",    //You can't take that.
+	"Das l\204\341t sich nicht \224ffnen.",    //This cannot be opened.
+	"Das ist schon offen.",    //This is already opened.
+	"Das ist verschlossen.",    //This is locked.
+	// 50
+	"Das l\204\341t sich nicht schlie\341en.",    //This cannot be closed.
+	"Das ist schon geschlossen.",    //This is already closed.
+	"Behalt es lieber!",    //Better keep it!
+	"Das geht nicht.",    //You can't do that.
+	"^(C) 1994 Thomas und Steffen Dingel#",    //^(C) 1994 Thomas and Steffen Dingel#
+	// 55
+	"Story und Grafik:^ Thomas Dingel#",    //Story and Graphics:^ Thomas Dingel#
+	"Programmierung:^ Steffen Dingel#",    //Programming:^ Steffen Dingel#
+	"Musik:^ Bernd Hoffmann#",    //Music:^ Bernd Hoffmann#
+	"Getestet von ...#",    //Tested by ...#
+	"^Das war's.#",    //^That's it.#
+	// 60
+	"^Schlu\341!#",    //^Over!#
+	"^Ende!#",    //^End!#
+	"^Aus!#",    //^Done!#
+	"^Tsch\201\341!#",    //^Bye!#
+	"Oh!",    //Oh!
+	// 65
+	"Nicht schlecht!",    //Not bad!
+	"Supersound!",    //Supersound!
+	"Klasse!",    //Great!
+	"Nicht zu fassen!",    //I can't believe it!
+	"Super, ey!",    //Dope, yo!
+	// 70
+	"Fantastisch!",    //Fantastic!
+	"Umwerfend!",    //Stunning!
+	"Genial!",    //Brilliant!
+	"Spitze!",    //Awesome!
+	"Jawoll!",    //Alright!
+	// 75
+	"Hervorragend!",    //Outstanding!
+	"Ultragut!",    //Ultra-good!
+	"Megacool!",    //Mega cool!
+	"Yeah!",    //Yeah!
+	"Ein W\204chter betritt den Raum.|Du wirst verhaftet.",    //A guard enters the room.|You are getting arrested.
+	// 80
+	"Die n\204chsten paar Jahre|verbringst du im Knast.",    //You will spend the next|few years in jail.
+	"Es wird Alarm ausgel\224st.",    //The alarm is about to be set off.
+	"Du h\224rst Schritte.",    //You are hearing footsteps.
+	"Um das Schloss zu \224ffnen,|brauchst du einige Zeit.",    //You will take some time,|to pick that lock.
+	"Du ger\204tst in Panik|und ziehst die Keycard|aus der T\201r.",    //You are panicking|and remove the keycard|from the door.
+	// 85
+	"Du hast deinen Auftrag|noch nicht ausgef\201hrt.",    //You have not completed|your task yet.
+	"Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du dich, zu fliehen.",    //Although you haven't|disabled the alarm yet,|you decide to escape.
+	"Du entledigst dich der Einbruchswerkzeuge|und nimmst ein Taxi zum Kulturpalast.",    //You get rid of your burglar tools|and take a cab to the Palace of Culture.
+	"Diese T\201r brauchst|du nicht zu \224ffnen.",    //You don't need|to open this door.
+	"Uff, es hat geklappt!",    //Phew, it worked!
+	// 90
+	"Zur\201ck im Quartier der Gangster ...",    //Back in the gangsters' hideout ...
+	"Das lief ja wie am Schn\201rchen!",    //Everything went like clockwork!
+	"Hier, dein Anteil von 30000 Xa.",    //Here, your share of 30000 Xa.
+	"Wo ist denn der Saurierkopf?",    //Where's the dinosaur skull?
+	"Dazu hatte ich keine Zeit mehr.",    //I didn't have enough time for that.
+	// 95
+	"Was? Du spinnst wohl!|Dann kriegst du auch deinen|Anteil nicht. Raus!",    //What? You're nuts!|Then you won't get your|share. Beat it!
+	"Der Sauger ist schon dort.",    //The suction cup is already there.
+	"Du heftest den Sauger an die Wand|und h\204lst dich daran fest.",    //You attach the suction cup to the wall|and hold on to it.
+	"Du stellst dich auf den|Boden nimmst den Sauger|wieder von der Wand",    //You stand on the floor|then remove the suction cup from the wall
+	"Die Alarmanlage ist|schon ausgeschaltet.",    //The alarm system is|already switched off.
+	// 100
+	"Um die Anlage abzuschalten,|brauchst du einige Zeit.",    //To turn off the system,|you need some time.
+	"Die Alarmanlage ist jetzt ausgeschaltet.",    //The alarm system is now switched off.
+	"Saurier",    //Dinosaur
+	"Du hast jetzt besseres zu tun,|als das Ding anzuschauen.",    //You have better things to do now|than look at that thing.
+	"Eingang",    //Entrance
+	// 105
+	"T\201r",    //Door
+	"Strasse zum Stadtzentrum",    //Road to the city center
+	"Kamera",    //Security camera
+	"Hoffentlich bemerkt dich niemand.",    //Hopefully nobody will notice you.
+	"Haupteingang",    //Main entrance
+	// 110
+	"Gang",    //Corridor
+	"Ziemlich gro\341.",    //Quite large.
+	"Saurierkopf",    //Dinosaur head
+	"Dies ist der Kopf,|den du suchst.",    //This is the head|you're looking for.
+	"Alarmanlage",    //Alarm system
+	// 115
+	"Sauger",    //Suction cup
+	"Wand",    //Wall
+	"Loch",    //Opening
+	"Buchstabe",    //Letter
+	"Sie ist sehr massiv.",    //It is very massive.
+	// 120
+	"Hmm, X und Y, irgendwo|habe ich die Buchstaben|schon gesehen.",    //Hmm, X and Y|I have seen these letters|somewhere before.
+	"Deine Zeit ist um, Fremder!",    //Your Time is up, Stranger!
+	"Du hast das Seil|doch schon festgebunden.",    //You already tied the rope.
+	"Das w\201rde wenig bringen.",    //That would have little effect.
+	"Sonnenstich, oder was?",    //Sunstroke, or what?
+	// 125
+	"Du merkst, da\341 der Boden|unter dir nachgibt, und|springst zur Seite.",    //You notice that the ground|is giving way under you,|and you leap aside.
+	"Puzzleteil",    //Puzzle piece
+	"Neben diesem Stein|ist kein freies Feld.",    //There's no free square|next to this stone.
+	"Du spielst gerade ein|Adventure, kein Rollenspiel!",    //You are currently playing an|Adventure, not a Role-Playing Game!
+	"Du kannst das Seil|nirgends befestigen.",    //There's nowhere|to attach the rope.
+	// 130
+	"Es pa\341t nicht|zwischen die Steine.",    //It does not fit|between the stones.
+	"Das ist doch|oben festgebunden!",    //That is already|tied up above!
+	"Hey, das ist|mindestens 10 Meter tief!",    //Hey, that is|at least 10 meters deep!
+	"In dem Schlitz|ist nichts mehr.",    //There is nothing|left in the slot.
+	"Das ist mindestens 5 Meter tief!",    //That is at least 5 meters deep!
+	// 135
+	"Du versuchst, den Sarg zu|\224ffnen, aber der Deckel bewegt|sich keinen Millimeter.",    //You try to open the coffin,|but the lid does not|move a millimeter.
+	"Du hast die Kugel schon gedr\201ckt.",    //You have already|pushed the ball.
+	"Die Kugel bewegt sich ein St\201ck.",    //The ball moves a bit.
+	"Herzlichen Gl\201ckwunsch!",    //Congratulations!
+	"Sie haben das Spiel gel\224st|und gewinnen 400 Xa!",    //You solved the game|and won 400 Xa!
+	// 140
+	"Vielen Dank f\201r die Benutzung eines|VIRTUAL-REALITY-SYSTEMS-Produkts!",    //Thank you for using a|VIRTUAL-REALITY-SYSTEMS product!
+	"N",    //N
+	"O",    //E
+	"S",    //S
+	"W",    //W
+	// 145
+	"Seil",    //Rope
+	"Schild",    //Sign
+	"Darauf steht:|\"Willst du finden das|richtige Loch, so wage|dich in die Pyramide!\".",    //It reads:|"Want to find|the right hole? Then dare|to enter the pyramid!".
+	"Es ist eine kleine \231ffnung.",    //It is a small opening.
+	"Pyramide",    //Pyramid
+	// 150
+	"Komisch! Was soll eine Pyramide|bei den Axacussanern? Deine|eigenen Gedanken scheinen|den Spielverlauf zu beeinflussen.",    //Weird! What is a pyramid doing|at the Axacussians? Your own thoughts seem to influence|the course of the game.
+	"Sonne",    //Sun
+	"Sch\224n!",    //Nice!
+	"\"Hallo Fremder, wenn du diesen|Raum betreten hast, bleibt|dir nur noch eine Stunde Zeit,|um deine Aufgabe zu erf\201llen!\"",    //"Hello, Stranger, when you enter|this room, you have only an hour|to accomplish your task!"
+	"rechte Seite",    //right side
+	// 155
+	"linke Seite",    //left side
+	"Knopf",    //Button
+	"Schrift",    //Inscription
+	"Tomate",    //Tomato
+	"Komisch!",    //Funny!
+	// 160
+	"Messer",    //Knife
+	"Es ist ein relativ stabiles Messer.",    //It is a relatively sturdy knife.
+	"Monster",    //Monster
+	"Es ist dick und|ungef\204hr 15 Meter lang.",    //It is thick and|about 15 meters long.
+	"Augen",    //Eyes
+	// 165
+	"Mund",    //Mouth
+	"Es ist nur eine Statue.",    //It's just a statue.
+	"Zettel",    //Note
+	"Darauf steht:|\"Wenn du fast am Ziel|bist, tu folgendes:|Sauf!\"",    //It reads:|"When you're almost there,|do the following:|Drink!"
+	"Es ist ca. 10 Meter tief.",    //It is about 10 meters deep.
+	// 170
+	"Oben siehst du helles Licht.",    //Above you is a bright light.
+	"Darauf steht:|\"Ruhe eine Minute im Raum|zwischen den Monstern,|und du wirst belohnt!\"",    //It reads:|"Rest a minute in the room|between the monsters,|and you'll be rewarded!"
+	"Schlitz",    //Slot
+	"Du kommst mit den|H\204nden nicht rein.",    //You cannot get in|with your hands.
+	"Es ist ca. 5 Meter tief.",    //It is about 5 meters deep.
+	// 175
+	"Steine",    //Stones
+	"Platte",    //Plate
+	"Sarg",    //Coffin
+	"Ausgang",    //Exit
+	"Unheimlich!",    //Creepy!
+	// 180
+	"Zahnb\201rste",    //Toothbrush
+	"Die Sache mit der|Artus GmbH scheint dir zu|Kopf gestiegen zu sein.",    //The thing with the|Artus GmbH seems to have|gotten to your head.
+	"Zahnpastatube",    //Toothpaste
+	"Kugel",    //Ball
+	"Hmm, die Kugel sieht lose aus.",    //Hmm, the ball looks loose.
+	// 185
+	"Auge",    //Eye
+	"Irgendwas stimmt damit nicht.",    //Something is wrong with that.
+	"Sieht nach Metall aus.",    //It looks like metal.
+	"Ein Taxi kommt angerauscht,|du steigst ein.",    //A taxi arrives, and you get in.
+	"Du dr\201ckst auf den Knopf, aber nichts passiert",    //You press the button, but nothing happens
+	// 190
+	"Es ist leer.",    //It is empty.
+	"Du findest ein kleines Ger\204t,|einen Ausweis und einen Xa.",    //You find a small device,|an ID card and a Xa.
+	"Du heftest den|Magnet an die Stange.",    //You attach the|magnet to the pole.
+	"Stange mit Magnet",    //Pole with magnet
+	"Raffiniert!",    //Cunning!
+	// 195
+	"Du mu\341t das|Ger\204t erst kaufen.",    //You must buy|this device first.
+	"Du legst den Chip|in das Ger\204t ein.",    //You insert the chip|into the device.
+	"Du \201berspielst die CD|auf den Musikchip.",    //You transfer the CD|to the Music chip.
+	"Ohne einen eingelegten|Musikchip kannst du auf dem|Ger\204t nichts aufnehmen.",    //Without an inserted|music chip, you can not|record on the device.
+	"Du nimmst den Chip|aus dem Ger\204t.",    //You remove the chip|from the device.
+	// 200
+	"Es ist kein Chip eingelegt.",    //There is no chip inserted.
+	"Wozu? Du hast sowieso nur die eine CD.",    //What for? You only have one CD anyway.
+	"Die \"Mad Monkeys\"-CD. Du hast|sie schon tausendmal geh\224rt.",    //The "Mad Monkeys" CD.|You've heard them a thousand times.
+	"Du h\224rst nichts.|Der Chip ist unbespielt.",    //All you hear is silence.|The chip is empty.
+	"Du h\224rst dir den Anfang|der \201berspielten CD an.",    //You are listening to the beginning|of the copied CD.
+	// 205
+	"Es ist kein Chip einglegt.",    //There is no chip inserted.
+	"Du trinkst etwas von den Zeug, danach|f\201hlst du dich leicht beschwipst.",    //You drink some of the stuff,|then begin to feel slightly tipsy.
+	"%d Xa",    //%d Xa
+	"Als du ebenfalls aussteigst haben|die anderen Passagiere das|Fluggel\204nde bereits verlassen.",    //When you get off the plane|the other passengers|have already left the airport.
+	"Flughafen",    //Airport
+	// 210
+	"Stadtzentrum",    //Downtown
+	"Kulturpalast",    //Palace of Culture
+	"Erde",    //Earth
+	"Privatwohnung",    //Private apartment
+	"(Taxi verlassen)",    //(Leave the taxi)
+	// 215
+	"(Bezahlen)",    //(Pay)
+	"Adresse:|                              ",    //Address:|                              
+	"Fuddeln gilt nicht!|Zu diesem Zeitpunkt kannst du diese|Adresse noch gar nicht kennen!",    //Fiddling with the system doesn't work!|At this time you can not|even know this address!
+	"Du hast nicht|mehr genug Geld.",    //You do not|have enough money left.
+	"Du merkst, da\341 das Taxi stark beschleunigt.",    //You notice the taxi is accelerating rapidly.
+	// 220
+	"F\201nf Minuten sp\204ter ...",    //Five minutes later ...
+	"Du hast doch schon eine Stange",    //You already have a pole
+	"Du s\204gst eine der Stangen ab.",    //You saw off one of the poles.
+	"Du betrittst das einzige|offene Gesch\204ft, das|du finden kannst.",    //You enter the only|open shop that|you can find.
+	"Die Kabine ist besetzt.",    //The cabin is occupied.
+	// 225
+	"He, nimm erstmal das Geld|aus dem R\201ckgabeschlitz!",    //Hey, take the money|from the return slot!
+	"Du hast doch schon bezahlt.",    //You have already paid.
+	"Du hast nicht mehr genug Geld.",    //You do not have enough money left.
+	"Du wirfst 10 Xa in den Schlitz.",    //You put 10 Xa in the slot.
+	"Dir wird schwarz vor Augen.",    //You are about to pass out.
+	// 230
+	"Du ruhst dich eine Weile aus.",    //You rest for a while.
+	"An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ...\"",    //On the Wall is:|"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
+	"Ok, ich nehme es.",    //OK, I'll take it.
+	"Nein danke, das ist mir zu teuer.",    //No thanks, that's too expensive for me.
+	"Ich w\201rde gern etwas kaufen.",    //I would like to buy something.
+	// 235
+	"Ich bin's, Horst Hummel.",    //It's me, Horst Hummel.
+	"Haben Sie auch einen Musikchip f\201r das Ger\204t?",    //Do you have a music chip for the device?
+	"Eine tolle Maske, nicht wahr?",    //It's a great mask, right?
+	"Komisch, da\341 sie schon drei Jahre da steht.",    //Strange that it has been there for three years.
+	"Ein starker Trunk. Zieht ganz sch\224n rein.",    //A strong drink. It hits you pretty hard.
+	// 240
+	"Ein Abspiel- und Aufnahmeger\204t f\201r die neuen Musikchips.",    //A playback and recording device for the new music chips.
+	"Eine ARTUS-Zahnb\201rste. Der letzte Schrei.",    //An ARTUS toothbrush. The latest craze.
+	"Verkaufe ich massenhaft, die Dinger.",    //I sell these things in bulk.
+	"Das sind echte Rarit\204ten. B\201cher in gebundener Form.",    //These are real rarities. Books in bound form.
+	"Die Encyclopedia Axacussana.",    //The Encyclopedia Axacussana.
+	// 245
+	"Das gr\224\341te erh\204ltliche Lexikon auf 30 Speicherchips.",    //The largest available dictionary on 30 memory chips.
+	"\232ber 400 Trilliarden Stichw\224rter.",    //Over 400 sextillion keywords.
+	"Die ist nicht zu verkaufen.",    //It is not for sale.
+	"So eine habe ich meinem Enkel zum Geburtstag geschenkt.",    //I gave one to my grandson for his birthday.
+	"Er war begeistert von dem Ding.",    //He was excited about this thing.
+	// 250
+	"Der stammt aus einem bekannten Computerspiel.",    //It comes from a well-known computer game.
+	"Robust, handlich und stromsparend.",    //Sturdy, handy and energy-saving.
+	"Irgendein lasches Ges\224ff.",    //Some cheap swill.
+	"Das sind Protestaufkleber gegen die hohen Taxigeb\201hren.",    //These are stickers protesting the high taxi fees.
+	"Das ist Geschirr aus der neuen Umbina-Kollektion.",    //These are dishes from the new Umbina-Collection.
+	// 255
+	"H\204\341lich, nicht wahr?",    //Ugly, right?
+	"Aber verkaufen tut sich das Zeug gut.",    //But this stuff sells well.
+	"Das kostet %d Xa.",    //That costs %d Xa.
+	"Schauen Sie sich ruhig um!",    //Take a look around!
+	"Unsinn!",    //Nonsense!
+	// 260
+	"Tut mir leid, die sind|schon alle ausverkauft.",    //I'm very sorry,|they are already sold out.
+	"Guten Abend.",    //Good evening.
+	"Hallo.",    //Hello.
+	"Huch, Sie haben mich aber erschreckt!",    //Yikes, you scared me!
+	"Wieso?",    //How so?
+	// 265
+	"Ihre Verkleidung ist wirklich t\204uschend echt.",    //Your disguise is deceptively real-looking.
+	"Welche Verkleidung?",    //What disguise?
+	"Na, tun Sie nicht so!",    //Stop pretending you don't know!
+	"Sie haben sich verkleidet wie der Au\341erirdische,|dieser Horst Hummel, oder wie er hei\341t.",    //You disguised yourself as that extraterrestrial guy,|Horst Hummel, or whatever his name is.
+	"Ich BIN Horst Hummel!",    //I AM Horst Hummel!
+	// 270
+	"Geben Sie's auf!",    //Give it up!
+	"An Ihrer Gestik merkt man, da\341 Sie|ein verkleideter Axacussaner sind.",    //You can tell from your gestures that you are|a disguised Axacussan.
+	"Der echte Hummel bewegt sich|anders, irgendwie ruckartig.",    //The real Hummel moves|differently, kind of jerky.
+	"Weil er ein Roboter ist! ICH bin der Echte!",    //Because he is a robot! I am the real one!
+	"Ach, Sie spinnen ja!",    //Oh, you are crazy!
+	// 275
+	"Sie Trottel!!!",    //You Idiot!!!
+	"Seien Sie still, oder ich werfe Sie raus!",    //Shut up or I'll kick you out!
+	"Taschenmesser",    //Pocket knife
+	"Hey, da ist sogar eine S\204ge dran.",    //Hey, there's even a saw on it.
+	"20 Xa",    //20 Xa
+	// 280
+	"Discman",    //Discman
+	"Da ist noch die \"Mad Monkeys\"-CD drin.",    //The "Mad Monkeys" CD is still in there.
+	"Mit dem Ding sollst du dich|an der Wand festhalten.",    //You should hold onto the wall|using that thing.
+	"Spezialkeycard",    //Special keycard
+	"Damit sollst du die|T\201ren knacken k\224nnen.",    //With that you should be able to crack the doors.
+	// 285
+	"Alarmknacker",    //Alarm cracker
+	"Ein kleines Ger\204t, um|die Alarmanlage auszuschalten.",    //A small device|to turn off the alarm.
+	"Karte",    //Keycard
+	"Raumschiff",    //Spaceship
+	"Damit bist du hierhergekommen.",    //You came here with it.
+	// 290
+	"Fahrzeuge",    //Vehicles
+	"Du kannst von hier aus nicht erkennen,|was das f\201r Fahrzeuge sind.",    //You cannot tell from here|what those vehicles are.
+	"Fahrzeug",    //Vehicle
+	"Es scheint ein Taxi zu sein.",    //It seems to be a taxi.
+	"Komisch, er ist verschlossen.",    //Funny, it is closed.
+	// 295
+	"Portemonnaie",    //Wallet
+	"Das mu\341 ein Axacussaner|hier verloren haben.",    //This must have been|lost by an Axacussan.
+	"Ger\204t",    //Device
+	"Auf dem Ger\204t steht: \"Taxi-Call\".|Es ist ein kleiner Knopf daran.",    //The device says "Taxi Call."|There is a small button on it.
+	"Ausweis",    //ID card
+	// 300
+	"Auf dem Ausweis steht:|  Berta Tschell|  Axacuss City|  115AY2,96A,32",    //On the card it reads: | Berta Tschell | Axacuss City | 115AY2,96A,32
+	"Treppe",    //Staircase
+	"Sie f\201hrt zu den Gesch\204ften.",    //It leads to the shops.
+	"Gesch\204ftsstra\341e im Hintergrund",    //Business street in the background
+	"Die Stra\341e scheint kein Ende zu haben.",    //The road seems to have no end.
+	// 305
+	"Stange",    //Rod
+	"Pfosten",    //Post
+	"Gel\204nder",    //Railing
+	"Plakat",    //Poster
+	"Musik Pur - Der Musikwettbewerb!|Heute im Kulturpalast|Hauptpreis:|Fernsehauftritt mit Horst Hummel|Sponsored by Artus GmbH",    //Pure Music - The Music Competition!|Today at the Palace of Culture|Main Prize:|Television appearance with Horst Hummel|Sponsored by Artus GmbH
+	// 310
+	"Kabine",    //Cabin
+	"Sie ist frei!",    //It is free!
+	"Sie ist besetzt.",    //It is occupied.
+	"F\201\341e",    //Feet
+	"Komisch, die|F\201\341e scheinen|erstarrt zu sein.",    //Strange, the|feet seem to be frozen.
+	// 315
+	"Haube",    //Hood
+	"Sieht aus wie beim Fris\224r.",    //Looks like the hairdresser.
+	"400 Xa",    //400 Xa
+	"10 Xa",    //10 Xa
+	"Dar\201ber steht:|\"Geldeinwurf: 10 Xa\".",    //It says:|"Coins: 10 Xa".
+	// 320
+	"Dar\201ber steht:|\"Gewinnausgabe / Geldr\201ckgabe\".",    //It says:|"Prize / Money Return".
+	"Stuhl",    //Chair
+	"Etwas Entspannung k\224nntest du jetzt gebrauchen.",    //You could use some relaxation right about now.
+	"Gekritzel",    //Scribble
+	"Gesicht",    //Face
+	// 325
+	"Nicht zu fassen! Die|W\204nde sind genauso beschmutzt|wie auf der Erde.",    //Unbelievable! The walls|are just as dirty|as those on Earth.
+	"B\201cher",    //Books
+	"Lexikon",    //Dictionary
+	"Pflanze",    //Plant
+	"Maske",    //Mask
+	// 330
+	"Schlange",    //Snake
+	"Becher",    //Cup
+	"Joystick",    //Joystick
+	"Eine normale Zahnb\201rste,|es steht nur \"Artus\" darauf.",    //An ordinary toothbrush.|It says "Artus" on it.
+	"Musikger\204t",    //Music device
+	// 335
+	"Ein Ger\204t zum Abspielen und|Aufnehmen von Musikchips.|Es ist ein Mikrofon daran.",    //A device for playing and recording music chips.|There is a microphone on it.
+	"Flasche",    //Bottle
+	"Auf dem Etikett steht:|\"Enth\204lt 10% Hyperalkohol\".",    //The label says: "Contains 10% hyperalcohol".
+	"Kiste",    //Box
+	"Verk\204ufer",    //Seller
+	// 340
+	"Was? Daf\201r wollen Sie die Karte haben?",    //What? Do you want the card for that?
+	"Sie sind wohl nicht ganz \201ber|die aktuellen Preise informiert!",    //You are probably not completely|informed about the current prices!
+	"Ich bin's, Horst Hummel!",    //It's me, Horst Hummel!
+	"Sch\224nes Wetter heute!",    //Nice weather today!
+	"K\224nnen Sie mir sagen, von wem ich eine Eintrittskarte f\201r den Musikwettbewerb kriegen kann?",    //Can you tell me who can get me a ticket for the music contest?
+	// 345
+	"Ok, hier haben Sie den Xa.",    //OK, here is the Xa.
+	"Ich biete Ihnen 500 Xa.",    //I offer you 500 Xa.
+	"Ich biete Ihnen 1000 Xa.",    //I offer you 1000 Xa.
+	"Ich biete Ihnen 5000 Xa.",    //I offer you 5000 Xa.
+	"Ich biete Ihnen 10000 Xa.",    //I offer you 10000 Xa.
+	// 350
+	"Vielen Dank f\201r Ihren Kauf!",    //Thank you for your purchase!
+	"Was bieten Sie mir|denn nun f\201r die Karte?",    //What will you offer me|for the card?
+	"Hallo, Sie!",    //Hello to you!
+	"Was wollen Sie?",    //What do you want?
+	"Wer sind Sie?",    //Who are you?
+	// 355
+	"Horst Hummel!",    //Horst Hummel!
+	"Kenne ich nicht.",    //Never heard of him.
+	"Was, Sie kennen den ber\201hmten Horst Hummel nicht?",    //What, you don't know the famous Horst Hummel?
+	"Ich bin doch der, der immer im Fernsehen zu sehen ist.",    //I'm the guy who is always on TV.
+	"Ich kenne Sie wirklich nicht.",    //I really do not know you.
+	// 360
+	"Komisch.",    //Funny.
+	"Aha.",    //Aha.
+	"Ja, kann ich.",    //Yes, I can.
+	"Von wem denn?",    //From whom?
+	"Diese Information kostet einen Xa.",    //This information costs a Xa.
+	// 365
+	"Wie Sie meinen.",    //As you say.
+	"Sie k\224nnen die Karte von MIR bekommen!",    //You can get the card from ME!
+	"Aber nur eine Teilnahmekarte,|keine Eintrittskarte.",    //But only a participation ticket,|not an entrance ticket.
+	"Was wollen Sie daf\201r haben?",    //What do you want for it?
+	"Machen Sie ein Angebot!",    //Make an offer!
+	// 370
+	"Das ist ein gutes Angebot!",    //That's a good offer!
+	"Daf\201r gebe ich Ihnen meine|letzte Teilnahmekarte!",    //For that I give you my|last participation card!
+	"(Dieser Trottel!)",    //(That Idiot!)
+	"Ich w\201rde gern beim Musikwettbewerb zuschauen.",    //I would like to watch the music competition.
+	"Ich w\201rde gern am Musikwettbewerb teilnehmen.",    //I would like to participate in the music competition.
+	// 375
+	"Wieviel Uhr haben wir?",    //What time is it?
+	"Ja.",    //Yes.
+	"Nein.",    //No.
+	"Hallo, Leute!",    //Hi guys!
+	"Hi, Fans!",    //Hi, fans!
+	// 380
+	"Gute Nacht!",    //Good night!
+	"\216h, wie geht es euch?",    //Uh, how are you?
+	"Sch\224nes Wetter heute.",    //Nice weather today.
+	"Hmm ...",    //Hmm ...
+	"Tja ...",    //Well ...
+	// 385
+	"Also ...",    //So ...
+	"Ok, los gehts!",    //OK let's go!
+	"Ich klimper mal was auf dem Keyboard hier.",    //I'll fix something on the keyboard here.
+	"Halt, sie sind doch schon drangewesen!",    //Stop, you have already been on it!
+	"He, Sie! Haben Sie|eine Eintrittskarte?",    //Hey, you! Do you have|a ticket?
+	// 390
+	"Ja nat\201rlich, hier ist meine Teilnahmekarte.",    //Yes of course, here is my participation ticket.
+	"Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten k\224nnen.",    //You are a participant!|Please ask at the checkout|when you can go on stage.
+	"\216h, nein.",    //Uh, no.
+	"He, wo ist Ihr Musikchip?",    //Hey, where's your music chip?
+	"Laber nicht!",    //Stop talking!
+	// 395
+	"Fang an!",    //Get started!
+	"Einen Moment, ich mu\341 erstmal \201berlegen, was ich|euch spiele.",    //One moment, I have to think about what I'm playing for you.
+	"Anfangen!!!",    //Begin!!!
+	"Nun denn ...",    //Well then ...
+	"Raus!",    //Out!
+	// 400
+	"Buh!",    //Boo!
+	"Aufh\224ren!",    //Stop!
+	"Hilfe!",    //Help!
+	"Ich verziehe mich lieber.",    //I'd prefer to get lost.
+	"Mist, auf dem Chip war|gar keine Musik drauf.",    //Damn, there was no music on the chip at all.
+	// 405
+	"Das ging ja voll daneben!",    //That went completely wrong!
+	"Du n\204herst dich der B\201hne,|aber dir wird mulmig zumute.",    //You approach the stage,|but you feel queasy.
+	"Du traust dich nicht, vor|so vielen Menschen aufzutreten|und kehrst wieder um.",    //You do not dare to appear|in front of so many people|and turn around.
+	"Oh, Sie sind Teilnehmer!|Dann sind Sie aber sp\204t dran.",    //Oh, you are a participant!|But you are late.
+	"Spielen Sie die Musik live?",    //Do you play the music live?
+	// 410
+	"Dann geben Sie bitte Ihren Musikchip ab!|Er wird bei Ihrem Auftritt abgespielt.",    //Then please submit your music chip!|It will be played during your performance.
+	"Oh, Sie sind sofort an der Reihe!|Beeilen Sie sich! Der B\201hneneingang|ist hinter dem Haupteingang rechts.",    //Oh, it's your turn!|Hurry! The stage entrance|is to the right behind the main entrance.
+	"Habe ich noch einen zweiten Versuch?",    //Can I have another try?
+	"Nein!",    //No!
+	"Haben Sie schon eine Eintrittskarte?",    //Do you already have a ticket?
+	// 415
+	"Tut mir leid, die Karten|sind schon alle ausverkauft.",    //I'm sorry, the tickets|are already sold out.
+	"Mist!",    //Crap!
+	"Haben Sie schon eine Teilnahmekarte?",    //Do you already have a participation ticket?
+	"Ja, hier ist sie.",    //Yes, here it is.
+	"Tut mir leid, die Teilnahmekarten|sind schon alle ausverkauft.",    //I'm sorry, the participation tickets|are already sold out.
+	// 420
+	"Schei\341e!",    //Crap!
+	"Das kann ich Ihnen|leider nicht sagen.",    //I can not tell you that.
+	"Wo ist denn nun Ihr Musikchip?",    //Where is your music chip?
+	"Jetzt beeilen Sie sich doch!",    //Now hurry up!
+	"Huch, Sie sind hier bei einem Musik-,|nicht bei einem Imitationswettbewerb",    //Huh, you're here at a music contest,|not at an imitation contest
+	// 425
+	"Imitationswettbewerb?|Ich will niemanden imitieren.",    //Imitation contest?|I do not want to imitate anyone.
+	"Guter Witz, wieso sehen Sie|dann aus wie Horst Hummel?",    //Good joke. Then why do you look like Horst Hummel?
+	"Na, nun h\224ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht.",    //Oh come on! Your disguise isn't that perfect.
+	"Ich werde Ihnen beweisen, da\341 ich Horst Hummel bin,|indem ich diesen Wettbewerb hier gewinne.",    //I will prove to you that I am Horst Hummel|by winning this competition.
+	"Dann kann ich in dieser verdammten Fernsehshow|auftreten.",    //Then I can perform in this|damn TV show.
+	// 430
+	"Du hampelst ein bi\341chen zu|der Musik vom Chip herum.|Die Leute sind begeistert!",    //You're rocking a little bit|to the music from the chip.|The audience is excited!
+	"Guten Abend. Diesmal haben wir|einen besonderen Gast bei uns.",    //Good evening. This time we have|a special guest with us.
+	"Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort vor allem durch seine|Verkleidung aufgefallen war.",    //He is the winner of yesterday's music competition in the Palace of Culture.|He was particularly noteworthy|because of his disguise.
+	"Sie haben das Wort!",    //You have the floor!
+	"Nun ja, meine erste Frage lautet: ...",    //Well, my first question is ...
+	// 435
+	"Warum haben Sie sich sofort nach|Ihrer Landung entschlossen, f\201r|die Artus-GmbH zu arbeiten?",    //Why did you decide immediately|after your arrival to work for|Artus GmbH?
+	"Es war meine freie Entscheidung.|Die Artus-GmbH hat mir einfach gefallen.",    //It was a decision I made on my own.|I just decided I liked Artus-GmbH.
+	"Wieso betonen Sie, da\341 es|Ihre freie Entscheidung war?|Haben Sie Angst, da\341 man Ihnen|nicht glaubt?",    //Why do you stress that|it was your own decision?|Are you afraid that nobody will believe you otherwise?
+	"Also, ich mu\341 doch sehr bitten!|Was soll diese unsinnige Frage?",    //How dare you!|What is with this nonsensical question?
+	"Ich finde die Frage wichtig.|Nun, Herr Hummel, was haben|Sie dazu zu sagen?",    //I think the question is important.|Well, Mr. Hummel, what do you have to say?
+	// 440
+	"Auf solch eine Frage brauche|ich nicht zu antworten!",    //I don't feel that I have|to answer such a question!
+	"Gut, dann etwas anderes ...",    //Alright, something else then ...
+	"Sie sind von Beruf Koch.|Wie hie\341 das Restaurant,|in dem Sie auf der Erde|gearbeitet haben?",    //You are a chef by profession.|What was the name of the restaurant|where you worked|on Earth?
+	"Hmm, da\341 wei\341 ich nicht mehr.",    //Hmm, I do not remember that.
+	"Sie wollen mir doch nicht weismachen,|da\341 Sie den Namen vergessen haben!",    //Do you really expect me to believe you cannot remember the name?
+	// 445
+	"Schlie\341lich haben Sie|zehn Jahre dort gearbeitet!",    //After all, you worked there for ten years!
+	"Woher wollen Sie das wissen?",    //How do you know that?
+	"Nun, ich komme von der Erde,|im Gegensatz zu Ihnen!",    //Well, I come from Earth,|unlike you!
+	"Langsam gehen Sie zu weit!",    //Now you've gone too far!
+	"Sie sind ein Roboter!|Das merkt man schon an|Ihrer dummen Antwort!|Sie sind nicht optimal|programmiert!",    //You are a robot!|It is obvious from|your stupid answer!|You are not even programmed|correctly!
+	// 450
+	"Wenn Sie jetzt nicht mit Ihren|Beleidigungen aufh\224ren, mu\341 ich|Ihnen das Mikrofon abschalten!",    //If you do not stop right now|with your insults, I will have|to turn off the microphone!
+	"Ich bin der echte Horst Hummel,|und hier ist der Beweis!",    //I am the real Horst Hummel,|and here is the proof!
+	"Am n\204chsten Morgen sind alle|Zeitungen voll mit deiner spektakul\204ren|Enth\201llung des Schwindels.",    //The next morning, all the papers|are full of your spectacular|revelation of fraud.
+	"Die Manager der Artus-GmbH und Commander|Sumoti wurden sofort verhaftet.",    //The managers of Artus-GmbH and Commander|Sumoti were arrested immediately.
+	"Nach dem Stre\341 der letzten Tage,|entscheidest du dich, auf die|Erde zur\201ckzukehren.",    //After these stressful last few days|you decide to return to Earth.
+	// 455
+	"W\204hrend du dich vor Interviews|kaum noch retten kannst, ...",    //While you can barely save|yourself from interviews, ...
+	"... arbeiten die Axacussanischen|Techniker an einem Raumschiff,|das dich zur Erde zur\201ckbringen soll.",    //... the Axacussan|technicians are working on a spaceship|to bring you back to Earth.
+	"Eine Woche sp\204ter ist der|Tag des Starts gekommen.",    //One week later, the day of the launch has arrived.
+	"Zum dritten Mal in deinem|Leben verbringst du eine lange|Zeit im Tiefschlaf.",    //For the third time in your life,|you spend a long time|in deep sleep.
+	"Zehn Jahre sp\204ter ...",    //Ten years later ...
+	// 460
+	"Du wachst auf und beginnst,|dich schwach an deine|Erlebnisse zu erinnern.",    //You wake up and begin|to faintly remember|your experiences.
+	"Um dich herum ist alles dunkel.",    //Everything is dark around you.
+	"Sie zeigt %d an.",    //It displays %d.
+	"Ich interessiere mich f\201r den Job, bei dem man \201ber Nacht",    //I'm interested in the job where you can get
+	"reich werden kann.",    //rich overnight.
+	// 465
+	"Ich verkaufe frische Tomaten.",    //I sell fresh tomatoes.
+	"Ich bin der Klempner. Ich soll hier ein Rohr reparieren.",    //I am the plumber. I'm supposed to fix a pipe here.
+	"Ja, h\224rt sich gut an.",    //Yes, it sounds good.
+	"Krumme Gesch\204fte? F\201r wen halten Sie mich? Auf Wiedersehen!",    //Crooked business? Who do you think I am? Goodbye!
+	"\216h - k\224nnten Sie mir das Ganze nochmal erkl\204ren?",    //Uh - could you explain that to me again?
+	// 470
+	"Wie gro\341 ist mein Anteil?",    //How big is my share?
+	"Machen Sie es immer so, da\341 Sie Ihre Komplizen \201ber ein Graffitti anwerben?",    //Do you always use graffiti to recruit your accomplices?
+	"Hmm, Moment mal, ich frage den Boss.",    //Hmm wait, I will ask the boss.
+	"Kurze Zeit sp\204ter ...",    //A short while later ...
+	"Ok, der Boss will dich sprechen.",    //OK, the boss wants to talk to you.
+	// 475
+	"Du betrittst die Wohnung und|wirst zu einem Tisch gef\201hrt.",    //You enter the apartment and are led to a table.
+	"Hmm, du willst dir also|etwas Geld verdienen?",    //Hmm, so you want to earn some money?
+	"Nun ja, wir planen|einen n\204chtlichen Besuch|eines bekannten Museums.",    //Well, we're planning|a nightly visit|to a well-known museum.
+	"Wie sieht's aus, bist du interessiert?",    //So, are you interested?
+	"Halt, warte!",    //Stop, wait!
+	// 480
+	"\232berleg's dir, es springen|30000 Xa f\201r dich raus!",    //Think about it, your share would be|30000 Xa!
+	"30000?! Ok, ich mache mit.",    //30000?! Alright, count me in.
+	"Gut, dann zu den Einzelheiten.",    //Good, now then to the details.
+	"Bei dem Museum handelt es|sich um das Orzeng-Museum.",    //The museum in question is|the Orzeng Museum.
+	"Es enth\204lt die wertvollsten|Dinosaurierfunde von ganz Axacuss.",    //It contains the most valuable|dinosaur discoveries of Axacuss.
+	// 485
+	"Wir haben es auf das Sodo-Skelett|abgesehen. Es ist weltber\201hmt.",    //We're aiming to get the Sodo skeleton.|It is world-famous.
+	"Alle bekannten Pal\204ontologen haben|sich schon damit besch\204ftigt.",    //All known paleontologists|have already dealt with it.
+	"Der Grund daf\201r ist, da\341 es allen|bis jetzt bekannten Erkenntnissen|\232ber die Evolution widerspricht.",    //The reason for this is that it contradicts all known|knowledge about evolution.
+	"Irgendein verr\201ckter Forscher|bietet uns 200.000 Xa,|wenn wir ihm das Ding beschaffen.",    //Some crazy researcher|will give us 200,000 Xa|if we retrieve that thing for him.
+	"So, jetzt zu deiner Aufgabe:",    //So, now to your task:
+	// 490
+	"Du dringst durch den Nebeneingang|in das Geb\204ude ein.",    //You enter the building through|the side entrance.
+	"Dort schaltest du die Alarmanlage aus,|durch die das Sodo-Skelett gesichert wird.",    //There you switch off the alarm system,|which secures the Sodo skeleton.
+	"Wir betreten einen anderen Geb\204udeteil|und holen uns das Gerippe.",    //We'll enter another part of the building|and fetch the skeleton.
+	"Deine Aufgabe ist nicht leicht.|Schau dir diesen Plan an.",    //Your task is not easy.|Look at this plan.
+	"Unten siehst du die kleine Abstellkammer,|durch die du in die Austellungsr\204ume kommst.",    //Below you can see the small storage room,|through which you come to the showrooms.
+	// 495
+	"Bei der mit Y gekennzeichneten|Stelle ist die Alarmanlage.",    //The alarm system is at the location marked Y.
+	"Bei dem X steht ein gro\341er Dinosaurier|mit einem wertvollen Sch\204del.|Den Sch\204del nimmst du mit.",    //The X marks the spot with a big dinosaur|with a valuable skull.|You will take the skull with you.
+	"Nun zu den Problemen:",    //Now for the problems:
+	"Die wei\341 gekennzeichneten|T\201ren sind verschlossen.",    //The marked white doors|are locked.
+	"Sie m\201ssen mit einer Spezialkeycard ge\224ffnet|werden, was jedoch einige Zeit dauert.",    //They have to be opened with a special keycard,|which can take a while.
+	// 500
+	"Au\341erdem gibt es in den auf der Karte|farbigen R\204umen einen Druck-Alarm.",    //In addition, there are pressure alarms|in the rooms which are colored on the map.
+	"Du darfst dich dort nicht l\204nger|als 16 bzw. 8 Sekunden aufhalten,|sonst wird Alarm ausgel\224st.",    //You can not stay there longer than|16 or 8 seconds,|or the alarm will go off.
+	"Im Raum oben rechts ist|eine Kamera installiert.",    //In the room at the top right|there is a camera installed.
+	"Diese wird jedoch nur von|der 21. bis zur 40. Sekunde|einer Minute \201berwacht.",    //However, it is only monitored|between the 21st and the 40th second|of every minute.
+	"Das gr\224\341te Problem ist der W\204chter.",    //The biggest problem is the guard.
+	// 505
+	"Er braucht f\201r seine Runde genau|eine Minute, ist also ungef\204hr|zehn Sekunden in einem Raum.",    //He needs exactly one minute for his round,|so he is in each room|for about ten seconds.
+	"Du m\201\341test seine Schritte h\224ren k\224nnen,|wenn du in der Abstellkammer bist|und der W\204chter dort vorbeikommt.",    //You should be able to hear his footsteps|if you are in the closet|and the guard passes by.
+	"Wenn du es bis zur Alarmanlage|geschafft hast, h\204ngst du dich|mit dem Sauger an die Wand,|damit du keinen Druck-Alarm ausl\224st.",    //If you make it to the alarm system,|you'll use the sucker to hang on the wall|to avoid triggering the pressure alarm.
+	"Die Alarmanlage schaltest du|mit einem speziellen Ger\204t aus.",    //You switch off the alarm system|with a special device.
+	"Wenn du das geschafft hast, nichts|wie raus! Aber keine Panik,|du darfst keinen Alarm ausl\224sen.",    //Once you're done, get out of there!|But do not panic!|You must not set off the alarm.
+	// 510
+	"So, noch irgendwelche Fragen?",    //So, any more questions?
+	"Also gut.",    //All right then.
+	"Du bekommst 30000 Xa.",    //You get 30,000 Xa.
+	"Ja, die Methode hat sich bew\204hrt.",    //Yes, that method has proven itself worthy.
+	"Hast du sonst noch Fragen?",    //Do you have any questions?
+	// 515
+	"Nachdem wir alles gekl\204rt|haben, kann es ja losgehen!",    //Now that we are on the same page we can get started!
+	"Zur vereinbarten Zeit ...",    //At the agreed upon time ...
+	"Du stehst vor dem Orzeng Museum,|w\204hrend die Gangster schon in einen|anderen Geb\204uderteil eingedrungen sind.",    //You stand in front of the Orzeng Museum,|while the gangsters have already penetrated|into another part of the building.
+	"Wichtiger Hinweis:|Hier ist die letzte M\224glichkeit,|vor dem Einbruch abzuspeichern.",    //Important note:|Here is the last possibility to save|before the break-in.
+	"Wenn Sie das Museum betreten haben,|k\224nnen Sie nicht mehr speichern!",    //Once you enter the museum|you will not be able to save!
+	// 520
+	"Stecken Sie sich Ihre|Tomaten an den Hut!",    //You can keep your tomatoes!
+	"Das kann ja jeder sagen!",    //Anyone can say that!
+	"Niemand \224ffnet.",    //Nobody answers.
+	"Welche Zahl willst du eingeben:      ",    //What number do you want to enter:      
+	"Falsche Eingabe",    //Invalid input
+	// 525
+	"Der Aufzug bewegt sich.",    //The elevator is moving.
+	"Die Karte wird|nicht angenommen.",    //The card|is not accepted.
+	"Da ist nichts mehr.",    //There is nothing left.
+	"Da ist ein Schl\201ssel unter dem Bett!",    //There's a key under the bed!
+	"Hey, da ist etwas unter dem|Bett. Nach dem Ger\204usch zu|urteilen, ist es aus Metall.",    //Hey, there is something under the|bed. Judging by the noise,|it is made of metal.
+	// 530
+	"Mist, es gelingt dir nicht,|den Gegenstand hervorzuholen.",    //Damn, you do not succeed in getting the object out.
+	"Die Klappe ist schon offen.",    //The flap is already open.
+	"Der Schl\201sssel pa\341t nicht.",    //The key does not fit.
+	"Du steckst den Chip in die|Anlage, aber es passiert nichts.|Die Anlage scheint kaputt zu sein.",    //You put the chip in the stereo,|but nothing happens.|The stereo seems to be broken.
+	"Es passiert nichts. Das Ding|scheint kaputt zu sein.",    //Nothing happens. The thing|seems to be broken.
+	// 535
+	"Hochspannung ist ungesund, wie du aus|Teil 1 eigentlich wissen m\201\341test!",    //High voltage is unhealthy, as you|should already know|from Part 1!
+	"Es h\204ngt ein Kabel heraus.",    //A cable hangs out.
+	"Irgendetwas hat hier|nicht ganz funktioniert.",    //Something did not|quite work out here.
+	"Du ziehst den Raumanzug an.",    //You put on your space suit.
+	"Du ziehst den Raumanzug aus.",    //You take off your space suit.
+	// 540
+	"Das ist schon verbunden.",    //That is already connected.
+	"Die Leitung ist hier|schon ganz richtig.",    //The cable is already|at the right place.
+	"Roger W.! Wie kommen Sie denn hierher?",    //Roger W.! How did you get here?
+	"Ach, sieh mal einer an! Sie schon wieder!",    //Oh, look at that! It's you again!
+	"Wo haben Sie denn|Ihr Schiff gelassen?",    //Where did you|leave your ship?
+	// 545
+	"Schauen Sie mal hinter mich auf|den Turm! Da oben h\204ngt es.",    //Take a look behind me, up on|the tower! It's up there.
+	"Ich hatte es scheinbar etwas zu|eilig, aber ich mu\341te unbedingt|zu den Dreharbeiten nach Xenon!",    //Apparently I was too much in a hurry,|but I had to be at the film shooting in Xenon!
+	"Mich wundert, da\341 es die Leute|hier so gelassen nehmen.",    //I am surprised that people|here take things so calmly.
+	"Die tun gerade so, als ob der Turm|schon immer so schr\204g gestanden h\204tte!",    //They are pretending that the tower|has always been that slanted!
+	"Hat er auch, schon seit|mehreren Jahrhunderten!",    //It has, for|several centuries, actually!
+	// 550
+	"\216h ... ach so. Und von wo|kommen Sie? Sie hatten's ja|wohl auch ziemlich eilig.",    //Uh ... I see. And where are you coming from? It seems you were in quite a hurry as well.
+	"Ich komme von Axacuss.",    //I come from Axacuss.
+	"Hmm, was mach ich jetzt blo\341?",    //Hmm, what am I going to do now?
+	"Ich kenne ein gutes Cafe nicht|weit von hier, da k\224nnen|wir uns erstmal erholen.",    //I know a good cafe not far from here,|where we can get some rest.
+	"Ok, einverstanden.",    //OK, I agree.
+	// 555
+	"Faszinierend!",    //Fascinating!
+	"Taxis",    //Taxis
+	"Hier ist ja richtig was los!",    //There seems to be something really going on here!
+	"Axacussaner",    //Axacussan
+	"Teilnahmekarte",    //Participation card
+	// 560
+	"Axacussanerin",    //Axacussian
+	"Darauf steht:|\"115AY2,96A\"",    //It reads:|"115AY2,96A"
+	"Darauf steht:|\"115AY2,96B\"",    //It reads:|"115AY2,96B"
+	"Darauf steht:|\"341,105A\"",    //It reads:|"341,105A"
+	"Darauf steht:|\"341,105B\"",    //It reads:|"341,105B"
+	// 565
+	"Klingel",    //Bell
+	"Anzeige",    //Display
+	"Tastenblock",    //Keypad
+	"Es sind Tasten von 0 bis 9 darauf.",    //There are keys from 0 to 9 on it.
+	"Chip",    //Chip
+	// 570
+	"Es ist ein Musikchip!",    //It's a music chip!
+	"Klappe",    //Hatch
+	"Sie ist mit einem altmodischen|Schlo\341 verschlossen.",    //It is secured with an old-fashioned lock.
+	"Musikanlage",    //Music system
+	"Toll, eine in die Wand|integrierte Stereoanlage.",    //Great, a built-in stereo|in the wall.
+	// 575
+	"Boxen",    //Speakers
+	"Ganz normale Boxen.",    //Ordinary speakers.
+	"Stifte",    //Pencils
+	"Ganz normale Stifte.",    //Ordinary pencils.
+	"Metallkl\224tzchen",    //Metal blocks
+	// 580
+	"Es ist magnetisch.",    //It is magnetic.
+	"Bild",    //Image
+	"Ein ungew\224hnliches Bild.",    //An unusual picture.
+	"Schrank",    //Cabinet
+	"Er ist verschlossen",    //It is closed
+	// 585
+	"Aufzug",    //Elevator
+	"unter Bett",    //under bed
+	"Unter dem Bett sind bestimmt wichtige|Dinge zu finden, nur kommst du nicht darunter.|Du br\204uchtest einen Stock oder so etwas.",    //Under the bed are certainly important|things to find, only you cannot reach underneath.|You need a stick or something.
+	"Schl\201ssel",    //Key
+	"Ein kleiner Metallschl\201ssel.",    //A small metal key.
+	// 590
+	"Schalter",    //Switch
+	"Griff",    //Handle
+	"Luke",    //Hatch
+	"Raumanzug",    //Space suit
+	"Ein zusammenfaltbarer Raumanzug.",    //A collapsible spacesuit.
+	// 595
+	"Leitung",    //Cable
+	"Irgendetwas scheint hier|kaputtgegangen zu sein.",    //Something seems to|have broken here.
+	"Sie h\204ngt lose von der Decke runter.",    //It hangs loose from the ceiling.
+	"Zur Erinnerung:|Dir ist es gelungen, aus den|Artus-Geheimb\201ros zu fliehen.",    //Reminder:|You managed to escape from the|Artus-GmbH secret offices.
+	"Nun befindest du dich in|einem Passagierraumschiff,|das nach Axacuss City fliegt.",    //Now you are in a passenger|spaceship that|flies to Axacuss City.
+	// 600
+	"W\204hrend des Fluges schaust du dir|das axacussanische Fernsehprogramm an.|Du st\224\341t auf etwas Interessantes ...",    //During the flight, you watch the|Axacussan TV program.|You come across something interesting ...
+	"Herzlich willkommen!",    //Welcome!
+	"Heute zu Gast ist Alga Lorch.|Sie wird Fragen an den Erdling|Horst Hummel stellen.",    //Alga Lorch will be present today.|She will ask questions to the Earthling|Horst Hummel.
+	"Horst wird alle Fragen|beantworten, soweit es|ihm m\224glich ist.",    //Horst will answer all|questions as fully|as possible.
+	"Sie haben das Wort, Frau Lorch!",    //You have the floor, Mrs Lorch!
+	// 605
+	"Herr Hummel, hier ist meine erste Frage: ...",    //Mr. Hummel, here is my first question: ...
+	"Sie sind nun ein ber\201hmter Mann auf Axacuss.|Aber sicher vermissen Sie auch Ihren Heimatplaneten.",    //You are now a famous man on Axacuss.|But surely you miss your home planet.
+	"Wenn Sie w\204hlen k\224nnten, w\201rden Sie lieber|ein normales Leben auf der Erde f\201hren,|oder finden Sie das Leben hier gut?",    //If you could choose, would you prefer|to lead a normal life on Earth,|or do you find life here good?
+	"Ehrlich gesagt finde ich es sch\224n,|ber\201hmt zu sein. Das Leben ist|aufregender als auf der Erde.",    //Honestly, I think it's nice to be|famous. Life is more exciting here|than on Earth.
+	"Au\341erdem sind die Leute von der|Artus GmbH hervorragende Freunde.",    //In addition, the people of|Artus GmbH are excellent friends.
+	// 610
+	"Nun ja, planen Sie denn trotzdem,|irgendwann auf die Erde zur\201ckzukehren?",    //Well, are you still planning|to return to Earth someday?
+	"Das kann ich Ihnen zum jetzigen|Zeitpunkt noch nicht genau sagen.",    //At this point in time,|I haven't made up my mind, yet.
+	"Aber ich versichere Ihnen, ich|werde noch eine Weile hierbleiben.",    //But I assure you,|I will stay here for a while.
+	"Aha, mich interessiert au\341erdem,|ob es hier auf Axacuss etwas gibt,|das Sie besonders m\224gen.",    //I see. I'm also interested in|whether there's anything here on Axacuss that you particularly like.
+	"Oh mir gef\204llt der ganze Planet,|aber das Beste hier sind die|hervorragenden Artus-Zahnb\201rsten!",    //Oh I like the whole planet,|but the best thing here are the|extraordinary Artus toothbrushes!
+	// 615
+	"Zahnb\201rsten von solcher Qualit\204t|gab es auf der Erde nicht.",    //Toothbrushes of such quality|do not exist on Earth.
+	"\216h, ach so.",    //Um, I see.
+	"Pl\224tzlich lenkt dich eine|Lautsprecherstimme vom Fernseher ab.",    //Suddenly, a speaker's voice|distracts you from the television.
+	"\"Sehr geehrte Damen und Herren,|wir sind soeben auf dem Flughafen|von Axacuss City gelandet.\"",    //"Ladies and Gentlemen,|We just landed at the airport|at Axacuss City."
+	"\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das Raumschiff! Auf Wiedersehen!\"",    //"I hope you had a nice flight.|Please leave the spaceship! Goodbye!"
+	// 620
+	"W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.",    //While the other passengers|are disembarking, you are trying|to handle the shock.
+	"\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
+	"\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"", //"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
+	"Sieht gef\204hrlich aus!", //Looks dangerous
+	"Das Auge ist schon offen.", //This Eye is already opened
+	// 625
+	"Es gelingt dir, zu fliehen.", //You manage to escape
+	NULL
 };
 
 #endif // GAMETEXT_H
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 70d167e..293af6c 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -186,8 +186,12 @@ enum StringId {
 	kStringCommandGo = 0, kStringCommandLook, kStringCommandTake, kStringCommandOpen, kStringCommandClose,
 	kStringCommandPress, kStringCommandPull, kStringCommandUse, kStringCommandTalk, kStringCommandGive,
 	kStringStatusCommandGo, kStringStatusCommandLook, kStringStatusCommandTake, kStringStatusCommandOpen, kStringStatusCommandClose,
-	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive, kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kStringDefaultDescription, kStringDialogSeparator, kStringConversationEnd, kStringHelpOverview1, kStringHelpOverview2,
-	kStringHelpOverview3, kStringHelpOverview4, kStringHelpOverview5, kStringHelpOverview6, kStringHelpOverview7, kStringTextSpeed, kStringLeaveGame, kStringYes, kStringNo
+	kStringStatusCommandPress, kStringStatusCommandPull, kStringStatusCommandUse, kStringStatusCommandTalk, kStringStatusCommandGive,
+	kPhrasalVerbParticleGiveTo, kPhrasalVerbParticleUseWith, kStringDefaultDescription, kStringDialogSeparator, kStringConversationEnd,
+	// 25
+	kStringHelpOverview1, kStringHelpOverview2, kStringHelpOverview3, kStringHelpOverview4, kStringHelpOverview5,
+	kStringHelpOverview6, kStringHelpOverview7, kStringTextSpeed, kStringLeaveGame, kStringYes,
+	kStringNo
 };
 
 ObjectType operator|(ObjectType a, ObjectType b);
diff --git a/engines/supernova/supernova1/stringid.h b/engines/supernova/supernova1/stringid.h
index 81f9277..c28d843 100644
--- a/engines/supernova/supernova1/stringid.h
+++ b/engines/supernova/supernova1/stringid.h
@@ -28,153 +28,157 @@
 namespace Supernova {
 
 enum StringId1 {
-	kStringTitleVersion = 36, kStringTitle1, kStringTitle2, kStringTitle3, kStringIntro1,
-	kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5, kStringIntro6,
-	kStringIntro7, kStringIntro8, kStringIntro9, kStringIntro10, kStringIntro11,
-	kStringIntro12, kStringIntro13, kStringBroken, kStringTakeMessage,
+	// 36
+	kStringTitleVersion = 36, kStringTitle1, kStringTitle2, kStringTitle3,
+	kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
+	kStringIntro6, kStringIntro7, kStringIntro8, kStringIntro9, kStringIntro10,
+	// 50
+	kStringIntro11, kStringIntro12, kStringIntro13, kStringBroken, kStringTakeMessage,
 	kStringKeycard, kStringKeycardDescription, kStringKnife, kStringKnifeDescription, kStringWatch,
 	kStringDiscman, kStringDiscmanDescription, kStringHatch, kStringButton, kStringHatchButtonDescription,
-	// 50
 	kStringLadder, kStringExit, kStringCockpitHatchDescription, kStringKitchenHatchDescription, kStringStasisHatchDescription,
 	kStringStasisHatchDescription2, kStringSlot, kStringSlotDescription, kStringCorridor, kStringComputer,
+	// 75
 	kStringComputerPassword, kStringInstruments, kStringInstrumentsDescription1, kStringMonitor, kStringMonitorDescription,
 	kStringImage, kStringGenericDescription1, kStringGenericDescription2, kStringGenericDescription3, kStringGenericDescription4,
 	kStringMagnete, kStringMagneteDescription, kStringPen, kStringPenDescription, kStringShelf,
 	kStringCompartment, kStringSocket, kStringToilet, kStringPistol, kStringPistolDescription,
 	kStringBooks, kStringBooksDescription, kStringSpool, kStringSpoolDescription, kStringBook,
+	// 100
 	kStringUnderwear, kStringUnderwearDescription, kStringClothes, kStringJunk, kStringJunkDescription,
 	kStringFolders, kStringFoldersDescription, kStringPoster, kStringPosterDescription1, kStringPosterDescription2,
 	kStringSpeaker, kStringRecord, kStringRecordDescription, kStringRecordStand, kStringRecordStandDescription,
-	// 100
 	kStringTurntable, kStringTurntableDescription, kStringWire, kStringPlug, kStringImageDescription1,
 	kStringDrawingInstruments, kStringDrawingInstrumentsDescription, kStringChessGame, kStringChessGameDescription1, kStringTennisRacket,
+	// 125
 	kStringTennisRacketDescription, kStringTennisBall, kStringChessGameDescription2, kStringBed, kStringBedDescription,
 	kStringCompartmentDescription, kStringAlbums, kStringAlbumsDescription, kStringRope, kStringRopeDescription,
 	kStringShelfDescription, kStringClothesDescription, kStringSocks, kStringBookHitchhiker, kStringBathroom,
 	kStringBathroomDescription, kStringShower, kStringHatchDescription1, kStringHatchDescription2, kStringHelmet,
 	kStringHelmetDescription, kStringSuit, kStringSuitDescription, kStringLifeSupport, kStringLifeSupportDescription,
+	// 150
 	kStringScrap, kStringScrapDescription1, kStringTerminalStrip, kStringScrapDescription2, kStringReactor,
 	kStringReactorDescription, kStringNozzle, kStringPumpkin, kStringPumpkinDescription, kStringLandingModule,
 	kStringLandingModuleDescription, kStringHatchDescription3, kStringGenerator, kStringGeneratorDescription, kStringScrapDescription3,
-	// 150
 	kSafetyButtonDescription, kStringKeyboard, kStringGeneratorWire, kStringEmptySpool, kStringKeycard2,
 	kStringKeycard2Description, kStringTrap, kStringVoltmeter, kStringClip, kStringWireDescription,
+	// 175
 	kStringStone, kStringCaveOpening, kStringCaveOpeningDescription, kStringExitDescription, kStringCave,
 	kStringSign, kStringSignDescription, kStringEntrance, kStringStar, kStringSpaceshift,
 	kStringPorter, kStringPorterDescription, kStringDoor, kStringChewingGum, kStringGummyBears,
 	kStringChocolateBall, kStringEgg, kStringLiquorice, kStringPill, kStringPillDescription,
 	kStringVendingMachine, kStringVendingMachineDescription, kStringToiletDescription, kStringStaircase, kStringCoins,
+	// 200
 	kStringCoinsDescription, kStringTabletPackage, kStringTabletPackageDescription, kStringChair, kStringShoes,
 	kStringShoesDescription, kStringFrogFace, kStringScrible, kStringScribleDescription, kStringWallet,
 	kStringMenu, kStringMenuDescription, kStringCup, kStringCupDescription, kStringBill,
-	// 200
 	kStringBillDescription, kStringKeycard3, kStringAnnouncement, kStringAnnouncementDescription, kStringRoger,
 	kStringUfo, kStringUfoDescription, kStringTray, kStringTrayDescription, kStringLamp,
+	// 225
 	kStringLampDescription, kStringEyes, kStringEyesDescription, kStringSocketDescription, kStringMetalBlock,
 	kStringMetalBlockDescription, kStringRobot, kStringRobotDescription, kStringTable, kStringTableDescription,
 	kStringCellDoor, kStringCellDoorDescription, kStringLaptop, kStringWristwatch, kStringPillar,
 	kStringDoorDescription1, kStringDoorDescription2, kStringDoorDescription3, kStringDoorDescription4, kStringDontEnter,
 	kStringAxacussan, kStringAxacussanDescription, kStringImageDescription2, kStringMastercard, kStringMastercardDescription,
+	// 250
 	kStringLamp2, kStringGenericDescription5, kStringMoney, kStringMoneyDescription1, kStringLocker,
 	kStringLockerDescription, kStringLetter, kStringCube, kStringGenericDescription6, kStringGenericDescription7,
 	kStringStrangeThing, kStringGenericDescription8, kStringImageDescription3, kStringPlant, kStringStatue,
-	// 250
 	kStringStatueDescription, kStringPlantDescription, kStringComputerDescription, kStringGraffiti, kStringGraffitiDescription,
 	kStringMoneyDescription2, kStringJungle, kStringJungleDescription, kStringOutro1, kStringOutro2,
+	// 275
 	kStringOutro3, kStringOutro4, kStringOutro5, kStringOutro6, kStringOutro7,
 	kStringOutro8, kStringOutro9, kStringOutro10, kStringOutro11, kStringOutro12,
 	kStringOutro13, kStringOutro14, kStringWireAndPlug, kStringWireAndClip, kStringWireAndPlug2,
-	// 275
 	kStringSignDescription2, kStringCoin, kStringDoorDescription5, kStringDoorDescription6, kStringKeycard2Description2,
 	kSringSpoolAndClip, kStringIntroCutscene1, kStringIntroCutscene2, kStringIntroCutscene3, kStringIntroCutscene4,
+	// 300
 	kStringIntroCutscene5, kStringIntroCutscene6, kStringIntroCutscene7, kStringIntroCutscene8, kStringIntroCutscene9,
 	kStringIntroCutscene10, kStringIntroCutscene11, kStringIntroCutscene12, kStringIntroCutscene13, kStringIntroCutscene14,
 	kStringIntroCutscene15, kStringIntroCutscene16, kStringIntroCutscene17, kStringIntroCutscene18, kStringIntroCutscene19,
-	// 300
 	kStringIntroCutscene20, kStringIntroCutscene21, kStringIntroCutscene22, kStringIntroCutscene23, kStringIntroCutscene24,
 	kStringIntroCutscene25, kStringIntroCutscene26, kStringIntroCutscene27, kStringIntroCutscene28, kStringIntroCutscene29,
+	// 325
 	kStringIntroCutscene30, kStringIntroCutscene31, kStringIntroCutscene32, kStringIntroCutscene33, kStringIntroCutscene34,
 	kStringIntroCutscene35, kStringIntroCutscene36, kStringIntroCutscene37, kStringIntroCutscene38, kStringIntroCutscene39,
-	kStringIntroCutscene40, kStringIntroCutscene41, kStringIntroCutscene42, kStringShipHall1,       kStringShipSleepCabin1,
-	//325
+	kStringIntroCutscene40, kStringIntroCutscene41, kStringIntroCutscene42, kStringShipHall1, kStringShipSleepCabin1,
 	kStringShipSleepCabin2,  kStringShipSleepCabin3,  kStringShipSleepCabin4,  kStringShipSleepCabin5,  kStringShipSleepCabin6,
 	kStringShipSleepCabin7,  kStringShipSleepCabin8,  kStringShipSleepCabin9,  kStringShipSleepCabin10, kStringShipSleepCabin11,
+	// 350
 	kStringShipSleepCabin12, kStringShipSleepCabin13, kStringShipSleepCabin14, kStringShipSleepCabin15, kStringShipSleepCabin16,
 	kStringShipCockpit1, kStringShipCockpit2, kStringShipCockpit3, kStringShipCockpit4, kStringShipCockpit5,
 	kStringShipCockpit6, kStringShipCockpit7, kStringShipCockpit8, kStringShipCockpit9, kStringShipCockpit10,
-	// 350
 	kStringShipCockpit11, kStringShipCockpit12, kStringShipCockpit13, kStringShipCabinL3_1, kStringShipCabinL3_2,
 	kStringShipCabinL3_3, kStringShipCabinL3_4, kStringShipCabinL3_5, kStringShipAirlock1, kStringShipAirlock2,
+	// 375
 	kStringShipAirlock3, kStringShipAirlock4, kStringShipHold1, kStringCable1, kStringCable2,
 	kStringCable3, kStringCable4, kStringShipHold2, kStringShipHold3, kStringShipHold4,
 	kStringShipHold5, kStringShipHold6, kStringShipHold7, kStringShipHold8, kStringShipHold9,
-	// 375
 	kStringShipHold10, kStringShipHold11, kStringShipHold12, kStringShipHold13, kStringShipHold14,
 	kStringShipHold15, kStringShipHold16, kStringArsanoMeetup1, kStringArsanoMeetup2, kStringArsanoMeetup3,
+	// 400
 	kStringArsanoEntrance1, kStringArsanoEntrance2, kStringArsanoEntrance3, kStringArsanoEntrance4, kStringArsanoEntrance5,
 	kStringArsanoEntrance6, kStringArsanoEntrance7, kStringArsanoEntrance8, kStringArsanoEntrance9, kStringArsanoEntrance10,
 	kStringArsanoEntrance11, kStringArsanoEntrance12, kStringArsanoEntrance13, kStringArsanoEntrance14, kStringArsanoEntrance15,
-	// 400
 	kStringArsanoEntrance16, kStringArsanoEntrance17, kStringArsanoEntrance18, kStringArsanoEntrance19, kStringArsanoEntrance20,
 	kStringArsanoEntrance21, kStringArsanoEntrance22, kStringArsanoEntrance23, kStringArsanoEntrance24, kStringArsanoEntrance25,
+	// 425
 	kStringArsanoEntrance26, kStringArsanoEntrance27, kStringArsanoDialog1, kStringArsanoDialog2, kStringArsanoDialog3,
 	kStringArsanoDialog4, kStringArsanoDialog5, kStringArsanoDialog6, kStringArsanoDialog7, kStringArsanoDialog8,
-	kStringArsanoDialog9, kStringDialogArsanoRoger1, kStringDialogArsanoRoger2, kStringDialogArsanoRoger3,
-	// 425
-	kStringDialogArsanoMeetup3_1, kStringDialogArsanoMeetup3_2, kStringDialogArsanoMeetup3_3, kStringDialogArsanoMeetup3_4, kStringDialogArsanoMeetup3_5,
-	kStringArsanoRoger1, kStringArsanoRoger2, kStringArsanoRoger3, kStringArsanoRoger4, kStringArsanoRoger5,
-	kStringArsanoRoger6, kStringArsanoRoger7, kStringArsanoRoger8, kStringArsanoRoger9, kStringArsanoRoger10,
-	kStringArsanoRoger11, kStringArsanoRoger12, kStringArsanoRoger13, kStringArsanoRoger14, kStringArsanoRoger15,
-	kStringArsanoRoger16, kStringArsanoRoger17, kStringArsanoRoger18, kStringArsanoRoger19, kStringArsanoRoger20,
+	kStringArsanoDialog9, kStringDialogArsanoRoger1, kStringDialogArsanoRoger2, kStringDialogArsanoRoger3, kStringDialogArsanoMeetup3_1,
+	kStringDialogArsanoMeetup3_2, kStringDialogArsanoMeetup3_3, kStringDialogArsanoMeetup3_4, kStringDialogArsanoMeetup3_5, kStringArsanoRoger1,
+	kStringArsanoRoger2, kStringArsanoRoger3, kStringArsanoRoger4, kStringArsanoRoger5, kStringArsanoRoger6,
 	// 450
-	kStringArsanoRoger21, kStringArsanoRoger22, kStringArsanoRoger23, kStringArsanoRoger24, kStringArsanoRoger25,
-	kStringArsanoRoger26, kStringArsanoRoger27, kStringArsanoRoger28, kStringArsanoRoger29, kStringArsanoRoger30,
-	kStringArsanoRoger31, kStringArsanoRoger32, kStringArsanoRoger33, kStringArsanoRoger34, kStringArsanoRoger35,
-	kStringArsanoRoger36, kStringArsanoRoger37, kStringArsanoRoger38, kStringArsanoRoger39, kStringArsanoRoger40,
-	kStringArsanoGlider1, kStringArsanoMeetup2_1, kStringArsanoMeetup2_2, kStringArsanoMeetup2_3, kStringArsanoMeetup2_4,
+	kStringArsanoRoger7, kStringArsanoRoger8, kStringArsanoRoger9, kStringArsanoRoger10, kStringArsanoRoger11,
+	kStringArsanoRoger12, kStringArsanoRoger13, kStringArsanoRoger14, kStringArsanoRoger15, kStringArsanoRoger16,
+	kStringArsanoRoger17, kStringArsanoRoger18, kStringArsanoRoger19, kStringArsanoRoger20, kStringArsanoRoger21,
+	kStringArsanoRoger22, kStringArsanoRoger23, kStringArsanoRoger24, kStringArsanoRoger25, kStringArsanoRoger26,
+	kStringArsanoRoger27, kStringArsanoRoger28, kStringArsanoRoger29, kStringArsanoRoger30, kStringArsanoRoger31,
 	// 475
-	kStringArsanoMeetup2_5, kStringArsanoMeetup2_6, kStringArsanoMeetup2_7, kStringArsanoMeetup2_8, kStringArsanoMeetup2_9,
-	kStringArsanoMeetup2_10, kStringArsanoMeetup2_11, kStringArsanoMeetup2_12, kStringArsanoMeetup2_13, kStringArsanoMeetup3_1,
-	kStringArsanoMeetup3_2, kStringArsanoMeetup3_3, kStringArsanoMeetup3_4, kStringArsanoMeetup3_5, kStringArsanoMeetup3_6,
-	kStringArsanoMeetup3_7, kStringArsanoMeetup3_8, kStringArsanoMeetup3_9, kStringArsanoMeetup3_10, kStringArsanoMeetup3_11,
-	kStringArsanoMeetup3_12, kStringArsanoMeetup3_13, kStringArsanoMeetup3_14, kStringArsanoMeetup3_15, kStringArsanoMeetup3_16,
+	kStringArsanoRoger32, kStringArsanoRoger33, kStringArsanoRoger34, kStringArsanoRoger35, kStringArsanoRoger36,
+	kStringArsanoRoger37, kStringArsanoRoger38, kStringArsanoRoger39, kStringArsanoRoger40, kStringArsanoGlider1,
+	kStringArsanoMeetup2_1, kStringArsanoMeetup2_2, kStringArsanoMeetup2_3, kStringArsanoMeetup2_4, kStringArsanoMeetup2_5,
+	kStringArsanoMeetup2_6, kStringArsanoMeetup2_7, kStringArsanoMeetup2_8, kStringArsanoMeetup2_9, kStringArsanoMeetup2_10,
+	kStringArsanoMeetup2_11, kStringArsanoMeetup2_12, kStringArsanoMeetup2_13, kStringArsanoMeetup3_1, kStringArsanoMeetup3_2,
 	// 500
-	kStringArsanoMeetup3_17, kStringArsanoMeetup3_18, kStringArsanoMeetup3_19, kStringArsanoMeetup3_20, kStringArsanoMeetup3_21,
-	kStringArsanoMeetup3_22, kStringArsanoMeetup3_23, kStringArsanoMeetup3_24, kStringArsanoMeetup3_25, kStringArsanoMeetup3_26,
-	kStringArsanoMeetup3_27, kStringArsanoMeetup3_28, kStringAxacussCell_1, kStringAxacussCell_2, kStringAxacussCell_3,
-	kStringAxacussCell_4, kStringAxacussCell_5, kStringOk, kStringDialogArsanoMeetup2_1, kStringDialogArsanoMeetup2_2,
-	kStringDialogArsanoMeetup2_3, kStringDialogArsanoMeetup2_4, kStringDialogArsanoMeetup2_5, kStringDialogArsanoMeetup2_6, kStringDialogArsanoMeetup2_7,
+	kStringArsanoMeetup3_3, kStringArsanoMeetup3_4, kStringArsanoMeetup3_5, kStringArsanoMeetup3_6, kStringArsanoMeetup3_7,
+	kStringArsanoMeetup3_8, kStringArsanoMeetup3_9, kStringArsanoMeetup3_10, kStringArsanoMeetup3_11, kStringArsanoMeetup3_12,
+	kStringArsanoMeetup3_13, kStringArsanoMeetup3_14, kStringArsanoMeetup3_15, kStringArsanoMeetup3_16, kStringArsanoMeetup3_17,
+	kStringArsanoMeetup3_18, kStringArsanoMeetup3_19, kStringArsanoMeetup3_20, kStringArsanoMeetup3_21, kStringArsanoMeetup3_22,
+	kStringArsanoMeetup3_23, kStringArsanoMeetup3_24, kStringArsanoMeetup3_25, kStringArsanoMeetup3_26, kStringArsanoMeetup3_27,
 	// 525
-	kStringDialogArsanoMeetup2_8, kStringDialogArsanoMeetup2_9, kStringDialogArsanoMeetup2_10, kStringDialogArsanoMeetup2_11, kStringDialogAxacussCorridor5_1,
-	kStringDialogAxacussCorridor5_2, kStringDialogAxacussCorridor5_3, kStringDialogAxacussCorridor5_4, kStringDialogAxacussCorridor5_5, kStringDialogAxacussCorridor5_6,
-	kStringDialogAxacussCorridor5_7, kStringDialogX1, kStringDialogX2, kStringDialogX3, kStringAxacussCorridor5_1,
-	kStringAxacussCorridor5_2, kStringAxacussCorridor5_3, kStringAxacussCorridor5_4, kStringAxacussCorridor5_5, kStringAxacussCorridor5_6,
-	kStringAxacussCorridor5_7, kStringAxacussBcorridor_1, kStringAxacussOffice1_1, kStringAxacussOffice1_2, kStringAxacussOffice1_3,
+	kStringArsanoMeetup3_28, kStringAxacussCell_1, kStringAxacussCell_2, kStringAxacussCell_3, kStringAxacussCell_4,
+	kStringAxacussCell_5, kStringOk, kStringDialogArsanoMeetup2_1, kStringDialogArsanoMeetup2_2, kStringDialogArsanoMeetup2_3,
+	kStringDialogArsanoMeetup2_4, kStringDialogArsanoMeetup2_5, kStringDialogArsanoMeetup2_6, kStringDialogArsanoMeetup2_7, kStringDialogArsanoMeetup2_8,
+	kStringDialogArsanoMeetup2_9, kStringDialogArsanoMeetup2_10, kStringDialogArsanoMeetup2_11, kStringDialogAxacussCorridor5_1, kStringDialogAxacussCorridor5_2,
+	kStringDialogAxacussCorridor5_3, kStringDialogAxacussCorridor5_4, kStringDialogAxacussCorridor5_5, kStringDialogAxacussCorridor5_6, kStringDialogAxacussCorridor5_7,
 	// 550
-	kStringAxacussOffice1_4, kStringAxacussOffice1_5, kStringAxacussOffice1_6, kStringAxacussOffice1_7, kStringAxacussOffice1_8,
-	kStringAxacussOffice1_9, kStringAxacussOffice1_10, kStringAxacussOffice1_11, kStringAxacussOffice1_12, kStringAxacussOffice1_13,
-	kStringAxacussOffice1_14, kStringAxacussOffice1_15, kStringAxacussOffice1_16, kStringAxacussOffice3_1, kStringAxacussElevator_1,
-	kStringAxacussElevator_2, kStringAxacussElevator_3, kStringShock, kStringShot, kStringCloseLocker_1,
-	kStringIsHelmetOff_1, kStringGenericInteract_1, kStringGenericInteract_2, kStringGenericInteract_3, kStringGenericInteract_4,
+	kStringDialogX1, kStringDialogX2, kStringDialogX3, kStringAxacussCorridor5_1, kStringAxacussCorridor5_2,
+	kStringAxacussCorridor5_3, kStringAxacussCorridor5_4, kStringAxacussCorridor5_5, kStringAxacussCorridor5_6, kStringAxacussCorridor5_7,
+	kStringAxacussBcorridor_1, kStringAxacussOffice1_1, kStringAxacussOffice1_2, kStringAxacussOffice1_3, kStringAxacussOffice1_4,
+	kStringAxacussOffice1_5, kStringAxacussOffice1_6, kStringAxacussOffice1_7, kStringAxacussOffice1_8, kStringAxacussOffice1_9,
+	kStringAxacussOffice1_10, kStringAxacussOffice1_11, kStringAxacussOffice1_12, kStringAxacussOffice1_13, kStringAxacussOffice1_14,
 	// 575
-	kStringGenericInteract_5, kStringGenericInteract_6, kStringGenericInteract_7, kStringGenericInteract_8, kStringGenericInteract_9,
-	kStringGenericInteract_10, kStringGenericInteract_11, kStringGenericInteract_12,
-	kStringGenericInteract_13, kStringGenericInteract_14, kStringGenericInteract_15, kStringGenericInteract_16, kStringGenericInteract_17,
-	kStringGenericInteract_18, kStringGenericInteract_19, kStringGenericInteract_20, kStringGenericInteract_21, kStringGenericInteract_22,
-	kStringGenericInteract_23, kStringGenericInteract_24, kStringGenericInteract_25, kStringGenericInteract_26, kStringGenericInteract_27,
+	kStringAxacussOffice1_15, kStringAxacussOffice1_16, kStringAxacussOffice3_1, kStringAxacussElevator_1, kStringAxacussElevator_2,
+	kStringAxacussElevator_3, kStringShock, kStringShot, kStringCloseLocker_1, kStringIsHelmetOff_1,
+	kStringGenericInteract_1, kStringGenericInteract_2, kStringGenericInteract_3, kStringGenericInteract_4, kStringGenericInteract_5,
+	kStringGenericInteract_6, kStringGenericInteract_7, kStringGenericInteract_8, kStringGenericInteract_9, kStringGenericInteract_10,
+	kStringGenericInteract_11, kStringGenericInteract_12, kStringGenericInteract_13, kStringGenericInteract_14, kStringGenericInteract_15,
 	// 600
-	kStringGenericInteract_28, kStringGenericInteract_29, kStringGenericInteract_30, kStringGenericInteract_31, kStringGenericInteract_32,
-	kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35, kStringGenericInteract_36, kStringGenericInteract_37,
-	kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40, kStringGenericInteract_41, kStringGenericInteract_42,
-	kStringGenericInteract_43, kStringSupernova1, kStringSupernova2, kStringSupernova3,
-	kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7, kStringSupernova8,
+	kStringGenericInteract_16, kStringGenericInteract_17, kStringGenericInteract_18, kStringGenericInteract_19, kStringGenericInteract_20,
+	kStringGenericInteract_21, kStringGenericInteract_22, kStringGenericInteract_23, kStringGenericInteract_24, kStringGenericInteract_25,
+	kStringGenericInteract_26, kStringGenericInteract_27, kStringGenericInteract_28, kStringGenericInteract_29, kStringGenericInteract_30,
+	kStringGenericInteract_31, kStringGenericInteract_32, kStringGenericInteract_33, kStringGenericInteract_34, kStringGenericInteract_35,
+	kStringGenericInteract_36, kStringGenericInteract_37, kStringGenericInteract_38, kStringGenericInteract_39, kStringGenericInteract_40,
 	// 625
-	kStringGuardNoticed1, kStringGuardNoticed2, kStringTelomat1, kStringTelomat2,
+	kStringGenericInteract_41, kStringGenericInteract_42, kStringGenericInteract_43, kStringSupernova1, kStringSupernova2,
+	kStringSupernova3, kStringSupernova4, kStringSupernova5, kStringSupernova6, kStringSupernova7,
+	kStringSupernova8, kStringGuardNoticed1, kStringGuardNoticed2, kStringTelomat1, kStringTelomat2,
 	kStringTelomat3, kStringTelomat4, kStringTelomat5, kStringTelomat6, kStringTelomat7,
 	kStringTelomat8, kStringTelomat9, kStringTelomat10, kStringTelomat11, kStringTelomat12,
+	// 650
 	kStringTelomat13, kStringTelomat14, kStringTelomat15, kStringTelomat16, kStringTelomat17,
 	kStringTelomat18, kStringTelomat19, kStringTelomat20, kStringTelomat21, kStringAlarm,
-	// 650
 	// Add two placeholder strings at the end for variable text
 	kStringPlaceholder1, kStringPlaceholder2,
 
diff --git a/engines/supernova/supernova2/stringid.h b/engines/supernova/supernova2/stringid.h
index 4254031..5fa60a5 100644
--- a/engines/supernova/supernova2/stringid.h
+++ b/engines/supernova/supernova2/stringid.h
@@ -26,128 +26,151 @@
 #include "common/scummsys.h"
 
 namespace Supernova {
-
 enum StringId2 {
-kString23 = 36, kString24,
-kString25, kString26, kString27,
-kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3,
-kStringGenericInteract4, kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8,
-kStringGenericInteract9, kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13,
-kStringIntro1, kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5,
-kStringOutro1, kStringOutro2, kStringOutro3, kStringOutro4, kStringOutro5,
-kStringShout1, kStringShout2, kStringShout3, kStringShout4, kStringShout5,
-kStringShout6, kStringShout7, kStringShout8, kStringShout9, kStringShout10,
-kStringShout11, kStringShout12, kStringShout13, kStringShout14, kStringShout15,
-kStringMuseum8, kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15,
-kStringMuseum16, kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14,
-kStringMuseum1, kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5,
-kStringMuseum23, kStringMuseum24, kStringMuseum17, kStringMuseum18, kStringMuseum19,
-kStringMuseum20, kStringMuseum21, kStringMuseum22, kStringDinosaur, kStringDinosaurDescription,
-kStringEntrance, kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription,
-kStringMainEntrance, kStringCorridor, kStringDinosaurDescription2, kStringDinosaurHead, kStringDinosaurHeadDescription,
-kStringAlarmSystem, kStringSuctionCup, kStringWall, kStringOpening, kStringLetter,
-kStringMassive, kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2,
-kStringPyramid3, kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6,
-kStringPyramid7, kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11,
-kStringPyramid12, kStringPyramid13, kStringPyramid14, kStringPyramid15, kStringPyramid17,
-kStringPyramid18, kStringPyramid19, kStringDirection1, kStringDirection2, kStringDirection3,
-kStringDirection4, kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description,
-kStringPyramid, kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description,
-kStringRight, kStringLeft, kStringButton, kStringInscription, kStringTomato,
-kStringFunnyDescription, kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription,
-kStringEyes, kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription,
-kStringOpeningDescription1, kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3,
-kStringOpeningDescription3, kStringStones, kStringPlate, kStringCoffin, kStringExit,
-kStringCreepy, kStringToothbrush, kStringToothbrushDescription1, kStringToothpaste, kStringBall,
-kStringBallDescription, kStringEye, kStringEyeDescription, kStringLooksMetal,
-kStringTaxiArrives, kStringNothingHappens, kStringEmpty, kStringWalletOpen, kStringAttachMagnet,
-kStringPoleMagnet, kStringCunning, kStringMustBuyFirst, kStringInsertChip, kStringTransferCD,
-kStringCDNotInserted, kStringRemoveChip, kStringChipNotInserted, kStringWhatFor, kStringMMCD,
-kStringChipEmpty, kStringListeningToCD, kStringNoChip, kStringTipsy, kStringXa,
-kStringAirportEntrance, kStringAirport, kStringDowntown, kStringCulturePalace, kStringEarth,
-kStringPrivateApartment, kStringLeaveTaxi, kStringPay, kStringAddress, kStringCheater,
-kStringNotEnoughMoney, kStringTaxiAccelerating, kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole,
-kStringOnlyShop, kStringCabinOccupiedSay, kStringTakeMoney, kStringAlreadyPaid, kStringNoMoney,
-kStringPay10Xa, kStringWillPassOut, kStringRest, kStringCypher, kStringWillTakeIt,
-kStringTooExpensive, kStringWouldBuy, kStringMeHorstHummel, kStringHaveMusicChip, kStringGreatMask,
-kStringThreeYears, kStringStrongDrink, kStringMusicDevice, kStringArtusToothbrush, kStringSellInBulk,
-kStringRarityBooks, kStringEncyclopedia, kStringLargestDictionary, kStringOver400Words, kStringNotSale,
-kStringGaveOne, kStringExcited, kStringFromGame, kStringRobust, kStringCheapSwill,
-kStringStickers, kStringDishes, kStringUgly, kStringSellsWell, kStringThatCosts,
-kStringTakeALook, kStringNonsense, kStringImSorry, kStringGoodEvening, kStringHello,
-kStringScaredMe, kStringHowSo, kStringDisguise, kStringWhatDisguise, kStringStopPretending,
-kStringYouDisguised, kStringIAmHorstHummel, kStringGiveItUp, kStringGestures, kStringMovesDifferently,
-kStringHeIsRobot, kStringYouAreCrazy, kStringYouIdiot, kStringShutUp, kStringKnife,
-kStringKnifeDescription, kStringMoney, kStringDiscman, kStringDiscmanDescription, kStringSuctionCupDescription,
-kStringSpecialCard, kStringSpecialCardDescription, kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard,
-kStringSpaceship, kStringSpaceshipDescription, kStringVehicles, kStringVehiclesDescription, kStringVehicle,
-kStringVehicleDescription, kStringEntranceDescription, kStringWallet, kStringWalletDescription, kStringDevice,
-kStringDeviceDescription, kStringIdCard, kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription,
-kStringBusinessStreet, kStringBusinessStreetDescription, kStringRod, kStringPost, kStringRailing,
-kStringPoster, kStringPosterDescription, kStringCabin, kStringCabinFree, kStringCabinOccupied,
-kStringFeet, kStringFeetDescription, kStringHood, kStringHoodDescription, kString400Xa,
-kString10Xa, kStringSlotDescription1, kStringSlotDescription2, kStringChair, kStringChairDescription,
-kStringScribble, kStringFace, kStringFaceDescription, kStringBooks, kStringDictionary,
-kStringPlant, kStringMask, kStringSnake, kStringCup, kStringJoystick,
-kStringToothbrushDescription, kStringMusic, kStringMusicDescription, kStringBottle, kStringBottleDescription,
-kStringBox, kStringSeller, kStringWhat, kStringNotInformed, kStringHorstHummel,
-kStringNiceWeather, kStringTellTicket, kStringHereIsXa, kString500Xa, kString1000Xa,
-kString5000Xa, kString10000Xa, kStringThankYou, kStringWhatYouOffer, kStringHello2,
-kStringWhatYouWant, kStringWhoAreYou, kStringHorstHummel2, kStringNeverHeard, kStringYouDontKnow,
-kStringImOnTV, kStringIDontKnow, kStringFunny, kStringAha, kStringICan,
-kStringFromWhom, kStringCost, kStringAsYouSay, kStringGetCard, kStringOnlyParticipation,
-kStringWhatForIt, kStringMakeOffer, kStringGoodOffer, kStringGiveCard, kStringIdiot,
-kStringCheckout1, kStringCheckout2, kStringCheckout3, kStringYes2, kStringNo2,
-kStringCheckout4, kStringCheckout5, kStringCheckout6, kStringCheckout7, kStringCheckout8,
-kStringCheckout9, kStringCheckout10, kStringCheckout11, kStringCheckout12, kStringCheckout13,
-kStringCheckout14, kStringCheckout15, kStringCheckout16, kStringCheckout17, kStringCheckout18,
-kStringCheckout19, kStringCheckout20, kStringCheckout21, kStringCheckout22, kStringCheckout23,
-kStringCheckout24, kStringCheckout25, kStringCheckout26, kStringCheckout27, kStringCheckout28,
-kStringCheckout29, kStringCheckout30, kStringCheckout31, kStringCheckout32, kStringCheckout33,
-kStringCheckout34, kStringCheckout35, kStringCheckout36, kStringCheckout37, kStringCheckout38,
-kStringCheckout39, kStringCheckout40, kStringCheckout41, kStringCheckout42, kStringCheckout43,
-kStringCheckout44, kStringCheckout45, kStringCheckout46, kStringCheckout47, kStringCheckout48,
-kStringCheckout49, kStringAtMusicContest, kStringNoImitation, kStringGoodJoke, kStringCommon,
-kStringIWillProof, kStringIWillPerform, kStringAppearance32, kStringAppearance1, kStringAppearance2,
-kStringAppearance3, kStringAppearance4, kStringAppearance5, kStringAppearance6, kStringAppearance7,
-kStringAppearance8, kStringAppearance9, kStringAppearance10, kStringAppearance11, kStringAppearance12,
-kStringAppearance13, kStringAppearance14, kStringAppearance15, kStringAppearance16, kStringAppearance17,
-kStringAppearance18, kStringAppearance19, kStringAppearance20, kStringAppearance21, kStringAppearance22,
-kStringAppearance23, kStringAppearance24, kStringAppearance25, kStringAppearance26, kStringAppearance27,
-kStringAppearance28, kStringAppearance29, kStringAppearance30, kStringAppearance31, kStringElevator1,
-kStringElevator2, kStringElevator3, kStringElevator4, kStringElevator5, kStringElevator6,
-kStringElevator7, kStringElevator8, kStringElevator9, kStringElevator10, kStringElevator11,
-kStringElevator12, kStringElevator13, kStringElevator14, kStringElevator15, kStringElevator16,
-kStringElevator17, kStringElevator18, kStringElevator19, kStringElevator20, kStringElevator21,
-kStringElevator22, kStringElevator23, kStringElevator24, kStringElevator25, kStringElevator26,
-kStringElevator27, kStringElevator28, kStringElevator29, kStringElevator30, kStringElevator31,
-kStringElevator32, kStringElevator33, kStringElevator34, kStringElevator35, kStringElevator36,
-kStringElevator37, kStringElevator38, kStringElevator39, kStringElevator40, kStringElevator41,
-kStringElevator42, kStringElevator43, kStringElevator44, kStringElevator45, kStringElevator46,
-kStringElevator47, kStringElevator48, kStringElevator49, kStringElevator50, kStringElevator51,
-kStringElevator52, kStringElevator53, kStringElevator54, kStringElevator55, kStringElevator56,
-kStringElevator57, kStringElevator58, kStringElevator59, kStringElevator60, kStringElevator61,
-kStringElevator62, kStringElevator63, kStringElevator64, kStringElevator65, kStringApartment1,
-kStringApartment2, kStringApartment3, kStringApartment4, kStringApartment5, kStringApartment6,
-kStringApartment7, kStringApartment8, kStringShip0, kStringShip1, kStringShip2,
-kStringShip3, kStringShip4, kStringShip5, kStringShip6, kStringShip7,
-kStringShip8, kStringShip9, kStringShip10, kStringShip11, kStringShip12,
-kStringShip13, kStringShip14, kStringShip15, kStringShip16, kStringShip17,
-kStringShip18, kStringShip19, kStringFascinating, kStringTaxis, kStringTaxisDescription,
-kStringAxacussan, kStringParticipationCard, kStringAxacussian, kStringSign1Description, kStringSign2Description,
-kStringSign3Description, kStringSign4Description, kStringBell, kStringDisplay, kStringKeypad,
-kStringKeypadDescription, kStringChip, kStringChipDescription, kStringHatch, kStringHatchDescription,
-kStringMusicSystem, kStringMusicSystemDescription, kStringSpeakers, kStringSpeakersDescription, kStringPencils,
-kStringPencilsDescription, kStringMetalBlocks, kStringMetalBlocksDescription, kStringImage, kStringImageDescription,
-kStringCabinet, kStringCabinetDescription, kStringElevator, kStringUnderBed, kStringUnderBedDescription,
-kStringKey, kStringKeyDescription, kStringSwitch, kStringHandle, kStringHatch2,
-kStringSpaceSuit, kStringSpaceSuitDescription, kStringCable, kStringCableDescription1, kStringCableDescription2,
-kStringIntro6, kStringIntro7, kStringIntro8, kStringIntroTV1, kStringIntroTV2,
-kStringIntroTV3, kStringIntroTV4, kStringIntroTV5, kStringIntroTV6, kStringIntroTV7,
-kStringIntroTV8, kStringIntroTV9, kStringIntroTV10, kStringIntroTV11, kStringIntroTV12,
-kStringIntroTV13, kStringIntroTV14, kStringIntroTV15, kStringIntroTV16, kStringIntro9,
-kStringIntro10, kStringIntro11, kStringIntro12, kStringIntro13, kStringIntro14, 
-kStringMonsterDescription, kStringPyramid16, kStringMuseum11
+	// 36
+	kString23 = 36, kString24, kString25, kString26,
+	kString27, kStringGenericInteract1, kStringGenericInteract2, kStringGenericInteract3, kStringGenericInteract4,
+	kStringGenericInteract5, kStringGenericInteract6, kStringGenericInteract7, kStringGenericInteract8, kStringGenericInteract9,
+	// 50
+	kStringGenericInteract10, kStringGenericInteract11, kStringGenericInteract12, kStringGenericInteract13, kStringIntro1,
+	kStringIntro2, kStringIntro3, kStringIntro4, kStringIntro5, kStringOutro1,
+	kStringOutro2, kStringOutro3, kStringOutro4, kStringOutro5, kStringShout1,
+	kStringShout2, kStringShout3, kStringShout4, kStringShout5, kStringShout6,
+	kStringShout7, kStringShout8, kStringShout9, kStringShout10, kStringShout11,
+	// 75
+	kStringShout12, kStringShout13, kStringShout14, kStringShout15, kStringMuseum8,
+	kStringMuseum9, kStringMuseum7, kStringMuseum6, kStringMuseum15, kStringMuseum16,
+	kStringMuseum10, kStringMuseum12, kStringMuseum13, kStringMuseum14, kStringMuseum1,
+	kStringMuseum2, kStringMuseum3, kStringMuseum4, kStringMuseum5, kStringMuseum23,
+	kStringMuseum24, kStringMuseum17, kStringMuseum18, kStringMuseum19, kStringMuseum20,
+	// 100
+	kStringMuseum21, kStringMuseum22, kStringDinosaur, kStringDinosaurDescription, kStringEntrance,
+	kStringDoor, kStringRoad, kStringCamera, kStringCameraDescription, kStringMainEntrance,
+	kStringCorridor, kStringDinosaurDescription2, kStringDinosaurHead, kStringDinosaurHeadDescription, kStringAlarmSystem,
+	kStringSuctionCup, kStringWall, kStringOpening, kStringLetter, kStringMassive,
+	kStringInscriptionDescription, kStringPyramid0, kStringPyramid1, kStringPyramid2, kStringPyramid3,
+	// 125
+	kStringPyramid4, kStringPiece, kStringPyramid5, kStringPyramid6, kStringPyramid7,
+	kStringPyramid8, kStringPyramid9, kStringPyramid10, kStringPyramid11, kStringPyramid12,
+	kStringPyramid13, kStringPyramid14, kStringPyramid15, kStringPyramid17, kStringPyramid18,
+	kStringPyramid19, kStringDirection1, kStringDirection2, kStringDirection3, kStringDirection4,
+	kStringRope, kStringSign, kStringSignDescription, kStringEntrance1Description, kStringPyramid,
+	// 150
+	kStringPyramidDescription, kStringSun, kStringSunDescription, kStringSign5Description, kStringRight,
+	kStringLeft, kStringButton, kStringInscription, kStringTomato, kStringFunnyDescription,
+	kStringKnife1, kStringKnife1Description, kStringMonster, kStringRopeDescription, kStringEyes,
+	kStringMouth, kStringMonster1Description, kStringNote, kStringNoteDescription, kStringOpeningDescription1,
+	kStringOpeningDescription2, kStringNoteDescription1, kStringSlot, kStringSlotDescription3, kStringOpeningDescription3,
+	// 175
+	kStringStones, kStringPlate, kStringCoffin, kStringExit, kStringCreepy,
+	kStringToothbrush, kStringToothbrushDescription1, kStringToothpaste, kStringBall, kStringBallDescription,
+	kStringEye, kStringEyeDescription, kStringLooksMetal, kStringTaxiArrives, kStringNothingHappens,
+	kStringEmpty, kStringWalletOpen, kStringAttachMagnet, kStringPoleMagnet, kStringCunning,
+	kStringMustBuyFirst, kStringInsertChip, kStringTransferCD, kStringCDNotInserted, kStringRemoveChip,
+	// 200
+	kStringChipNotInserted, kStringWhatFor, kStringMMCD, kStringChipEmpty, kStringListeningToCD,
+	kStringNoChip, kStringTipsy, kStringXa, kStringAirportEntrance, kStringAirport,
+	kStringDowntown, kStringCulturePalace, kStringEarth, kStringPrivateApartment, kStringLeaveTaxi,
+	kStringPay, kStringAddress, kStringCheater, kStringNotEnoughMoney, kStringTaxiAccelerating,
+	kString5MinutesLater, kStringAlreadyHavePole, kStringSawPole, kStringOnlyShop, kStringCabinOccupiedSay,
+	// 225
+	kStringTakeMoney, kStringAlreadyPaid, kStringNoMoney, kStringPay10Xa, kStringWillPassOut,
+	kStringRest, kStringCypher, kStringWillTakeIt, kStringTooExpensive, kStringWouldBuy,
+	kStringMeHorstHummel, kStringHaveMusicChip, kStringGreatMask, kStringThreeYears, kStringStrongDrink,
+	kStringMusicDevice, kStringArtusToothbrush, kStringSellInBulk, kStringRarityBooks, kStringEncyclopedia,
+	kStringLargestDictionary, kStringOver400Words, kStringNotSale, kStringGaveOne, kStringExcited,
+	// 250
+	kStringFromGame, kStringRobust, kStringCheapSwill, kStringStickers, kStringDishes,
+	kStringUgly, kStringSellsWell, kStringThatCosts, kStringTakeALook, kStringNonsense,
+	kStringImSorry, kStringGoodEvening, kStringHello, kStringScaredMe, kStringHowSo,
+	kStringDisguise, kStringWhatDisguise, kStringStopPretending, kStringYouDisguised, kStringIAmHorstHummel,
+	kStringGiveItUp, kStringGestures, kStringMovesDifferently, kStringHeIsRobot, kStringYouAreCrazy,
+	// 275
+	kStringYouIdiot, kStringShutUp, kStringKnife, kStringKnifeDescription, kStringMoney,
+	kStringDiscman, kStringDiscmanDescription, kStringSuctionCupDescription, kStringSpecialCard, kStringSpecialCardDescription,
+	kStringAlarmCracker, kStringAlarmCrackerDescription, kStringKeycard, kStringSpaceship, kStringSpaceshipDescription,
+	kStringVehicles, kStringVehiclesDescription, kStringVehicle, kStringVehicleDescription, kStringEntranceDescription,
+	kStringWallet, kStringWalletDescription, kStringDevice, kStringDeviceDescription, kStringIdCard,
+	// 300
+	kStringIdCardDescription, kStringStaircase, kStringStaircaseDescription, kStringBusinessStreet, kStringBusinessStreetDescription,
+	kStringRod, kStringPost, kStringRailing, kStringPoster, kStringPosterDescription,
+	kStringCabin, kStringCabinFree, kStringCabinOccupied, kStringFeet, kStringFeetDescription,
+	kStringHood, kStringHoodDescription, kString400Xa, kString10Xa, kStringSlotDescription1,
+	kStringSlotDescription2, kStringChair, kStringChairDescription, kStringScribble, kStringFace,
+	// 325
+	kStringFaceDescription, kStringBooks, kStringDictionary, kStringPlant, kStringMask,
+	kStringSnake, kStringCup, kStringJoystick, kStringToothbrushDescription, kStringMusic,
+	kStringMusicDescription, kStringBottle, kStringBottleDescription, kStringBox, kStringSeller,
+	kStringWhat, kStringNotInformed, kStringHorstHummel, kStringNiceWeather, kStringTellTicket,
+	kStringHereIsXa, kString500Xa, kString1000Xa, kString5000Xa, kString10000Xa,
+	// 350
+	kStringThankYou, kStringWhatYouOffer, kStringHello2, kStringWhatYouWant, kStringWhoAreYou,
+	kStringHorstHummel2, kStringNeverHeard, kStringYouDontKnow, kStringImOnTV, kStringIDontKnow,
+	kStringFunny, kStringAha, kStringICan, kStringFromWhom, kStringCost,
+	kStringAsYouSay, kStringGetCard, kStringOnlyParticipation, kStringWhatForIt, kStringMakeOffer,
+	kStringGoodOffer, kStringGiveCard, kStringIdiot, kStringCheckout1, kStringCheckout2,
+	// 375
+	kStringCheckout3, kStringYes2, kStringNo2, kStringCheckout4, kStringCheckout5,
+	kStringCheckout6, kStringCheckout7, kStringCheckout8, kStringCheckout9, kStringCheckout10,
+	kStringCheckout11, kStringCheckout12, kStringCheckout13, kStringCheckout14, kStringCheckout15,
+	kStringCheckout16, kStringCheckout17, kStringCheckout18, kStringCheckout19, kStringCheckout20,
+	kStringCheckout21, kStringCheckout22, kStringCheckout23, kStringCheckout24, kStringCheckout25,
+	// 400
+	kStringCheckout26, kStringCheckout27, kStringCheckout28, kStringCheckout29, kStringCheckout30,
+	kStringCheckout31, kStringCheckout32, kStringCheckout33, kStringCheckout34, kStringCheckout35,
+	kStringCheckout36, kStringCheckout37, kStringCheckout38, kStringCheckout39, kStringCheckout40,
+	kStringCheckout41, kStringCheckout42, kStringCheckout43, kStringCheckout44, kStringCheckout45,
+	kStringCheckout46, kStringCheckout47, kStringCheckout48, kStringCheckout49, kStringAtMusicContest,
+	// 425
+	kStringNoImitation, kStringGoodJoke, kStringCommon, kStringIWillProof, kStringIWillPerform,
+	kStringAppearance32, kStringAppearance1, kStringAppearance2, kStringAppearance3, kStringAppearance4,
+	kStringAppearance5, kStringAppearance6, kStringAppearance7, kStringAppearance8, kStringAppearance9,
+	kStringAppearance10, kStringAppearance11, kStringAppearance12, kStringAppearance13, kStringAppearance14,
+	kStringAppearance15, kStringAppearance16, kStringAppearance17, kStringAppearance18, kStringAppearance19,
+	// 450
+	kStringAppearance20, kStringAppearance21, kStringAppearance22, kStringAppearance23, kStringAppearance24,
+	kStringAppearance25, kStringAppearance26, kStringAppearance27, kStringAppearance28, kStringAppearance29,
+	kStringAppearance30, kStringAppearance31, kStringElevator1, kStringElevator2, kStringElevator3,
+	kStringElevator4, kStringElevator5, kStringElevator6, kStringElevator7, kStringElevator8,
+	kStringElevator9, kStringElevator10, kStringElevator11, kStringElevator12, kStringElevator13,
+	// 475
+	kStringElevator14, kStringElevator15, kStringElevator16, kStringElevator17, kStringElevator18,
+	kStringElevator19, kStringElevator20, kStringElevator21, kStringElevator22, kStringElevator23,
+	kStringElevator24, kStringElevator25, kStringElevator26, kStringElevator27, kStringElevator28,
+	kStringElevator29, kStringElevator30, kStringElevator31, kStringElevator32, kStringElevator33,
+	kStringElevator34, kStringElevator35, kStringElevator36, kStringElevator37, kStringElevator38,
+	// 500
+	kStringElevator39, kStringElevator40, kStringElevator41, kStringElevator42, kStringElevator43,
+	kStringElevator44, kStringElevator45, kStringElevator46, kStringElevator47, kStringElevator48,
+	kStringElevator49, kStringElevator50, kStringElevator51, kStringElevator52, kStringElevator53,
+	kStringElevator54, kStringElevator55, kStringElevator56, kStringElevator57, kStringElevator58,
+	kStringElevator59, kStringElevator60, kStringElevator61, kStringElevator62, kStringElevator63,
+	// 525
+	kStringElevator64, kStringElevator65, kStringApartment1, kStringApartment2, kStringApartment3,
+	kStringApartment4, kStringApartment5, kStringApartment6, kStringApartment7, kStringApartment8,
+	kStringShip0, kStringShip1, kStringShip2, kStringShip3, kStringShip4,
+	kStringShip5, kStringShip6, kStringShip7, kStringShip8, kStringShip9,
+	kStringShip10, kStringShip11, kStringShip12, kStringShip13, kStringShip14,
+	// 550
+	kStringShip15, kStringShip16, kStringShip17, kStringShip18, kStringShip19,
+	kStringFascinating, kStringTaxis, kStringTaxisDescription, kStringAxacussan, kStringParticipationCard,
+	kStringAxacussian, kStringSign1Description, kStringSign2Description, kStringSign3Description, kStringSign4Description,
+	kStringBell, kStringDisplay, kStringKeypad, kStringKeypadDescription, kStringChip,
+	kStringChipDescription, kStringHatch, kStringHatchDescription, kStringMusicSystem, kStringMusicSystemDescription,
+	// 575
+	kStringSpeakers, kStringSpeakersDescription, kStringPencils, kStringPencilsDescription, kStringMetalBlocks,
+	kStringMetalBlocksDescription, kStringImage, kStringImageDescription, kStringCabinet, kStringCabinetDescription,
+	kStringElevator, kStringUnderBed, kStringUnderBedDescription, kStringKey, kStringKeyDescription,
+	kStringSwitch, kStringHandle, kStringHatch2, kStringSpaceSuit, kStringSpaceSuitDescription,
+	kStringCable, kStringCableDescription1, kStringCableDescription2, kStringIntro6, kStringIntro7,
+	// 600
+	kStringIntro8, kStringIntroTV1, kStringIntroTV2, kStringIntroTV3, kStringIntroTV4,
+	kStringIntroTV5, kStringIntroTV6, kStringIntroTV7, kStringIntroTV8, kStringIntroTV9,
+	kStringIntroTV10, kStringIntroTV11, kStringIntroTV12, kStringIntroTV13, kStringIntroTV14,
+	kStringIntroTV15, kStringIntroTV16, kStringIntro9, kStringIntro10, kStringIntro11,
+	kStringIntro12, kStringIntro13, kStringIntro14, kStringMonsterDescription, kStringPyramid16,
+	// 625
+	kStringMuseum11
 };
 }
 


Commit: 1cf7bd073f629638488b9dfaaffef693aac0caf5
    https://github.com/scummvm/scummvm/commit/1cf7bd073f629638488b9dfaaffef693aac0caf5
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix segfault in axacuss

Changed paths:
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova1/state.cpp


diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index f39cbb8..5fe0868 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -3108,8 +3108,9 @@ void AxacussCorridor3::onEntrance() {
 
 void AxacussCorridor4::onEntrance() {
 	_gm->great(4);
-	_gm->corridorOnEntrance();
-	if (_gm->_rooms[GUARD]->isSectionVisible(1))
+	if (_gm->_state._corridorSearch)
+		_gm->busted(0);
+	else if (_gm->_rooms[GUARD]->isSectionVisible(1))
 		_gm->busted(0);
 }
 
@@ -3459,8 +3460,9 @@ AxacussBcorridor::AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm) {
 }
 
 void AxacussBcorridor::onEntrance() {
-	_gm->corridorOnEntrance();
-	if (isSectionVisible(7))
+	if (_gm->_state._corridorSearch)
+		_gm->busted(0);
+	else if (isSectionVisible(7))
 		_gm->busted(-1);
 }
 
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index f3f8bba..e9c4d34 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -653,6 +653,7 @@ void GameManager1::busted(int i) {
 			wait(3);
 			_vm->renderImage(i + 2);
 			shot(0, 0);
+			return;
 		} else if (_currentRoom->getId() == BCORRIDOR)
 			_vm->renderImage(21);
 		else if (_currentRoom->isSectionVisible(4))


Commit: 28f262eaee067a031dd6c7adf940a21c31e86ec2
    https://github.com/scummvm/scummvm/commit/28f262eaee067a031dd6c7adf940a21c31e86ec2
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix translation of "Wundersam!"

Changed paths:
    devtools/create_supernova/gametext.h
    dists/engine-data/supernova.dat


diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 79bc430..93d9a64 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -349,7 +349,7 @@ const char *gameText[] = {
 	"Affenstark!",                           // kStringGenericDescription7
 	// 260
 	"Komisches Ding",                        // kStringStrangeThing
-	"Wundersam",                             // kStringGenericDescription8
+	"Wundersam!",                             // kStringGenericDescription8
 	"Es ist ein Axacussanerkopf auf dem Bild.", // kStringImageDescription3
 	"Pflanze",                               // kStringPlant
 	"Figur",                                 // kStringStatue
diff --git a/dists/engine-data/supernova.dat b/dists/engine-data/supernova.dat
index 63e6bdb..9131925 100644
Binary files a/dists/engine-data/supernova.dat and b/dists/engine-data/supernova.dat differ


Commit: 43131d8e02bbe068cf14995b99660f2da37ec48e
    https://github.com/scummvm/scummvm/commit/43131d8e02bbe068cf14995b99660f2da37ec48e
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add intermediate room classes

Changed paths:
    engines/supernova/supernova1/rooms.h
    engines/supernova/supernova2/rooms.h


diff --git a/engines/supernova/supernova1/rooms.h b/engines/supernova/supernova1/rooms.h
index d45936b..166d796 100644
--- a/engines/supernova/supernova1/rooms.h
+++ b/engines/supernova/supernova1/rooms.h
@@ -38,14 +38,18 @@ namespace Supernova {
 class GameManager1;
 class SupernovaEngine;
 
+class Room1: public Room {
+	protected:
+		GameManager1 *_gm;
+};
+
 // Room 0
-class Intro : public Room {
+class Intro : public Room1 {
 public:
 	Intro(SupernovaEngine *vm, GameManager1 *gm);
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 	bool animate(int section1, int section2, int duration);
 	bool animate(int section1, int section2, int duration, MessagePosition position,
 				 int text);
@@ -62,27 +66,25 @@ private:
 };
 
 // Spaceship
-class ShipCorridor : public Room {
+class ShipCorridor : public Room1 {
 public:
 	ShipCorridor(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipHall: public Room {
+class ShipHall: public Room1 {
 public:
 	ShipHall(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipSleepCabin: public Room {
+class ShipSleepCabin: public Room1 {
 public:
 	ShipSleepCabin(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -91,11 +93,10 @@ public:
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 	byte _color;
 };
 
-class ShipCockpit : public Room {
+class ShipCockpit : public Room1 {
 public:
 	ShipCockpit(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -104,55 +105,49 @@ public:
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 	byte _color;
 };
 
-class ShipCabinL1: public Room {
+class ShipCabinL1: public Room1 {
 public:
 	ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipCabinL2 : public Room {
+class ShipCabinL2 : public Room1 {
 public:
 	ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipCabinL3 : public Room {
+class ShipCabinL3 : public Room1 {
 public:
 	ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipCabinR1 : public Room {
+class ShipCabinR1 : public Room1 {
 public:
 	ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipCabinR2 : public Room {
+class ShipCabinR2 : public Room1 {
 public:
 	ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipCabinR3 : public Room {
+class ShipCabinR3 : public Room1 {
 public:
 	ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -160,18 +155,16 @@ public:
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipCabinBathroom : public Room  {
+class ShipCabinBathroom : public Room1  {
 public:
 	ShipCabinBathroom(SupernovaEngine *vm, GameManager1 *gm);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipAirlock : public Room {
+class ShipAirlock : public Room1 {
 public:
 	ShipAirlock(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -179,10 +172,9 @@ public:
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipHold : public Room {
+class ShipHold : public Room1 {
 public:
 	ShipHold(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -190,40 +182,36 @@ public:
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipLandingModule : public Room {
+class ShipLandingModule : public Room1 {
 public:
 	ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipGenerator : public Room {
+class ShipGenerator : public Room1 {
 public:
 	ShipGenerator(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ShipOuterSpace : public Room {
+class ShipOuterSpace : public Room1 {
 public:
 	ShipOuterSpace(SupernovaEngine *vm, GameManager1 *gm);
 
 private:
-	GameManager1 *_gm;
 };
 
 
 // Arsano
-class ArsanoRocks : public Room {
+class ArsanoRocks : public Room1 {
 public:
 	ArsanoRocks(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -231,18 +219,16 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ArsanoCave : public Room {
+class ArsanoCave : public Room1 {
 public:
 	ArsanoCave(SupernovaEngine *vm, GameManager1 *gm);
 
 private:
-	GameManager1 *_gm;
 };
 
-class ArsanoMeetup : public Room {
+class ArsanoMeetup : public Room1 {
 public:
 	ArsanoMeetup(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -253,10 +239,9 @@ public:
 private:
 	byte _sign;
 	byte _beacon;
-	GameManager1 *_gm;
 };
 
-class ArsanoEntrance : public Room {
+class ArsanoEntrance : public Room1 {
 public:
 	ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -268,10 +253,9 @@ private:
 	int _dialog2[5];
 	int _dialog3[5];
 	byte _eyewitness;
-	GameManager1 *_gm;
 };
 
-class ArsanoRemaining : public Room {
+class ArsanoRemaining : public Room1 {
 public:
 	ArsanoRemaining(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -280,10 +264,9 @@ public:
 private:
 	bool _chewing;
 	int _i;
-	GameManager1 *_gm;
 };
 
-class ArsanoRoger : public Room {
+class ArsanoRoger : public Room1 {
 public:
 	ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -295,10 +278,9 @@ private:
 	int _dialog1[4];
 	byte _eyewitness;
 	byte _hands;
-	GameManager1 *_gm;
 };
 
-class ArsanoGlider : public Room {
+class ArsanoGlider : public Room1 {
 public:
 	ArsanoGlider(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -307,10 +289,9 @@ public:
 
 private:
 	byte _sinus;
-	GameManager1 *_gm;
 };
 
-class ArsanoMeetup2 : public Room {
+class ArsanoMeetup2 : public Room1 {
 public:
 	ArsanoMeetup2(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -325,14 +306,13 @@ private:
 	int _dialog2[2];
 	int _dialog3[4];
 	int _dialog4[3];
-	GameManager1 *_gm;
 
 	// FIXME: Remove following unused bool variables?
 	//bool _found;
 	//bool _flug;
 };
 
-class ArsanoMeetup3 : public Room {
+class ArsanoMeetup3 : public Room1 {
 public:
 	ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -344,12 +324,11 @@ private:
 
 	// TODO: Hack, to be move away and renamed when the other uses are found
 	int _dialogsX[6];
-	GameManager1 *_gm;
 };
 
 
 // Axacuss
-class AxacussCell : public Room {
+class AxacussCell : public Room1 {
 public:
 	AxacussCell(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -358,40 +337,36 @@ public:
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor1 : public Room {
+class AxacussCorridor1 : public Room1 {
 public:
 	AxacussCorridor1(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor2 : public Room {
+class AxacussCorridor2 : public Room1 {
 public:
 	AxacussCorridor2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor3 : public Room {
+class AxacussCorridor3 : public Room1 {
 public:
 	AxacussCorridor3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor4 : public Room {
+class AxacussCorridor4 : public Room1 {
 public:
 	AxacussCorridor4(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -400,10 +375,9 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor5 : public Room {
+class AxacussCorridor5 : public Room1 {
 public:
 	AxacussCorridor5(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -421,10 +395,9 @@ private:
 
 	byte _rows[6];
 
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor6 : public Room {
+class AxacussCorridor6 : public Room1 {
 public:
 	AxacussCorridor6(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -432,20 +405,18 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor7 : public Room {
+class AxacussCorridor7 : public Room1 {
 public:
 	AxacussCorridor7(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual void onEntrance();
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor8 : public Room {
+class AxacussCorridor8 : public Room1 {
 public:
 	AxacussCorridor8(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -453,10 +424,9 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussCorridor9 : public Room {
+class AxacussCorridor9 : public Room1 {
 public:
 	AxacussCorridor9(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -464,10 +434,9 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussBcorridor : public Room {
+class AxacussBcorridor : public Room1 {
 public:
 	AxacussBcorridor(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -475,10 +444,9 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussIntersection : public Room {
+class AxacussIntersection : public Room1 {
 public:
 	AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -486,10 +454,9 @@ public:
 
 private:
 	int _dialogsX[6];
-	GameManager1 *_gm;
 };
 
-class AxacussExit : public Room {
+class AxacussExit : public Room1 {
 public:
 	AxacussExit(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -497,50 +464,45 @@ public:
 
 private:
 	int _dialogsX[6];
-	GameManager1 *_gm;
 };
 
-class AxacussOffice1 : public Room {
+class AxacussOffice1 : public Room1 {
 public:
 	AxacussOffice1(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussOffice2 : public Room {
+class AxacussOffice2 : public Room1 {
 public:
 	AxacussOffice2(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussOffice3 : public Room {
+class AxacussOffice3 : public Room1 {
 public:
 	AxacussOffice3(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussOffice4 : public Room {
+class AxacussOffice4 : public Room1 {
 public:
 	AxacussOffice4(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussOffice5 : public Room {
+class AxacussOffice5 : public Room1 {
 public:
 	AxacussOffice5(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -548,40 +510,36 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussElevator : public Room {
+class AxacussElevator : public Room1 {
 public:
 	AxacussElevator(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussStation : public Room {
+class AxacussStation : public Room1 {
 public:
 	AxacussStation(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class AxacussSign : public Room {
+class AxacussSign : public Room1 {
 public:
 	AxacussSign(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager1 *_gm;
 };
 
-class Outro : public Room {
+class Outro : public Room1 {
 public:
 	Outro(SupernovaEngine *vm, GameManager1 *gm);
 
@@ -596,7 +554,6 @@ private:
 				 MessagePosition position, const char *text);
 
 	Common::String _outroText;
-	GameManager1 *_gm;
 };
 
 }
diff --git a/engines/supernova/supernova2/rooms.h b/engines/supernova/supernova2/rooms.h
index 7f9f272..6d43b4c 100644
--- a/engines/supernova/supernova2/rooms.h
+++ b/engines/supernova/supernova2/rooms.h
@@ -46,14 +46,17 @@ struct RoomEntry {
 	RoomId _exitRoom;
 };
 
+class Room2 : public Room {
+	protected:
+		GameManager2 *_gm;
+};
 
-class Intro2 : public Room {
+class Intro2 : public Room2 {
 public:
 	Intro2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 
 private:
-	GameManager2 *_gm;
 	void titleScreen();
 	bool tvSay(int mod1, int mod2, int rest, MessagePosition pos, int id);
 	bool tvRest(int mod1, int mod2, int rest);
@@ -65,48 +68,40 @@ private:
 	Common::String _introText;
 };
 
-class Airport : public Room {
+class Airport : public Room2 {
 public:
 	Airport(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 
-private:
-	GameManager2 *_gm;
 };
 
-class TaxiStand : public Room {
+class TaxiStand : public Room2 {
 public:
 	TaxiStand(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Street : public Room {
+class Street : public Room2 {
 public:
 	Street(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Games : public Room {
+class Games : public Room2 {
 public:
 	Games(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Cabin2 : public Room {
+class Cabin2 : public Room2 {
 public:
 	Cabin2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
@@ -114,22 +109,19 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager2 *_gm;
 	bool _paid;
 };
 
-class Kiosk : public Room {
+class Kiosk : public Room2 {
 public:
 	Kiosk(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class CulturePalace : public Room {
+class CulturePalace : public Room2 {
 public:
 	CulturePalace(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
@@ -137,11 +129,10 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager2 *_gm;
 	void notEnoughMoney();
 };
 
-class Checkout : public Room {
+class Checkout : public Room2 {
 public:
 	Checkout(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
@@ -149,34 +140,29 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager2 *_gm;
 	void appearance();
 	void shouting();
 };
 
-class City1 : public Room {
+class City1 : public Room2 {
 public:
 	City1(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class City2 : public Room {
+class City2 : public Room2 {
 public:
 	City2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Elevator2 : public Room {
+class Elevator2 : public Room2 {
 public:
 	Elevator2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
@@ -184,22 +170,19 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager2 *_gm;
 	void jobDescription();
 };
 
-class Apartment : public Room {
+class Apartment : public Room2 {
 public:
 	Apartment(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Ship : public Room {
+class Ship : public Room2 {
 public:
 	Ship(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
@@ -209,23 +192,20 @@ public:
 	Common::String _outroText2;
 
 private:
-	GameManager2 *_gm;
 	void kill();
 	void outro();
 };
 
-class Pyramid : public Room {
+class Pyramid : public Room2 {
 public:
 	Pyramid(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class PyrEntrance : public Room {
+class PyrEntrance : public Room2 {
 public:
 	PyrEntrance(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
@@ -233,297 +213,244 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager2 *_gm;
 	uint32 _waitTime;
 };
 
-class Upstairs1 : public Room {
+class Upstairs1 : public Room2 {
 public:
 	Upstairs1(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Downstairs1 : public Room {
+class Downstairs1 : public Room2 {
 public:
 	Downstairs1(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class BottomRightDoor : public Room {
+class BottomRightDoor : public Room2 {
 public:
 	BottomRightDoor(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class BottomLeftDoor : public Room {
+class BottomLeftDoor : public Room2 {
 public:
 	BottomLeftDoor(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Upstairs2 : public Room {
+class Upstairs2 : public Room2 {
 public:
 	Upstairs2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Downstairs2 : public Room {
+class Downstairs2 : public Room2 {
 public:
 	Downstairs2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class UpperDoor : public Room {
+class UpperDoor : public Room2 {
 public:
 	UpperDoor(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class PuzzleFront : public Room {
+class PuzzleFront : public Room2 {
 public:
 	PuzzleFront(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class PuzzleBehind : public Room {
+class PuzzleBehind : public Room2 {
 public:
 	PuzzleBehind(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Formula1F : public Room {
+class Formula1F : public Room2 {
 public:
 	Formula1F(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Formula1N : public Room {
+class Formula1N : public Room2 {
 public:
 	Formula1N(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Formula2F : public Room {
+class Formula2F : public Room2 {
 public:
 	Formula2F(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Formula2N : public Room {
+class Formula2N : public Room2 {
 public:
 	Formula2N(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class TomatoF : public Room {
+class TomatoF : public Room2 {
 public:
 	TomatoF(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class TomatoN : public Room {
+class TomatoN : public Room2 {
 public:
 	TomatoN(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class MonsterF : public Room {
+class MonsterF : public Room2 {
 public:
 	MonsterF(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Monster1N : public Room {
+class Monster1N : public Room2 {
 public:
 	Monster1N(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Monster2N : public Room {
+class Monster2N : public Room2 {
 public:
 	Monster2N(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Upstairs3 : public Room {
+class Upstairs3 : public Room2 {
 public:
 	Upstairs3(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Downstairs3 : public Room {
+class Downstairs3 : public Room2 {
 public:
 	Downstairs3(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class LCorridor1 : public Room {
+class LCorridor1 : public Room2 {
 public:
 	LCorridor1(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class LCorridor2 : public Room {
+class LCorridor2 : public Room2 {
 public:
 	LCorridor2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class HoleRoom : public Room {
+class HoleRoom : public Room2 {
 public:
 	HoleRoom(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class InHole : public Room {
+class InHole : public Room2 {
 public:
 	InHole(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Floordoor : public Room {
+class Floordoor : public Room2 {
 public:
 	Floordoor(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class FloordoorU : public Room {
+class FloordoorU : public Room2 {
 public:
 	FloordoorU(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class BstDoor : public Room {
+class BstDoor : public Room2 {
 public:
 	BstDoor(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
@@ -531,316 +458,259 @@ public:
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
 private:
-	GameManager2 *_gm;
 	char _password[16];
 };
 
-class Hall2 : public Room {
+class Hall2 : public Room2 {
 public:
 	Hall2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class CoffinRoom : public Room {
+class CoffinRoom : public Room2 {
 public:
 	CoffinRoom(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mask : public Room {
+class Mask : public Room2 {
 public:
 	Mask(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Museum : public Room {
+class Museum : public Room2 {
 public:
 	Museum(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class MusEntrance : public Room {
+class MusEntrance : public Room2 {
 public:
 	MusEntrance(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus1 : public Room {
+class Mus1 : public Room2 {
 public:
 	Mus1(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus2 : public Room {
+class Mus2 : public Room2 {
 public:
 	Mus2(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus3 : public Room {
+class Mus3 : public Room2 {
 public:
 	Mus3(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus4 : public Room {
+class Mus4 : public Room2 {
 public:
 	Mus4(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus5 : public Room {
+class Mus5 : public Room2 {
 public:
 	Mus5(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus6 : public Room {
+class Mus6 : public Room2 {
 public:
 	Mus6(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus7 : public Room {
+class Mus7 : public Room2 {
 public:
 	Mus7(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus8 : public Room {
+class Mus8 : public Room2 {
 public:
 	Mus8(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus9 : public Room {
+class Mus9 : public Room2 {
 public:
 	Mus9(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus10 : public Room {
+class Mus10 : public Room2 {
 public:
 	Mus10(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus11 : public Room {
+class Mus11 : public Room2 {
 public:
 	Mus11(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class MusRound : public Room {
+class MusRound : public Room2 {
 public:
 	MusRound(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus12 : public Room {
+class Mus12 : public Room2 {
 public:
 	Mus12(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus13 : public Room {
+class Mus13 : public Room2 {
 public:
 	Mus13(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus14 : public Room {
+class Mus14 : public Room2 {
 public:
 	Mus14(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus15 : public Room {
+class Mus15 : public Room2 {
 public:
 	Mus15(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus16 : public Room {
+class Mus16 : public Room2 {
 public:
 	Mus16(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus17 : public Room {
+class Mus17 : public Room2 {
 public:
 	Mus17(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus18 : public Room {
+class Mus18 : public Room2 {
 public:
 	Mus18(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus19 : public Room {
+class Mus19 : public Room2 {
 public:
 	Mus19(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus20 : public Room {
+class Mus20 : public Room2 {
 public:
 	Mus20(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus21 : public Room {
+class Mus21 : public Room2 {
 public:
 	Mus21(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
-class Mus22 : public Room {
+class Mus22 : public Room2 {
 public:
 	Mus22(SupernovaEngine *vm, GameManager2 *gm);
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
 
-private:
-	GameManager2 *_gm;
 };
 
 }


Commit: 09975e10c2c1e635206d4f3ab9234c6ead358279
    https://github.com/scummvm/scummvm/commit/09975e10c2c1e635206d4f3ab9234c6ead358279
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Remove meaning TODOs from MS2

Changed paths:
    engines/supernova/supernova2/rooms.cpp


diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index 9399444..1ff643f 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -2064,7 +2064,6 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 		_vm->renderImage(12);
 		_gm->wait(18);
-		// TODO some palette stuff
 		outro();
 	} else
 		return false;
@@ -2111,7 +2110,6 @@ void Ship::outro() {
 		g_system->updateScreen();
 		g_system->delayMillis(_vm->_delay);
 	}
-	// TODO: End with some end of music
 	int volume;
 	do {
 		volume = _vm->_sound->getVolume() - 10;


Commit: 5ddc251528b5588b9460d4e00fa90c44b34f6061
    https://github.com/scummvm/scummvm/commit/5ddc251528b5588b9460d4e00fa90c44b34f6061
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Preload exit list on room entry

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/supernova1/state.cpp
    engines/supernova/supernova2/state.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index b5bbe2e..e6a6943 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -689,6 +689,15 @@ void GameManager::roomBrightness() {
 void GameManager::changeRoom(RoomId id) {
 	_currentRoom = _rooms[id];
 	_newRoom = true;
+
+	for (int i = 0; i < 25; i++)
+		_exitList[i] = -1;
+	for (int i = 0; i < kMaxObject; i++) {
+		if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
+			byte r = _currentRoom->getObject(i)->_direction;
+			_exitList[r] = i;
+		}
+	}
 }
 
 void GameManager::wait(int ticks) {
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index e9c4d34..1f9c81b 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -1067,15 +1067,12 @@ void GameManager1::shock() {
 }
 
 void GameManager1::drawMapExits() {
-// TODO: Preload _exitList on room entry instead on every call
 	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
 
-	for (int i = 0; i < 25; i++)
-		_exitList[i] = -1;
-	for (int i = 0; i < kMaxObject; i++) {
-		if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
-			byte r = _currentRoom->getObject(i)->_direction;
-			_exitList[r] = i;
+	int idx;
+	for (int i = 0; i < 25; i++) {
+		if ((idx = _exitList[i]) != -1) {
+			byte r = _currentRoom->getObject(idx)->_direction;
 			int x = 284 + 7 * (r % 5);
 			int y = 164 + 7 * (r / 5);
 			_vm->renderBox(x, y, 5, 5, kColorDarkRed);
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index b280b77..1b2d28a 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -451,19 +451,16 @@ void GameManager2::handleTime() {
 }
 
 void GameManager2::drawMapExits() {
-// TODO: Preload _exitList on room entry instead on every call
 	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
 
 	if ((_currentRoom >= _rooms[PYR_ENTRANCE] && _currentRoom <= _rooms[HOLE_ROOM]) ||
 		(_currentRoom >= _rooms[FLOORDOOR] && _currentRoom <= _rooms[BST_DOOR]))
 		compass();
 	else {
-		for (int i = 0; i < 25; i++)
-			_exitList[i] = -1;
-		for (int i = 0; i < kMaxObject; i++) {
-			if (_currentRoom->getObject(i)->hasProperty(EXIT)) {
-				byte r = _currentRoom->getObject(i)->_direction;
-				_exitList[r] = i;
+		int idx;
+		for (int i = 0; i < 25; i++) {
+			if ((idx = _exitList[i]) != -1) {
+				byte r = _currentRoom->getObject(idx)->_direction;
 				int x = 284 + 7 * (r % 5);
 				int y = 164 + 7 * (r / 5);
 				_vm->renderBox(x, y, 5, 5, kColorDarkRed);


Commit: fbf6a912cbc66b205ee85f32891e36029e386e10
    https://github.com/scummvm/scummvm/commit/fbf6a912cbc66b205ee85f32891e36029e386e10
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Resolve same MS1 TODOs

Changed paths:
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova1/rooms.h


diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index 5fe0868..41b2338 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -31,6 +31,12 @@
 
 namespace Supernova {
 
+Room1::Room1() {
+	_dialogsX[0] = kStringDialogX1;
+	_dialogsX[1] = kStringDialogX2;
+	_dialogsX[2] = kStringDialogX3;
+}
+
 Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
 	_vm = vm;
 	_gm = gm;
@@ -2720,10 +2726,6 @@ ArsanoMeetup3::ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm) {
 	_dialog2[3] = kStringDialogArsanoMeetup3_3;
 	_dialog3[0] = kStringDialogArsanoMeetup3_4;
 	_dialog3[1] = kStringDialogArsanoMeetup3_5;
-
-	_dialogsX[0] = kStringDialogX1;
-	_dialogsX[1] = kStringDialogX2;
-	_dialogsX[2] = kStringDialogX3;
 }
 
 bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
@@ -3557,10 +3559,6 @@ AxacussIntersection::AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm)
 	_objectState[3] = Object(_id, kStringAxacussan, kStringAxacussanDescription, GUARDIAN, TALK, 0, 0, 0);
 	_objectState[4] = Object(_id, kStringImage, kStringImageDescription2, NULLOBJECT, NULLTYPE, 2, 2, 0);
 	_objectState[5] = Object(_id, kStringMastercard, kStringMastercardDescription, MASTERKEYCARD, TAKE | COMBINABLE, 255, 255, 1);
-
-	_dialogsX[0] = kStringDialogX1;
-	_dialogsX[1] = kStringDialogX2;
-	_dialogsX[2] = kStringDialogX3;
 }
 
 bool AxacussIntersection::interact(Action verb, Object &obj1, Object &obj2) {
@@ -3608,10 +3606,6 @@ AxacussExit::AxacussExit(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[4] = Object(_id, kStringLamp2,kStringDefaultDescription,LAMP,COMBINABLE,3,3,0);
 	_objectState[5] = Object(_id, kStringAxacussan,kStringDefaultDescription,GUARDIAN,TALK,5,5,0);
 	_objectState[6] = Object(_id, kStringImage,kStringGenericDescription5,NULLOBJECT,NULLTYPE,4,4,0);
-
-	_dialogsX[0] = kStringDialogX1;
-	_dialogsX[1] = kStringDialogX2;
-	_dialogsX[2] = kStringDialogX3;
 }
 
 bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
diff --git a/engines/supernova/supernova1/rooms.h b/engines/supernova/supernova1/rooms.h
index 166d796..aa11817 100644
--- a/engines/supernova/supernova1/rooms.h
+++ b/engines/supernova/supernova1/rooms.h
@@ -39,8 +39,11 @@ class GameManager1;
 class SupernovaEngine;
 
 class Room1: public Room {
+	public:
+		Room1();
 	protected:
 		GameManager1 *_gm;
+	int _dialogsX[6];
 };
 
 // Room 0
@@ -306,10 +309,6 @@ private:
 	int _dialog2[2];
 	int _dialog3[4];
 	int _dialog4[3];
-
-	// FIXME: Remove following unused bool variables?
-	//bool _found;
-	//bool _flug;
 };
 
 class ArsanoMeetup3 : public Room1 {
@@ -321,9 +320,6 @@ public:
 private:
 	int _dialog2[4];
 	int _dialog3[2];
-
-	// TODO: Hack, to be move away and renamed when the other uses are found
-	int _dialogsX[6];
 };
 
 
@@ -451,9 +447,6 @@ public:
 	AxacussIntersection(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	int _dialogsX[6];
 };
 
 class AxacussExit : public Room1 {
@@ -461,9 +454,6 @@ public:
 	AxacussExit(SupernovaEngine *vm, GameManager1 *gm);
 
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	int _dialogsX[6];
 };
 
 class AxacussOffice1 : public Room1 {


Commit: 8f7b10a5dec7f3f7ca2d422e24d682ea6551fce3
    https://github.com/scummvm/scummvm/commit/8f7b10a5dec7f3f7ca2d422e24d682ea6551fce3
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add tool to create image datafiles.

Changed paths:
  A devtools/create_supernova2/create_image/015/clickfield_info
  A devtools/create_supernova2/create_image/015/free_tile.xcf
  A devtools/create_supernova2/create_image/015/image0.bmp
  A devtools/create_supernova2/create_image/015/image1.bmp
  A devtools/create_supernova2/create_image/015/image10.bmp
  A devtools/create_supernova2/create_image/015/image11.bmp
  A devtools/create_supernova2/create_image/015/image12.bmp
  A devtools/create_supernova2/create_image/015/image13.bmp
  A devtools/create_supernova2/create_image/015/image14.bmp
  A devtools/create_supernova2/create_image/015/image15.bmp
  A devtools/create_supernova2/create_image/015/image16.bmp
  A devtools/create_supernova2/create_image/015/image17.bmp
  A devtools/create_supernova2/create_image/015/image18.bmp
  A devtools/create_supernova2/create_image/015/image19.bmp
  A devtools/create_supernova2/create_image/015/image2.bmp
  A devtools/create_supernova2/create_image/015/image3.bmp
  A devtools/create_supernova2/create_image/015/image4.bmp
  A devtools/create_supernova2/create_image/015/image5.bmp
  A devtools/create_supernova2/create_image/015/image6.bmp
  A devtools/create_supernova2/create_image/015/image7.bmp
  A devtools/create_supernova2/create_image/015/image8.bmp
  A devtools/create_supernova2/create_image/015/image9.bmp
  A devtools/create_supernova2/create_image/015/palette
  A devtools/create_supernova2/create_image/015/section_info
  A devtools/create_supernova2/create_image/README
  A devtools/create_supernova2/create_image/create_image.cpp
  A devtools/create_supernova2/create_image/create_ms2_data.015.sh
  A devtools/create_supernova2/create_image/module.mk
    devtools/create_supernova2/module.mk


diff --git a/devtools/create_supernova2/create_image/015/clickfield_info b/devtools/create_supernova2/create_image/015/clickfield_info
new file mode 100644
index 0000000..14d95f6
--- /dev/null
+++ b/devtools/create_supernova2/create_image/015/clickfield_info
@@ -0,0 +1,115 @@
+19
+
+123
+134
+49
+63
+0
+
+135
+146
+49
+63
+0
+
+147
+158
+49
+63
+0
+
+159
+170
+49
+63
+0
+
+171
+182
+49
+63
+0
+
+183
+194
+49
+63
+0
+
+123
+134
+64
+77
+0
+
+135
+146
+64
+77
+0
+
+147
+158
+64
+77
+0
+
+159
+170
+64
+77
+0
+
+171
+182
+64
+77
+0
+
+183
+194
+64
+77
+0
+
+135
+146
+78
+91
+0
+
+147
+158
+78
+91
+0
+
+159
+170
+78
+91
+0
+
+171
+182
+78
+91
+0
+
+84
+235
+7
+131
+0
+
+0
+24
+0
+137
+0
+
+295
+319
+0
+137
+0
diff --git a/devtools/create_supernova2/create_image/015/free_tile.xcf b/devtools/create_supernova2/create_image/015/free_tile.xcf
new file mode 100644
index 0000000..cae6311
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/free_tile.xcf differ
diff --git a/devtools/create_supernova2/create_image/015/image0.bmp b/devtools/create_supernova2/create_image/015/image0.bmp
new file mode 100644
index 0000000..dbe9d24
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image0.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image1.bmp b/devtools/create_supernova2/create_image/015/image1.bmp
new file mode 100644
index 0000000..afee16b
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image1.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image10.bmp b/devtools/create_supernova2/create_image/015/image10.bmp
new file mode 100644
index 0000000..b7bd16f
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image10.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image11.bmp b/devtools/create_supernova2/create_image/015/image11.bmp
new file mode 100644
index 0000000..7bc12dc
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image11.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image12.bmp b/devtools/create_supernova2/create_image/015/image12.bmp
new file mode 100644
index 0000000..27c3822
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image12.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image13.bmp b/devtools/create_supernova2/create_image/015/image13.bmp
new file mode 100644
index 0000000..4757b8c
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image13.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image14.bmp b/devtools/create_supernova2/create_image/015/image14.bmp
new file mode 100644
index 0000000..1f4ac7f
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image14.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image15.bmp b/devtools/create_supernova2/create_image/015/image15.bmp
new file mode 100644
index 0000000..784f3a1
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image15.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image16.bmp b/devtools/create_supernova2/create_image/015/image16.bmp
new file mode 100644
index 0000000..1f4ac7f
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image16.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image17.bmp b/devtools/create_supernova2/create_image/015/image17.bmp
new file mode 100644
index 0000000..01a0a95
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image17.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image18.bmp b/devtools/create_supernova2/create_image/015/image18.bmp
new file mode 100644
index 0000000..6989ef9
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image18.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image19.bmp b/devtools/create_supernova2/create_image/015/image19.bmp
new file mode 100644
index 0000000..f5a5afd
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image19.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image2.bmp b/devtools/create_supernova2/create_image/015/image2.bmp
new file mode 100644
index 0000000..b7bd16f
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image2.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image3.bmp b/devtools/create_supernova2/create_image/015/image3.bmp
new file mode 100644
index 0000000..2d646d9
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image3.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image4.bmp b/devtools/create_supernova2/create_image/015/image4.bmp
new file mode 100644
index 0000000..77493cb
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image4.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image5.bmp b/devtools/create_supernova2/create_image/015/image5.bmp
new file mode 100644
index 0000000..784f3a1
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image5.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image6.bmp b/devtools/create_supernova2/create_image/015/image6.bmp
new file mode 100644
index 0000000..1f4ac7f
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image6.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image7.bmp b/devtools/create_supernova2/create_image/015/image7.bmp
new file mode 100644
index 0000000..77493cb
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image7.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image8.bmp b/devtools/create_supernova2/create_image/015/image8.bmp
new file mode 100644
index 0000000..e8047cb
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image8.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/image9.bmp b/devtools/create_supernova2/create_image/015/image9.bmp
new file mode 100644
index 0000000..6935736
Binary files /dev/null and b/devtools/create_supernova2/create_image/015/image9.bmp differ
diff --git a/devtools/create_supernova2/create_image/015/palette b/devtools/create_supernova2/create_image/015/palette
new file mode 100644
index 0000000..1829779
--- /dev/null
+++ b/devtools/create_supernova2/create_image/015/palette
@@ -0,0 +1,77 @@
+76
+50 50 50
+0 0 0
+28 25 20
+15 13 11
+55 34 21
+57 38 20
+58 38 21
+24 21 17
+49 10 10
+26 23 19
+53 38 17
+22 19 16
+20 18 14
+20 20 20
+56 38 19
+34 29 9
+36 36 36
+40 40 40
+63 39 24
+51 38 16
+50 37 15
+54 38 18
+34 31 25
+47 37 14
+43 36 11
+46 37 13
+44 36 12
+49 37 14
+49 10 10
+30 27 22
+19 7 3
+34 29 9
+40 10 8
+27 9 5
+42 36 11
+34 34 34
+40 37 30
+44 10 9
+23 8 4
+23 21 17
+30 27 24
+31 9 6
+36 10 7
+35 31 28
+45 43 39
+38 35 28
+31 28 23
+43 43 43
+32 28 26
+37 34 27
+32 29 24
+34 31 25
+35 32 26
+18 16 13
+43 41 37
+40 36 30
+44 40 33
+42 38 32
+19 17 14
+38 35 29
+36 33 27
+36 32 29
+21 19 16
+34 31 26
+46 42 35
+29 26 21
+42 39 35
+23 21 17
+29 26 21
+31 28 23
+33 29 24
+27 24 20
+25 22 18
+40 38 34
+37 34 31
+39 36 32
diff --git a/devtools/create_supernova2/create_image/015/section_info b/devtools/create_supernova2/create_image/015/section_info
new file mode 100644
index 0000000..2000012
--- /dev/null
+++ b/devtools/create_supernova2/create_image/015/section_info
@@ -0,0 +1,161 @@
+20
+
+0
+319
+0
+137
+0
+0
+0
+
+123
+134
+49
+62
+0
+44160
+0
+
+135
+146
+49
+62
+0
+44328
+0
+
+147
+158
+49
+62
+0
+44496
+0
+
+159
+170
+49
+62
+0
+44664
+0
+
+171
+182
+49
+62
+0
+44832
+0
+
+183
+194
+49
+62
+0
+45000
+0
+
+123
+134
+63
+76
+0
+45168
+0
+
+135
+146
+63
+76
+0
+45336
+0
+
+147
+158
+63
+76
+0
+45504
+0
+
+159
+170
+63
+76
+0
+45672
+0
+
+171
+182
+63
+76
+0
+45840
+0
+
+183
+194
+63
+76
+0
+46008
+0
+
+135
+146
+77
+90
+0
+46176
+0
+
+147
+158
+77
+90
+0
+46344
+0
+
+159
+170
+77
+90
+0
+46512
+0
+
+171
+182
+77
+90
+0
+46680
+0
+
+84
+235
+6
+131
+0
+46848
+0
+
+84
+235
+39
+131
+0
+464
+1
+
+84
+235
+93
+131
+0
+14600
+1
diff --git a/devtools/create_supernova2/create_image/README b/devtools/create_supernova2/create_image/README
new file mode 100644
index 0000000..80c898f
--- /dev/null
+++ b/devtools/create_supernova2/create_image/README
@@ -0,0 +1,87 @@
+This tool can be used to generate Mission Supernova 2 datafiles containing images
+and might be able to do the same even for Mission Supernova 1.
+
+The tool is not foolproof and a lot of checks are missing (since it's just a tool),
+so it could easily generate nonsense without any warning if for example command line
+arguments aren't as expected.
+
+To use this tool create a folder named as the number of the datafile you want to
+create, it should be 3 characters long, add required numbers of zeros to the begining
+of the name (015 for ms2_data.015).
+
+Inside this folder should be:
+
+--clickfield_info, this contains info about clickfields. On the first row should be a
+number saying how many clickfields there are and on the following rows are
+descripitons of individual clickfields in this order (x1, x2, y1, y2, next),
+for example:
+	2
+
+	123
+	134
+	49
+	63
+	0
+
+	135
+	146
+	49
+	63
+	0
+
+This would be the contents of a file describing 2 clickfields.
+
+--section_info similar to the clickfield_info. Contains info about sections. On the
+first row should be a number saying how many sections there are and on the following
+rows are descripitons of individual sections in this order
+(x1, x2, y1, y2, next, addressLow, addressHigh), for example:
+	2
+
+	0
+	319
+	0
+	137
+	0
+	0
+	0
+
+	123
+	134
+	49
+	62
+	0
+	44160
+	0
+
+This would be the contents of a file describing 2 sections
+
+--palette Contains info about palette. On the first row should be a number saying
+how many colors there are and on the following rows are the individual RGB values of
+colors (don't forget, that the engine shifts each color by 2 places to the left
+(brightening the image), so the palette basicaly has to be shifted by 2 to the right
+to get the right colors). For example:
+3
+50 50 50
+0 0 0
+28 25 20
+
+This would be the contents of a file containing palette with 3 colors.
+
+--image#.bmp For each section, there has to be image#.bmp, replace the '#' by the
+number of section this image belongs to. The image has to use indexes to the palette
+for storing the color of each pixel (Image -> Mode -> Indexed... in gimp).
+
+
+Running the tool
+The tool needs 3 comand line arguments when running it:
+-- Prefix of the file to be created (use "ms2_data" to create "ms2_data.###")
+-- Number of the file to be created and also the number of a folder to read all the 
+files from (use "15" to create prefix.015)
+-- Number of bytes to skip in each .bmp file. At the begining of each .bmp file is
+a header with information about the file and after that is stored the palette. This
+tool doesn't need these, so this number says how many bytes to skip to get to the pixel
+data. For example: use 1146 to generate ms2_data.015 from the files included.
+
+Be aware, this tool does only basic checks of comandline arguments and no checks of
+the input files (only their presence).
+
diff --git a/devtools/create_supernova2/create_image/create_image.cpp b/devtools/create_supernova2/create_image/create_image.cpp
new file mode 100644
index 0000000..9600f0c
--- /dev/null
+++ b/devtools/create_supernova2/create_image/create_image.cpp
@@ -0,0 +1,178 @@
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <cstring>
+#include <iomanip>
+#include <cstdlib>
+
+std::string filenumber;
+
+int writePalette(std::ofstream &output) {
+	std::string filename = filenumber + "/palette";
+	std::ifstream palette(filename.c_str());
+	if (!palette.is_open()) {
+		std::cerr << "Couldn't open palette file";
+		return 1;
+	}
+	int input;
+	do {
+		palette >> input;
+		if (palette.eof())
+			break;
+		output << (char) input;
+	} while(true);
+	palette.close();
+	return 0;
+}
+
+int writeSections(std::ofstream &output) {
+	std::string filename = filenumber + "/section_info";
+	std::ifstream sectionInfo(filename.c_str());
+	if (!sectionInfo.is_open()) {
+		std::cerr << "Couldn't open section_info file";
+		return 0;
+	}
+	int numSections;
+	sectionInfo >> numSections;
+	output << (char) numSections;
+
+	int input;
+	char *input_byte = (char *) &input;
+	for(int i = 0; i < numSections; i++) {
+		//x1
+		sectionInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//x2
+		sectionInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//y1
+		sectionInfo >> input;
+		output << (char)input;
+		//y2
+		sectionInfo >> input;
+		output << (char)input;
+		//next
+		sectionInfo >> input;
+		output << (char)input;
+		//addressLow
+		sectionInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//addressHigh
+		sectionInfo >> input;
+		output << (char)input;
+	}
+	sectionInfo.close();
+	return numSections;
+}
+
+int writeClickFields(std::ofstream &output) {
+	std::string filename = filenumber + "/clickfield_info";
+	std::ifstream clickFieldInfo(filename.c_str());
+	if (!clickFieldInfo.is_open()) {
+		std::cerr << "Couldn't open clickfield_info file";
+		return 1;
+	}
+	int numClickFields;
+	clickFieldInfo >> numClickFields;
+	output << (char) numClickFields;
+
+	int input;
+	char *input_byte = (char *) &input;
+	for(int i = 0; i < numClickFields; i++) {
+		//x1
+		clickFieldInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//x2
+		clickFieldInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//y1
+		clickFieldInfo >> input;
+		output << (char)input;
+		//y2
+		clickFieldInfo >> input;
+		output << (char)input;
+		//next
+		clickFieldInfo >> input;
+		output << (char)input;
+	}
+	clickFieldInfo.close();
+	return 0;
+}
+
+int writePixelData(std::ofstream &output, int imageNum, int skip) {
+	std::ostringstream fileName;
+	fileName << filenumber << "/image" << imageNum << ".bmp";
+	std::ifstream image(fileName.str().c_str(), std::ios::binary);
+	if (!image.is_open()) {
+		std::cerr << "Couldn't open " << fileName.str() << " file";
+		return 1;
+	}
+
+	image.seekg(0, image.end);
+	int length = image.tellg();
+	length -= skip;
+	image.seekg(skip, image.beg);
+	char *buf = new char[length];
+	image.read(buf, length);
+	output.write(buf, length);
+	delete buf;
+	return 0;
+}
+
+void printHelp() {
+	std::cout << "create_image output-prefix file-number bytes-skip" << std::endl << std::endl;
+	std::cout << "	output-prefix: String the created file should begin with" << std::endl;
+	std::cout << "	file-number: Number of the created file and also name of source folder" << std::endl;
+	std::cout << "	bytes-skip: How many bytes to to skip in each .bmp file" << std::endl;
+	std::cout << std::endl << "EXAMPLE:" << std::endl
+		<< "create_image ms2_data 15 1146" << std::endl
+		<< "	creates ms2_data.015 assuming there are the right files inside 015 folder" << std::endl;
+}
+
+int main(int argc, char *argv[]) {
+	if (argc == 2 && !strcmp(argv[1], "--help")) {
+		printHelp();
+		return 0;
+	}
+	if (argc != 4 ) {
+		printHelp();
+		return 1;
+	}
+	std::ostringstream oss;
+	oss << std::setfill('0') << std::setw(3) << argv[2];
+	filenumber = oss.str();
+	char *ptr;
+	int bytesSkip = strtol(argv[3], &ptr, 10);
+	std::string oFileName = argv[1];
+	oFileName += "." + filenumber;
+	std::ofstream output(oFileName.c_str(), std::ios::binary);
+	if (!output.is_open()) {
+		std::cerr << "Couldn't open output file";
+		return 1;
+	}
+	// size
+	// don't know how to determine that yet
+	output << (char) 0x40;
+	output << (char) 0x70;
+	output << (char) 0x01;
+	output << (char) 0x00;
+	if (writePalette(output))
+		return 1;
+	int numImages = writeSections(output);
+	if (numImages == 0)
+		return 1;
+	if (writeClickFields(output))
+		return 1;
+	// we don't compress the images, so set to 0
+	output << (char) 0; //numRepeat
+	output << (char) 0; //numZw
+	for (int i = 0; i < numImages; i++)
+		writePixelData(output, i, bytesSkip);
+	output.close();
+	return 0;
+}
diff --git a/devtools/create_supernova2/create_image/create_ms2_data.015.sh b/devtools/create_supernova2/create_image/create_ms2_data.015.sh
new file mode 100755
index 0000000..883cff6
--- /dev/null
+++ b/devtools/create_supernova2/create_image/create_ms2_data.015.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+./create_image ms2_data 15 1146
diff --git a/devtools/create_supernova2/create_image/module.mk b/devtools/create_supernova2/create_image/module.mk
new file mode 100644
index 0000000..cb99dfe
--- /dev/null
+++ b/devtools/create_supernova2/create_image/module.mk
@@ -0,0 +1,10 @@
+MODULE := devtools/create_supernova2/create_image
+
+MODULE_OBJS := create_image.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_image
+
+# Include common rules
+include $(srcdir)/rules.mk
+
diff --git a/devtools/create_supernova2/module.mk b/devtools/create_supernova2/module.mk
index f157fde..9c3d671 100644
--- a/devtools/create_supernova2/module.mk
+++ b/devtools/create_supernova2/module.mk
@@ -10,3 +10,6 @@ TOOL_EXECUTABLE := create_supernova2
 
 # Include common rules
 include $(srcdir)/rules.mk
+
+include $(srcdir)/devtools/create_supernova2/create_image/module.mk
+.PHONY: $(srcdir)/devtools/create_supernova2/create_image/module.mk


Commit: 80c1cd9e613b9204e4eb095c5dc788526c9b6006
    https://github.com/scummvm/scummvm/commit/80c1cd9e613b9204e4eb095c5dc788526c9b6006
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Implement MS datafile loading to .dat

Changed paths:
  A devtools/create_supernova2/ms2_data.015-en
    devtools/create_supernova2/create_supernova2.cpp


diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp
index cca2a73..009a743 100644
--- a/devtools/create_supernova2/create_supernova2.cpp
+++ b/devtools/create_supernova2/create_supernova2.cpp
@@ -19,6 +19,49 @@ const char *lang[] = {
 	"en",
 	NULL
 };
+void writeDatafile(File& outputFile, int fileNumber, const char* language) {
+	File dataFile;
+	char fileName[20];
+	sprintf(fileName, "ms2_data.%03d-%s", fileNumber, language);
+	if (!dataFile.open(fileName, kFileReadMode)) {
+		printf("Cannot find dataFile 'ms2_data.%3d' for language '%s'. This file will be skipped.\n", fileNumber, language);
+		return;
+	}
+
+	// Write block header in output file (4 bytes).
+	// M(fileNumber) for example M015
+	char number[4];
+	sprintf(number, "%03d", fileNumber);
+	outputFile.writeByte('M');
+	for (int i = 0 ; i < 3 ; ++i) {
+			outputFile.writeByte(number[i]);
+	}
+	// And write the language code on 4 bytes as well (padded with 0 if needed).
+	int languageLength = strlen(language);
+	for (int i = 0 ; i < 4 ; ++i) {
+		if (i < languageLength)
+			outputFile.writeByte(language[i]);
+		else
+			outputFile.writeByte(0);
+	}
+
+	// Write block size
+	
+	dataFile.seek(0, SEEK_END);
+	int length = dataFile.pos();
+	dataFile.seek(0, SEEK_SET);
+	outputFile.writeLong(length);
+
+	// Write all the bytes. We should have w * h / 8 bytes
+	// However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
+	// but pbm uses 0 for white and 1 for black.
+	for (int i = 0 ; i < length; ++i) {
+		byte b = dataFile.readByte();
+		outputFile.writeByte(b);
+	}
+
+	dataFile.close();
+}
 
 void writeImage(File& outputFile, const char *name, const char* language) {
 	File imgFile;
@@ -240,6 +283,7 @@ int main(int argc, char *argv[]) {
 	// Other languages
 	const char **l = &lang[0];
 	while(*l) {
+		writeDatafile(outputFile, 15, *l);
 		writeImage(outputFile, "img1", *l);
 	//	writeImage(outputFile, "img2", *l);
 		writeStrings(outputFile, *l);
diff --git a/devtools/create_supernova2/ms2_data.015-en b/devtools/create_supernova2/ms2_data.015-en
new file mode 100644
index 0000000..2b05057
Binary files /dev/null and b/devtools/create_supernova2/ms2_data.015-en differ


Commit: 12f4211fb22141de409becced10826a926a28fe8
    https://github.com/scummvm/scummvm/commit/12f4211fb22141de409becced10826a926a28fe8
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Load MS2 datafiles from .dat file.

Changed paths:
    engines/supernova/graphics.cpp
    engines/supernova/graphics.h


diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index af3a1b3..479a12e 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -25,6 +25,7 @@
 #include "common/stream.h"
 #include "common/system.h"
 #include "common/config-manager.h"
+#include "common/memstream.h"
 #include "graphics/palette.h"
 #include "graphics/surface.h"
 
@@ -69,6 +70,7 @@ MSNImage::~MSNImage() {
 
 bool MSNImage::init(int filenumber) {
 	Common::File file;
+	_filenumber = filenumber;
 	if (_MSPart == 1) {
 		if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
 			warning("Image data file msn_data.%03d could not be read!", filenumber);
@@ -76,19 +78,19 @@ bool MSNImage::init(int filenumber) {
 		}
 	}
 	else if (_MSPart == 2) {
-		if (!file.open(Common::String::format("ms2_data.%03d", filenumber))) {
-			warning("Image data file ms2_data.%03d could not be read!", filenumber);
-			return false;
+		if (!loadFromEngineDataFile()) {
+			if (!file.open(Common::String::format("ms2_data.%03d", filenumber))) {
+				warning("Image data file ms2_data.%03d could not be read!", filenumber);
+				return false;
+			}
+			loadStream(file);
 		}
 	}
 
-	_filenumber = filenumber;
-	loadStream(file);
-
 	return true;
 }
 
-bool MSNImage::loadFromEngineDataFile() {
+bool MSNImage::loadPbmFromEngineDataFile() {
 	Common::String name;
 	Common::File f;
 	char id[5], lang[5];
@@ -149,6 +151,47 @@ bool MSNImage::loadFromEngineDataFile() {
 	return false;
 }
 
+bool MSNImage::loadFromEngineDataFile() {
+	Common::String name;
+	Common::File f;
+	char id[5], lang[5];
+	id[4] = lang[4] = '\0';
+	if (_MSPart == 1) {
+		return false;
+	} else if (_MSPart == 2) {
+		if (_filenumber == 15)
+			name = "M015";
+		else
+			return false;
+
+		if (!f.open(SUPERNOVA2_DAT))
+			return false;
+
+		f.read(id, 3);
+		if (strncmp(id, "MS2", 3) != 0)
+			return false;
+		int version = f.readByte();
+		if (version != SUPERNOVA2_DAT_VERSION)
+			return false;
+	}
+
+	Common::String cur_lang = ConfMan.get("language");
+
+	while (!f.eos()) {
+		f.read(id, 4);
+		f.read(lang, 4);
+		uint32 size = f.readUint32LE();
+		if (f.eos())
+			break;
+		if (name == id && cur_lang == lang) {
+			return loadStream(*f.readStream(size));
+		} else
+			f.skip(size);
+	}
+
+	return false;
+}
+
 bool MSNImage::loadStream(Common::SeekableReadStream &stream) {
 	destroy();
 
@@ -211,7 +254,7 @@ bool MSNImage::loadStream(Common::SeekableReadStream &stream) {
 
 	// Newspaper images may be in the engine data file. So first try to read
 	// it from there.
-	if (!loadFromEngineDataFile()) {
+	if (!loadPbmFromEngineDataFile()) {
 		// Load the image from the stream
 		byte zwCodes[256] = {0};
 		byte numRepeat = stream.readByte();
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index 5a790ec..c69d650 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -81,6 +81,7 @@ public:
 private:
 	int _MSPart;
 	bool loadFromEngineDataFile();
+	bool loadPbmFromEngineDataFile();
 	bool loadSections();
 };
 


Commit: 3a08ad99d920fb233d2d8f9b9d5cdd4faf126754
    https://github.com/scummvm/scummvm/commit/3a08ad99d920fb233d2d8f9b9d5cdd4faf126754
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix palette in translated ms2_data.015

Changed paths:
    devtools/create_supernova2/create_image/015/palette
    devtools/create_supernova2/ms2_data.015-en


diff --git a/devtools/create_supernova2/create_image/015/palette b/devtools/create_supernova2/create_image/015/palette
index 1829779..075b385 100644
--- a/devtools/create_supernova2/create_image/015/palette
+++ b/devtools/create_supernova2/create_image/015/palette
@@ -1,4 +1,168 @@
-76
+239
+
+0 0 0
+5 5 5
+8 8 8
+11 11 11
+14 14 14
+17 17 17
+20 20 20
+24 24 24
+28 28 28
+32 32 32
+36 36 36
+40 40 40
+45 45 45
+50 50 50
+56 56 56
+63 63 63
+0 0 63
+16 0 63
+31 0 63
+47 0 63
+63 0 63
+63 0 47
+63 0 31
+63 0 16
+63 0 0
+63 16 0
+63 31 0
+63 47 0
+63 63 0
+47 63 0
+31 63 0
+16 63 0
+0 63 0
+0 63 16
+0 63 31
+0 63 47
+0 63 63
+0 47 63
+0 31 63
+0 16 63
+31 31 63
+39 31 63
+47 31 63
+55 31 63
+63 31 63
+63 31 55
+63 31 47
+63 31 39
+63 31 31
+63 39 31
+63 47 31
+63 55 31
+63 63 31
+55 63 31
+47 63 31
+39 63 31
+31 63 31
+31 63 39
+31 63 47
+31 63 55
+31 63 63
+31 55 63
+31 47 63
+31 39 63
+45 45 63
+49 45 63
+54 45 63
+58 45 63
+63 45 63
+63 45 58
+63 45 54
+63 45 49
+63 45 45
+63 49 45
+63 54 45
+63 58 45
+63 63 45
+58 63 45
+54 63 45
+49 63 45
+45 63 45
+45 63 49
+45 63 54
+45 63 58
+45 63 63
+45 58 63
+45 54 63
+45 49 63
+0 0 28
+7 0 28
+14 0 28
+21 0 28
+28 0 28
+28 0 21
+28 0 14
+28 0 7
+28 0 0
+28 7 0
+28 14 0
+28 21 0
+28 28 0
+21 28 0
+14 28 0
+7 28 0
+0 28 0
+0 28 7
+0 28 14
+0 28 21
+0 28 28
+0 21 28
+0 14 28
+0 7 28
+14 14 28
+17 14 28
+21 14 28
+24 14 28
+28 14 28
+28 14 24
+28 14 21
+28 14 17
+28 14 14
+28 17 14
+28 21 14
+28 24 14
+28 28 14
+24 28 14
+21 28 14
+17 28 14
+14 28 14
+14 28 17
+14 28 21
+14 28 24
+14 28 28
+14 24 28
+14 21 28
+14 17 28
+20 20 28
+22 20 28
+24 20 28
+26 20 28
+28 20 28
+28 20 26
+28 20 24
+28 20 22
+28 20 20
+28 22 20
+28 24 20
+28 26 20
+28 28 20
+26 28 20
+24 28 20
+22 28 20
+20 28 20
+20 28 22
+20 28 24
+20 28 26
+20 28 28
+20 26 28
+20 24 28
+20 22 28
+0 0 16
+4 0 16
+8 0 16
 50 50 50
 0 0 0
 28 25 20
diff --git a/devtools/create_supernova2/ms2_data.015-en b/devtools/create_supernova2/ms2_data.015-en
index 2b05057..d099458 100644
Binary files a/devtools/create_supernova2/ms2_data.015-en and b/devtools/create_supernova2/ms2_data.015-en differ


Commit: 061d14e7996cce22a2012aea8514a58c10c5ee74
    https://github.com/scummvm/scummvm/commit/061d14e7996cce22a2012aea8514a58c10c5ee74
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add ciphered text image translation.

Changed paths:
  A devtools/create_supernova2/create_image/028/clickfield_info
  A devtools/create_supernova2/create_image/028/image0.bmp
  A devtools/create_supernova2/create_image/028/palette
  A devtools/create_supernova2/create_image/028/section_info
  A devtools/create_supernova2/create_image/create_ms2_data.028.sh
  A devtools/create_supernova2/ms2_data.028-en
    devtools/create_supernova2/create_supernova2.cpp
    engines/supernova/graphics.cpp
    engines/supernova/screen.cpp


diff --git a/devtools/create_supernova2/create_image/028/clickfield_info b/devtools/create_supernova2/create_image/028/clickfield_info
new file mode 100644
index 0000000..6207269
--- /dev/null
+++ b/devtools/create_supernova2/create_image/028/clickfield_info
@@ -0,0 +1,7 @@
+1
+
+0
+319
+0
+199
+0
diff --git a/devtools/create_supernova2/create_image/028/image0.bmp b/devtools/create_supernova2/create_image/028/image0.bmp
new file mode 100644
index 0000000..9333191
Binary files /dev/null and b/devtools/create_supernova2/create_image/028/image0.bmp differ
diff --git a/devtools/create_supernova2/create_image/028/palette b/devtools/create_supernova2/create_image/028/palette
new file mode 100644
index 0000000..18fcc1f
--- /dev/null
+++ b/devtools/create_supernova2/create_image/028/palette
@@ -0,0 +1,179 @@
+177
+
+0 0 0
+10 10 10
+10 10 10
+11 11 11
+11 11 11
+12 12 12
+13 13 13
+13 13 13
+13 13 13
+13 13 13
+14 14 14
+14 14 14
+14 14 14
+15 15 15
+15 15 15
+15 15 15
+15 15 15
+16 16 16
+16 16 16
+16 16 16
+16 16 16
+17 17 17
+17 17 17
+17 17 17
+17 17 17
+18 18 18
+18 18 18
+18 18 18
+18 18 18
+19 19 19
+19 19 19
+19 19 19
+19 19 19
+20 20 20
+20 20 20
+20 20 20
+20 20 20
+21 21 21
+21 21 21
+21 21 21
+21 21 21
+22 22 22
+22 22 22
+22 22 22
+22 22 22
+23 23 23
+23 23 23
+23 23 23
+23 23 23
+24 24 24
+24 24 24
+24 24 24
+24 24 24
+25 25 25
+25 25 25
+25 25 25
+25 25 25
+26 26 26
+26 26 26
+26 26 26
+26 26 26
+27 27 27
+27 27 27
+27 27 27
+27 27 27
+28 28 28
+28 28 28
+28 28 28
+28 28 28
+29 29 29
+29 29 29
+29 29 29
+29 29 29
+30 30 30
+30 30 30
+30 30 30
+30 30 30
+31 31 31
+31 31 31
+31 31 31
+31 31 31
+32 32 32
+32 32 32
+32 32 32
+32 32 32
+33 33 33
+33 33 33
+33 33 33
+33 33 33
+34 34 34
+34 34 34
+34 34 34
+34 34 34
+35 35 35
+35 35 35
+35 35 35
+35 35 35
+36 36 36
+36 36 36
+36 36 36
+36 36 36
+37 37 37
+37 37 37
+37 37 37
+37 37 37
+38 38 38
+38 38 38
+38 38 38
+38 38 38
+39 39 39
+39 39 39
+39 39 39
+39 39 39
+40 40 40
+40 40 40
+40 40 40
+40 40 40
+41 41 41
+41 41 41
+41 41 41
+41 41 41
+42 42 42
+42 42 42
+42 42 42
+42 42 42
+43 43 43
+43 43 43
+43 43 43
+43 43 43
+44 44 44
+44 44 44
+44 44 44
+44 44 44
+45 45 45
+45 45 45
+45 45 45
+45 45 45
+46 46 46
+46 46 46
+46 46 46
+46 46 46
+47 47 47
+47 47 47
+47 47 47
+47 47 47
+48 48 48
+48 48 48
+48 48 48
+48 48 48
+49 49 49
+49 49 49
+49 49 49
+49 49 49
+50 50 50
+50 50 50
+50 50 50
+50 50 50
+51 51 51
+51 51 51
+51 51 51
+51 51 51
+52 52 52
+52 52 52
+52 52 52
+52 52 52
+53 53 53
+53 53 53
+53 53 53
+53 53 53
+54 54 54
+54 54 54
+54 54 54
+54 54 54
+55 55 55
+55 55 55
+55 55 55
+55 55 55
diff --git a/devtools/create_supernova2/create_image/028/section_info b/devtools/create_supernova2/create_image/028/section_info
new file mode 100644
index 0000000..5ced3d3
--- /dev/null
+++ b/devtools/create_supernova2/create_image/028/section_info
@@ -0,0 +1,9 @@
+1
+
+0
+319
+0
+199
+0
+0
+0
diff --git a/devtools/create_supernova2/create_image/create_ms2_data.028.sh b/devtools/create_supernova2/create_image/create_ms2_data.028.sh
new file mode 100755
index 0000000..66fda85
--- /dev/null
+++ b/devtools/create_supernova2/create_image/create_ms2_data.028.sh
@@ -0,0 +1 @@
+./create_image ms2_data 28 829
diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp
index 009a743..24d79f1 100644
--- a/devtools/create_supernova2/create_supernova2.cpp
+++ b/devtools/create_supernova2/create_supernova2.cpp
@@ -284,8 +284,7 @@ int main(int argc, char *argv[]) {
 	const char **l = &lang[0];
 	while(*l) {
 		writeDatafile(outputFile, 15, *l);
-		writeImage(outputFile, "img1", *l);
-	//	writeImage(outputFile, "img2", *l);
+		writeDatafile(outputFile, 28, *l);
 		writeStrings(outputFile, *l);
 		++l;
 	}
diff --git a/devtools/create_supernova2/ms2_data.028-en b/devtools/create_supernova2/ms2_data.028-en
new file mode 100644
index 0000000..5ac4fed
Binary files /dev/null and b/devtools/create_supernova2/ms2_data.028-en differ
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index 479a12e..a858181 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -161,6 +161,8 @@ bool MSNImage::loadFromEngineDataFile() {
 	} else if (_MSPart == 2) {
 		if (_filenumber == 15)
 			name = "M015";
+		else if (_filenumber == 28)
+			name = "M028";
 		else
 			return false;
 
@@ -292,16 +294,15 @@ bool MSNImage::loadStream(Common::SeekableReadStream &stream) {
 bool MSNImage::loadSections() {
 	bool isNewspaper = (_MSPart == 1 && (_filenumber == 1 || _filenumber == 2)) ||
 					   (_MSPart == 2 && _filenumber == 38);
-	bool isCypheredText = _MSPart == 2 && _filenumber == 28 && ConfMan.get("language") == "en";
-	int imageWidth = isNewspaper || isCypheredText ? 640 : 320;
-	int imageHeight = isNewspaper || isCypheredText ? 480 : 200;
+	int imageWidth = isNewspaper ? 640 : 320;
+	int imageHeight = isNewspaper ? 480 : 200;
 	_pitch = imageWidth;
 
 	for (int section = 0; section < _numSections; ++section) {
 		Graphics::Surface *surface = new Graphics::Surface;
 		_sectionSurfaces.push_back(surface);
 
-		if (isNewspaper || isCypheredText) {
+		if (isNewspaper) {
 			Color color1 = isNewspaper ? kColorWhite63 : kColorWhite44;
 			surface->create(imageWidth, imageHeight, g_system->getScreenFormat());
 			byte *surfacePixels = static_cast<byte *>(surface->getPixels());
diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index 5cdbb4c..6a76dac 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -375,8 +375,7 @@ void Screen::renderImageSection(const MSNImage *image, int section, bool invert)
 	if (_vm->_MSPart == 1)
 		bigImage = image->_filenumber == 1 || image->_filenumber == 2;
 	else if (_vm->_MSPart == 2)
-		bigImage = image->_filenumber == 38 ||
-						(image->_filenumber == 28 && ConfMan.get("language") == "en");
+		bigImage = image->_filenumber == 38;
 	if (bigImage) {
 		sectionRect.setWidth(640);
 		sectionRect.setHeight(480);


Commit: 28a70bb615ab7e1afff37ca975ad28f6c2a7bdd0
    https://github.com/scummvm/scummvm/commit/28a70bb615ab7e1afff37ca975ad28f6c2a7bdd0
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix german save and load feature.

Changed paths:
    engines/supernova/detection.cpp


diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index b68c44c..f6fe201 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -135,9 +135,9 @@ bool SupernovaMetaEngine::createInstance(OSystem *syst, Engine **engine, const A
 SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
 	Common::StringArray filenames;
 	Common::String pattern;
-	if (!strcmp(target, "msn1"))
+	if (!strncmp(target, "msn1", 4))
 		pattern = Common::String::format("msn_save.###");
-	if (!strcmp(target, "msn2"))
+	if (!strncmp(target, "msn2", 4))
 		pattern = Common::String::format("ms2_save.###");
 
 	filenames = g_system->getSavefileManager()->listSavefiles(pattern);
@@ -150,8 +150,8 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
 			Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(*file);
 			if (savefile) {
 				uint saveHeader = savefile->readUint32LE();
-				if ((saveHeader == SAVEGAME_HEADER && !strcmp(target, "msn1")) ||
-					(saveHeader == SAVEGAME_HEADER2 && !strcmp(target, "msn2"))) {
+				if ((saveHeader == SAVEGAME_HEADER && !strncmp(target, "msn1", 4)) ||
+					(saveHeader == SAVEGAME_HEADER2 && !strncmp(target, "msn2", 4))) {
 					byte saveVersion = savefile->readByte();
 					if (saveVersion <= SAVEGAME_VERSION) {
 						int saveFileDescSize = savefile->readSint16LE();
@@ -172,25 +172,25 @@ SaveStateList SupernovaMetaEngine::listSaves(const char *target) const {
 
 void SupernovaMetaEngine::removeSaveState(const char *target, int slot) const {
 	Common::String filename;
-	if (!strcmp(target, "msn1"))
+	if (!strncmp(target, "msn1", 4))
 		filename = Common::String::format("msn_save.%03d", slot);
-	if (!strcmp(target, "msn2"))
+	if (!strncmp(target, "msn2", 4))
 		filename = Common::String::format("ms2_save.%03d", slot);
 	g_system->getSavefileManager()->removeSavefile(filename);
 }
 
 SaveStateDescriptor SupernovaMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
 	Common::String fileName;
-	if (!strcmp(target, "msn1"))
+	if (!strncmp(target, "msn1", 4))
 		fileName = Common::String::format("msn_save.%03d", slot);
-	if (!strcmp(target, "msn2"))
+	if (!strncmp(target, "msn2", 4))
 		fileName = Common::String::format("ms2_save.%03d", slot);
 	Common::InSaveFile *savefile = g_system->getSavefileManager()->openForLoading(fileName);
 
 	if (savefile) {
 		uint saveHeader = savefile->readUint32LE();
-		if ((!strcmp(target, "msn1") && saveHeader != SAVEGAME_HEADER) || 
-			(!strcmp(target, "msn2") && saveHeader != SAVEGAME_HEADER2)) {
+		if ((!strncmp(target, "msn1", 4) && saveHeader != SAVEGAME_HEADER) || 
+			(!strncmp(target, "msn2", 4) && saveHeader != SAVEGAME_HEADER2)) {
 			delete savefile;
 			return SaveStateDescriptor();
 		}


Commit: b0e386b0147129017e8a0ed531332585f086aa11
    https://github.com/scummvm/scummvm/commit/b0e386b0147129017e8a0ed531332585f086aa11
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix MS1 image loading

Changed paths:
    engines/supernova/graphics.cpp


diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index a858181..ed17ebe 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -76,6 +76,7 @@ bool MSNImage::init(int filenumber) {
 			warning("Image data file msn_data.%03d could not be read!", filenumber);
 			return false;
 		}
+		loadStream(file);
 	}
 	else if (_MSPart == 2) {
 		if (!loadFromEngineDataFile()) {


Commit: a4ca2a838f739a53894e05100acf468788eca21b
    https://github.com/scummvm/scummvm/commit/a4ca2a838f739a53894e05100acf468788eca21b
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: When dead return back to main loop ASAP

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/game-manager.h
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova1/state.cpp
    engines/supernova/supernova2/rooms.cpp
    engines/supernova/supernova2/state.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index e6a6943..2d00374 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -922,6 +922,7 @@ void GameManager::dead(int messageId) {
 	_vm->paletteFadeIn();
 
 	_guiEnabled = true;
+	_dead = true;
 }
 
 int GameManager::invertSection(int section) {
diff --git a/engines/supernova/game-manager.h b/engines/supernova/game-manager.h
index 5ee747f..1700ab8 100644
--- a/engines/supernova/game-manager.h
+++ b/engines/supernova/game-manager.h
@@ -152,6 +152,7 @@ public:
 	byte _rows[6];
 	byte _rowsStart[6];
 	int32 _time;
+	bool _dead;
 
 	void takeObject(Object &obj);
 	void setObjectNull(Object *&obj);
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index 41b2338..77d0eac 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -3499,8 +3499,10 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
 		else {
 			_vm->renderImage(1);
 			_vm->playSound(kAudioDoorOpen);
-			if (getObject(4)->hasProperty(CAUGHT))
+			if (getObject(4)->hasProperty(CAUGHT)) {
 				_gm->busted(11);
+				return true;
+			}
 			getObject(4)->resetProperty(EXIT | OPENABLE | OPENED);
 		}
 	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR2) && !getObject(5)->hasProperty(OPENED)) {
@@ -3509,8 +3511,10 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
 		else {
 			_vm->renderImage(2);
 			_vm->playSound(kAudioDoorOpen);
-			if (getObject(5)->hasProperty(CAUGHT))
+			if (getObject(5)->hasProperty(CAUGHT)) {
 				_gm->busted(16);
+				return true;
+			}
 			getObject(5)->resetProperty(EXIT | OPENABLE | OPENED);
 		}
 	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR3) && !getObject(6)->hasProperty(OPENED)) {
@@ -3519,8 +3523,10 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
 		else {
 			_vm->renderImage(3);
 			_vm->playSound(kAudioDoorOpen);
-			if (getObject(6)->hasProperty(CAUGHT))
+			if (getObject(6)->hasProperty(CAUGHT)) {
 				_gm->busted(15);
+				return true;
+			}
 			getObject(6)->resetProperty(EXIT | OPENABLE | OPENED);
 		}
 	} else if ((verb == ACTION_USE) && Object::combine(obj1, obj2, MASTERKEYCARD, DOOR4) && !getObject(7)->hasProperty(OPENED)) {
@@ -3529,8 +3535,10 @@ bool AxacussBcorridor::interact(Action verb, Object &obj1, Object &obj2) {
 		} else {
 			_vm->renderImage(4);
 			_vm->playSound(kAudioDoorOpen);
-			if (getObject(7)->hasProperty(CAUGHT))
+			if (getObject(7)->hasProperty(CAUGHT)) {
 				_gm->busted(20);
+				return true;
+			}
 			getObject(7)->resetProperty(EXIT | OPENABLE | OPENED);
 		}
 	} else if ((verb == ACTION_LOOK) && (obj1._id >= DOOR1) && (obj1._id <= DOOR4)) {
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index 1f9c81b..2dd2a1d 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -296,6 +296,7 @@ void GameManager1::initState() {
 	_state._dream = false;
 
 	_prevImgId = 0;
+	_dead = false;
 }
 
 void GameManager1::initRooms() {
@@ -1502,6 +1503,10 @@ void GameManager1::handleInput() {
 void GameManager1::executeRoom() {
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
 		handleInput();
+		if (_dead) {
+			_dead = false;
+			return;
+		}
 		if (_mouseClicked) {
 			Common::Event event;
 			event.type = Common::EVENT_MOUSEMOVE;
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index 1ff643f..6feebef 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -1977,8 +1977,10 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		else if (isSectionVisible(9)) {
 			_vm->renderImage(9 + 128);
 			_vm->renderImage(11);
-			if (!_shown[kMaxSection - 1])
+			if (!_shown[kMaxSection - 1]) {
 				kill();
+				return true;
+			}
 			_objectState[6]._click = 8;
 			_gm->wait(2);
 			_vm->renderImage(4);
@@ -1989,8 +1991,10 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 			_objectState[2]._description = kStringDefaultDescription;
 		} else {
 			_vm->renderImage(10);
-			if (!_shown[kMaxSection - 1])
+			if (!_shown[kMaxSection - 1]) {
 				kill();
+				return true;
+			}
 			_objectState[6]._click = 7;
 		}
 	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, DOOR_SWITCH) && isSectionVisible(7)) {
@@ -2004,8 +2008,10 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		else if (isSectionVisible(10)) {
 			_vm->renderImage(10 + 128);
 			_vm->renderImage(11);
-			if (!_shown[kMaxSection - 1])
+			if (!_shown[kMaxSection - 1]) {
 				kill();
+				return true;
+			}
 			_objectState[6]._click = 8;
 			_gm->wait(2);
 			_vm->renderImage(4);
@@ -4742,6 +4748,8 @@ bool Mus22::interact(Action verb, Object &obj1, Object &obj2) {
 		else {
 			_vm->renderMessage(kStringMuseum21);
 			_gm->crack(20);
+			if (_gm->_dead)
+				return true;
 			if (!_gm->_state._alarmOn) {
 				_vm->renderMessage(kStringMuseum22);
 				_vm->playSound(kAudioSuccess2);
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index 1b2d28a..01f425d 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -296,6 +296,7 @@ void GameManager2::initState() {
 	int16 startPuzzleTab[15] = {12, 3, 14, 1, 11, 0, 2, 13, 9, 5, 4, 10, 7, 6, 8};
 	for (int i = 0; i < 15; i++)
 		_state._puzzleTab[i] = startPuzzleTab[i];
+	_dead = false;
 }
 
 void GameManager2::initRooms() {
@@ -728,6 +729,10 @@ void GameManager2::executeRoom() {
 		_vm->_sound->playSiren();
 	if (_processInput && !_vm->_screen->isMessageShown() && _guiEnabled) {
 		handleInput();
+		if (_dead) {
+			_dead = false;
+			return;
+		}
 		if (_mouseClicked) {
 			Common::Event event;
 			event.type = Common::EVENT_MOUSEMOVE;
@@ -750,6 +755,10 @@ void GameManager2::executeRoom() {
 			drawMapExits();
 		else
 			drawClock();
+		if (_dead) {
+			_dead = false;
+			return;
+		}
 		drawInventory();
 		drawStatus();
 		drawCommandBox();
@@ -1331,6 +1340,7 @@ void GameManager2::drawClock() {
 		//arrow();
 		_state._alarmCracked = false;
 		caught();
+		return;
 	}
 	for (int i = 0; i < 3; i++) {
 		Object *o = r->getObject(i);
@@ -1363,7 +1373,7 @@ void GameManager2::crack(int time) {
 		zv = z;
 		drawClock();
 		t++;
-	} while (t < time && _state._alarmOn == _alarmBefore);
+	} while (t < time && _state._alarmOn == _alarmBefore && !_dead);
 	_cracking = false;
 	_vm->_screen->changeCursor(ResourceManager::kCursorNormal);
 	if (_state._alarmOn == _alarmBefore)
@@ -1373,6 +1383,8 @@ void GameManager2::crack(int time) {
 bool GameManager2::crackDoor(int time) {
 	_vm->renderMessage(kStringMuseum15);
 	crack(time);
+	if (_dead)
+		return false;
 	if (_state._alarmOn != _alarmBefore) {
 		waitOnInput(_messageDuration);
 		_vm->removeMessage();


Commit: 24ff7b26ff43eb37daa1ca0ca3f9ad2817c11f41
    https://github.com/scummvm/scummvm/commit/24ff7b26ff43eb37daa1ca0ca3f9ad2817c11f41
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix some room comparison issues.

Changed paths:
    engines/supernova/supernova2/state.cpp


diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index 01f425d..2b227dc 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -454,8 +454,8 @@ void GameManager2::handleTime() {
 void GameManager2::drawMapExits() {
 	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
 
-	if ((_currentRoom >= _rooms[PYR_ENTRANCE] && _currentRoom <= _rooms[HOLE_ROOM]) ||
-		(_currentRoom >= _rooms[FLOORDOOR] && _currentRoom <= _rooms[BST_DOOR]))
+	if ((_currentRoom->getId() >= PYR_ENTRANCE && _currentRoom->getId() <= HOLE_ROOM) ||
+		(_currentRoom->getId() >= FLOORDOOR && _currentRoom->getId() <= BST_DOOR))
 		compass();
 	else {
 		int idx;
@@ -1276,26 +1276,26 @@ void GameManager2::alarm() {
 void GameManager2::caught() {
 	if (_vm->_screen->isMessageShown())
 		_vm->removeMessage();
-	if        (_currentRoom <  _rooms[MUS1]) {
-	} else if (_currentRoom <= _rooms[MUS2]) {
+	if        (_currentRoom->getId() <  MUS1) {
+	} else if (_currentRoom->getId() <= MUS2) {
 		_vm->renderImage( 8); 
 		_vm->renderImage(18);
-	} else if (_currentRoom == _rooms[MUS3]) {
+	} else if (_currentRoom->getId() == MUS3) {
 		_vm->renderImage(12); 
 		_vm->renderImage(30);
-	} else if (_currentRoom == _rooms[MUS4]) {
+	} else if (_currentRoom->getId() == MUS4) {
 		_vm->renderImage( 8); 
 		_vm->renderImage(18);
-	} else if (_currentRoom == _rooms[MUS5]) {
+	} else if (_currentRoom->getId() == MUS5) {
 		_vm->renderImage( 9); 
 		_vm->renderImage(29);
-	} else if (_currentRoom <= _rooms[MUS7]) {
+	} else if (_currentRoom->getId() <= MUS7) {
 		_vm->renderImage( 7); 
 		_vm->renderImage(17);
-	} else if (_currentRoom <= _rooms[MUS9]) {
+	} else if (_currentRoom->getId() <= MUS9) {
 		_vm->renderImage( 1); 
 		_vm->renderImage( 7);
-	} else if (_currentRoom <= _rooms[MUS11]) {
+	} else if (_currentRoom->getId() <= MUS11) {
 		_vm->renderImage( 2); 
 		_vm->renderImage( 8);
 	}
@@ -1487,7 +1487,7 @@ void GameManager2::pressureAlarmCount() {
 	if (!(_state._alarmOn ||
 			(_currentRoom == _rooms[MUS22] && _currentRoom->isSectionVisible(6)))) {
 		_state._pressureCounter++;
-		if ((_currentRoom >= _rooms[MUS12] && _state._pressureCounter > 8) || 
+		if ((_currentRoom->getId() >= MUS12 && _state._pressureCounter > 8) || 
 				_state._pressureCounter > 16)
 			alarm();
 	}


Commit: c1317bb9c7b8c3d3164919de31f064d54de78994
    https://github.com/scummvm/scummvm/commit/c1317bb9c7b8c3d3164919de31f064d54de78994
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Finish pyramid door translation

Change password to TOAST, remove subtitle on room entrance

Changed paths:
    engines/supernova/supernova2/rooms.cpp


diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index 6feebef..43adab1 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -3554,7 +3554,7 @@ BstDoor::BstDoor(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[18] = Object(_id, kStringDoor, kStringMassive, DOOR, EXIT | OPENABLE | CLOSED, 16, 16, 0, HALL2, 2);
 
 	char germanPassword[16] =  {0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0};
-	char englishPassword[16] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
+	char englishPassword[16] = {0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0};
 	if (ConfMan.get("language") == "en")
 		for (int i = 0; i < 16; i++)
 			_password[i] = englishPassword[i];
@@ -3564,8 +3564,6 @@ BstDoor::BstDoor(SupernovaEngine *vm, GameManager2 *gm) {
 }
 
 void BstDoor::onEntrance() {
-	if (ConfMan.get("language") == "en")
-		_vm->_screen->renderMessage("You are almost there", kMessageNormal, 105, 130);
 }
 
 void BstDoor::animation() {


Commit: 61975aa2e2cb8f432b58d7c1c4af6110fbf9d81d
    https://github.com/scummvm/scummvm/commit/61975aa2e2cb8f432b58d7c1c4af6110fbf9d81d
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add improved mode

Changed paths:
    engines/supernova/detection.cpp
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova2/rooms.cpp


diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index f6fe201..417d06f 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -29,9 +29,13 @@
 
 #include "supernova/supernova.h"
 
+#define GAMEOPTION_IMPROVED GUIO_GAMEOPTIONS1
+
 static const PlainGameDescriptor supernovaGames[] = {
 	{"msn1", "Mission Supernova 1"},
 	{"msn2", "Mission Supernova 2"},
+	{"msn1-i", "Mission Supernova 1 improved"},
+	{"msn2-i", "Mission Supernova 2 improved"},
 	{nullptr, nullptr}
 };
 
@@ -56,6 +60,24 @@ static const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE,
 		GUIO1(GUIO_NONE)
 	},
+	{
+		"msn1-i",
+		nullptr,
+		AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163),
+		Common::DE_DEU,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GAMEOPTION_IMPROVED)
+	},
+	{
+		"msn1-i",
+		nullptr,
+		AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163),
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GAMEOPTION_IMPROVED)
+	},
 	// Mission Supernova 2
 	{
 		"msn2",
@@ -75,6 +97,24 @@ static const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE,
 		GUIO1(GUIO_NONE)
 	},
+	{
+		"msn2-i",
+		nullptr,
+		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
+		Common::DE_DEU,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GAMEOPTION_IMPROVED)
+	},
+	{
+		"msn2-i",
+		nullptr,
+		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
+		Common::EN_ANY,
+		Common::kPlatformDOS,
+		ADGF_UNSTABLE,
+		GUIO1(GAMEOPTION_IMPROVED)
+	},
 	AD_TABLE_END_MARKER
 };
 }
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 0324e88..c225c7c 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -87,7 +87,8 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
 	, _sleepAutoSave(nullptr)
 	, _sleepAuoSaveVersion(-1)
 	, _delay(33)
-	, _textSpeed(kTextSpeed[2]) {
+	, _textSpeed(kTextSpeed[2])
+	, _improved(false) {
 	if (ConfMan.hasKey("textspeed"))
 		_textSpeed = ConfMan.getInt("textspeed");
 
@@ -95,7 +96,13 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
 		_MSPart = 1;
 	else if (ConfMan.get("gameid") == "msn2")
 		_MSPart = 2;
-	else
+	else if (ConfMan.get("gameid") == "msn1-i") {
+		_MSPart = 1;
+		_improved = true;
+	} else if (ConfMan.get("gameid") == "msn2-i") {
+		_MSPart = 2;
+		_improved = true;
+	} else
 		_MSPart = 0;
 	DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
 }
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index b357f6e..55a021d 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -90,6 +90,7 @@ public:
 	uint _delay;
 	int  _textSpeed;
 	char _MSPart;
+	bool _improved;
 
 	Common::Error loadGameStrings();
 	void init();
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index 77d0eac..6d2fdd5 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -1339,10 +1339,26 @@ bool ShipAirlock::interact(Action verb, Object &obj1, Object &obj2) {
 }
 
 void ShipAirlock::onEntrance() {
-	if (!hasSeen())
+	if (!isSectionVisible(kMaxSection - 1)) {
 		_vm->renderMessage(kStringShipAirlock4);
+		setSectionVisible(kMaxSection -1, kShownTrue);
+	}
+	if (_vm->_improved && isSectionVisible(kMaxSection - 2)) {
+		if (_objectState[0].hasProperty(OPENED)) {
+			_objectState[4].setProperty(WORN);
+			_objectState[5].setProperty(WORN);
+			_objectState[6].setProperty(WORN);
+			interact(ACTION_PRESS, _objectState[2], _gm->_nullObject);
+			interact(ACTION_PRESS, _objectState[3], _gm->_nullObject);
+		} else {
+			_objectState[4].disableProperty(WORN);
+			_objectState[5].disableProperty(WORN);
+			_objectState[6].disableProperty(WORN);
+			interact(ACTION_PRESS, _objectState[3], _gm->_nullObject);
+			interact(ACTION_PRESS, _objectState[2], _gm->_nullObject);
+		}
+	}
 
-	setRoomSeen(true);
 }
 
 ShipHold::ShipHold(SupernovaEngine *vm, GameManager1 *gm) {
@@ -1419,6 +1435,7 @@ bool ShipHold::interact(Action verb, Object &obj1, Object &obj2) {
 void ShipHold::onEntrance() {
 	if (!hasSeen())
 		_vm->renderMessage(kStringShipHold2);
+	_gm->_rooms[AIRLOCK]->setSectionVisible(kMaxSection - 2, kShownTrue);
 	setRoomSeen(true);
 	_gm->_rooms[COCKPIT]->setRoomSeen(true);
 }
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index 43adab1..edfc389 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -2728,7 +2728,8 @@ bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
 	if (_gm->move(verb, obj1)) {
 		_gm->passageConstruction();
 		_gm->_newRoom = true;
-	} else if (verb == ACTION_PRESS && obj1._id >= PART0 && obj1._id <= PART15) {
+	} else if ((verb == ACTION_PRESS || (verb == ACTION_WALK && _vm->_improved))
+			&& obj1._id >= PART0 && obj1._id <= PART15) {
 		int pos = obj1._id - PART0;
 		int newPos = 0;
 		if (pos > 3  && _gm->_puzzleField[pos - 4] == 255)
@@ -3573,7 +3574,8 @@ bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
 	if (_gm->move(verb, obj1)) {
 		_gm->passageConstruction();
 		_gm->_newRoom = true;
-	} else if (verb == ACTION_PRESS && obj1._id >= BST1 && obj1._id <= BST16) {
+	} else if ((verb == ACTION_PRESS || (verb == ACTION_WALK && _vm->_improved))
+			&& obj1._id >= BST1 && obj1._id <= BST16) {
 		int number = obj1._id - (BST1 - 1);
 		if (isSectionVisible(number))
 			_vm->renderImage(number + 128);


Commit: 7ea4d0359704998ebb7e8dbe1fbf4a838c902023
    https://github.com/scummvm/scummvm/commit/7ea4d0359704998ebb7e8dbe1fbf4a838c902023
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add size computation to create_image.

Changed paths:
    devtools/create_supernova2/create_image/028/palette
    devtools/create_supernova2/create_image/create_image.cpp
    devtools/create_supernova2/ms2_data.015-en
    devtools/create_supernova2/ms2_data.028-en
    engines/supernova/graphics.cpp


diff --git a/devtools/create_supernova2/create_image/028/palette b/devtools/create_supernova2/create_image/028/palette
index 18fcc1f..bb77e05 100644
--- a/devtools/create_supernova2/create_image/028/palette
+++ b/devtools/create_supernova2/create_image/028/palette
@@ -1,4 +1,4 @@
-177
+239
 
 0 0 0
 10 10 10
@@ -177,3 +177,65 @@
 55 55 55
 55 55 55
 55 55 55
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
diff --git a/devtools/create_supernova2/create_image/create_image.cpp b/devtools/create_supernova2/create_image/create_image.cpp
index 9600f0c..1bf1e24 100644
--- a/devtools/create_supernova2/create_image/create_image.cpp
+++ b/devtools/create_supernova2/create_image/create_image.cpp
@@ -11,7 +11,7 @@ int writePalette(std::ofstream &output) {
 	std::string filename = filenumber + "/palette";
 	std::ifstream palette(filename.c_str());
 	if (!palette.is_open()) {
-		std::cerr << "Couldn't open palette file";
+		std::cerr << "Couldn't open palette file" << std::endl;
 		return 1;
 	}
 	int input;
@@ -29,7 +29,7 @@ int writeSections(std::ofstream &output) {
 	std::string filename = filenumber + "/section_info";
 	std::ifstream sectionInfo(filename.c_str());
 	if (!sectionInfo.is_open()) {
-		std::cerr << "Couldn't open section_info file";
+		std::cerr << "Couldn't open section_info file" << std::endl;
 		return 0;
 	}
 	int numSections;
@@ -72,7 +72,7 @@ int writeClickFields(std::ofstream &output) {
 	std::string filename = filenumber + "/clickfield_info";
 	std::ifstream clickFieldInfo(filename.c_str());
 	if (!clickFieldInfo.is_open()) {
-		std::cerr << "Couldn't open clickfield_info file";
+		std::cerr << "Couldn't open clickfield_info file" << std::endl;
 		return 1;
 	}
 	int numClickFields;
@@ -109,8 +109,8 @@ int writePixelData(std::ofstream &output, int imageNum, int skip) {
 	fileName << filenumber << "/image" << imageNum << ".bmp";
 	std::ifstream image(fileName.str().c_str(), std::ios::binary);
 	if (!image.is_open()) {
-		std::cerr << "Couldn't open " << fileName.str() << " file";
-		return 1;
+		std::cerr << "Couldn't open " << fileName.str() << " file" << std::endl;
+		return 0;
 	}
 
 	image.seekg(0, image.end);
@@ -121,7 +121,7 @@ int writePixelData(std::ofstream &output, int imageNum, int skip) {
 	image.read(buf, length);
 	output.write(buf, length);
 	delete buf;
-	return 0;
+	return length;
 }
 
 void printHelp() {
@@ -152,11 +152,11 @@ int main(int argc, char *argv[]) {
 	oFileName += "." + filenumber;
 	std::ofstream output(oFileName.c_str(), std::ios::binary);
 	if (!output.is_open()) {
-		std::cerr << "Couldn't open output file";
+		std::cerr << "Couldn't open output file" << std::endl;
 		return 1;
 	}
 	// size
-	// don't know how to determine that yet
+	// just a place holder, will be filled later
 	output << (char) 0x40;
 	output << (char) 0x70;
 	output << (char) 0x01;
@@ -171,8 +171,32 @@ int main(int argc, char *argv[]) {
 	// we don't compress the images, so set to 0
 	output << (char) 0; //numRepeat
 	output << (char) 0; //numZw
-	for (int i = 0; i < numImages; i++)
-		writePixelData(output, i, bytesSkip);
+	int totalLength = 0;
+	int oldLength = 0;
+	for (int i = 0; i < numImages; i++) {
+		totalLength += writePixelData(output, i, bytesSkip);
+		if (oldLength == totalLength) {
+			std::cerr << "Error while reading the image number: " << i << std::endl; 
+			return 1;
+		}
+		oldLength = totalLength;
+	}
+
+	//reversing the size computation inside the engine
+	totalLength += 15;
+	totalLength /= 16;
+	totalLength -= 0x70;
+	int i = (totalLength & 0xf000) >> 12;
+	int j = totalLength << 4;
+	char *i_p = (char *) &i;
+	char *j_p = (char *) &j;
+
+	//writing the size
+	output.seekp(0);
+	output << j_p[0];
+	output << j_p[1];
+	output << i_p[0];
+	output << i_p[1];
 	output.close();
 	return 0;
 }
diff --git a/devtools/create_supernova2/ms2_data.015-en b/devtools/create_supernova2/ms2_data.015-en
index d099458..20ab530 100644
Binary files a/devtools/create_supernova2/ms2_data.015-en and b/devtools/create_supernova2/ms2_data.015-en differ
diff --git a/devtools/create_supernova2/ms2_data.028-en b/devtools/create_supernova2/ms2_data.028-en
index 5ac4fed..88ab4c8 100644
Binary files a/devtools/create_supernova2/ms2_data.028-en and b/devtools/create_supernova2/ms2_data.028-en differ
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index ed17ebe..7bd1cc6 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -114,9 +114,6 @@ bool MSNImage::loadPbmFromEngineDataFile() {
 		if (version != SUPERNOVA_DAT_VERSION)
 			return false;
 	} else if (_MSPart == 2) {
-		if (_filenumber == 28)
-			name = "IMG1";
-		else
 			return false;
 
 		if (!f.open(SUPERNOVA2_DAT))


Commit: bcd62c06699f3240aaa79eeb4bb31f23dbe2bd56
    https://github.com/scummvm/scummvm/commit/bcd62c06699f3240aaa79eeb4bb31f23dbe2bd56
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Code refactoring

Add constant for inverting sections (number 128)
Move some initialization in initState from derived classes to
    base class.
Simpilfy AxacussCorridor4::onEntrance

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/msn_def.h
    engines/supernova/room.cpp
    engines/supernova/screen.cpp
    engines/supernova/supernova.cpp
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova1/state.cpp
    engines/supernova/supernova2/rooms.cpp
    engines/supernova/supernova2/state.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index 2d00374..5cf54d4 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -165,6 +165,35 @@ void GameManager::destroyRooms() {
 }
 
 void GameManager::initState() {
+	_currentInputObject = &_nullObject;
+	_inputObject[0] = &_nullObject;
+	_inputObject[1] = &_nullObject;
+	_inputVerb = ACTION_WALK;
+	_processInput = false;
+	_guiEnabled = true;
+	_animationEnabled = true;
+	_roomBrightness = 255;
+	_mouseClicked = false;
+	_keyPressed = false;
+	_mouseX = -1;
+	_mouseY = -1;
+	_mouseField = -1;
+	_inventoryScroll = 0;
+	_oldTime = g_system->getMillis();
+	_timerPaused = 0;
+	_timePaused = false;
+	_messageDuration = 0;
+	_animationTimer = 0;
+	_currentSentence = -1;
+	for (int i = 0 ; i < 6 ; ++i) {
+		_sentenceNumber[i] = -1;
+		_texts[i] = kNoString;
+		_rows[i] = 0;
+		_rowsStart[i] = 0;
+	}
+
+	_prevImgId = 0;
+	_dead = false;
 }
 
 void GameManager::initRooms() {
@@ -926,10 +955,10 @@ void GameManager::dead(int messageId) {
 }
 
 int GameManager::invertSection(int section) {
-	if (section < 128)
-		section += 128;
+	if (section < kSectionInvert)
+		section += kSectionInvert;
 	else
-		section -= 128;
+		section -= kSectionInvert;
 
 	return section;
 }
diff --git a/engines/supernova/msn_def.h b/engines/supernova/msn_def.h
index 293af6c..6c5dcc0 100644
--- a/engines/supernova/msn_def.h
+++ b/engines/supernova/msn_def.h
@@ -40,6 +40,8 @@ const int kSleepAutosaveSlot = 999;
 const byte kShownFalse = 0;
 const byte kShownTrue = 1;
 
+const byte kSectionInvert = 128;
+
 enum MessagePosition {
 	kMessageNormal,
 	kMessageLeft,
diff --git a/engines/supernova/room.cpp b/engines/supernova/room.cpp
index 404ad02..47b67fb 100644
--- a/engines/supernova/room.cpp
+++ b/engines/supernova/room.cpp
@@ -130,7 +130,7 @@ void Room::setSectionVisible(uint section, bool visible) {
 	if (section < kMaxSection)
 		_shown[section] = visible ? kShownTrue : kShownFalse;
 	else
-		_shown[section - 128] = visible ? kShownFalse : kShownTrue;
+		_shown[section - kSectionInvert] = visible ? kShownFalse : kShownTrue;
 }
 
 bool Room::isSectionVisible(uint index) const {
diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index 6a76dac..7dc04b0 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -422,9 +422,9 @@ void Screen::renderImage(ImageId id, bool removeImage) {
 
 void Screen::renderImage(int section) {
 	bool removeImage = false;
-	if (section > 128) {
+	if (section > kSectionInvert) {
 		removeImage = true;
-		section -= 128;
+		section -= kSectionInvert;
 	}
 
 	if (!_currentImage || section >= kMaxSection)
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index c225c7c..07d9128 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -287,10 +287,7 @@ void SupernovaEngine::playSound(MusicId index) {
 }
 
 void SupernovaEngine::renderImage(int section) {
-	if (section > 128)
-		_gm->_currentRoom->setSectionVisible(section - 128, false);
-	else
-		_gm->_currentRoom->setSectionVisible(section, true);
+	_gm->_currentRoom->setSectionVisible(section, true);
 
 	_screen->renderImage(section);
 }
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index 6d2fdd5..af86450 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -875,8 +875,8 @@ ShipCabinL1::ShipCabinL1(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[2] = Object(_id, kStringImage, kStringGenericDescription3, NULLOBJECT, UNNECESSARY, 7, 7, 0, NULLROOM, 0);
 	_objectState[3] = Object(_id, kStringMagnete, kStringMagneteDescription, NULLOBJECT, UNNECESSARY, 8, 8, 0, NULLROOM, 0);
 	_objectState[4] = Object(_id, kStringImage, kStringGenericDescription4, NULLOBJECT, UNNECESSARY, 9, 9, 0);
-	_objectState[5] = Object(_id, kStringPen, kStringPenDescription, PEN, TAKE | COMBINABLE, 10, 10, 5 | 128);
-	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | 128, CORRIDOR_ROOM, 9);
+	_objectState[5] = Object(_id, kStringPen, kStringPenDescription, PEN, TAKE | COMBINABLE, 10, 10, 5 | kSectionInvert);
+	_objectState[6] = Object(_id, kStringHatch, kStringDefaultDescription, NULLOBJECT, OPENABLE | OPENED | EXIT, 3, 3, 24 | kSectionInvert, CORRIDOR_ROOM, 9);
 	_objectState[7] = Object(_id, kStringSlot, kStringSlotDescription, NULLOBJECT, COMBINABLE, 0, 0, 0);
 	_objectState[8] = Object(_id, kStringShelf, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 1, 1, 0);
 	_objectState[9] = Object(_id, kStringCompartment, kStringDefaultDescription, NULLOBJECT, OPENABLE | CLOSED, 2, 2, 0);
@@ -912,7 +912,7 @@ ShipCabinL2::ShipCabinL2(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[16] = Object(_id, kStringJunk,kStringJunkDescription,NULLOBJECT,UNNECESSARY,38,38,0);
 	_objectState[17] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,23,23,0);
 	_objectState[18] = Object(_id, kStringToilet,kStringDefaultDescription,BATHROOM_DOOR,EXIT,255,255,0,BATHROOM,22);
-	_objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR_ROOM,9);
+	_objectState[19] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | kSectionInvert,CORRIDOR_ROOM,9);
 	_objectState[20] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[21] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[22] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -979,14 +979,14 @@ ShipCabinL3::ShipCabinL3(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[1] = Object(_id, kStringPoster,kStringPosterDescription2,NULLOBJECT,UNNECESSARY,12,12,0);
 	_objectState[2] = Object(_id, kStringSpeaker,kStringDefaultDescription,NULLOBJECT,NULLTYPE,13,13,0);
 	_objectState[3] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,14,14,0);
-	_objectState[4] = Object(_id, kStringRecord,kStringRecordDescription,RECORD,TAKE | COMBINABLE,15,15,8 | 128);
+	_objectState[4] = Object(_id, kStringRecord,kStringRecordDescription,RECORD,TAKE | COMBINABLE,15,15,8 | kSectionInvert);
 	_objectState[5] = Object(_id, kStringRecordStand,kStringRecordStandDescription,NULLOBJECT,UNNECESSARY,16,16,0);
 	_objectState[6] = Object(_id, kStringButton,kStringDefaultDescription,TURNTABLE_BUTTON,PRESS,22,22,0);
 	_objectState[7] = Object(_id, kStringTurntable,kStringTurntableDescription,TURNTABLE,UNNECESSARY | COMBINABLE,17,17,0);
 	_objectState[8] = Object(_id, kStringWire,kStringDefaultDescription,WIRE,COMBINABLE,18,18,0);
 	_objectState[9] = Object(_id, kStringWire,kStringDefaultDescription,WIRE2,COMBINABLE,19,19,0);
 	_objectState[10] = Object(_id, kStringPlug,kStringDefaultDescription,PLUG,COMBINABLE,20,20,0);
-	_objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | 128,CORRIDOR_ROOM,9);
+	_objectState[11] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,24 | kSectionInvert,CORRIDOR_ROOM,9);
 	_objectState[12] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[13] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[14] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1088,7 +1088,7 @@ ShipCabinR1::ShipCabinR1(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[0] = Object(_id, kStringImage,kStringImageDescription1,NULLOBJECT,UNNECESSARY,5,5,0);
 	_objectState[1] = Object(_id, kStringDrawingInstruments,kStringDrawingInstrumentsDescription,NULLOBJECT,UNNECESSARY,6,6,0);
 	_objectState[2] = Object(_id, kStringMagnete,kStringMagneteDescription,NULLOBJECT,UNNECESSARY,7,7,0);
-	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR_ROOM,5);
+	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | kSectionInvert,CORRIDOR_ROOM,5);
 	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1110,7 +1110,7 @@ ShipCabinR2::ShipCabinR2(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription1,NULLOBJECT,UNNECESSARY,11,11,0);
 	_objectState[1] = Object(_id, kStringTennisRacket,kStringTennisRacketDescription,NULLOBJECT,UNNECESSARY,8,8,0);
 	_objectState[2] = Object(_id, kStringTennisBall,kStringGenericDescription2,NULLOBJECT,UNNECESSARY,9,9,0);
-	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | 128,CORRIDOR_ROOM,5);
+	_objectState[3] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | OPENED | EXIT,3,3,15 | kSectionInvert,CORRIDOR_ROOM,5);
 	_objectState[4] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[5] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[6] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1129,7 +1129,7 @@ ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm) {
 	_shown[8] = kShownTrue;
 	_shown[15] = kShownTrue;
 
-	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | 128);
+	_objectState[0] = Object(_id, kStringChessGame,kStringChessGameDescription2,CHESS,TAKE | COMBINABLE,12,12,7 | kSectionInvert);
 	_objectState[1] = Object(_id, kStringBed,kStringBedDescription,NULLOBJECT,NULLTYPE,13,13,0);
 	_objectState[2] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K1,COMBINABLE,27,27,0);
 	_objectState[3] = Object(_id, kStringSlot,kStringSlotDescription,SLOT_K2,COMBINABLE,28,28,0);
@@ -1147,7 +1147,7 @@ ShipCabinR3::ShipCabinR3(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[15] = Object(_id, kStringCompartment,kStringCompartmentDescription,SHELF4,OPENABLE | CLOSED,24,25,13);
 	_objectState[16] = Object(_id, kStringBook,kStringBookHitchhiker,BOOK,TAKE,26,26,14);
 	_objectState[17] = Object(_id, kStringDiscman,kStringDiscmanDescription,DISCMAN,TAKE | COMBINABLE,33,33,16);
-	_objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | 128,CORRIDOR_ROOM,5);
+	_objectState[18] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | EXIT,3,3,15 | kSectionInvert,CORRIDOR_ROOM,5);
 	_objectState[19] = Object(_id, kStringSlot,kStringSlotDescription,NULLOBJECT,COMBINABLE,0,0,0);
 	_objectState[20] = Object(_id, kStringShelf,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,1,1,0);
 	_objectState[21] = Object(_id, kStringCompartment,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,2,2,0);
@@ -1453,7 +1453,7 @@ ShipLandingModule::ShipLandingModule(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[2] = Object(_id, kStringMonitor,kStringDefaultDescription,LANDINGMOD_MONITOR,NULLTYPE,3,3,0);
 	_objectState[3] = Object(_id, kStringKeyboard,kStringDefaultDescription,KEYBOARD,NULLTYPE,4,4,0);
 	_objectState[4] = Object(_id, kNoString,kStringDefaultDescription,LANDINGMOD_WIRE,COMBINABLE,255,255,0);
-	_objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | 128,HOLD,10);
+	_objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,LANDINGMOD_HATCH,EXIT | OPENABLE | OPENED | COMBINABLE, 0,0,1 | kSectionInvert,HOLD,10);
 }
 
 bool ShipLandingModule::interact(Action verb, Object &obj1, Object &obj2) {
@@ -1565,7 +1565,7 @@ ShipGenerator::ShipGenerator(SupernovaEngine *vm, GameManager1 *gm) {
 
 	_objectState[0] = Object(_id, kStringGeneratorWire,kStringDefaultDescription,GENERATOR_WIRE,COMBINABLE,255,255,0);
 	_objectState[1] = Object(_id, kStringEmptySpool,kStringDefaultDescription,NULLOBJECT,UNNECESSARY,255,255,0);
-	_objectState[2] = Object(_id, kStringKeycard2,kStringKeycard2Description,KEYCARD2,COMBINABLE | TAKE,12,12,5 | 128);
+	_objectState[2] = Object(_id, kStringKeycard2,kStringKeycard2Description,KEYCARD2,COMBINABLE | TAKE,12,12,5 | kSectionInvert);
 	_objectState[3] = Object(_id, kStringRope,kStringDefaultDescription,GENERATOR_ROPE,COMBINABLE,255,255,0);
 	_objectState[4] = Object(_id, kStringHatch,kStringHatchDescription3,OUTERHATCH,EXIT | OPENABLE,1,2,1,OUTSIDE,22);
 	_objectState[5] = Object(_id, kStringHatch,kStringDefaultDescription,NULLOBJECT,OPENABLE | CLOSED,3,3,0);
@@ -1883,11 +1883,11 @@ ArsanoEntrance::ArsanoEntrance(SupernovaEngine *vm, GameManager1 *gm) {
 	_objectState[0] = Object(_id, kStringPorter,kStringPorterDescription,PORTER,TALK,0,0,0);
 	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,NULLOBJECT,EXIT | OPENABLE | CLOSED,1,1,0,NULLROOM,5);
 	_objectState[2] = Object(_id, kStringSign,kStringSignDescription,KITCHEN_SIGN,NULLTYPE,2,2,0);
-	_objectState[3] = Object(_id, kStringChewingGum,kStringDefaultDescription,SCHNUCK,TAKE,255,255,10+128);
-	_objectState[4] = Object(_id, kStringGummyBears,kStringDefaultDescription,SCHNUCK,TAKE,255,255,11+128);
-	_objectState[5] = Object(_id, kStringChocolateBall,kStringDefaultDescription,SCHNUCK,TAKE,255,255,12+128);
-	_objectState[6] = Object(_id, kStringEgg,kStringDefaultDescription,EGG,TAKE,255,255,13+128);
-	_objectState[7] = Object(_id, kStringLiquorice,kStringDefaultDescription,SCHNUCK,TAKE,255,255,14+128);
+	_objectState[3] = Object(_id, kStringChewingGum,kStringDefaultDescription,SCHNUCK,TAKE,255,255,10+kSectionInvert);
+	_objectState[4] = Object(_id, kStringGummyBears,kStringDefaultDescription,SCHNUCK,TAKE,255,255,11+kSectionInvert);
+	_objectState[5] = Object(_id, kStringChocolateBall,kStringDefaultDescription,SCHNUCK,TAKE,255,255,12+kSectionInvert);
+	_objectState[6] = Object(_id, kStringEgg,kStringDefaultDescription,EGG,TAKE,255,255,13+kSectionInvert);
+	_objectState[7] = Object(_id, kStringLiquorice,kStringDefaultDescription,SCHNUCK,TAKE,255,255,14+kSectionInvert);
 	_objectState[8] = Object(_id, kStringPill,kStringPillDescription,PILL,TAKE,255,255,0);
 	_objectState[9] = Object(_id, kStringSlot,kStringDefaultDescription,CAR_SLOT,COMBINABLE,6,6,0);
 	_objectState[10] = Object(_id, kStringVendingMachine,kStringVendingMachineDescription,NULLOBJECT,NULLTYPE,5,5,0);
@@ -2020,16 +2020,16 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 				while ((e < 3) && (!allSentencesRemoved(4, 1))) {
 					switch (e = _gm->dialog(5, row1, _dialog1, 1)) {
 					case 0:
-						_gm->reply(kStringArsanoEntrance15, 1, 1 + 128);
+						_gm->reply(kStringArsanoEntrance15, 1, 1 + kSectionInvert);
 						break;
 					case 1:
-						_gm->reply(kStringArsanoEntrance3, 1, 1 + 128);
-						_gm->reply(kStringArsanoEntrance4, 1, 1 + 128);
-						_gm->reply(kStringArsanoEntrance5, 1, 1 + 128);
+						_gm->reply(kStringArsanoEntrance3, 1, 1 + kSectionInvert);
+						_gm->reply(kStringArsanoEntrance4, 1, 1 + kSectionInvert);
+						_gm->reply(kStringArsanoEntrance5, 1, 1 + kSectionInvert);
 						removeSentence(0, 2);
 						break;
 					case 2:
-						_gm->reply(kStringArsanoEntrance7, 1, 1 + 128);
+						_gm->reply(kStringArsanoEntrance7, 1, 1 + kSectionInvert);
 						_gm->_state._shoes = 2;
 						break;
 					case 3:
@@ -2037,7 +2037,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 						_gm->wait(2);
 						_vm->renderImage(4);
 						setSectionVisible(3, false);
-						_gm->reply(kStringArsanoEntrance16, 1, 1 + 128);
+						_gm->reply(kStringArsanoEntrance16, 1, 1 + kSectionInvert);
 						_vm->renderImage(3);
 						setSectionVisible(4, false);
 						_gm->wait(2);
@@ -2048,7 +2048,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 				}
 			} else {
 				_gm->dialog(2, row3, _dialog3, 0);
-				_gm->reply(kStringArsanoEntrance10, 1, 1 + 128);
+				_gm->reply(kStringArsanoEntrance10, 1, 1 + kSectionInvert);
 			}
 		}
 	} else if ((verb == ACTION_PRESS) && (obj1._id == BATHROOM_BUTTON)) {
@@ -2349,7 +2349,7 @@ ArsanoRoger::ArsanoRoger(SupernovaEngine *vm, GameManager1 *gm) {
 void ArsanoRoger::onEntrance() {
 	if (!sentenceRemoved(0, 2)) {
 		_gm->say(kStringArsanoRoger1);
-		_gm->reply(kStringArsanoRoger2, 2, 2 + 128);
+		_gm->reply(kStringArsanoRoger2, 2, 2 + kSectionInvert);
 		removeSentence(0, 2);
 	}
 }
@@ -2387,7 +2387,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->great(0);
 			return false;
 		}
-		_gm->reply(kStringArsanoRoger3, 2, 2 + 128);
+		_gm->reply(kStringArsanoRoger3, 2, 2 + kSectionInvert);
 	} else if ((verb == ACTION_USE) && (obj1._id == CUP))
 		_vm->renderMessage(kStringArsanoRoger4);
 	else if ((verb == ACTION_TALK) && (obj1._id == ROGER_W)) {
@@ -2396,40 +2396,40 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
 		else {
 			switch (_gm->dialog(4, row1, _dialog1, 1)) {
 			case 0:
-				_gm->reply(kStringArsanoRoger6, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger7, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger6, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoRoger7, 2, 2 + kSectionInvert);
 				break;
 			case 1:
-				_gm->reply(kStringArsanoRoger8, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger9, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger8, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoRoger9, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger10);
 				break;
 			case 2:
-				_gm->reply(kStringArsanoRoger11, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger11, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger12);
-				_gm->reply(kStringArsanoRoger13, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger13, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger14);
-				_gm->reply(kStringArsanoRoger15, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger16, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger15, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoRoger16, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger17);
 				_gm->say(kStringArsanoRoger18);
-				_gm->reply(kStringArsanoRoger19, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger19, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger20);
 				_gm->say(kStringArsanoRoger21);
-				_gm->reply(kStringArsanoRoger22, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger22, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger23);
-				_gm->reply(kStringArsanoRoger24, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger25, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger24, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoRoger25, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger26);
-				_gm->reply(kStringArsanoRoger27, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger28, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger27, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoRoger28, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger29);
-				_gm->reply(kStringArsanoRoger30, 2, 2 + 128);
-				_gm->reply(kStringArsanoRoger31, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger30, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoRoger31, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger32);
-				_gm->reply(kStringArsanoRoger33, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger33, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoRoger34);
-				_gm->reply(kStringArsanoRoger35, 2, 2 + 128);
+				_gm->reply(kStringArsanoRoger35, 2, 2 + kSectionInvert);
 			}
 		}
 	} else if (((verb == ACTION_USE) && Object::combine(obj1, obj2, CHESS, ROGER_W)) ||
@@ -2437,7 +2437,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderImage(11);
 		_gm->great(0);
 		_gm->say(kStringArsanoRoger36);
-		_gm->reply(kStringArsanoRoger37, 2, 2 + 128);
+		_gm->reply(kStringArsanoRoger37, 2, 2 + kSectionInvert);
 		_gm->say(kStringArsanoRoger38);
 		_vm->paletteFadeOut();
 		_gm->_inventory.remove(*_gm->_rooms[CABIN_R3]->getObject(0)); // Chess board
@@ -2621,13 +2621,13 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->paletteBrightness();
 		bool found;
 		if (sentenceRemoved(0, 2) || sentenceRemoved(1, 2)) {
-			_gm->reply(kStringArsanoMeetup2_3, 1, 1 + 128);
+			_gm->reply(kStringArsanoMeetup2_3, 1, 1 + kSectionInvert);
 			found = !_gm->dialog(2, row4, _dialog4, 0);
 			if (!(found))
-				_gm->reply(kStringArsanoMeetup2_4, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup2_4, 1, 1 + kSectionInvert);
 		} else {
-			_gm->reply(kStringArsanoMeetup2_5, 1, 1 + 128);
-			_gm->reply(kStringArsanoMeetup2_6, 1, 1 + 128);
+			_gm->reply(kStringArsanoMeetup2_5, 1, 1 + kSectionInvert);
+			_gm->reply(kStringArsanoMeetup2_6, 1, 1 + kSectionInvert);
 			found = !_gm->dialog(2, row1, _dialog1, 0);
 			removeSentence(0, 2);
 		}
@@ -2635,15 +2635,15 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(3));
 			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(7));
 			_gm->_inventory.remove(*_gm->_rooms[ROGER]->getObject(8));
-			_gm->reply(kStringArsanoMeetup2_7, 1, 1 + 128);
-			_gm->reply(kStringArsanoMeetup2_8, 1, 1 + 128);
+			_gm->reply(kStringArsanoMeetup2_7, 1, 1 + kSectionInvert);
+			_gm->reply(kStringArsanoMeetup2_8, 1, 1 + kSectionInvert);
 			bool flight = _gm->dialog(2, row2, _dialog2, 0);
 			if (flight) {
-				_gm->reply(kStringArsanoMeetup2_9, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup2_9, 1, 1 + kSectionInvert);
 				_gm->dialog(4, row3, _dialog3, 0);
-				_gm->reply(kStringArsanoMeetup2_10, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup2_10, 1, 1 + kSectionInvert);
 			} else
-				_gm->reply(kStringArsanoMeetup2_11, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup2_11, 1, 1 + kSectionInvert);
 
 			_gm->changeRoom(MEETUP2);
 			_gm->_rooms[MEETUP2]->setSectionVisible(12, false);
@@ -2716,13 +2716,13 @@ void ArsanoMeetup2::shipStart() {
 	_gm->wait(12);
 	for (int i = 2; i <= 11; ++i) {
 		if (i >= 9)
-			_vm->renderImage(i - 1 + 128);
+			_vm->renderImage(i - 1 + kSectionInvert);
 		else
 			setSectionVisible(i - 1, false);
 		_vm->renderImage(i);
 		_gm->wait(2);
 	}
-	_vm->renderImage(11 + 128);
+	_vm->renderImage(11 + kSectionInvert);
 }
 
 ArsanoMeetup3::ArsanoMeetup3(SupernovaEngine *vm, GameManager1 *gm) {
@@ -2792,55 +2792,55 @@ bool ArsanoMeetup3::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderImage(0);
 		_vm->paletteFadeIn();
 		_gm->wait(18);
-		_gm->reply(kStringArsanoMeetup3_1, 2, 2 + 128);
+		_gm->reply(kStringArsanoMeetup3_1, 2, 2 + kSectionInvert);
 		_gm->wait(10);
-		_gm->reply(kStringArsanoMeetup3_2, 1, 1 + 128);
+		_gm->reply(kStringArsanoMeetup3_2, 1, 1 + kSectionInvert);
 
 		do {
 			int i = _gm->dialog(4, row2, _dialog2, 2);
 			switch (i) {
 			case 0:
-				_gm->reply(kStringArsanoMeetup3_3, 1, 1 + 128);
-				_gm->reply(kStringArsanoMeetup3_4, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup3_3, 1, 1 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_4, 1, 1 + kSectionInvert);
 				break;
 			case 1:
-				_gm->reply(kStringArsanoMeetup3_5, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_5, 2, 2 + kSectionInvert);
 				_gm->say(kStringArsanoMeetup3_6);
-				_gm->reply(kStringArsanoMeetup3_7, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_8, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_9, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_10, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_11, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_7, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_8, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_9, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_10, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_11, 2, 2 + kSectionInvert);
 				if (_gm->dialog(2, row3, _dialog3, 0)) {
-					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
+					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + kSectionInvert);
 					_gm->say(kStringArsanoMeetup3_13);
 				}
-				_gm->reply(kStringArsanoMeetup3_14, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_15, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_16, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_17, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_14, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_15, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_16, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_17, 2, 2 + kSectionInvert);
 				if (_gm->dialog(2, row3, _dialog3, 0)) {
-					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + 128);
+					_gm->reply(kStringArsanoMeetup3_12, 2, 2 + kSectionInvert);
 					_gm->say(kStringArsanoMeetup3_13);
 				}
-				_gm->reply(kStringArsanoMeetup3_18, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_18, 2, 2 + kSectionInvert);
 				break;
 			case 2:
-				_gm->reply(kStringArsanoMeetup3_19, 2, 2 + 128);
-				_gm->reply(kStringArsanoMeetup3_20, 2, 2 + 128);
+				_gm->reply(kStringArsanoMeetup3_19, 2, 2 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_20, 2, 2 + kSectionInvert);
 				break;
 			case 3:
-				_gm->reply(kStringArsanoMeetup3_21, 1, 1 + 128);
-				_gm->reply(kStringArsanoMeetup3_22, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup3_21, 1, 1 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_22, 1, 1 + kSectionInvert);
 				_gm->say(kStringArsanoMeetup3_23);
-				_gm->reply(kStringArsanoMeetup3_24, 1, 1 + 128);
-				_gm->reply(kStringArsanoMeetup3_25, 1, 1 + 128);
+				_gm->reply(kStringArsanoMeetup3_24, 1, 1 + kSectionInvert);
+				_gm->reply(kStringArsanoMeetup3_25, 1, 1 + kSectionInvert);
 			}
 			removeSentence(2, 2);
 		} while (!allSentencesRemoved(4, 2));
 		_gm->say(kStringArsanoMeetup3_26);
-		_gm->reply(kStringArsanoMeetup3_27, 1, 1 + 128);
-		_gm->reply(kStringArsanoMeetup3_28, 1, 1 + 128);
+		_gm->reply(kStringArsanoMeetup3_27, 1, 1 + kSectionInvert);
+		_gm->reply(kStringArsanoMeetup3_28, 1, 1 + kSectionInvert);
 		_vm->paletteFadeOut();
 		// Remove all objects from the inventory except the Knife, Watch and Discman
 		bool has_knife = _gm->_rooms[INTRO1]->getObject(1)->hasProperty(CARRIED);
@@ -2874,7 +2874,7 @@ AxacussCell::AxacussCell(SupernovaEngine *vm, GameManager1 *gm) {
 	_shown[31] = kShownTrue;
 
 	_objectState[0] = Object(_id, kStringButton,kStringDefaultDescription,CELL_BUTTON,PRESS,1,1,0);
-	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+128,CORRIDOR4,1);
+	_objectState[1] = Object(_id, kStringDoor,kStringDefaultDescription,CELL_DOOR,EXIT|OPENABLE|CLOSED,0,0,31+kSectionInvert,CORRIDOR4,1);
 	_objectState[2] = Object(_id, kStringTray,kStringTrayDescription,TRAY,UNNECESSARY,255,255,0);
 	_objectState[3] = Object(_id, kStringLamp,kStringLampDescription,NULLOBJECT,COMBINABLE,3,3,0);
 	_objectState[4] = Object(_id, kStringEyes,kStringEyesDescription,NULLOBJECT,NULLTYPE,4,4,0);
@@ -2919,7 +2919,7 @@ void AxacussCell::animation() {
 		getObject(0)->_click = 255;
 		getObject(1)->resetProperty(EXIT | OPENABLE | OPENED | CLOSED);
 	} else if ((_gm->_state._timeRobot >= 601) && (_gm->_state._timeRobot <= 620)) {
-		_vm->renderImage(_gm->_state._timeRobot - 593 + 128);
+		_vm->renderImage(_gm->_state._timeRobot - 593 + kSectionInvert);
 		_vm->renderImage(_gm->_state._timeRobot - 592);
 	} else if (_gm->_state._timeRobot == 621) {
 		_vm->renderImage(31);
@@ -2929,7 +2929,7 @@ void AxacussCell::animation() {
 	} else if (_gm->_state._timeRobot == 700)
 		_gm->_state._timeRobot = 0;
 	else if (_gm->_state._timeRobot == 10002) {
-		_vm->renderImage(18 + 128);
+		_vm->renderImage(18 + kSectionInvert);
 		_vm->renderImage(29);
 		_vm->renderImage(7);
 		getObject(2)->_click = 13;
@@ -3127,9 +3127,7 @@ void AxacussCorridor3::onEntrance() {
 
 void AxacussCorridor4::onEntrance() {
 	_gm->great(4);
-	if (_gm->_state._corridorSearch)
-		_gm->busted(0);
-	else if (_gm->_rooms[GUARD]->isSectionVisible(1))
+	if (_gm->_state._corridorSearch || _gm->_rooms[GUARD]->isSectionVisible(1))
 		_gm->busted(0);
 }
 
@@ -3229,7 +3227,7 @@ void AxacussCorridor5::onEntrance() {
 
 bool AxacussCorridor5::handleMoneyDialog() {
 	if (_gm->dialog(2, _rows, _dialog2, 0) == 0) {
-		_gm->reply(kStringAxacussCorridor5_5, 1, 1 + 128);
+		_gm->reply(kStringAxacussCorridor5_5, 1, 1 + kSectionInvert);
 		addAllSentences(2);
 		if (_gm->_state._money == 0) {
 			removeSentence(2, 2);
@@ -3257,14 +3255,14 @@ bool AxacussCorridor5::handleMoneyDialog() {
 				stopInteract(_gm->_state._money - 200);
 				return true;
 			}
-			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
+			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + kSectionInvert);
 			break;
 		case 3:
 			if (_gm->_state._money >= 900) {
 				stopInteract(_gm->_state._money);
 				return true;
 			}
-			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + 128);
+			_gm->reply(kStringAxacussCorridor5_6, 1, 1 + kSectionInvert);
 			break;
 		}
 	}
@@ -3272,7 +3270,7 @@ bool AxacussCorridor5::handleMoneyDialog() {
 }
 
 void AxacussCorridor5::stopInteract(int sum) {
-	_gm->reply(kStringAxacussCorridor5_7, 1, 1 + 128);
+	_gm->reply(kStringAxacussCorridor5_7, 1, 1 + kSectionInvert);
 	_gm->great(0);
 	_gm->changeRoom(ELEVATOR);
 	_gm->takeMoney(-sum);
@@ -3285,16 +3283,16 @@ bool AxacussCorridor5::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderImage(0);
 		_vm->paletteBrightness();
 		if (_gm->_guiEnabled) {
-			_gm->reply(kStringAxacussCorridor5_1, 1, 1 + 128);
+			_gm->reply(kStringAxacussCorridor5_1, 1, 1 + kSectionInvert);
 			if (handleMoneyDialog())
 				return true;
 		} else {
 			_gm->_guiEnabled = true;
-			_gm->reply(kStringAxacussCorridor5_2, 1, 1 + 128);
+			_gm->reply(kStringAxacussCorridor5_2, 1, 1 + kSectionInvert);
 			if (_gm->dialog(2, _rows, _dialog1, 0))
-				_gm->reply(kStringAxacussCorridor5_3, 1, 1 + 128);
+				_gm->reply(kStringAxacussCorridor5_3, 1, 1 + kSectionInvert);
 			else {
-				_gm->reply(kStringAxacussCorridor5_4, 1, 1 + 128);
+				_gm->reply(kStringAxacussCorridor5_4, 1, 1 + kSectionInvert);
 				if (handleMoneyDialog())
 					return true;
 			}
@@ -3648,7 +3646,7 @@ bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) {
 			if (i == 11)
 				_vm->playSound(kAudioSmash); // 046/4020
 			_gm->wait(1);
-			_vm->renderImage(i + 128);
+			_vm->renderImage(i + kSectionInvert);
 		}
 		_gm->_state._powerOff = true;
 		_objectState[5]._click = 255;
@@ -3958,7 +3956,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->setCurrentImage(41);
 		_vm->renderImage(0);
 		_vm->paletteBrightness();
-		_gm->reply(kStringAxacussElevator_1, 1, 1 + 128);
+		_gm->reply(kStringAxacussElevator_1, 1, 1 + kSectionInvert);
 		_gm->say(kStringAxacussElevator_2);
 		g_system->fillScreen(kColorBlack);
 	} else if ((verb == ACTION_PRESS) && (obj1._id == BUTTON1)) {
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index 2dd2a1d..443053d 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -243,34 +243,7 @@ void GameManager1::destroyRooms() {
 }
 
 void GameManager1::initState() {
-	_currentInputObject = &_nullObject;
-	_inputObject[0] = &_nullObject;
-	_inputObject[1] = &_nullObject;
-	_inputVerb = ACTION_WALK;
-	_processInput = false;
-	_guiEnabled = true;
-	_animationEnabled = true;
-	_roomBrightness = 255;
-	_mouseClicked = false;
-	_keyPressed = false;
-	_mouseX = -1;
-	_mouseY = -1;
-	_mouseField = -1;
-	_inventoryScroll = 0;
-	_oldTime = g_system->getMillis();
-	_timerPaused = 0;
-	_timePaused = false;
-	_messageDuration = 0;
-	_animationTimer = 0;
-
-	_currentSentence = -1;
-	for (int i = 0 ; i < 6 ; ++i) {
-		_sentenceNumber[i] = -1;
-		_texts[i] = kNoString;
-		_rows[i] = 0;
-		_rowsStart[i] = 0;
-	}
-
+	GameManager::initState();
 	_time = ticksToMsec(916364); // 2 pm
 	_state._timeSleep = 0;
 	_state._timeAlarm = ticksToMsec(458182);    // 7 am
@@ -294,9 +267,6 @@ void GameManager1::initState() {
 	_state._cableConnected = false;
 	_state._powerOff = false;
 	_state._dream = false;
-
-	_prevImgId = 0;
-	_dead = false;
 }
 
 void GameManager1::initRooms() {
@@ -811,7 +781,7 @@ void GameManager1::guardReturnedEvent() {
 
 void GameManager1::walk(int imgId) {
 	if (_prevImgId)
-		_vm->renderImage(_prevImgId + 128);
+		_vm->renderImage(_prevImgId + kSectionInvert);
 	_vm->renderImage(imgId);
 	_prevImgId = imgId;
 	wait(3);
@@ -852,7 +822,7 @@ void GameManager1::guardWalkEvent() {
 		_vm->renderImage(imgId);
 		if (!behind) {
 			wait(3);
-			_vm->renderImage(_prevImgId + 128);
+			_vm->renderImage(_prevImgId + kSectionInvert);
 			_sound->play(kAudioDoorClose);
 		}
 
@@ -916,14 +886,14 @@ void GameManager1::guardWalkEvent() {
 			_vm->renderImage(_state._destination + 1);
 			_sound->play(kAudioDoorOpen);
 			wait(3);
-			_vm->renderImage(_prevImgId + 128);
+			_vm->renderImage(_prevImgId + kSectionInvert);
 			wait(3);
-			_vm->renderImage(_state._destination + 1 + 128);
+			_vm->renderImage(_state._destination + 1 + kSectionInvert);
 			_sound->play(kAudioDoorClose);
 			_rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
 			_state._destination = 255;
 		} else if (_rooms[BCORRIDOR]->isSectionVisible(_state._destination + 1)) {
-			_vm->renderImage(_prevImgId + 128);
+			_vm->renderImage(_prevImgId + kSectionInvert);
 			_rooms[BCORRIDOR]->getObject(_state._destination + 4)->setProperty(OCCUPIED);
 			SWAP(_state._origin, _state._destination);
 			_state._eventTime = _time + ticksToMsec(60);
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index edfc389..38d83b5 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -224,7 +224,7 @@ bool Intro2::tvDialogue() {
 	_vm->setCurrentImage(42);
 	_vm->renderImage(0);
 
-	if(!_gm->talk(1, 1+128, 0, kMessageLeft, kStringIntroTV1))
+	if(!_gm->talk(1, 1 + kSectionInvert, 0, kMessageLeft, kStringIntroTV1))
 		return false;
 
 	_vm->renderImage(4);
@@ -248,7 +248,7 @@ bool Intro2::tvDialogue() {
 	if(!_gm->talk(8, 6, 0, kMessageLeft, kStringIntroTV4))
 		return false;
 
-	_vm->renderImage(10 + 128);
+	_vm->renderImage(10 + kSectionInvert);
 	_gm->wait(3);
 	_vm->renderImage(5);
 	_gm->wait(3);
@@ -263,19 +263,19 @@ bool Intro2::tvDialogue() {
 	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV7))
 		return false;
 
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV8))
+	if(!_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringIntroTV8))
 		return false;
 
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV9))
+	if(!_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringIntroTV9))
 		return false;
 
 	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV10))
 		return false;
 
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV11))
+	if(!_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringIntroTV11))
 		return false;
 
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV12))
+	if(!_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringIntroTV12))
 		return false;
 
 	if(!_gm->talk(9, 7, 8, kMessageCenter, kStringIntroTV13))
@@ -286,7 +286,7 @@ bool Intro2::tvDialogue() {
 	if(!_gm->talkRest(9, 7, 1))
 		return false;
 
-	_vm->renderImage(4 + 128);
+	_vm->renderImage(4 + kSectionInvert);
 
 	if(!_gm->talkRest(9, 7, 3))
 		return false;
@@ -303,10 +303,10 @@ bool Intro2::tvDialogue() {
 
 	_vm->removeMessage();
 
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV14))
+	if(!_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringIntroTV14))
 		return false;
 
-	if(!_gm->talk(3, 3 + 128, 0, kMessageRight, kStringIntroTV15))
+	if(!_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringIntroTV15))
 		return false;
 
 	if(!_gm->talk(9, 7, 0, kMessageCenter, kStringIntroTV16))
@@ -348,7 +348,7 @@ TaxiStand::TaxiStand(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[0] = Object(_id, kStringVehicle, kStringVehicleDescription, TAXI, NULLTYPE, 2, 2, 0, NULLROOM, 11);
 	_objectState[1] = Object(_id, kStringVehicle, kStringVehicleDescription, NULLOBJECT, NULLTYPE, 1, 1, 0);
 	_objectState[2] = Object(_id, kStringEntrance, kStringEntranceDescription, DOOR, EXIT | OPENABLE | CLOSED, 3, 3, 0, NULLROOM, 1);
-	_objectState[3] = Object(_id, kStringWallet, kStringWalletDescription, WALLET, TAKE, 0, 0, 7 + 128);
+	_objectState[3] = Object(_id, kStringWallet, kStringWalletDescription, WALLET, TAKE, 0, 0, 7 + kSectionInvert);
 	_objectState[4] = Object(_id, kStringDevice, kStringDeviceDescription, TRANSMITTER, TAKE | PRESS, 255, 255, 0);
 	_objectState[5] = Object(_id, kStringIdCard, kStringIdCardDescription, ID_CARD, TAKE | COMBINABLE, 255, 255, 0);
 	_objectState[6] = Object(_id, kStringAirport, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, AIRPORT, 22);
@@ -409,10 +409,10 @@ void Street::onEntrance() {
 
 void Street::animation() {
 	static int ltab[36] = {
-		8, 9 + 128, 10, 11 + 128, 6, 12, 13 + 128, 9, 14, 15 + 128, 19,
-		16, 17 + 128, 9 + 128, 18, 19 + 128, 6 + 128, 20, 21 + 128,
-		8 + 128, 9, 10 + 128, 11, 6, 12 + 128, 13, 14 + 128, 15, 19,
-		16 + 128, 17, 18 + 128, 19 + 128, 6 + 128, 20 + 128, 21
+		8, 9 + kSectionInvert, 10, 11 + kSectionInvert, 6, 12, 13 + kSectionInvert, 9, 14, 15 + kSectionInvert, 19,
+		16, 17 + kSectionInvert, 9 + kSectionInvert, 18, 19 + kSectionInvert, 6 + kSectionInvert, 20, 21 + kSectionInvert,
+		8 + kSectionInvert, 9, 10 + kSectionInvert, 11, 6, 12 + kSectionInvert, 13, 14 + kSectionInvert, 15, 19,
+		16 + kSectionInvert, 17, 18 + kSectionInvert, 19 + kSectionInvert, 6 + kSectionInvert, 20 + kSectionInvert, 21
 	};
 
 	static int i, banks, light;
@@ -532,7 +532,7 @@ Cabin2::Cabin2(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[0] = Object(_id, kStringExit, kStringDefaultDescription, NULLOBJECT, EXIT, 255, 255, 0, GAMES, 22);
 	_objectState[1] = Object(_id, kStringHood, kStringHoodDescription, NULLOBJECT, NULLTYPE, 0, 0, 0);
 	_objectState[2] = Object(_id, kString400Xa, kStringDefaultDescription, PRIZE, TAKE, 255, 255, 2 + 180);
-	_objectState[3] = Object(_id, kString10Xa, kStringDefaultDescription, BACK_MONEY, TAKE, 255, 255, 2 + 128);
+	_objectState[3] = Object(_id, kString10Xa, kStringDefaultDescription, BACK_MONEY, TAKE, 255, 255, 2 + kSectionInvert);
 	_objectState[4] = Object(_id, kStringSlot, kStringSlotDescription1, SLOT1, COMBINABLE, 2, 2, 0);
 	_objectState[5] = Object(_id, kStringSlot, kStringSlotDescription2, NULLOBJECT, COMBINABLE, 3, 3, 0);
 	_objectState[6] = Object(_id, kStringChair, kStringChairDescription, CHAIR, NULLTYPE, 4, 4, 0);
@@ -549,7 +549,7 @@ void Cabin2::onEntrance() {
 void Cabin2::animation() {
 	if (_shown[kMaxSection - 1]) {
 		if (isSectionVisible(1))
-			_vm->renderImage(1 + 128);
+			_vm->renderImage(1 + kSectionInvert);
 		else
 			_vm->renderImage(1);
 	}
@@ -606,11 +606,11 @@ bool Cabin2::interact(Action verb, Object &obj1, Object &obj2) {
 		} else
 			_vm->renderMessage(kStringRest);
 	} else if (verb == ACTION_TAKE && obj1._id == PRIZE) {
-		_vm->renderImage(2 + 128);
+		_vm->renderImage(2 + kSectionInvert);
 		obj1._click = 255;
 		_gm->takeMoney(400);
 	} else if (verb == ACTION_TAKE && obj1._id == BACK_MONEY) {
-		_vm->renderImage(2 + 128);
+		_vm->renderImage(2 + kSectionInvert);
 		obj1._click = 255;
 		_gm->takeMoney(10);
 	} else if (verb == ACTION_LOOK && obj1._id == SCRIBBLE1) {
@@ -655,13 +655,13 @@ Kiosk::Kiosk(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[1] = Object(_id, kStringBooks, kStringDefaultDescription, BOOKS, UNNECESSARY, 0, 0, 0);
 	_objectState[2] = Object(_id, kStringDictionary, kStringDefaultDescription, LEXICON, UNNECESSARY, 1, 1, 0);
 	_objectState[3] = Object(_id, kStringPlant, kStringDefaultDescription, PLANT, UNNECESSARY, 2, 2, 0);
-	_objectState[4] = Object(_id, kStringMask, kStringDefaultDescription, BMASK, UNNECESSARY, 4, 4, 2 + 128);
+	_objectState[4] = Object(_id, kStringMask, kStringDefaultDescription, BMASK, UNNECESSARY, 4, 4, 2 + kSectionInvert);
 	_objectState[5] = Object(_id, kStringSnake, kStringDefaultDescription, SNAKE, UNNECESSARY, 3, 3, 0);
 	_objectState[6] = Object(_id, kStringCup, kStringDefaultDescription, CUP, UNNECESSARY, 5, 5, 0);
 	_objectState[7] = Object(_id, kStringJoystick, kStringDefaultDescription, JOYSTICK, UNNECESSARY, 6, 6, 0);
-	_objectState[8] = Object(_id, kStringToothbrush, kStringToothbrushDescription, TOOTHBRUSH, TAKE, 7, 7, 5 + 128);
-	_objectState[9] = Object(_id, kStringMusic, kStringMusicDescription, PLAYER, TAKE | COMBINABLE, 8, 8, 4 + 128);
-	_objectState[10] = Object(_id, kStringBottle, kStringBottleDescription, BOTTLE, TAKE, 9, 9, 3 + 128);
+	_objectState[8] = Object(_id, kStringToothbrush, kStringToothbrushDescription, TOOTHBRUSH, TAKE, 7, 7, 5 + kSectionInvert);
+	_objectState[9] = Object(_id, kStringMusic, kStringMusicDescription, PLAYER, TAKE | COMBINABLE, 8, 8, 4 + kSectionInvert);
+	_objectState[10] = Object(_id, kStringBottle, kStringBottleDescription, BOTTLE, TAKE, 9, 9, 3 + kSectionInvert);
 	_objectState[11] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE1, UNNECESSARY, 10, 10, 0);
 	_objectState[12] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE2, UNNECESSARY, 11, 11, 0);
 	_objectState[13] = Object(_id, kStringBottle, kStringDefaultDescription, BOTTLE3, UNNECESSARY, 12, 12, 0);
@@ -682,21 +682,21 @@ void Kiosk::onEntrance() {
 		_vm->renderImage(6);
 		_vm->playSound(kAudioKiosk);
 		_gm->wait(8);
-		_vm->renderImage(6 + 128);
-		_gm->reply(kStringScaredMe, 1, 1 +128);
+		_vm->renderImage(6 + kSectionInvert);
+		_gm->reply(kStringScaredMe, 1, 1 + kSectionInvert);
 		_gm->say(kStringHowSo);
-		_gm->reply(kStringDisguise, 1, 1 +128);
+		_gm->reply(kStringDisguise, 1, 1 + kSectionInvert);
 		_gm->say(kStringWhatDisguise);
-		_gm->reply(kStringStopPretending, 1, 1 +128);
-		_gm->reply(kStringYouDisguised, 1, 1 +128);
+		_gm->reply(kStringStopPretending, 1, 1 + kSectionInvert);
+		_gm->reply(kStringYouDisguised, 1, 1 + kSectionInvert);
 		_gm->say(kStringIAmHorstHummel);
-		_gm->reply(kStringGiveItUp, 1, 1 +128);
-		_gm->reply(kStringGestures, 1, 1 +128);
-		_gm->reply(kStringMovesDifferently, 1, 1 +128);
+		_gm->reply(kStringGiveItUp, 1, 1 + kSectionInvert);
+		_gm->reply(kStringGestures, 1, 1 + kSectionInvert);
+		_gm->reply(kStringMovesDifferently, 1, 1 + kSectionInvert);
 		_gm->say(kStringHeIsRobot);
-		_gm->reply(kStringYouAreCrazy, 1, 1 +128);
+		_gm->reply(kStringYouAreCrazy, 1, 1 + kSectionInvert);
 		_gm->say(kStringYouIdiot);
-		_gm->reply(kStringShutUp, 1, 1 +128);
+		_gm->reply(kStringShutUp, 1, 1 + kSectionInvert);
 		_gm->drawGUI();
 		setRoomSeen(true);
 	}
@@ -753,7 +753,7 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 		Common::String format = _vm->getGameString(kStringThatCosts);
 		Common::String cost = Common::String::format(format.c_str(), price);
 		_vm->renderMessage(cost, kMessageTop);
-		_gm->reply(cost.c_str(), 1, 1 +128);
+		_gm->reply(cost.c_str(), 1, 1 + kSectionInvert);
 
 		if (_gm->_state._money < price)
 			_gm->say(dialPrice[1]);
@@ -764,7 +764,7 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->drawGUI();
 	} else if (verb == ACTION_LOOK && obj1._id >= BMASK && obj1._id <= FACES) {
 		for(int i = 0; i < 3; i++) {
-			_gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + 128);
+			_gm->reply(dialSeller[obj1._id - BMASK][i], 1, 1 + kSectionInvert);
 		}
 	} else if (verb == ACTION_TALK && obj1._id >= SELLER) {
 		int i = 2;
@@ -772,13 +772,13 @@ bool Kiosk::interact(Action verb, Object &obj1, Object &obj2) {
 			i++;
 		switch (_gm->dialog(i, _gm->_dials, dialSay, 0)) {
 		case 0:
-			_gm->reply(kStringTakeALook, 1, 1 + 128);
+			_gm->reply(kStringTakeALook, 1, 1 + kSectionInvert);
 			break;
 		case 1:
-			_gm->reply(kStringNonsense, 1, 1 + 128);
+			_gm->reply(kStringNonsense, 1, 1 + kSectionInvert);
 			break;
 		case 2:
-			_gm->reply(kStringImSorry, 1, 1 + 128);
+			_gm->reply(kStringImSorry, 1, 1 + kSectionInvert);
 			break;
 		}
 		_gm->drawGUI();
@@ -828,7 +828,7 @@ void CulturePalace::animation() {
 void CulturePalace::notEnoughMoney() {
 	_gm->reply(kStringWhat, 2, 1);
 	_gm->reply(kStringNotInformed, 2, 1);
-	_vm->renderImage(1 + 128);
+	_vm->renderImage(1 + kSectionInvert);
 	setSectionVisible(2, kShownFalse);
 }
 
@@ -897,7 +897,7 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 				break;
 			}
 		}
-		_vm->renderImage(1 + 128);
+		_vm->renderImage(1 + kSectionInvert);
 		setSectionVisible(2, kShownFalse);
 		_gm->drawGUI();
 	}
@@ -916,7 +916,7 @@ bool CulturePalace::interact(Action verb, Object &obj1, Object &obj2) {
 					else
 						_gm->takeMoney(-10000);
 					_gm->takeObject(*getObject(4));
-					_vm->renderImage(1 + 128);
+					_vm->renderImage(1 + kSectionInvert);
 					setSectionVisible(2, false);
 					_gm->reply(kStringIdiot, 0, 0);
 					_shown[kMaxSection - 2] = false;
@@ -951,11 +951,11 @@ Checkout::Checkout(SupernovaEngine *vm, GameManager2 *gm) {
 void Checkout::onEntrance() {
 	if (!_shown[kMaxSection - 3]) {
 		_shown[kMaxSection - 3] = true;
-		_gm->reply(kStringAtMusicContest, 1, 1 + 128);
+		_gm->reply(kStringAtMusicContest, 1, 1 + kSectionInvert);
 		_gm->say(kStringNoImitation);
-		_gm->reply(kStringGoodJoke, 1, 1 + 128);
+		_gm->reply(kStringGoodJoke, 1, 1 + kSectionInvert);
 		_gm->say(kStringIAmHorstHummel);
-		_gm->reply(kStringCommon, 1, 1 + 128);
+		_gm->reply(kStringCommon, 1, 1 + kSectionInvert);
 		_gm->say(kStringIWillProof);
 		_gm->say(kStringIWillPerform);
 		_gm->drawGUI();
@@ -998,11 +998,11 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 		if (_shown[kMaxSection - 4]) {
 			_vm->renderImage(2);
 			_gm->reply(kStringCheckout14, 0, 0);
-			_vm->renderImage(2 + 128);
+			_vm->renderImage(2 + kSectionInvert);
 		} else if (_shown[kMaxSection - 2] == 0) {
 			_vm->renderImage(2);
 			_gm->reply(kStringCheckout15, 0, 0);
-			_vm->renderImage(2 + 128);
+			_vm->renderImage(2 + kSectionInvert);
 			if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
 				_gm->say(kStringCheckout16);
 				_gm->reply(kStringCheckout17, 0, 0);
@@ -1010,7 +1010,7 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 				_gm->say(kStringCheckout18);
 			_gm->drawGUI();
 		} else if (_shown[kMaxSection - 2] == 1) {
-			_gm->reply(kStringCheckout19, 1, 1 + 128);
+			_gm->reply(kStringCheckout19, 1, 1 + kSectionInvert);
 		} else {
 			if (_gm->_state._tipsy) {
 				_vm->setCurrentImage(22);
@@ -1089,25 +1089,25 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 			_shown[kMaxSection - 2] == 1) {
 		_gm->_inventory.remove(obj1);
 		_shown[kMaxSection - 5] = true;
-		_gm->reply(kStringCheckout37, 1, 1 + 128);
+		_gm->reply(kStringCheckout37, 1, 1 + kSectionInvert);
 		_shown[kMaxSection - 2] = 2;
 		_gm->drawGUI();
 	} else if (verb == ACTION_GIVE && obj1._id == CARD && obj2._id == AXACUSSER) {
 		_gm->_inventory.remove(*_gm->_rooms[CULTURE_PALACE]->getObject(4));
-		_gm->reply(kStringCheckout34, 1, 1 + 128);
-		_gm->reply(kStringCheckout35, 1, 1 + 128);
+		_gm->reply(kStringCheckout34, 1, 1 + kSectionInvert);
+		_gm->reply(kStringCheckout35, 1, 1 + kSectionInvert);
 		if (_gm->dialog(2, _gm->_dials, dialCheckout2, 0) == 1) {
-			_gm->reply(kStringCheckout36, 1, 1 + 128);
+			_gm->reply(kStringCheckout36, 1, 1 + kSectionInvert);
 			_shown[kMaxSection - 2] = 1;
 		} else {
-			_gm->reply(kStringCheckout37, 1, 1 + 128);
+			_gm->reply(kStringCheckout37, 1, 1 + kSectionInvert);
 			_shown[kMaxSection - 2] = 2;
 		}
 		_gm->drawGUI();
 	} else if (verb == ACTION_TALK && obj1._id == AXACUSSER) {
 		if (_shown[kMaxSection - 4]) {
 			_gm->say(kStringCheckout38);
-			_gm->reply(kStringCheckout39, 1, 1 + 128);
+			_gm->reply(kStringCheckout39, 1, 1 + kSectionInvert);
 			_gm->drawGUI();
 		} else {
 			switch (_shown[kMaxSection - 2]) {
@@ -1115,13 +1115,13 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 				addSentence(2, 1);
 				switch (_gm->dialog(3, _gm->_dials, dialCheckout1, 1)) {
 				case 0:
-					_gm->reply(kStringCheckout40, 1, 1 + 128);
+					_gm->reply(kStringCheckout40, 1, 1 + kSectionInvert);
 					_gm->say(kStringNo2);
-					_gm->reply(kStringCheckout41, 1, 1 + 128);
+					_gm->reply(kStringCheckout41, 1, 1 + kSectionInvert);
 					_gm->say(kStringCheckout42);
 					break;
 				case 1:
-					_gm->reply(kStringCheckout43, 1, 1 + 128);
+					_gm->reply(kStringCheckout43, 1, 1 + kSectionInvert);
 					if (_gm->_rooms[CULTURE_PALACE]->getObject(4)->_type & CARRIED) {
 						_gm->say(kStringCheckout44);
 						return interact(ACTION_GIVE,
@@ -1129,21 +1129,21 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 								*_gm->_rooms[CHECKOUT]->getObject(2));
 					} else {
 						_gm->say(kStringNo2);
-						_gm->reply(kStringCheckout45, 1, 1 + 128);
+						_gm->reply(kStringCheckout45, 1, 1 + kSectionInvert);
 						_gm->say(kStringCheckout46);
 					}
 					break;
 				case 2:
-					_gm->reply(kStringCheckout47, 1, 1 + 128);
+					_gm->reply(kStringCheckout47, 1, 1 + kSectionInvert);
 					break;
 				}
 				_gm->drawGUI();
 				break;
 			case 1:
-				_gm->reply(kStringCheckout48, 1, 1 + 128);
+				_gm->reply(kStringCheckout48, 1, 1 + kSectionInvert);
 				break;
 			case 2:
-				_gm->reply(kStringCheckout49, 1, 1 + 128);
+				_gm->reply(kStringCheckout49, 1, 1 + kSectionInvert);
 				break;
 			}
 		}
@@ -1278,38 +1278,38 @@ void Checkout::appearance() {
 	_vm->setCurrentImage(42);
 	_vm->renderImage(0);
 	_vm->renderImage(11);
-	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance1);
-	_gm->talk(1, 1 + 128, 0, kMessageLeft, kStringAppearance2);
+	_gm->talk(1, 1 + kSectionInvert, 0, kMessageLeft, kStringAppearance1);
+	_gm->talk(1, 1 + kSectionInvert, 0, kMessageLeft, kStringAppearance2);
 	_vm->renderImage(4);
 	_gm->wait(3);
 	_vm->renderImage(6);
 	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance3);
 	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance4);
 	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance5);
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance6);
+	_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringAppearance6);
 	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance7);
 	_gm->talk(8, 6, 0, kMessageLeft, kStringAppearance8);
 	_gm->talk(12, 13, 4, kMessageCenter, kStringAppearance9);
 	_vm->renderImage(4);
 	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(4 + 128);
+	_vm->renderImage(4 + kSectionInvert);
 	_gm->talkRest(12, 13, 4);
 	_vm->renderImage(4);
 	_gm->talkRest(12, 13, 1);
 	_vm->renderImage(6);
 	_gm->talkRest(12, 13, _gm->_restTime + 6);
 	_vm->removeMessage();
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance10);
+	_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringAppearance10);
 	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance11);
 	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance12);
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance13);
+	_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringAppearance13);
 	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance14);
 	_gm->talk(12, 13, 0, kMessageCenter, kStringAppearance15);
-	_gm->talk(3, 3 + 128, 0, kMessageRight, kStringAppearance16);
+	_gm->talk(3, 3 + kSectionInvert, 0, kMessageRight, kStringAppearance16);
 	_gm->talk(12, 13, 2, kMessageCenter, kStringAppearance17);
 	_vm->renderImage(4);
 	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(4 + 128);
+	_vm->renderImage(4 + kSectionInvert);
 	_gm->talkRest(12, 13, 4);
 	_vm->renderImage(4);
 	_gm->talkRest(12, 13, 1);
@@ -1320,7 +1320,7 @@ void Checkout::appearance() {
 	_gm->talk(12, 13, 1, kMessageCenter, kStringAppearance19);
 	_vm->renderImage(4);
 	_gm->talkRest(12, 13, 1);
-	_vm->renderImage(4 + 128);
+	_vm->renderImage(4 + kSectionInvert);
 	_gm->talkRest(12, 13, 4);
 	_vm->renderImage(4);
 	_gm->talkRest(12, 13, 1);
@@ -1340,31 +1340,31 @@ void Checkout::appearance() {
 	_vm->renderImage(21);
 	_vm->renderImage(19);
 	_gm->wait(1);
-	_vm->renderImage(21+128);
+	_vm->renderImage(21 + kSectionInvert);
 	_vm->renderImage(22);
 	_vm->renderImage(18);
 	_gm->wait(1);
-	_vm->renderImage(22+128);
+	_vm->renderImage(22 + kSectionInvert);
 	_vm->renderImage(23);
 	_gm->wait(1);
-	_vm->renderImage(23+128);
+	_vm->renderImage(23 + kSectionInvert);
 	_vm->renderImage(24);
 	_vm->renderImage(17);
 	_gm->wait(1);
-	_vm->renderImage(24+128);
+	_vm->renderImage(24 + kSectionInvert);
 	_vm->renderImage(25);
 	_gm->wait(1);
-	_vm->renderImage(25+128);
+	_vm->renderImage(25 + kSectionInvert);
 	_vm->renderImage(32);
 	_vm->renderImage(11);
 	_vm->renderImage(26);
 	_vm->playSound(kAudioAppearance3);
 	_gm->wait(2);
-	_vm->renderImage(32+128);
+	_vm->renderImage(32 + kSectionInvert);
 	_vm->renderImage(33);
 	_vm->renderImage(27);
 	_gm->wait(2);
-	_vm->renderImage(33+128);
+	_vm->renderImage(33 + kSectionInvert);
 	_vm->renderImage(34);
 	_vm->renderImage(28);
 	_gm->wait(2);
@@ -1412,7 +1412,7 @@ void Checkout::appearance() {
 	do {
 		_vm->renderImage(1);
 		_gm->wait(1);
-		_vm->renderImage(1 + 128);
+		_vm->renderImage(1 + kSectionInvert);
 		image->_section[1].x1 += xp;
 		image->_section[1].x2 += xp;
 		image->_section[1].y1 -= 2;
@@ -1579,7 +1579,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->playSound(kAudioElevatorBell);
 		while(_vm->_sound->isPlaying())
 			_gm->wait(1);
-		_vm->renderImage(8 + 128);
+		_vm->renderImage(8 + kSectionInvert);
 		if (_gm->_state._elevatorNumber == 4 && _gm->_state._elevatorE == 4 && !_gm->_state._toMuseum) {
 			_gm->wait(18);
 			_vm->renderImage(1);
@@ -1599,7 +1599,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderImage(1);
 				setSectionVisible(2, kShownFalse);
 				_gm->wait(3);
-				_vm->renderImage(1 + 128);
+				_vm->renderImage(1 + kSectionInvert);
 				_vm->renderMessage(kStringElevator12);
 				_gm->waitOnInput(_gm->_messageDuration);
 				_vm->removeMessage();
@@ -1623,23 +1623,23 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->setCurrentImage(26);
 				_vm->renderImage(0);
 				_vm->paletteFadeIn();
-				_gm->reply(kStringElevator15, 1, 1 + 128);
+				_gm->reply(kStringElevator15, 1, 1 + kSectionInvert);
 				_gm->say(kStringYes2);
-				_gm->reply(kStringElevator16, 1, 1 + 128);
-				_gm->reply(kStringElevator17, 1, 1 + 128);
+				_gm->reply(kStringElevator16, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator17, 1, 1 + kSectionInvert);
 				if (_gm->dialog(2, _gm->_dials, dialBoss1, 0)) {
-					_gm->reply(kStringElevator18, 1, 1 + 128);
-					_gm->reply(kStringElevator19, 1, 1 + 128);
+					_gm->reply(kStringElevator18, 1, 1 + kSectionInvert);
+					_gm->reply(kStringElevator19, 1, 1 + kSectionInvert);
 					_gm->say(kStringElevator20);
 				}
-				_gm->reply(kStringElevator21, 1, 1 + 128);
-				_gm->reply(kStringElevator22, 1, 1 + 128);
-				_gm->reply(kStringElevator23, 1, 1 + 128);
-				_gm->reply(kStringElevator24, 1, 1 + 128);
-				_gm->reply(kStringElevator25, 1, 1 + 128);
-				_gm->reply(kStringElevator26, 1, 1 + 128);
-				_gm->reply(kStringElevator27, 1, 1 + 128);
-				_gm->reply(kStringElevator28, 1, 1 + 128);
+				_gm->reply(kStringElevator21, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator22, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator23, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator24, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator25, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator26, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator27, 1, 1 + kSectionInvert);
+				_gm->reply(kStringElevator28, 1, 1 + kSectionInvert);
 				jobDescription();
 				return true;
 			case 1:
@@ -1650,7 +1650,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_gm->wait(3);
 				_vm->renderImage(1);
 				setSectionVisible(2, kShownFalse);
-				_vm->renderImage(1 + 128);
+				_vm->renderImage(1 + kSectionInvert);
 				break;
 			case 2:
 				_gm->reply(kStringElevator60, 4, 3);
@@ -1660,7 +1660,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_gm->wait(3);
 				_vm->renderImage(1);
 				setSectionVisible(2, kShownFalse);
-				_vm->renderImage(1 + 128);
+				_vm->renderImage(1 + kSectionInvert);
 				break;
 			}
 			_gm->drawGUI();
@@ -1685,7 +1685,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderMessage(kStringElevator63);
 			else if (number != _gm->_state._elevatorE) {
 				if (isSectionVisible(6)) {
-					_vm->renderImage(6 + 128);
+					_vm->renderImage(6 + kSectionInvert);
 					_objectState[4]._type &= ~OPENED;
 					_vm->playSound(kAudioElevator1);
 				}
@@ -1717,10 +1717,10 @@ void Elevator2::jobDescription() {
 	};
 	byte dialsBoss2[4] = {1,1,1,1};
 
-	_gm->reply(kStringElevator29, 1, 1 + 128);
-	_gm->reply(kStringElevator30, 1, 1 + 128);
-	_gm->reply(kStringElevator31, 1, 1 + 128);
-	_gm->reply(kStringElevator32, 1, 1 + 128);
+	_gm->reply(kStringElevator29, 1, 1 + kSectionInvert);
+	_gm->reply(kStringElevator30, 1, 1 + kSectionInvert);
+	_gm->reply(kStringElevator31, 1, 1 + kSectionInvert);
+	_gm->reply(kStringElevator32, 1, 1 + kSectionInvert);
 	_vm->setCurrentImage(30);
 	_vm->renderImage(0);
 	_gm->waitOnInput(72);
@@ -1743,26 +1743,26 @@ void Elevator2::jobDescription() {
 	_vm->setCurrentImage(26);
 	_vm->_system->fillScreen(kColorBlack);
 	_vm->renderImage(0);
-	_gm->reply(kStringElevator49, 1, 1 + 128);
+	_gm->reply(kStringElevator49, 1, 1 + kSectionInvert);
 	int e;
 	do {
 		addSentence(0, 2);
 		switch (e = _gm->dialog(4, dialsBoss2, dialBoss2, 2)) {
 		case 0:
-			_gm->reply(kStringElevator50, 1, 1 + 128);
+			_gm->reply(kStringElevator50, 1, 1 + kSectionInvert);
 			jobDescription();
 			return;
 		case 1:
-			_gm->reply(kStringElevator51, 1, 1 + 128);
+			_gm->reply(kStringElevator51, 1, 1 + kSectionInvert);
 			break;
 		case 2:
-			_gm->reply(kStringElevator52, 1, 1 + 128);
+			_gm->reply(kStringElevator52, 1, 1 + kSectionInvert);
 			break;
 		}
 		if (e == 1 || e == 2)
-			_gm->reply(kStringElevator53, 1, 1 + 128);
+			_gm->reply(kStringElevator53, 1, 1 + kSectionInvert);
 	} while (e != 3);
-	_gm->reply(kStringElevator54, 1, 1 + 128);
+	_gm->reply(kStringElevator54, 1, 1 + kSectionInvert);
 	_vm->paletteFadeOut();
 	_vm->_system->fillScreen(kColorBlack);
 	_vm->_screen->setViewportBrightness(255);
@@ -1810,7 +1810,7 @@ Apartment::Apartment(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[3] = Object(_id, kStringMusicSystem, kStringMusicSystemDescription, MUSIC_SYSTEM, COMBINABLE, 4, 4, 0);
 	_objectState[4] = Object(_id, kStringSpeakers, kStringSpeakersDescription, NULLOBJECT, NULLTYPE, 5, 5, 0);
 	_objectState[5] = Object(_id, kStringPencils, kStringPencilsDescription, NULLOBJECT, UNNECESSARY, 6, 6, 0);
-	_objectState[6] = Object(_id, kStringMetalBlocks, kStringMetalBlocksDescription, MAGNET, TAKE | COMBINABLE, 10, 10, 3 + 128);
+	_objectState[6] = Object(_id, kStringMetalBlocks, kStringMetalBlocksDescription, MAGNET, TAKE | COMBINABLE, 10, 10, 3 + kSectionInvert);
 	_objectState[7] = Object(_id, kStringImage, kStringImageDescription, NULLOBJECT, UNNECESSARY, 7, 7, 0);
 	_objectState[8] = Object(_id, kStringCabinet, kStringCabinetDescription, CABINET, OPENABLE | CLOSED, 8, 8, 0);
 	_objectState[9] = Object(_id, kStringChair, kStringDefaultDescription, NULLOBJECT, NULLTYPE, 9, 9, 0);
@@ -1854,7 +1854,7 @@ bool Apartment::interact(Action verb, Object &obj1, Object &obj2) {
 			}
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == HATCH && obj1._type & OPENED) {
-		_vm->renderImage(1 + 128);
+		_vm->renderImage(1 + kSectionInvert);
 		setSectionVisible(2, false);
 		_vm->playSound(kAudioElevator1);
 		obj1._type &= ~OPENED;
@@ -1890,7 +1890,7 @@ Ship::Ship(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[3] = Object(_id, kStringSwitch, kStringDefaultDescription, DOOR_SWITCH, PRESS | COMBINABLE, 255, 255, 0);
 	_objectState[4] = Object(_id, kStringSpaceSuit, kStringSpaceSuitDescription, SUIT, TAKE, 255, 255, 1);
 	_objectState[5] = Object(_id, kStringCable, kStringCableDescription1, RCABLE, COMBINABLE, 255, 255, 0);
-	_objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + 128);
+	_objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + kSectionInvert);
 
 	_outroText = 
 		_vm->getGameString(kStringIntro1) + '\0' + 
@@ -1945,7 +1945,7 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->playSound(kAudioShip1);
 		while (_vm->_sound->isPlaying() && !_vm->shouldQuit())
 			_gm->wait(1);
-		_vm->renderImage(6 + 128);
+		_vm->renderImage(6 + kSectionInvert);
 		_vm->renderImage(7);
 		_objectState[3]._description = kStringShip1;
 		_objectState[2]._description = kStringShip2;
@@ -1969,13 +1969,13 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, RCABLE)) {
 		_objectState[6]._description = kStringDefaultDescription;
 		if (_objectState[6]._click == 5)
-			_vm->renderImage(8 + 128);
+			_vm->renderImage(8 + kSectionInvert);
 		if (_objectState[6]._type & CARRIED)
 			_gm->_inventory.remove(_objectState[6]);
 		if (isSectionVisible(11) || isSectionVisible(10))
 			_vm->renderMessage(kStringShip5);
 		else if (isSectionVisible(9)) {
-			_vm->renderImage(9 + 128);
+			_vm->renderImage(9 + kSectionInvert);
 			_vm->renderImage(11);
 			if (!_shown[kMaxSection - 1]) {
 				kill();
@@ -2000,13 +2000,13 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 	} else if (verb == ACTION_USE && Object::combine(obj1, obj2, CABLE, DOOR_SWITCH) && isSectionVisible(7)) {
 		_objectState[6]._description = kStringDefaultDescription;
 		if (_objectState[6]._click == 5)
-			_vm->renderImage(8 + 128);
+			_vm->renderImage(8 + kSectionInvert);
 		if (_objectState[6]._type & CARRIED)
 			_gm->_inventory.remove(_objectState[6]);
 		if (isSectionVisible(11) || isSectionVisible(9))
 			_vm->renderMessage(kStringShip5);
 		else if (isSectionVisible(10)) {
-			_vm->renderImage(10 + 128);
+			_vm->renderImage(10 + kSectionInvert);
 			_vm->renderImage(11);
 			if (!_shown[kMaxSection - 1]) {
 				kill();
@@ -2037,27 +2037,27 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderMessage(kStringShip7, kMessageRight);
 		_gm->waitOnInput(_gm->_messageDuration);
 		_vm->removeMessage();
-		_gm->reply(kStringShip8, 1, 1 + 128);
+		_gm->reply(kStringShip8, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip9, kMessageRight);
 		_gm->waitOnInput(_gm->_messageDuration);
 		_vm->removeMessage();
-		_gm->reply(kStringShip10, 1, 1 + 128);
-		_gm->reply(kStringShip11, 1, 1 + 128);
-		_gm->reply(kStringShip12, 1, 1 + 128);
-		_gm->reply(kStringShip13, 1, 1 + 128);
+		_gm->reply(kStringShip10, 1, 1 + kSectionInvert);
+		_gm->reply(kStringShip11, 1, 1 + kSectionInvert);
+		_gm->reply(kStringShip12, 1, 1 + kSectionInvert);
+		_gm->reply(kStringShip13, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip14, kMessageRight);
 		_gm->waitOnInput(_gm->_messageDuration);
 		_vm->removeMessage();
-		_gm->reply(kStringShip15, 1, 1 + 128);
+		_gm->reply(kStringShip15, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip16, kMessageRight);
 		_gm->waitOnInput(_gm->_messageDuration);
 		_vm->removeMessage();
-		_gm->reply(kStringAha, 1, 1 + 128);
-		_gm->reply(kStringShip17, 1, 1 + 128);
+		_gm->reply(kStringAha, 1, 1 + kSectionInvert);
+		_gm->reply(kStringShip17, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip18, kMessageRight);
 		_gm->waitOnInput(_gm->_messageDuration);
 		_vm->removeMessage();
-		_gm->reply(kStringShip19, 1, 1 + 128);
+		_gm->reply(kStringShip19, 1, 1 + kSectionInvert);
 		_gm->wait(16);
 		CursorMan.showMouse(false);
 		_vm->renderImage(2);
@@ -2066,7 +2066,7 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 			if (i == 9)
 				_vm->playSound(kAudioShip3);
 			_gm->wait(2);
-			_vm->renderImage(i + 128);
+			_vm->renderImage(i + kSectionInvert);
 		}
 		_vm->renderImage(12);
 		_gm->wait(18);
@@ -2142,7 +2142,7 @@ Pyramid::Pyramid(SupernovaEngine *vm, GameManager2 *gm) {
 	_id = PYRAMID;
 	_shown[0] = kShownTrue;
 
-	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + 128);
+	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE | COMBINABLE, 255, 255, 1 + kSectionInvert);
 	_objectState[1] = Object(_id, kStringSign, kStringSignDescription, SIGN, COMBINABLE, 25, 25, 0);
 	_objectState[2] = Object(_id, kStringEntrance, kStringEntrance1Description, PYRA_ENTRANCE, EXIT, 27, 27, 0, PYR_ENTRANCE, 7);
 	_objectState[3] = Object(_id, kStringPyramid, kStringPyramidDescription, NULLOBJECT, NULLTYPE, 26, 26, 0);
@@ -2216,7 +2216,7 @@ bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
 			int number = hole->_id - HOLE1;
 			int start = number / 5 * 5 + 2;
 			for (int i = 1; i <= 26; i++)
-				_vm->renderImage(i + 128);
+				_vm->renderImage(i + kSectionInvert);
 			for (int i = start; i <= start + number % 5; i++)
 				_vm->renderImage(i);
 			_objectState[0]._click = 30;
@@ -2233,7 +2233,7 @@ bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
 	} else if (verb == ACTION_PULL && rope != nullptr && !(rope->_type & CARRIED) &&
 			!isSectionVisible(1)) {
 		for (int i = 2; i <= 26; i++)
-			_vm->renderImage(i + 128);
+			_vm->renderImage(i + kSectionInvert);
 		_vm->renderImage(1);
 		_objectState[0]._click = 29;
 		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
@@ -2241,7 +2241,7 @@ bool Pyramid::interact(Action verb, Object &obj1, Object &obj2) {
 		_gm->_rooms[HOLE_ROOM]->getObject(3)->_type = NULLTYPE;
 	} else if (verb == ACTION_TAKE && rope != nullptr && !(rope->_type & CARRIED)) {
 		for (int i = 2; i <= 26; i++)
-			_vm->renderImage(i + 128);
+			_vm->renderImage(i + kSectionInvert);
 		_gm->takeObject(*rope);
 		_gm->_rooms[HOLE_ROOM]->setSectionVisible(16, kShownFalse);
 		_gm->_rooms[HOLE_ROOM]->getObject(2)->_click = 255;
@@ -2745,7 +2745,7 @@ bool PuzzleFront::interact(Action verb, Object &obj1, Object &obj2) {
 			return true;
 		}
 		int a = _gm->_puzzleField[pos] + 1;
-		_vm->renderImage(a + 128);
+		_vm->renderImage(a + kSectionInvert);
 		image->_section[a].x1 = 95 + (newPos % 4) * 33;
 		image->_section[a].x2 = image->_section[a].x1 + 31;
 		image->_section[a].y1 = 24 + (newPos / 4) * 25;
@@ -3366,7 +3366,7 @@ InHole::InHole(SupernovaEngine *vm, GameManager2 *gm) {
 	_shown[0] = kShownTrue;
 
 	_objectState[0] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, EXIT, 0, 0, 0, HOLE_ROOM, 2);
-	_objectState[1] = Object(_id, kStringNote, kStringNoteDescription1, NULLOBJECT, TAKE, 255, 255, 1 + 128);
+	_objectState[1] = Object(_id, kStringNote, kStringNoteDescription1, NULLOBJECT, TAKE, 255, 255, 1 + kSectionInvert);
 	_objectState[2] = Object(_id, kStringSlot, kStringSlotDescription3, SLOT, COMBINABLE, 1, 1, 0);
 }
 
@@ -3408,7 +3408,7 @@ Floordoor::Floordoor(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[0] = Object(_id, kStringRight, kStringDefaultDescription, G_RIGHT, EXIT, 12, 12, 0, PYR_ENTRANCE, 14);
 	_objectState[1] = Object(_id, kStringLeft, kStringDefaultDescription, G_LEFT, EXIT, 11, 11, 0, PYR_ENTRANCE, 10);
 	_objectState[2] = Object(_id, kStringKnife1, kStringDefaultDescription, TKNIFE, TAKE | COMBINABLE, 255, 255, 9);
-	_objectState[3] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE, 255, 255, 11+128);
+	_objectState[3] = Object(_id, kStringRope, kStringDefaultDescription, ROPE, TAKE, 255, 255, 11 + kSectionInvert);
 	_objectState[4] = Object(_id, kStringOpening, kStringOpeningDescription3, HOLE, EXIT, 4, 4, 0, FLOORDOOR_U, 12);
 	_objectState[5] = Object(_id, kStringStones, kStringDefaultDescription, STONES, COMBINABLE, 5, 5, 0);
 }
@@ -3578,7 +3578,7 @@ bool BstDoor::interact(Action verb, Object &obj1, Object &obj2) {
 			&& obj1._id >= BST1 && obj1._id <= BST16) {
 		int number = obj1._id - (BST1 - 1);
 		if (isSectionVisible(number))
-			_vm->renderImage(number + 128);
+			_vm->renderImage(number + kSectionInvert);
 		else
 			_vm->renderImage(number);
 		_vm->playSound(kAudioTaxiOpen);
@@ -3728,9 +3728,9 @@ bool Mask::interact(Action verb, Object &obj1, Object &obj2) {
 		else
 			_vm->renderImage(obj1._id - EYE1 + 1);
 		if (isSectionVisible(1) && isSectionVisible(2)) {
-			_gm->reply(kStringPyramid17, 3, 3 + 128);
-			_gm->reply(kStringPyramid18, 3, 3 + 128);
-			_gm->reply(kStringPyramid19, 3, 3 + 128);
+			_gm->reply(kStringPyramid17, 3, 3 + kSectionInvert);
+			_gm->reply(kStringPyramid18, 3, 3 + kSectionInvert);
+			_gm->reply(kStringPyramid19, 3, 3 + kSectionInvert);
 			_vm->playSound(kAudioAppearance1);
 			while(_vm->_sound->isPlaying())
 				_gm->wait(1);
@@ -3791,14 +3791,14 @@ void Museum::onEntrance() {
 		_vm->renderImage(0);
 		_vm->paletteFadeIn();
 		if (hasDinosaurHead) {
-			_gm->reply(kStringMuseum3, 1, 1 + 128);
-			_gm->reply(kStringMuseum4, 1, 1 + 128);
+			_gm->reply(kStringMuseum3, 1, 1 + kSectionInvert);
+			_gm->reply(kStringMuseum4, 1, 1 + kSectionInvert);
 			_gm->takeMoney(30000);
 			_vm->playSound(kAudioAppearance1);
 		} else {
-			_gm->reply(kStringMuseum5, 1, 1 + 128);
+			_gm->reply(kStringMuseum5, 1, 1 + kSectionInvert);
 			_gm->say(kStringMuseum23);
-			_gm->reply(kStringMuseum24, 1, 1 + 128);
+			_gm->reply(kStringMuseum24, 1, 1 + kSectionInvert);
 		}
 		_vm->paletteFadeOut();
 		_gm->changeRoom(CITY2);
@@ -3860,7 +3860,7 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->playSound(kAudioTaxiOpen);
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == DOOR && (obj1._type & OPENED)) {
-		_vm->renderImage(1 + 128);
+		_vm->renderImage(1 + kSectionInvert);
 		_objectState[2]._type = EXIT | OPENABLE | CLOSED;
 		_vm->playSound(kAudioElevator1);
 	} else if (verb == ACTION_USE &&
@@ -3910,7 +3910,7 @@ bool MusEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 		return true;
 	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR &&
 			(obj1._type & OPENED)) {
-		_vm->renderImage(2 + 128);
+		_vm->renderImage(2 + kSectionInvert);
 		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
 		_vm->playSound(kAudioElevator1);
 		return true;
@@ -4088,7 +4088,7 @@ bool Mus5::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
 				(obj1._type & OPENED)) {
-		_vm->renderImage(8 + 128);
+		_vm->renderImage(8 + kSectionInvert);
 		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS6]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS6]->setSectionVisible(7, kShownFalse);
@@ -4138,7 +4138,7 @@ bool Mus6::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
 				(obj1._type & OPENED)) {
-		_vm->renderImage(7 + 128);
+		_vm->renderImage(7 + kSectionInvert);
 		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS5]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS5]->setSectionVisible(8, kShownFalse);
@@ -4219,7 +4219,7 @@ bool Mus8::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
 				(obj1._type & OPENED)) {
-		_vm->renderImage(2 + 128);
+		_vm->renderImage(2 + kSectionInvert);
 		_objectState[1]._type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS9]->getObject(0)->_type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS9]->setSectionVisible(1, kShownFalse);
@@ -4266,7 +4266,7 @@ bool Mus9::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
 				(obj1._type & OPENED)) {
-		_vm->renderImage(1 + 128);
+		_vm->renderImage(1 + kSectionInvert);
 		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS8]->getObject(1)->_type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS8]->setSectionVisible(2, kShownFalse);
@@ -4401,7 +4401,7 @@ bool MusRound::interact(Action verb, Object &obj1, Object &obj2) {
 		}
 	} else if (verb == ACTION_CLOSE && obj1._id == ENCRYPTED_DOOR && 
 				(obj1._type & OPENED)) {
-		_vm->renderImage(1 + 128);
+		_vm->renderImage(1 + kSectionInvert);
 		_objectState[0]._type = EXIT | OPENABLE | CLOSED;
 		_gm->_rooms[MUS9]->getObject(2)->_type = EXIT | OPENABLE | CLOSED;
 		_vm->playSound(kAudioElevator1);
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index 2b227dc..8f6b8d6 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -230,26 +230,7 @@ void GameManager2::destroyRooms() {
 }
 
 void GameManager2::initState() {
-	_currentInputObject = &_nullObject;
-	_inputObject[0] = &_nullObject;
-	_inputObject[1] = &_nullObject;
-	_inputVerb = ACTION_WALK;
-	_processInput = false;
-	_guiEnabled = true;
-	_animationEnabled = true;
-	_roomBrightness = 255;
-	_mouseClicked = false;
-	_keyPressed = false;
-	_mouseX = -1;
-	_mouseY = -1;
-	_mouseField = -1;
-	_inventoryScroll = 0;
-	_restTime = 0;
-	_oldTime = g_system->getMillis();
-	_timerPaused = 0;
-	_timePaused = false;
-	_messageDuration = 0;
-	_animationTimer = 0;
+	GameManager::initState();
 	_mapOn = false;
 	_steps = false;
 	_cracking = false;
@@ -258,17 +239,6 @@ void GameManager2::initState() {
 	for (int i = 0; i < 10; i++)
 		_securityTab[i] = startSecurityTab[i];
 
-	_currentSentence = -1;
-	for (int i = 0 ; i < 6 ; ++i) {
-		_sentenceNumber[i] = -1;
-		_texts[i] = kNoString;
-		_rows[i] = 0;
-		_rowsStart[i] = 0;
-		_dials[i] = 1;
-	}
-
-	_prevImgId = 0;
-
 	_state._money = 20;
 	_state._startTime = 0;
 	_state._addressKnown = false;
@@ -296,7 +266,10 @@ void GameManager2::initState() {
 	int16 startPuzzleTab[15] = {12, 3, 14, 1, 11, 0, 2, 13, 9, 5, 4, 10, 7, 6, 8};
 	for (int i = 0; i < 15; i++)
 		_state._puzzleTab[i] = startPuzzleTab[i];
-	_dead = false;
+
+	for (int i = 0 ; i < 6 ; ++i) {
+		_dials[i] = 1;
+	}
 }
 
 void GameManager2::initRooms() {
@@ -542,7 +515,7 @@ bool GameManager2::genericInteract(Action verb, Object &obj1, Object &obj2) {
 			if (!(o1->_type & CARRIED))
 			{
 				_vm->renderImage(1);
-				_vm->renderImage(2 + 128);
+				_vm->renderImage(2 + kSectionInvert);
 				_currentRoom->getObject(0)->_click = 255;
 			} else
 				_inventory.remove(*o1);


Commit: 16bad91f4b18427ebd210d6bebf826b364c3feba
    https://github.com/scummvm/scummvm/commit/16bad91f4b18427ebd210d6bebf826b364c3feba
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add placeholder info files to .dat

Changed paths:
  A devtools/create_supernova/msn.doc-en
  A devtools/create_supernova/msn.inf-en
  A devtools/create_supernova2/ms2.doc-en
  A devtools/create_supernova2/ms2.inf-en
    devtools/create_supernova/create_supernova.cpp
    devtools/create_supernova2/create_supernova2.cpp


diff --git a/devtools/create_supernova/create_supernova.cpp b/devtools/create_supernova/create_supernova.cpp
index 9ce202c..2022808 100644
--- a/devtools/create_supernova/create_supernova.cpp
+++ b/devtools/create_supernova/create_supernova.cpp
@@ -20,6 +20,50 @@ const char *lang[] = {
 	NULL
 };
 
+void writeDocFile(File& outputFile, const char *fileExtension, const char* language) {
+	File docFile;
+	char fileName[20];
+	sprintf(fileName, "msn.%s-%s", fileExtension, language);
+	if (!docFile.open(fileName, kFileReadMode)) {
+		printf("Cannot find file 'msn.%s' for language '%s'. This file will be skipped.\n", fileExtension, language);
+		return;
+	}
+
+	// Write block header in output file (4 bytes).
+	// We convert the file extension to upper case.
+	for (int i = 0 ; i < 3 ; ++i) {
+		if (fileExtension[i] >= 97 && fileExtension[i] <= 122)
+			outputFile.writeByte(fileExtension[i] - 32);
+		else
+			outputFile.writeByte(fileExtension[i]);
+	}
+	outputFile.writeByte('1');
+
+	// And write the language code on 4 bytes as well (padded with 0 if needed).
+	int languageLength = strlen(language);
+	for (int i = 0 ; i < 4 ; ++i) {
+		if (i < languageLength)
+			outputFile.writeByte(language[i]);
+		else
+			outputFile.writeByte(0);
+	}
+
+	// Write block size
+	
+	docFile.seek(0, SEEK_END);
+	int length = docFile.pos();
+	docFile.seek(0, SEEK_SET);
+	outputFile.writeLong(length);
+
+	// Write all the bytes.
+	for (int i = 0 ; i < length; ++i) {
+		byte b = docFile.readByte();
+		outputFile.writeByte(b);
+	}
+
+	docFile.close();
+}
+
 void writeImage(File& outputFile, const char *name, const char* language) {
 	File imgFile;
 	char fileName[16];
@@ -242,6 +286,8 @@ int main(int argc, char *argv[]) {
 		writeImage(outputFile, "img1", *l);
 		writeImage(outputFile, "img2", *l);
 		writeStrings(outputFile, *l);
+		writeDocFile(outputFile, "inf", *l);
+		writeDocFile(outputFile, "doc", *l);
 		++l;
 	}
 
diff --git a/devtools/create_supernova/msn.doc-en b/devtools/create_supernova/msn.doc-en
new file mode 100644
index 0000000..6add950
--- /dev/null
+++ b/devtools/create_supernova/msn.doc-en
@@ -0,0 +1 @@
+PLACEHOLDER MSN.DOC
diff --git a/devtools/create_supernova/msn.inf-en b/devtools/create_supernova/msn.inf-en
new file mode 100644
index 0000000..b1f25f5
--- /dev/null
+++ b/devtools/create_supernova/msn.inf-en
@@ -0,0 +1 @@
+PLACEHOLDER MSN.INF
diff --git a/devtools/create_supernova2/create_supernova2.cpp b/devtools/create_supernova2/create_supernova2.cpp
index 24d79f1..a6399b9 100644
--- a/devtools/create_supernova2/create_supernova2.cpp
+++ b/devtools/create_supernova2/create_supernova2.cpp
@@ -19,6 +19,51 @@ const char *lang[] = {
 	"en",
 	NULL
 };
+
+void writeDocFile(File& outputFile, const char *fileExtension, const char* language) {
+	File docFile;
+	char fileName[20];
+	sprintf(fileName, "ms2.%s-%s", fileExtension, language);
+	if (!docFile.open(fileName, kFileReadMode)) {
+		printf("Cannot find file 'ms2.%s' for language '%s'. This file will be skipped.\n", fileExtension, language);
+		return;
+	}
+
+	// Write block header in output file (4 bytes).
+	// We convert the file extension to upper case.
+	for (int i = 0 ; i < 3 ; ++i) {
+		if (fileExtension[i] >= 97 && fileExtension[i] <= 122)
+			outputFile.writeByte(fileExtension[i] - 32);
+		else
+			outputFile.writeByte(fileExtension[i]);
+	}
+	outputFile.writeByte('2');
+
+	// And write the language code on 4 bytes as well (padded with 0 if needed).
+	int languageLength = strlen(language);
+	for (int i = 0 ; i < 4 ; ++i) {
+		if (i < languageLength)
+			outputFile.writeByte(language[i]);
+		else
+			outputFile.writeByte(0);
+	}
+
+	// Write block size
+	
+	docFile.seek(0, SEEK_END);
+	int length = docFile.pos();
+	docFile.seek(0, SEEK_SET);
+	outputFile.writeLong(length);
+
+	// Write all the bytes.
+	for (int i = 0 ; i < length; ++i) {
+		byte b = docFile.readByte();
+		outputFile.writeByte(b);
+	}
+
+	docFile.close();
+}
+
 void writeDatafile(File& outputFile, int fileNumber, const char* language) {
 	File dataFile;
 	char fileName[20];
@@ -167,9 +212,7 @@ void writeImage(File& outputFile, const char *name, const char* language) {
 	// Write block size
 	outputFile.writeLong(w * h / 8);
 
-	// Write all the bytes. We should have w * h / 8 bytes
-	// However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
-	// but pbm uses 0 for white and 1 for black.
+	// Write all the bytes.
 	for (i = 0 ; i < w * h / 8 ; ++i) {
 		byte b = imgFile.readByte();
 		outputFile.writeByte(~b);
@@ -286,6 +329,8 @@ int main(int argc, char *argv[]) {
 		writeDatafile(outputFile, 15, *l);
 		writeDatafile(outputFile, 28, *l);
 		writeStrings(outputFile, *l);
+		writeDocFile(outputFile, "inf", *l);
+		writeDocFile(outputFile, "doc", *l);
 		++l;
 	}
 
diff --git a/devtools/create_supernova2/ms2.doc-en b/devtools/create_supernova2/ms2.doc-en
new file mode 100644
index 0000000..da6df8c
--- /dev/null
+++ b/devtools/create_supernova2/ms2.doc-en
@@ -0,0 +1 @@
+PLACEHOLDER MS2.DOC
diff --git a/devtools/create_supernova2/ms2.inf-en b/devtools/create_supernova2/ms2.inf-en
new file mode 100644
index 0000000..ed3da50
--- /dev/null
+++ b/devtools/create_supernova2/ms2.inf-en
@@ -0,0 +1 @@
+PLACEHOLDER MS2.INF


Commit: 37c53c420f9a3ccf2bc21de8caea9e0b65edacec
    https://github.com/scummvm/scummvm/commit/37c53c420f9a3ccf2bc21de8caea9e0b65edacec
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Load info files from .dat file

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index 5cf54d4..e98218d 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -265,19 +265,13 @@ void GameManager::processInput(Common::KeyState &state) {
 		// show game manual
 		if (!_guiEnabled)
 			return;
-		if (_vm->_MSPart == 1)
-			_vm->showTextReader("msn.doc");
-		else if (_vm->_MSPart == 2)
-			_vm->showTextReader("ms2.doc");
+		_vm->showTextReader("doc");
 		break;
 	case Common::KEYCODE_F3:
 		// show game info
 		if (!_guiEnabled)
 			return;
-		if (_vm->_MSPart == 1)
-			_vm->showTextReader("msn.inf");
-		else if (_vm->_MSPart == 2)
-			_vm->showTextReader("ms2.inf");
+		_vm->showTextReader("inf");
 		break;
 	case Common::KEYCODE_F4:
 		if (!_guiEnabled)
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 07d9128..d186995 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -510,14 +510,87 @@ void SupernovaEngine::showHelpScreen2() {
 	_gm->animationOn();
 }
 
-Common::Error SupernovaEngine::showTextReader(const char *filename) {
-	Common::File file;
+Common::SeekableReadStream *SupernovaEngine::getBlockFromDatFile(Common::String name) {
+	Common::String cur_lang = ConfMan.get("language");
+
+	// Validate the data file header
+	Common::File f;
+	char id[5], lang[5];
+	id[4] = lang[4] = '\0';
+	if (_MSPart == 1) {
+		if (!f.open(SUPERNOVA_DAT)) {
+			GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
+			return nullptr;
+		}
+		f.read(id, 3);
+		if (strncmp(id, "MSN", 3) != 0) {
+			GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
+			return nullptr;
+		}
+
+		int version = f.readByte();
+		if (version != SUPERNOVA_DAT_VERSION) {
+			GUIErrorMessageFormat(
+				_("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+				SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
+			return nullptr;
+		}
+	}
+	else if (_MSPart == 2) {
+		if (!f.open(SUPERNOVA2_DAT)) {
+			GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA2_DAT);
+			return nullptr;
+		}
+		f.read(id, 3);
+		if (strncmp(id, "MS2", 3) != 0) {
+			GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA2_DAT);
+			return nullptr;
+		}
+
+		int version = f.readByte();
+		if (version != SUPERNOVA2_DAT_VERSION) {
+			GUIErrorMessageFormat(
+				_("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
+				SUPERNOVA2_DAT, SUPERNOVA2_DAT_VERSION, version);
+			return nullptr;
+		}
+	}
 
-	if (!file.open(filename)) {
-		GUIErrorMessageFormat(_("Unable to find '%s' in game folder."), filename);
-		return Common::kReadingFailed;
+
+	while (!f.eos()) {
+		f.read(id, 4);
+		f.read(lang, 4);
+		uint32 size = f.readUint32LE();
+		if (f.eos())
+			break;
+		if (name == id && cur_lang == lang) {
+			return f.readStream(size);
+		} else
+			f.skip(size);
+	}
+
+	return nullptr;
+}
+
+Common::Error SupernovaEngine::showTextReader(const char *extension) {
+	Common::SeekableReadStream *stream;
+	Common::String blockName;
+	blockName = Common::String::format("%s%d", extension, _MSPart);
+	blockName.toUppercase();
+	if ((stream = getBlockFromDatFile(blockName)) == nullptr) {
+		Common::File file;
+		Common::String filename;
+		if (_MSPart == 1)
+			filename = Common::String::format("msn.%s", extension);
+		if (_MSPart == 2)
+			filename = Common::String::format("ms2.%s", extension);
+
+		if (!file.open(filename)) {
+			GUIErrorMessageFormat(_("Unable to find '%s' in game folder or the engine data file."), filename);
+			return Common::kReadingFailed;
+		}
+		stream = file.readStream(file.size());
 	}
-	Common::SeekableReadStream *stream = file.readStream(file.size());
 	int linesInFile = 0;
 	while (!stream->eos()) {
 		stream->readLine();
diff --git a/engines/supernova/supernova.h b/engines/supernova/supernova.h
index 55a021d..8a6fe0f 100644
--- a/engines/supernova/supernova.h
+++ b/engines/supernova/supernova.h
@@ -105,7 +105,8 @@ public:
 	void setGameString(int idx, const Common::String &string);
 	void showHelpScreen1();
 	void showHelpScreen2();
-	Common::Error showTextReader(const char *filename);
+	Common::SeekableReadStream *getBlockFromDatFile(Common::String name);
+	Common::Error showTextReader(const char *extension);
 
 	// forwarding calls
 	void playSound(AudioId sample);


Commit: 0e31a6163d6df9a8b7b26b9f50a3a49fe5c7d499
    https://github.com/scummvm/scummvm/commit/0e31a6163d6df9a8b7b26b9f50a3a49fe5c7d499
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Merge create_supernova tools

Changed paths:
  A devtools/create_supernova/create_image/015/clickfield_info
  A devtools/create_supernova/create_image/015/free_tile.xcf
  A devtools/create_supernova/create_image/015/image0.bmp
  A devtools/create_supernova/create_image/015/image1.bmp
  A devtools/create_supernova/create_image/015/image10.bmp
  A devtools/create_supernova/create_image/015/image11.bmp
  A devtools/create_supernova/create_image/015/image12.bmp
  A devtools/create_supernova/create_image/015/image13.bmp
  A devtools/create_supernova/create_image/015/image14.bmp
  A devtools/create_supernova/create_image/015/image15.bmp
  A devtools/create_supernova/create_image/015/image16.bmp
  A devtools/create_supernova/create_image/015/image17.bmp
  A devtools/create_supernova/create_image/015/image18.bmp
  A devtools/create_supernova/create_image/015/image19.bmp
  A devtools/create_supernova/create_image/015/image2.bmp
  A devtools/create_supernova/create_image/015/image3.bmp
  A devtools/create_supernova/create_image/015/image4.bmp
  A devtools/create_supernova/create_image/015/image5.bmp
  A devtools/create_supernova/create_image/015/image6.bmp
  A devtools/create_supernova/create_image/015/image7.bmp
  A devtools/create_supernova/create_image/015/image8.bmp
  A devtools/create_supernova/create_image/015/image9.bmp
  A devtools/create_supernova/create_image/015/palette
  A devtools/create_supernova/create_image/015/section_info
  A devtools/create_supernova/create_image/028/clickfield_info
  A devtools/create_supernova/create_image/028/image0.bmp
  A devtools/create_supernova/create_image/028/palette
  A devtools/create_supernova/create_image/028/section_info
  A devtools/create_supernova/create_image/README
  A devtools/create_supernova/create_image/create_image.cpp
  A devtools/create_supernova/create_image/create_ms2_data.015.sh
  A devtools/create_supernova/create_image/create_ms2_data.028.sh
  A devtools/create_supernova/create_image/module.mk
  A devtools/create_supernova/ms2.doc-en
  A devtools/create_supernova/ms2.inf-en
  A devtools/create_supernova/ms2_data.015-en
  A devtools/create_supernova/ms2_data.028-en
  A devtools/create_supernova/strings1-en.po
  A devtools/create_supernova/strings2-en.po
  R devtools/create_supernova/strings-en.po
  R devtools/create_supernova2/create_image/015/clickfield_info
  R devtools/create_supernova2/create_image/015/free_tile.xcf
  R devtools/create_supernova2/create_image/015/image0.bmp
  R devtools/create_supernova2/create_image/015/image1.bmp
  R devtools/create_supernova2/create_image/015/image10.bmp
  R devtools/create_supernova2/create_image/015/image11.bmp
  R devtools/create_supernova2/create_image/015/image12.bmp
  R devtools/create_supernova2/create_image/015/image13.bmp
  R devtools/create_supernova2/create_image/015/image14.bmp
  R devtools/create_supernova2/create_image/015/image15.bmp
  R devtools/create_supernova2/create_image/015/image16.bmp
  R devtools/create_supernova2/create_image/015/image17.bmp
  R devtools/create_supernova2/create_image/015/image18.bmp
  R devtools/create_supernova2/create_image/015/image19.bmp
  R devtools/create_supernova2/create_image/015/image2.bmp
  R devtools/create_supernova2/create_image/015/image3.bmp
  R devtools/create_supernova2/create_image/015/image4.bmp
  R devtools/create_supernova2/create_image/015/image5.bmp
  R devtools/create_supernova2/create_image/015/image6.bmp
  R devtools/create_supernova2/create_image/015/image7.bmp
  R devtools/create_supernova2/create_image/015/image8.bmp
  R devtools/create_supernova2/create_image/015/image9.bmp
  R devtools/create_supernova2/create_image/015/palette
  R devtools/create_supernova2/create_image/015/section_info
  R devtools/create_supernova2/create_image/028/clickfield_info
  R devtools/create_supernova2/create_image/028/image0.bmp
  R devtools/create_supernova2/create_image/028/palette
  R devtools/create_supernova2/create_image/028/section_info
  R devtools/create_supernova2/create_image/README
  R devtools/create_supernova2/create_image/create_image.cpp
  R devtools/create_supernova2/create_image/create_ms2_data.015.sh
  R devtools/create_supernova2/create_image/create_ms2_data.028.sh
  R devtools/create_supernova2/create_image/module.mk
  R devtools/create_supernova2/create_supernova2.cpp
  R devtools/create_supernova2/create_supernova2.h
  R devtools/create_supernova2/file.cpp
  R devtools/create_supernova2/file.h
  R devtools/create_supernova2/gametext.h
  R devtools/create_supernova2/img1-en-original.jpg
  R devtools/create_supernova2/img1-en.pbm
  R devtools/create_supernova2/img1-en.xcf
  R devtools/create_supernova2/module.mk
  R devtools/create_supernova2/ms2.doc-en
  R devtools/create_supernova2/ms2.inf-en
  R devtools/create_supernova2/ms2_data.015-en
  R devtools/create_supernova2/ms2_data.028-en
  R devtools/create_supernova2/po_parser.cpp
  R devtools/create_supernova2/po_parser.h
  R devtools/create_supernova2/strings-en.po
    devtools/create_supernova/create_supernova.cpp
    devtools/create_supernova/create_supernova.h
    devtools/create_supernova/gametext.h
    devtools/create_supernova/module.mk
    engines/supernova/graphics.cpp
    engines/supernova/screen.cpp
    engines/supernova/screen.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova.h


diff --git a/devtools/create_supernova/create_image/015/clickfield_info b/devtools/create_supernova/create_image/015/clickfield_info
new file mode 100644
index 0000000..14d95f6
--- /dev/null
+++ b/devtools/create_supernova/create_image/015/clickfield_info
@@ -0,0 +1,115 @@
+19
+
+123
+134
+49
+63
+0
+
+135
+146
+49
+63
+0
+
+147
+158
+49
+63
+0
+
+159
+170
+49
+63
+0
+
+171
+182
+49
+63
+0
+
+183
+194
+49
+63
+0
+
+123
+134
+64
+77
+0
+
+135
+146
+64
+77
+0
+
+147
+158
+64
+77
+0
+
+159
+170
+64
+77
+0
+
+171
+182
+64
+77
+0
+
+183
+194
+64
+77
+0
+
+135
+146
+78
+91
+0
+
+147
+158
+78
+91
+0
+
+159
+170
+78
+91
+0
+
+171
+182
+78
+91
+0
+
+84
+235
+7
+131
+0
+
+0
+24
+0
+137
+0
+
+295
+319
+0
+137
+0
diff --git a/devtools/create_supernova/create_image/015/free_tile.xcf b/devtools/create_supernova/create_image/015/free_tile.xcf
new file mode 100644
index 0000000..cae6311
Binary files /dev/null and b/devtools/create_supernova/create_image/015/free_tile.xcf differ
diff --git a/devtools/create_supernova/create_image/015/image0.bmp b/devtools/create_supernova/create_image/015/image0.bmp
new file mode 100644
index 0000000..dbe9d24
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image0.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image1.bmp b/devtools/create_supernova/create_image/015/image1.bmp
new file mode 100644
index 0000000..afee16b
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image1.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image10.bmp b/devtools/create_supernova/create_image/015/image10.bmp
new file mode 100644
index 0000000..b7bd16f
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image10.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image11.bmp b/devtools/create_supernova/create_image/015/image11.bmp
new file mode 100644
index 0000000..7bc12dc
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image11.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image12.bmp b/devtools/create_supernova/create_image/015/image12.bmp
new file mode 100644
index 0000000..27c3822
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image12.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image13.bmp b/devtools/create_supernova/create_image/015/image13.bmp
new file mode 100644
index 0000000..4757b8c
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image13.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image14.bmp b/devtools/create_supernova/create_image/015/image14.bmp
new file mode 100644
index 0000000..1f4ac7f
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image14.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image15.bmp b/devtools/create_supernova/create_image/015/image15.bmp
new file mode 100644
index 0000000..784f3a1
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image15.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image16.bmp b/devtools/create_supernova/create_image/015/image16.bmp
new file mode 100644
index 0000000..1f4ac7f
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image16.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image17.bmp b/devtools/create_supernova/create_image/015/image17.bmp
new file mode 100644
index 0000000..01a0a95
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image17.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image18.bmp b/devtools/create_supernova/create_image/015/image18.bmp
new file mode 100644
index 0000000..6989ef9
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image18.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image19.bmp b/devtools/create_supernova/create_image/015/image19.bmp
new file mode 100644
index 0000000..f5a5afd
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image19.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image2.bmp b/devtools/create_supernova/create_image/015/image2.bmp
new file mode 100644
index 0000000..b7bd16f
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image2.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image3.bmp b/devtools/create_supernova/create_image/015/image3.bmp
new file mode 100644
index 0000000..2d646d9
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image3.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image4.bmp b/devtools/create_supernova/create_image/015/image4.bmp
new file mode 100644
index 0000000..77493cb
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image4.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image5.bmp b/devtools/create_supernova/create_image/015/image5.bmp
new file mode 100644
index 0000000..784f3a1
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image5.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image6.bmp b/devtools/create_supernova/create_image/015/image6.bmp
new file mode 100644
index 0000000..1f4ac7f
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image6.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image7.bmp b/devtools/create_supernova/create_image/015/image7.bmp
new file mode 100644
index 0000000..77493cb
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image7.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image8.bmp b/devtools/create_supernova/create_image/015/image8.bmp
new file mode 100644
index 0000000..e8047cb
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image8.bmp differ
diff --git a/devtools/create_supernova/create_image/015/image9.bmp b/devtools/create_supernova/create_image/015/image9.bmp
new file mode 100644
index 0000000..6935736
Binary files /dev/null and b/devtools/create_supernova/create_image/015/image9.bmp differ
diff --git a/devtools/create_supernova/create_image/015/palette b/devtools/create_supernova/create_image/015/palette
new file mode 100644
index 0000000..075b385
--- /dev/null
+++ b/devtools/create_supernova/create_image/015/palette
@@ -0,0 +1,241 @@
+239
+
+0 0 0
+5 5 5
+8 8 8
+11 11 11
+14 14 14
+17 17 17
+20 20 20
+24 24 24
+28 28 28
+32 32 32
+36 36 36
+40 40 40
+45 45 45
+50 50 50
+56 56 56
+63 63 63
+0 0 63
+16 0 63
+31 0 63
+47 0 63
+63 0 63
+63 0 47
+63 0 31
+63 0 16
+63 0 0
+63 16 0
+63 31 0
+63 47 0
+63 63 0
+47 63 0
+31 63 0
+16 63 0
+0 63 0
+0 63 16
+0 63 31
+0 63 47
+0 63 63
+0 47 63
+0 31 63
+0 16 63
+31 31 63
+39 31 63
+47 31 63
+55 31 63
+63 31 63
+63 31 55
+63 31 47
+63 31 39
+63 31 31
+63 39 31
+63 47 31
+63 55 31
+63 63 31
+55 63 31
+47 63 31
+39 63 31
+31 63 31
+31 63 39
+31 63 47
+31 63 55
+31 63 63
+31 55 63
+31 47 63
+31 39 63
+45 45 63
+49 45 63
+54 45 63
+58 45 63
+63 45 63
+63 45 58
+63 45 54
+63 45 49
+63 45 45
+63 49 45
+63 54 45
+63 58 45
+63 63 45
+58 63 45
+54 63 45
+49 63 45
+45 63 45
+45 63 49
+45 63 54
+45 63 58
+45 63 63
+45 58 63
+45 54 63
+45 49 63
+0 0 28
+7 0 28
+14 0 28
+21 0 28
+28 0 28
+28 0 21
+28 0 14
+28 0 7
+28 0 0
+28 7 0
+28 14 0
+28 21 0
+28 28 0
+21 28 0
+14 28 0
+7 28 0
+0 28 0
+0 28 7
+0 28 14
+0 28 21
+0 28 28
+0 21 28
+0 14 28
+0 7 28
+14 14 28
+17 14 28
+21 14 28
+24 14 28
+28 14 28
+28 14 24
+28 14 21
+28 14 17
+28 14 14
+28 17 14
+28 21 14
+28 24 14
+28 28 14
+24 28 14
+21 28 14
+17 28 14
+14 28 14
+14 28 17
+14 28 21
+14 28 24
+14 28 28
+14 24 28
+14 21 28
+14 17 28
+20 20 28
+22 20 28
+24 20 28
+26 20 28
+28 20 28
+28 20 26
+28 20 24
+28 20 22
+28 20 20
+28 22 20
+28 24 20
+28 26 20
+28 28 20
+26 28 20
+24 28 20
+22 28 20
+20 28 20
+20 28 22
+20 28 24
+20 28 26
+20 28 28
+20 26 28
+20 24 28
+20 22 28
+0 0 16
+4 0 16
+8 0 16
+50 50 50
+0 0 0
+28 25 20
+15 13 11
+55 34 21
+57 38 20
+58 38 21
+24 21 17
+49 10 10
+26 23 19
+53 38 17
+22 19 16
+20 18 14
+20 20 20
+56 38 19
+34 29 9
+36 36 36
+40 40 40
+63 39 24
+51 38 16
+50 37 15
+54 38 18
+34 31 25
+47 37 14
+43 36 11
+46 37 13
+44 36 12
+49 37 14
+49 10 10
+30 27 22
+19 7 3
+34 29 9
+40 10 8
+27 9 5
+42 36 11
+34 34 34
+40 37 30
+44 10 9
+23 8 4
+23 21 17
+30 27 24
+31 9 6
+36 10 7
+35 31 28
+45 43 39
+38 35 28
+31 28 23
+43 43 43
+32 28 26
+37 34 27
+32 29 24
+34 31 25
+35 32 26
+18 16 13
+43 41 37
+40 36 30
+44 40 33
+42 38 32
+19 17 14
+38 35 29
+36 33 27
+36 32 29
+21 19 16
+34 31 26
+46 42 35
+29 26 21
+42 39 35
+23 21 17
+29 26 21
+31 28 23
+33 29 24
+27 24 20
+25 22 18
+40 38 34
+37 34 31
+39 36 32
diff --git a/devtools/create_supernova/create_image/015/section_info b/devtools/create_supernova/create_image/015/section_info
new file mode 100644
index 0000000..2000012
--- /dev/null
+++ b/devtools/create_supernova/create_image/015/section_info
@@ -0,0 +1,161 @@
+20
+
+0
+319
+0
+137
+0
+0
+0
+
+123
+134
+49
+62
+0
+44160
+0
+
+135
+146
+49
+62
+0
+44328
+0
+
+147
+158
+49
+62
+0
+44496
+0
+
+159
+170
+49
+62
+0
+44664
+0
+
+171
+182
+49
+62
+0
+44832
+0
+
+183
+194
+49
+62
+0
+45000
+0
+
+123
+134
+63
+76
+0
+45168
+0
+
+135
+146
+63
+76
+0
+45336
+0
+
+147
+158
+63
+76
+0
+45504
+0
+
+159
+170
+63
+76
+0
+45672
+0
+
+171
+182
+63
+76
+0
+45840
+0
+
+183
+194
+63
+76
+0
+46008
+0
+
+135
+146
+77
+90
+0
+46176
+0
+
+147
+158
+77
+90
+0
+46344
+0
+
+159
+170
+77
+90
+0
+46512
+0
+
+171
+182
+77
+90
+0
+46680
+0
+
+84
+235
+6
+131
+0
+46848
+0
+
+84
+235
+39
+131
+0
+464
+1
+
+84
+235
+93
+131
+0
+14600
+1
diff --git a/devtools/create_supernova/create_image/028/clickfield_info b/devtools/create_supernova/create_image/028/clickfield_info
new file mode 100644
index 0000000..6207269
--- /dev/null
+++ b/devtools/create_supernova/create_image/028/clickfield_info
@@ -0,0 +1,7 @@
+1
+
+0
+319
+0
+199
+0
diff --git a/devtools/create_supernova/create_image/028/image0.bmp b/devtools/create_supernova/create_image/028/image0.bmp
new file mode 100644
index 0000000..9333191
Binary files /dev/null and b/devtools/create_supernova/create_image/028/image0.bmp differ
diff --git a/devtools/create_supernova/create_image/028/palette b/devtools/create_supernova/create_image/028/palette
new file mode 100644
index 0000000..bb77e05
--- /dev/null
+++ b/devtools/create_supernova/create_image/028/palette
@@ -0,0 +1,241 @@
+239
+
+0 0 0
+10 10 10
+10 10 10
+11 11 11
+11 11 11
+12 12 12
+13 13 13
+13 13 13
+13 13 13
+13 13 13
+14 14 14
+14 14 14
+14 14 14
+15 15 15
+15 15 15
+15 15 15
+15 15 15
+16 16 16
+16 16 16
+16 16 16
+16 16 16
+17 17 17
+17 17 17
+17 17 17
+17 17 17
+18 18 18
+18 18 18
+18 18 18
+18 18 18
+19 19 19
+19 19 19
+19 19 19
+19 19 19
+20 20 20
+20 20 20
+20 20 20
+20 20 20
+21 21 21
+21 21 21
+21 21 21
+21 21 21
+22 22 22
+22 22 22
+22 22 22
+22 22 22
+23 23 23
+23 23 23
+23 23 23
+23 23 23
+24 24 24
+24 24 24
+24 24 24
+24 24 24
+25 25 25
+25 25 25
+25 25 25
+25 25 25
+26 26 26
+26 26 26
+26 26 26
+26 26 26
+27 27 27
+27 27 27
+27 27 27
+27 27 27
+28 28 28
+28 28 28
+28 28 28
+28 28 28
+29 29 29
+29 29 29
+29 29 29
+29 29 29
+30 30 30
+30 30 30
+30 30 30
+30 30 30
+31 31 31
+31 31 31
+31 31 31
+31 31 31
+32 32 32
+32 32 32
+32 32 32
+32 32 32
+33 33 33
+33 33 33
+33 33 33
+33 33 33
+34 34 34
+34 34 34
+34 34 34
+34 34 34
+35 35 35
+35 35 35
+35 35 35
+35 35 35
+36 36 36
+36 36 36
+36 36 36
+36 36 36
+37 37 37
+37 37 37
+37 37 37
+37 37 37
+38 38 38
+38 38 38
+38 38 38
+38 38 38
+39 39 39
+39 39 39
+39 39 39
+39 39 39
+40 40 40
+40 40 40
+40 40 40
+40 40 40
+41 41 41
+41 41 41
+41 41 41
+41 41 41
+42 42 42
+42 42 42
+42 42 42
+42 42 42
+43 43 43
+43 43 43
+43 43 43
+43 43 43
+44 44 44
+44 44 44
+44 44 44
+44 44 44
+45 45 45
+45 45 45
+45 45 45
+45 45 45
+46 46 46
+46 46 46
+46 46 46
+46 46 46
+47 47 47
+47 47 47
+47 47 47
+47 47 47
+48 48 48
+48 48 48
+48 48 48
+48 48 48
+49 49 49
+49 49 49
+49 49 49
+49 49 49
+50 50 50
+50 50 50
+50 50 50
+50 50 50
+51 51 51
+51 51 51
+51 51 51
+51 51 51
+52 52 52
+52 52 52
+52 52 52
+52 52 52
+53 53 53
+53 53 53
+53 53 53
+53 53 53
+54 54 54
+54 54 54
+54 54 54
+54 54 54
+55 55 55
+55 55 55
+55 55 55
+55 55 55
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
+0 0 0
diff --git a/devtools/create_supernova/create_image/028/section_info b/devtools/create_supernova/create_image/028/section_info
new file mode 100644
index 0000000..5ced3d3
--- /dev/null
+++ b/devtools/create_supernova/create_image/028/section_info
@@ -0,0 +1,9 @@
+1
+
+0
+319
+0
+199
+0
+0
+0
diff --git a/devtools/create_supernova/create_image/README b/devtools/create_supernova/create_image/README
new file mode 100644
index 0000000..80c898f
--- /dev/null
+++ b/devtools/create_supernova/create_image/README
@@ -0,0 +1,87 @@
+This tool can be used to generate Mission Supernova 2 datafiles containing images
+and might be able to do the same even for Mission Supernova 1.
+
+The tool is not foolproof and a lot of checks are missing (since it's just a tool),
+so it could easily generate nonsense without any warning if for example command line
+arguments aren't as expected.
+
+To use this tool create a folder named as the number of the datafile you want to
+create, it should be 3 characters long, add required numbers of zeros to the begining
+of the name (015 for ms2_data.015).
+
+Inside this folder should be:
+
+--clickfield_info, this contains info about clickfields. On the first row should be a
+number saying how many clickfields there are and on the following rows are
+descripitons of individual clickfields in this order (x1, x2, y1, y2, next),
+for example:
+	2
+
+	123
+	134
+	49
+	63
+	0
+
+	135
+	146
+	49
+	63
+	0
+
+This would be the contents of a file describing 2 clickfields.
+
+--section_info similar to the clickfield_info. Contains info about sections. On the
+first row should be a number saying how many sections there are and on the following
+rows are descripitons of individual sections in this order
+(x1, x2, y1, y2, next, addressLow, addressHigh), for example:
+	2
+
+	0
+	319
+	0
+	137
+	0
+	0
+	0
+
+	123
+	134
+	49
+	62
+	0
+	44160
+	0
+
+This would be the contents of a file describing 2 sections
+
+--palette Contains info about palette. On the first row should be a number saying
+how many colors there are and on the following rows are the individual RGB values of
+colors (don't forget, that the engine shifts each color by 2 places to the left
+(brightening the image), so the palette basicaly has to be shifted by 2 to the right
+to get the right colors). For example:
+3
+50 50 50
+0 0 0
+28 25 20
+
+This would be the contents of a file containing palette with 3 colors.
+
+--image#.bmp For each section, there has to be image#.bmp, replace the '#' by the
+number of section this image belongs to. The image has to use indexes to the palette
+for storing the color of each pixel (Image -> Mode -> Indexed... in gimp).
+
+
+Running the tool
+The tool needs 3 comand line arguments when running it:
+-- Prefix of the file to be created (use "ms2_data" to create "ms2_data.###")
+-- Number of the file to be created and also the number of a folder to read all the 
+files from (use "15" to create prefix.015)
+-- Number of bytes to skip in each .bmp file. At the begining of each .bmp file is
+a header with information about the file and after that is stored the palette. This
+tool doesn't need these, so this number says how many bytes to skip to get to the pixel
+data. For example: use 1146 to generate ms2_data.015 from the files included.
+
+Be aware, this tool does only basic checks of comandline arguments and no checks of
+the input files (only their presence).
+
diff --git a/devtools/create_supernova/create_image/create_image.cpp b/devtools/create_supernova/create_image/create_image.cpp
new file mode 100644
index 0000000..1bf1e24
--- /dev/null
+++ b/devtools/create_supernova/create_image/create_image.cpp
@@ -0,0 +1,202 @@
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <cstring>
+#include <iomanip>
+#include <cstdlib>
+
+std::string filenumber;
+
+int writePalette(std::ofstream &output) {
+	std::string filename = filenumber + "/palette";
+	std::ifstream palette(filename.c_str());
+	if (!palette.is_open()) {
+		std::cerr << "Couldn't open palette file" << std::endl;
+		return 1;
+	}
+	int input;
+	do {
+		palette >> input;
+		if (palette.eof())
+			break;
+		output << (char) input;
+	} while(true);
+	palette.close();
+	return 0;
+}
+
+int writeSections(std::ofstream &output) {
+	std::string filename = filenumber + "/section_info";
+	std::ifstream sectionInfo(filename.c_str());
+	if (!sectionInfo.is_open()) {
+		std::cerr << "Couldn't open section_info file" << std::endl;
+		return 0;
+	}
+	int numSections;
+	sectionInfo >> numSections;
+	output << (char) numSections;
+
+	int input;
+	char *input_byte = (char *) &input;
+	for(int i = 0; i < numSections; i++) {
+		//x1
+		sectionInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//x2
+		sectionInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//y1
+		sectionInfo >> input;
+		output << (char)input;
+		//y2
+		sectionInfo >> input;
+		output << (char)input;
+		//next
+		sectionInfo >> input;
+		output << (char)input;
+		//addressLow
+		sectionInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//addressHigh
+		sectionInfo >> input;
+		output << (char)input;
+	}
+	sectionInfo.close();
+	return numSections;
+}
+
+int writeClickFields(std::ofstream &output) {
+	std::string filename = filenumber + "/clickfield_info";
+	std::ifstream clickFieldInfo(filename.c_str());
+	if (!clickFieldInfo.is_open()) {
+		std::cerr << "Couldn't open clickfield_info file" << std::endl;
+		return 1;
+	}
+	int numClickFields;
+	clickFieldInfo >> numClickFields;
+	output << (char) numClickFields;
+
+	int input;
+	char *input_byte = (char *) &input;
+	for(int i = 0; i < numClickFields; i++) {
+		//x1
+		clickFieldInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//x2
+		clickFieldInfo >> input;
+		output << (char)input_byte[0];
+		output << (char)input_byte[1];
+		//y1
+		clickFieldInfo >> input;
+		output << (char)input;
+		//y2
+		clickFieldInfo >> input;
+		output << (char)input;
+		//next
+		clickFieldInfo >> input;
+		output << (char)input;
+	}
+	clickFieldInfo.close();
+	return 0;
+}
+
+int writePixelData(std::ofstream &output, int imageNum, int skip) {
+	std::ostringstream fileName;
+	fileName << filenumber << "/image" << imageNum << ".bmp";
+	std::ifstream image(fileName.str().c_str(), std::ios::binary);
+	if (!image.is_open()) {
+		std::cerr << "Couldn't open " << fileName.str() << " file" << std::endl;
+		return 0;
+	}
+
+	image.seekg(0, image.end);
+	int length = image.tellg();
+	length -= skip;
+	image.seekg(skip, image.beg);
+	char *buf = new char[length];
+	image.read(buf, length);
+	output.write(buf, length);
+	delete buf;
+	return length;
+}
+
+void printHelp() {
+	std::cout << "create_image output-prefix file-number bytes-skip" << std::endl << std::endl;
+	std::cout << "	output-prefix: String the created file should begin with" << std::endl;
+	std::cout << "	file-number: Number of the created file and also name of source folder" << std::endl;
+	std::cout << "	bytes-skip: How many bytes to to skip in each .bmp file" << std::endl;
+	std::cout << std::endl << "EXAMPLE:" << std::endl
+		<< "create_image ms2_data 15 1146" << std::endl
+		<< "	creates ms2_data.015 assuming there are the right files inside 015 folder" << std::endl;
+}
+
+int main(int argc, char *argv[]) {
+	if (argc == 2 && !strcmp(argv[1], "--help")) {
+		printHelp();
+		return 0;
+	}
+	if (argc != 4 ) {
+		printHelp();
+		return 1;
+	}
+	std::ostringstream oss;
+	oss << std::setfill('0') << std::setw(3) << argv[2];
+	filenumber = oss.str();
+	char *ptr;
+	int bytesSkip = strtol(argv[3], &ptr, 10);
+	std::string oFileName = argv[1];
+	oFileName += "." + filenumber;
+	std::ofstream output(oFileName.c_str(), std::ios::binary);
+	if (!output.is_open()) {
+		std::cerr << "Couldn't open output file" << std::endl;
+		return 1;
+	}
+	// size
+	// just a place holder, will be filled later
+	output << (char) 0x40;
+	output << (char) 0x70;
+	output << (char) 0x01;
+	output << (char) 0x00;
+	if (writePalette(output))
+		return 1;
+	int numImages = writeSections(output);
+	if (numImages == 0)
+		return 1;
+	if (writeClickFields(output))
+		return 1;
+	// we don't compress the images, so set to 0
+	output << (char) 0; //numRepeat
+	output << (char) 0; //numZw
+	int totalLength = 0;
+	int oldLength = 0;
+	for (int i = 0; i < numImages; i++) {
+		totalLength += writePixelData(output, i, bytesSkip);
+		if (oldLength == totalLength) {
+			std::cerr << "Error while reading the image number: " << i << std::endl; 
+			return 1;
+		}
+		oldLength = totalLength;
+	}
+
+	//reversing the size computation inside the engine
+	totalLength += 15;
+	totalLength /= 16;
+	totalLength -= 0x70;
+	int i = (totalLength & 0xf000) >> 12;
+	int j = totalLength << 4;
+	char *i_p = (char *) &i;
+	char *j_p = (char *) &j;
+
+	//writing the size
+	output.seekp(0);
+	output << j_p[0];
+	output << j_p[1];
+	output << i_p[0];
+	output << i_p[1];
+	output.close();
+	return 0;
+}
diff --git a/devtools/create_supernova/create_image/create_ms2_data.015.sh b/devtools/create_supernova/create_image/create_ms2_data.015.sh
new file mode 100755
index 0000000..883cff6
--- /dev/null
+++ b/devtools/create_supernova/create_image/create_ms2_data.015.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+./create_image ms2_data 15 1146
diff --git a/devtools/create_supernova/create_image/create_ms2_data.028.sh b/devtools/create_supernova/create_image/create_ms2_data.028.sh
new file mode 100755
index 0000000..66fda85
--- /dev/null
+++ b/devtools/create_supernova/create_image/create_ms2_data.028.sh
@@ -0,0 +1 @@
+./create_image ms2_data 28 829
diff --git a/devtools/create_supernova/create_image/module.mk b/devtools/create_supernova/create_image/module.mk
new file mode 100644
index 0000000..547b6dd
--- /dev/null
+++ b/devtools/create_supernova/create_image/module.mk
@@ -0,0 +1,10 @@
+MODULE := devtools/create_supernova/create_image
+
+MODULE_OBJS := create_image.o
+
+# Set the name of the executable
+TOOL_EXECUTABLE := create_image
+
+# Include common rules
+include $(srcdir)/rules.mk
+
diff --git a/devtools/create_supernova/create_supernova.cpp b/devtools/create_supernova/create_supernova.cpp
index 2022808..b9571e4 100644
--- a/devtools/create_supernova/create_supernova.cpp
+++ b/devtools/create_supernova/create_supernova.cpp
@@ -2,6 +2,7 @@
 #include "gametext.h"
 #include "file.h"
 #include "po_parser.h"
+#include <iostream>
 
 // HACK to allow building with the SDL backend on MinGW
 // see bug #1800764 "TOOLS: MinGW tools building broken"
@@ -20,12 +21,62 @@ const char *lang[] = {
 	NULL
 };
 
-void writeDocFile(File& outputFile, const char *fileExtension, const char* language) {
+void writeDatafile(File& outputFile, int fileNumber, const char* language, int part) {
+	File dataFile;
+	char fileName[20];
+	if (part == 1)
+		sprintf(fileName, "msn_data.%03d-%s", fileNumber, language);
+	if (part == 2)
+		sprintf(fileName, "ms2_data.%03d-%s", fileNumber, language);
+	if (!dataFile.open(fileName, kFileReadMode)) {
+		printf("Cannot find dataFile %s. This file will be skipped.\n", fileName);
+		return;
+	}
+
+	// Write block header in output file (4 bytes).
+	// M(fileNumber) for example M015
+	char number[4];
+	sprintf(number, "%03d", fileNumber);
+	outputFile.writeByte('M');
+	for (int i = 0 ; i < 3 ; ++i) {
+			outputFile.writeByte(number[i]);
+	}
+	// And write the language code on 4 bytes as well (padded with 0 if needed).
+	int languageLength = strlen(language);
+	for (int i = 0 ; i < 4 ; ++i) {
+		if (i < languageLength)
+			outputFile.writeByte(language[i]);
+		else
+			outputFile.writeByte(0);
+	}
+
+	// Write block size
+	
+	dataFile.seek(0, SEEK_END);
+	int length = dataFile.pos();
+	dataFile.seek(0, SEEK_SET);
+	outputFile.writeLong(length);
+
+	// Write all the bytes. We should have w * h / 8 bytes
+	// However we need to invert the bits has the engine expects 1 for the background and 0 for the text (black)
+	// but pbm uses 0 for white and 1 for black.
+	for (int i = 0 ; i < length; ++i) {
+		byte b = dataFile.readByte();
+		outputFile.writeByte(b);
+	}
+
+	dataFile.close();
+}
+
+void writeDocFile(File& outputFile, const char *fileExtension, const char* language, int part) {
 	File docFile;
 	char fileName[20];
-	sprintf(fileName, "msn.%s-%s", fileExtension, language);
+	if (part == 1)
+		sprintf(fileName, "msn.%s-%s", fileExtension, language);
+	if (part == 2)
+		sprintf(fileName, "ms2.%s-%s", fileExtension, language);
 	if (!docFile.open(fileName, kFileReadMode)) {
-		printf("Cannot find file 'msn.%s' for language '%s'. This file will be skipped.\n", fileExtension, language);
+		printf("Cannot find file '%s'. This file will be skipped.\n", fileName);
 		return;
 	}
 
@@ -37,7 +88,7 @@ void writeDocFile(File& outputFile, const char *fileExtension, const char* langu
 		else
 			outputFile.writeByte(fileExtension[i]);
 	}
-	outputFile.writeByte('1');
+	outputFile.writeByte((char) part + '0');
 
 	// And write the language code on 4 bytes as well (padded with 0 if needed).
 	int languageLength = strlen(language);
@@ -179,7 +230,7 @@ void writeImage(File& outputFile, const char *name, const char* language) {
 	imgFile.close();
 }
 
-void writeGermanStrings(File& outputFile) {
+void writeGermanStrings(File& outputFile, int part) {
 	// Write header and language
 	outputFile.write("TEXT", 4);
 	outputFile.write("de\0\0", 4);
@@ -190,7 +241,11 @@ void writeGermanStrings(File& outputFile) {
 	outputFile.writeLong(blockSize);
 
 	// Write all the strings
-	const char **s = &gameText[0];
+	const char **s;
+	if (part == 1)
+		s = &gameText1[0];
+	if (part == 2)
+		s = &gameText2[0];
 	while (*s) {
 		outputFile.writeString(*s);
 		blockSize += strlen(*s) + 1;
@@ -203,9 +258,9 @@ void writeGermanStrings(File& outputFile) {
 	outputFile.seek(0, SEEK_END);
 }
 
-void writeStrings(File& outputFile, const char* language) {
+void writeStrings(File& outputFile, const char* language, int part) {
 	char fileName[16];
-	sprintf(fileName, "strings-%s.po", language);
+	sprintf(fileName, "strings%d-%s.po", part, language);
 	PoMessageList* poList = parsePoFile(fileName);
 	if (!poList) {
 		printf("Cannot find strings file for language '%s'.\n", language);
@@ -231,7 +286,11 @@ void writeStrings(File& outputFile, const char* language) {
 
 	// Write all the strings.
 	// If a string is not translated we use the German one.
-	const char **s = &gameText[0];
+	const char **s;
+	if (part == 1)
+		s = &gameText1[0];
+	if (part == 2)
+		s = &gameText2[0];
 	while (*s) {
 		const char* translation = poList->findTranslation(*s);
 		if (translation) {
@@ -247,10 +306,66 @@ void writeStrings(File& outputFile, const char* language) {
 
 	// Now write the block size and then go back to the end of the file.
 	outputFile.seek(blockSizePos, SEEK_SET);
+
 	outputFile.writeLong(blockSize);
 	outputFile.seek(0, SEEK_END);
 }
 
+void writeMS1(File &outputFile) {
+	// First part
+	outputFile.writeByte(1);
+
+	// Reserve space for game block size
+	uint32 blockSizePos = outputFile.pos();
+	uint32 blockSize = 0;
+	outputFile.writeLong(blockSize);
+
+	// German strings
+	writeGermanStrings(outputFile, 1);
+
+	// Other languages
+	const char **l = &lang[0];
+	while(*l) {
+		writeImage(outputFile, "img1", *l);
+		writeImage(outputFile, "img2", *l);
+		writeStrings(outputFile, *l, 1);
+		writeDocFile(outputFile, "inf", *l, 1);
+		writeDocFile(outputFile, "doc", *l, 1);
+		++l;
+	}
+	blockSize = outputFile.pos() - blockSizePos - 4;
+	outputFile.seek(blockSizePos, SEEK_SET);
+	outputFile.writeLong(blockSize);
+	outputFile.seek(0, SEEK_END);
+}
+
+void writeMS2(File &outputFile) {
+	// Second part
+	outputFile.writeByte(2);
+
+	// Reserve space for game block size
+	uint32 blockSizePos = outputFile.pos();
+	uint32 blockSize = 0;
+	outputFile.writeLong(blockSize);
+
+	// German strings
+	writeGermanStrings(outputFile, 2);
+
+	// Other languages
+	const char **l = &lang[0];
+	while(*l) {
+		writeDatafile(outputFile, 15, *l, 2);
+		writeDatafile(outputFile, 28, *l, 2);
+		writeStrings(outputFile, *l, 2);
+		writeDocFile(outputFile, "inf", *l, 2);
+		writeDocFile(outputFile, "doc", *l, 2);
+		++l;
+	}
+	blockSize = outputFile.pos() - blockSizePos - 4;
+	outputFile.seek(blockSizePos, SEEK_SET);
+	outputFile.writeLong(blockSize);
+	outputFile.seek(0, SEEK_END);
+}
 
 /**
  * Main method
@@ -265,31 +380,24 @@ int main(int argc, char *argv[]) {
 	// The generated file is of the form:
 	// 3 bytes: 'MSN'
 	// 1 byte:  version
+	// - game blocks
+	// 1 byte: part (1 or 2)
+	// 4 bytes: game block size
 	// -- data blocks
 	// 4 bytes: header  'IMG1' and 'IMG2' for newspaper images (for file 1 and file 2 respectively),
 	//                  'TEXT' for strings
 	// 4 bytes: language code ('en\0', 'de\0'- see common/language.cpp)
 	// 4 bytes: block size n (uint32)
 	// n bytes: data
-	// ---
+	// --
+	// -
 
 	// Header
 	outputFile.write("MSN", 3);
 	outputFile.writeByte(VERSION);
 
-	// German strings
-	writeGermanStrings(outputFile);
-
-	// Other languages
-	const char **l = &lang[0];
-	while(*l) {
-		writeImage(outputFile, "img1", *l);
-		writeImage(outputFile, "img2", *l);
-		writeStrings(outputFile, *l);
-		writeDocFile(outputFile, "inf", *l);
-		writeDocFile(outputFile, "doc", *l);
-		++l;
-	}
+	writeMS1(outputFile);
+	writeMS2(outputFile);
 
 	outputFile.close();
 	return 0;
diff --git a/devtools/create_supernova/create_supernova.h b/devtools/create_supernova/create_supernova.h
index 8304786..858395c 100644
--- a/devtools/create_supernova/create_supernova.h
+++ b/devtools/create_supernova/create_supernova.h
@@ -26,7 +26,7 @@
 #ifndef CREATE_SUPERNOVA_H
 #define CREATE_SUPERNOVA_H
 
-#define VERSION 2
+#define VERSION 3
 
 
 
diff --git a/devtools/create_supernova/gametext.h b/devtools/create_supernova/gametext.h
index 93d9a64..84529b1 100644
--- a/devtools/create_supernova/gametext.h
+++ b/devtools/create_supernova/gametext.h
@@ -34,7 +34,7 @@
 // TODO: add the strings from the engine here, add an Id string in comment.
 // And in the engine add a StringId enum with all the Ids = index in this array.
 
-const char *gameText[] = {
+const char *gameText1[] = {
 	// 0
 	"Gehe",         // kStringCommandGo
 	"Schau",        // kStringCommandLook
@@ -830,4 +830,760 @@ const char *gameText[] = {
 	NULL
 };
 
+const char *gameText2[] = {
+	// 0
+	"Gehe",    //Go
+	"Schau",    //Look
+	"Nimm",    //Take
+	"\231ffne",    //Open
+	"Schlie\341e",    //Close
+	// 5
+	"Dr\201cke",    //Push
+	"Ziehe",    //Pull
+	"Benutze",    //Use
+	"Rede",    //Talk
+	"Gib",    //Give
+	// 10
+	"Gehe zu ",    //Go to 
+	"Schau ",    //Look at 
+	"Nimm ",    //Take 
+	"\231ffne ",    //Open 
+	"Schlie\341e ",    //Close 
+	// 15
+	"Dr\201cke ",    //Push 
+	"Ziehe ",    //Pull 
+	"Benutze ",    //Use 
+	"Rede mit ",    //Talk to 
+	"Gib ",    //Give 
+	// 20
+	" an ",    // to 
+	" mit ",    // with 
+	"Es ist nichts Besonderes daran.",    //There's nothing special about it.
+	"|", //Dialog separator
+	"Gespr\204ch beenden",    //End of conversation
+	// 25
+	"   F1 Hilfe",  // kStringHelpOverview1
+	"   F2 Anleitung",  // kStringHelpOverview2
+	"   F3 Programminformationen",  //kStringHelpOverview3
+	"   F4 Textgeschwindigkeit",    //kStringHelpOverview4
+	"   F5 Laden/Speichern",  // kStringHelpOverview5
+	// 30
+	"  ESC Vorspann \201berspringen",   // kStringHelpOverview6
+	"Alt X Spiel beenden",     // kStringHelpOverview7
+	"Textgeschwindigkeit:",    //Text speed:
+	"Spiel abbrechen?",    //Leave game?
+	"Ja",    //Yes
+	// 35
+	"Nein",    //No
+	"Laden",    //Load
+	"Speichern",    //Save
+	"Zur\201ck",    //Back
+	"Neustart",    //Restart
+	// 40
+	"Schreibfehler",    //write error
+	"Das tr\204gst du doch bei dir.",    //You already carry this.
+	"Du bist doch schon da.",    //You are already there.
+	"Das ist geschlossen.",    //This is closed.
+	"Das hast du doch schon.",    //You already have that.
+	// 45
+	"Das brauchst du nicht.",    //You don't need that.
+	"Das kannst du nicht nehmen.",    //You can't take that.
+	"Das l\204\341t sich nicht \224ffnen.",    //This cannot be opened.
+	"Das ist schon offen.",    //This is already opened.
+	"Das ist verschlossen.",    //This is locked.
+	// 50
+	"Das l\204\341t sich nicht schlie\341en.",    //This cannot be closed.
+	"Das ist schon geschlossen.",    //This is already closed.
+	"Behalt es lieber!",    //Better keep it!
+	"Das geht nicht.",    //You can't do that.
+	"^(C) 1994 Thomas und Steffen Dingel#",    //^(C) 1994 Thomas and Steffen Dingel#
+	// 55
+	"Story und Grafik:^ Thomas Dingel#",    //Story and Graphics:^ Thomas Dingel#
+	"Programmierung:^ Steffen Dingel#",    //Programming:^ Steffen Dingel#
+	"Musik:^ Bernd Hoffmann#",    //Music:^ Bernd Hoffmann#
+	"Getestet von ...#",    //Tested by ...#
+	"^Das war's.#",    //^That's it.#
+	// 60
+	"^Schlu\341!#",    //^Over!#
+	"^Ende!#",    //^End!#
+	"^Aus!#",    //^Done!#
+	"^Tsch\201\341!#",    //^Bye!#
+	"Oh!",    //Oh!
+	// 65
+	"Nicht schlecht!",    //Not bad!
+	"Supersound!",    //Supersound!
+	"Klasse!",    //Great!
+	"Nicht zu fassen!",    //I can't believe it!
+	"Super, ey!",    //Dope, yo!
+	// 70
+	"Fantastisch!",    //Fantastic!
+	"Umwerfend!",    //Stunning!
+	"Genial!",    //Brilliant!
+	"Spitze!",    //Awesome!
+	"Jawoll!",    //Alright!
+	// 75
+	"Hervorragend!",    //Outstanding!
+	"Ultragut!",    //Ultra-good!
+	"Megacool!",    //Mega cool!
+	"Yeah!",    //Yeah!
+	"Ein W\204chter betritt den Raum.|Du wirst verhaftet.",    //A guard enters the room.|You are getting arrested.
+	// 80
+	"Die n\204chsten paar Jahre|verbringst du im Knast.",    //You will spend the next|few years in jail.
+	"Es wird Alarm ausgel\224st.",    //The alarm is about to be set off.
+	"Du h\224rst Schritte.",    //You are hearing footsteps.
+	"Um das Schloss zu \224ffnen,|brauchst du einige Zeit.",    //You will take some time,|to pick that lock.
+	"Du ger\204tst in Panik|und ziehst die Keycard|aus der T\201r.",    //You are panicking|and remove the keycard|from the door.
+	// 85
+	"Du hast deinen Auftrag|noch nicht ausgef\201hrt.",    //You have not completed|your task yet.
+	"Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du dich, zu fliehen.",    //Although you haven't|disabled the alarm yet,|you decide to escape.
+	"Du entledigst dich der Einbruchswerkzeuge|und nimmst ein Taxi zum Kulturpalast.",    //You get rid of your burglar tools|and take a cab to the Palace of Culture.
+	"Diese T\201r brauchst|du nicht zu \224ffnen.",    //You don't need|to open this door.
+	"Uff, es hat geklappt!",    //Phew, it worked!
+	// 90
+	"Zur\201ck im Quartier der Gangster ...",    //Back in the gangsters' hideout ...
+	"Das lief ja wie am Schn\201rchen!",    //Everything went like clockwork!
+	"Hier, dein Anteil von 30000 Xa.",    //Here, your share of 30000 Xa.
+	"Wo ist denn der Saurierkopf?",    //Where's the dinosaur skull?
+	"Dazu hatte ich keine Zeit mehr.",    //I didn't have enough time for that.
+	// 95
+	"Was? Du spinnst wohl!|Dann kriegst du auch deinen|Anteil nicht. Raus!",    //What? You're nuts!|Then you won't get your|share. Beat it!
+	"Der Sauger ist schon dort.",    //The suction cup is already there.
+	"Du heftest den Sauger an die Wand|und h\204lst dich daran fest.",    //You attach the suction cup to the wall|and hold on to it.
+	"Du stellst dich auf den|Boden nimmst den Sauger|wieder von der Wand",    //You stand on the floor|then remove the suction cup from the wall
+	"Die Alarmanlage ist|schon ausgeschaltet.",    //The alarm system is|already switched off.
+	// 100
+	"Um die Anlage abzuschalten,|brauchst du einige Zeit.",    //To turn off the system,|you need some time.
+	"Die Alarmanlage ist jetzt ausgeschaltet.",    //The alarm system is now switched off.
+	"Saurier",    //Dinosaur
+	"Du hast jetzt besseres zu tun,|als das Ding anzuschauen.",    //You have better things to do now|than look at that thing.
+	"Eingang",    //Entrance
+	// 105
+	"T\201r",    //Door
+	"Strasse zum Stadtzentrum",    //Road to the city center
+	"Kamera",    //Security camera
+	"Hoffentlich bemerkt dich niemand.",    //Hopefully nobody will notice you.
+	"Haupteingang",    //Main entrance
+	// 110
+	"Gang",    //Corridor
+	"Ziemlich gro\341.",    //Quite large.
+	"Saurierkopf",    //Dinosaur head
+	"Dies ist der Kopf,|den du suchst.",    //This is the head|you're looking for.
+	"Alarmanlage",    //Alarm system
+	// 115
+	"Sauger",    //Suction cup
+	"Wand",    //Wall
+	"Loch",    //Opening
+	"Buchstabe",    //Letter
+	"Sie ist sehr massiv.",    //It is very massive.
+	// 120
+	"Hmm, X und Y, irgendwo|habe ich die Buchstaben|schon gesehen.",    //Hmm, X and Y|I have seen these letters|somewhere before.
+	"Deine Zeit ist um, Fremder!",    //Your Time is up, Stranger!
+	"Du hast das Seil|doch schon festgebunden.",    //You already tied the rope.
+	"Das w\201rde wenig bringen.",    //That would have little effect.
+	"Sonnenstich, oder was?",    //Sunstroke, or what?
+	// 125
+	"Du merkst, da\341 der Boden|unter dir nachgibt, und|springst zur Seite.",    //You notice that the ground|is giving way under you,|and you leap aside.
+	"Puzzleteil",    //Puzzle piece
+	"Neben diesem Stein|ist kein freies Feld.",    //There's no free square|next to this stone.
+	"Du spielst gerade ein|Adventure, kein Rollenspiel!",    //You are currently playing an|Adventure, not a Role-Playing Game!
+	"Du kannst das Seil|nirgends befestigen.",    //There's nowhere|to attach the rope.
+	// 130
+	"Es pa\341t nicht|zwischen die Steine.",    //It does not fit|between the stones.
+	"Das ist doch|oben festgebunden!",    //That is already|tied up above!
+	"Hey, das ist|mindestens 10 Meter tief!",    //Hey, that is|at least 10 meters deep!
+	"In dem Schlitz|ist nichts mehr.",    //There is nothing|left in the slot.
+	"Das ist mindestens 5 Meter tief!",    //That is at least 5 meters deep!
+	// 135
+	"Du versuchst, den Sarg zu|\224ffnen, aber der Deckel bewegt|sich keinen Millimeter.",    //You try to open the coffin,|but the lid does not|move a millimeter.
+	"Du hast die Kugel schon gedr\201ckt.",    //You have already|pushed the ball.
+	"Die Kugel bewegt sich ein St\201ck.",    //The ball moves a bit.
+	"Herzlichen Gl\201ckwunsch!",    //Congratulations!
+	"Sie haben das Spiel gel\224st|und gewinnen 400 Xa!",    //You solved the game|and won 400 Xa!
+	// 140
+	"Vielen Dank f\201r die Benutzung eines|VIRTUAL-REALITY-SYSTEMS-Produkts!",    //Thank you for using a|VIRTUAL-REALITY-SYSTEMS product!
+	"N",    //N
+	"O",    //E
+	"S",    //S
+	"W",    //W
+	// 145
+	"Seil",    //Rope
+	"Schild",    //Sign
+	"Darauf steht:|\"Willst du finden das|richtige Loch, so wage|dich in die Pyramide!\".",    //It reads:|"Want to find|the right hole? Then dare|to enter the pyramid!".
+	"Es ist eine kleine \231ffnung.",    //It is a small opening.
+	"Pyramide",    //Pyramid
+	// 150
+	"Komisch! Was soll eine Pyramide|bei den Axacussanern? Deine|eigenen Gedanken scheinen|den Spielverlauf zu beeinflussen.",    //Weird! What is a pyramid doing|at the Axacussians? Your own thoughts seem to influence|the course of the game.
+	"Sonne",    //Sun
+	"Sch\224n!",    //Nice!
+	"\"Hallo Fremder, wenn du diesen|Raum betreten hast, bleibt|dir nur noch eine Stunde Zeit,|um deine Aufgabe zu erf\201llen!\"",    //"Hello, Stranger, when you enter|this room, you have only an hour|to accomplish your task!"
+	"rechte Seite",    //right side
+	// 155
+	"linke Seite",    //left side
+	"Knopf",    //Button
+	"Schrift",    //Inscription
+	"Tomate",    //Tomato
+	"Komisch!",    //Funny!
+	// 160
+	"Messer",    //Knife
+	"Es ist ein relativ stabiles Messer.",    //It is a relatively sturdy knife.
+	"Monster",    //Monster
+	"Es ist dick und|ungef\204hr 15 Meter lang.",    //It is thick and|about 15 meters long.
+	"Augen",    //Eyes
+	// 165
+	"Mund",    //Mouth
+	"Es ist nur eine Statue.",    //It's just a statue.
+	"Zettel",    //Note
+	"Darauf steht:|\"Wenn du fast am Ziel|bist, tu folgendes:|Sauf!\"",    //It reads:|"When you're almost there,|do the following:|Drink!"
+	"Es ist ca. 10 Meter tief.",    //It is about 10 meters deep.
+	// 170
+	"Oben siehst du helles Licht.",    //Above you is a bright light.
+	"Darauf steht:|\"Ruhe eine Minute im Raum|zwischen den Monstern,|und du wirst belohnt!\"",    //It reads:|"Rest a minute in the room|between the monsters,|and you'll be rewarded!"
+	"Schlitz",    //Slot
+	"Du kommst mit den|H\204nden nicht rein.",    //You cannot get in|with your hands.
+	"Es ist ca. 5 Meter tief.",    //It is about 5 meters deep.
+	// 175
+	"Steine",    //Stones
+	"Platte",    //Plate
+	"Sarg",    //Coffin
+	"Ausgang",    //Exit
+	"Unheimlich!",    //Creepy!
+	// 180
+	"Zahnb\201rste",    //Toothbrush
+	"Die Sache mit der|Artus GmbH scheint dir zu|Kopf gestiegen zu sein.",    //The thing with the|Artus GmbH seems to have|gotten to your head.
+	"Zahnpastatube",    //Toothpaste
+	"Kugel",    //Ball
+	"Hmm, die Kugel sieht lose aus.",    //Hmm, the ball looks loose.
+	// 185
+	"Auge",    //Eye
+	"Irgendwas stimmt damit nicht.",    //Something is wrong with that.
+	"Sieht nach Metall aus.",    //It looks like metal.
+	"Ein Taxi kommt angerauscht,|du steigst ein.",    //A taxi arrives, and you get in.
+	"Du dr\201ckst auf den Knopf, aber nichts passiert",    //You press the button, but nothing happens
+	// 190
+	"Es ist leer.",    //It is empty.
+	"Du findest ein kleines Ger\204t,|einen Ausweis und einen Xa.",    //You find a small device,|an ID card and a Xa.
+	"Du heftest den|Magnet an die Stange.",    //You attach the|magnet to the pole.
+	"Stange mit Magnet",    //Pole with magnet
+	"Raffiniert!",    //Cunning!
+	// 195
+	"Du mu\341t das|Ger\204t erst kaufen.",    //You must buy|this device first.
+	"Du legst den Chip|in das Ger\204t ein.",    //You insert the chip|into the device.
+	"Du \201berspielst die CD|auf den Musikchip.",    //You transfer the CD|to the Music chip.
+	"Ohne einen eingelegten|Musikchip kannst du auf dem|Ger\204t nichts aufnehmen.",    //Without an inserted|music chip, you can not|record on the device.
+	"Du nimmst den Chip|aus dem Ger\204t.",    //You remove the chip|from the device.
+	// 200
+	"Es ist kein Chip eingelegt.",    //There is no chip inserted.
+	"Wozu? Du hast sowieso nur die eine CD.",    //What for? You only have one CD anyway.
+	"Die \"Mad Monkeys\"-CD. Du hast|sie schon tausendmal geh\224rt.",    //The "Mad Monkeys" CD.|You've heard them a thousand times.
+	"Du h\224rst nichts.|Der Chip ist unbespielt.",    //All you hear is silence.|The chip is empty.
+	"Du h\224rst dir den Anfang|der \201berspielten CD an.",    //You are listening to the beginning|of the copied CD.
+	// 205
+	"Es ist kein Chip einglegt.",    //There is no chip inserted.
+	"Du trinkst etwas von den Zeug, danach|f\201hlst du dich leicht beschwipst.",    //You drink some of the stuff,|then begin to feel slightly tipsy.
+	"%d Xa",    //%d Xa
+	"Als du ebenfalls aussteigst haben|die anderen Passagiere das|Fluggel\204nde bereits verlassen.",    //When you get off the plane|the other passengers|have already left the airport.
+	"Flughafen",    //Airport
+	// 210
+	"Stadtzentrum",    //Downtown
+	"Kulturpalast",    //Palace of Culture
+	"Erde",    //Earth
+	"Privatwohnung",    //Private apartment
+	"(Taxi verlassen)",    //(Leave the taxi)
+	// 215
+	"(Bezahlen)",    //(Pay)
+	"Adresse:|                              ",    //Address:|                              
+	"Fuddeln gilt nicht!|Zu diesem Zeitpunkt kannst du diese|Adresse noch gar nicht kennen!",    //Fiddling with the system doesn't work!|At this time you can not|even know this address!
+	"Du hast nicht|mehr genug Geld.",    //You do not|have enough money left.
+	"Du merkst, da\341 das Taxi stark beschleunigt.",    //You notice the taxi is accelerating rapidly.
+	// 220
+	"F\201nf Minuten sp\204ter ...",    //Five minutes later ...
+	"Du hast doch schon eine Stange",    //You already have a pole
+	"Du s\204gst eine der Stangen ab.",    //You saw off one of the poles.
+	"Du betrittst das einzige|offene Gesch\204ft, das|du finden kannst.",    //You enter the only|open shop that|you can find.
+	"Die Kabine ist besetzt.",    //The cabin is occupied.
+	// 225
+	"He, nimm erstmal das Geld|aus dem R\201ckgabeschlitz!",    //Hey, take the money|from the return slot!
+	"Du hast doch schon bezahlt.",    //You have already paid.
+	"Du hast nicht mehr genug Geld.",    //You do not have enough money left.
+	"Du wirfst 10 Xa in den Schlitz.",    //You put 10 Xa in the slot.
+	"Dir wird schwarz vor Augen.",    //You are about to pass out.
+	// 230
+	"Du ruhst dich eine Weile aus.",    //You rest for a while.
+	"An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ...\"",    //On the Wall is:|"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
+	"Ok, ich nehme es.",    //OK, I'll take it.
+	"Nein danke, das ist mir zu teuer.",    //No thanks, that's too expensive for me.
+	"Ich w\201rde gern etwas kaufen.",    //I would like to buy something.
+	// 235
+	"Ich bin's, Horst Hummel.",    //It's me, Horst Hummel.
+	"Haben Sie auch einen Musikchip f\201r das Ger\204t?",    //Do you have a music chip for the device?
+	"Eine tolle Maske, nicht wahr?",    //It's a great mask, right?
+	"Komisch, da\341 sie schon drei Jahre da steht.",    //Strange that it has been there for three years.
+	"Ein starker Trunk. Zieht ganz sch\224n rein.",    //A strong drink. It hits you pretty hard.
+	// 240
+	"Ein Abspiel- und Aufnahmeger\204t f\201r die neuen Musikchips.",    //A playback and recording device for the new music chips.
+	"Eine ARTUS-Zahnb\201rste. Der letzte Schrei.",    //An ARTUS toothbrush. The latest craze.
+	"Verkaufe ich massenhaft, die Dinger.",    //I sell these things in bulk.
+	"Das sind echte Rarit\204ten. B\201cher in gebundener Form.",    //These are real rarities. Books in bound form.
+	"Die Encyclopedia Axacussana.",    //The Encyclopedia Axacussana.
+	// 245
+	"Das gr\224\341te erh\204ltliche Lexikon auf 30 Speicherchips.",    //The largest available dictionary on 30 memory chips.
+	"\232ber 400 Trilliarden Stichw\224rter.",    //Over 400 sextillion keywords.
+	"Die ist nicht zu verkaufen.",    //It is not for sale.
+	"So eine habe ich meinem Enkel zum Geburtstag geschenkt.",    //I gave one to my grandson for his birthday.
+	"Er war begeistert von dem Ding.",    //He was excited about this thing.
+	// 250
+	"Der stammt aus einem bekannten Computerspiel.",    //It comes from a well-known computer game.
+	"Robust, handlich und stromsparend.",    //Sturdy, handy and energy-saving.
+	"Irgendein lasches Ges\224ff.",    //Some cheap swill.
+	"Das sind Protestaufkleber gegen die hohen Taxigeb\201hren.",    //These are stickers protesting the high taxi fees.
+	"Das ist Geschirr aus der neuen Umbina-Kollektion.",    //These are dishes from the new Umbina-Collection.
+	// 255
+	"H\204\341lich, nicht wahr?",    //Ugly, right?
+	"Aber verkaufen tut sich das Zeug gut.",    //But this stuff sells well.
+	"Das kostet %d Xa.",    //That costs %d Xa.
+	"Schauen Sie sich ruhig um!",    //Take a look around!
+	"Unsinn!",    //Nonsense!
+	// 260
+	"Tut mir leid, die sind|schon alle ausverkauft.",    //I'm very sorry,|they are already sold out.
+	"Guten Abend.",    //Good evening.
+	"Hallo.",    //Hello.
+	"Huch, Sie haben mich aber erschreckt!",    //Yikes, you scared me!
+	"Wieso?",    //How so?
+	// 265
+	"Ihre Verkleidung ist wirklich t\204uschend echt.",    //Your disguise is deceptively real-looking.
+	"Welche Verkleidung?",    //What disguise?
+	"Na, tun Sie nicht so!",    //Stop pretending you don't know!
+	"Sie haben sich verkleidet wie der Au\341erirdische,|dieser Horst Hummel, oder wie er hei\341t.",    //You disguised yourself as that extraterrestrial guy,|Horst Hummel, or whatever his name is.
+	"Ich BIN Horst Hummel!",    //I AM Horst Hummel!
+	// 270
+	"Geben Sie's auf!",    //Give it up!
+	"An Ihrer Gestik merkt man, da\341 Sie|ein verkleideter Axacussaner sind.",    //You can tell from your gestures that you are|a disguised Axacussan.
+	"Der echte Hummel bewegt sich|anders, irgendwie ruckartig.",    //The real Hummel moves|differently, kind of jerky.
+	"Weil er ein Roboter ist! ICH bin der Echte!",    //Because he is a robot! I am the real one!
+	"Ach, Sie spinnen ja!",    //Oh, you are crazy!
+	// 275
+	"Sie Trottel!!!",    //You Idiot!!!
+	"Seien Sie still, oder ich werfe Sie raus!",    //Shut up or I'll kick you out!
+	"Taschenmesser",    //Pocket knife
+	"Hey, da ist sogar eine S\204ge dran.",    //Hey, there's even a saw on it.
+	"20 Xa",    //20 Xa
+	// 280
+	"Discman",    //Discman
+	"Da ist noch die \"Mad Monkeys\"-CD drin.",    //The "Mad Monkeys" CD is still in there.
+	"Mit dem Ding sollst du dich|an der Wand festhalten.",    //You should hold onto the wall|using that thing.
+	"Spezialkeycard",    //Special keycard
+	"Damit sollst du die|T\201ren knacken k\224nnen.",    //With that you should be able to crack the doors.
+	// 285
+	"Alarmknacker",    //Alarm cracker
+	"Ein kleines Ger\204t, um|die Alarmanlage auszuschalten.",    //A small device|to turn off the alarm.
+	"Karte",    //Keycard
+	"Raumschiff",    //Spaceship
+	"Damit bist du hierhergekommen.",    //You came here with it.
+	// 290
+	"Fahrzeuge",    //Vehicles
+	"Du kannst von hier aus nicht erkennen,|was das f\201r Fahrzeuge sind.",    //You cannot tell from here|what those vehicles are.
+	"Fahrzeug",    //Vehicle
+	"Es scheint ein Taxi zu sein.",    //It seems to be a taxi.
+	"Komisch, er ist verschlossen.",    //Funny, it is closed.
+	// 295
+	"Portemonnaie",    //Wallet
+	"Das mu\341 ein Axacussaner|hier verloren haben.",    //This must have been|lost by an Axacussan.
+	"Ger\204t",    //Device
+	"Auf dem Ger\204t steht: \"Taxi-Call\".|Es ist ein kleiner Knopf daran.",    //The device says "Taxi Call."|There is a small button on it.
+	"Ausweis",    //ID card
+	// 300
+	"Auf dem Ausweis steht:|  Berta Tschell|  Axacuss City|  115AY2,96A,32",    //On the card it reads: | Berta Tschell | Axacuss City | 115AY2,96A,32
+	"Treppe",    //Staircase
+	"Sie f\201hrt zu den Gesch\204ften.",    //It leads to the shops.
+	"Gesch\204ftsstra\341e im Hintergrund",    //Business street in the background
+	"Die Stra\341e scheint kein Ende zu haben.",    //The road seems to have no end.
+	// 305
+	"Stange",    //Rod
+	"Pfosten",    //Post
+	"Gel\204nder",    //Railing
+	"Plakat",    //Poster
+	"Musik Pur - Der Musikwettbewerb!|Heute im Kulturpalast|Hauptpreis:|Fernsehauftritt mit Horst Hummel|Sponsored by Artus GmbH",    //Pure Music - The Music Competition!|Today at the Palace of Culture|Main Prize:|Television appearance with Horst Hummel|Sponsored by Artus GmbH
+	// 310
+	"Kabine",    //Cabin
+	"Sie ist frei!",    //It is free!
+	"Sie ist besetzt.",    //It is occupied.
+	"F\201\341e",    //Feet
+	"Komisch, die|F\201\341e scheinen|erstarrt zu sein.",    //Strange, the|feet seem to be frozen.
+	// 315
+	"Haube",    //Hood
+	"Sieht aus wie beim Fris\224r.",    //Looks like the hairdresser.
+	"400 Xa",    //400 Xa
+	"10 Xa",    //10 Xa
+	"Dar\201ber steht:|\"Geldeinwurf: 10 Xa\".",    //It says:|"Coins: 10 Xa".
+	// 320
+	"Dar\201ber steht:|\"Gewinnausgabe / Geldr\201ckgabe\".",    //It says:|"Prize / Money Return".
+	"Stuhl",    //Chair
+	"Etwas Entspannung k\224nntest du jetzt gebrauchen.",    //You could use some relaxation right about now.
+	"Gekritzel",    //Scribble
+	"Gesicht",    //Face
+	// 325
+	"Nicht zu fassen! Die|W\204nde sind genauso beschmutzt|wie auf der Erde.",    //Unbelievable! The walls|are just as dirty|as those on Earth.
+	"B\201cher",    //Books
+	"Lexikon",    //Dictionary
+	"Pflanze",    //Plant
+	"Maske",    //Mask
+	// 330
+	"Schlange",    //Snake
+	"Becher",    //Cup
+	"Joystick",    //Joystick
+	"Eine normale Zahnb\201rste,|es steht nur \"Artus\" darauf.",    //An ordinary toothbrush.|It says "Artus" on it.
+	"Musikger\204t",    //Music device
+	// 335
+	"Ein Ger\204t zum Abspielen und|Aufnehmen von Musikchips.|Es ist ein Mikrofon daran.",    //A device for playing and recording music chips.|There is a microphone on it.
+	"Flasche",    //Bottle
+	"Auf dem Etikett steht:|\"Enth\204lt 10% Hyperalkohol\".",    //The label says: "Contains 10% hyperalcohol".
+	"Kiste",    //Box
+	"Verk\204ufer",    //Seller
+	// 340
+	"Was? Daf\201r wollen Sie die Karte haben?",    //What? Do you want the card for that?
+	"Sie sind wohl nicht ganz \201ber|die aktuellen Preise informiert!",    //You are probably not completely|informed about the current prices!
+	"Ich bin's, Horst Hummel!",    //It's me, Horst Hummel!
+	"Sch\224nes Wetter heute!",    //Nice weather today!
+	"K\224nnen Sie mir sagen, von wem ich eine Eintrittskarte f\201r den Musikwettbewerb kriegen kann?",    //Can you tell me who can get me a ticket for the music contest?
+	// 345
+	"Ok, hier haben Sie den Xa.",    //OK, here is the Xa.
+	"Ich biete Ihnen 500 Xa.",    //I offer you 500 Xa.
+	"Ich biete Ihnen 1000 Xa.",    //I offer you 1000 Xa.
+	"Ich biete Ihnen 5000 Xa.",    //I offer you 5000 Xa.
+	"Ich biete Ihnen 10000 Xa.",    //I offer you 10000 Xa.
+	// 350
+	"Vielen Dank f\201r Ihren Kauf!",    //Thank you for your purchase!
+	"Was bieten Sie mir|denn nun f\201r die Karte?",    //What will you offer me|for the card?
+	"Hallo, Sie!",    //Hello to you!
+	"Was wollen Sie?",    //What do you want?
+	"Wer sind Sie?",    //Who are you?
+	// 355
+	"Horst Hummel!",    //Horst Hummel!
+	"Kenne ich nicht.",    //Never heard of him.
+	"Was, Sie kennen den ber\201hmten Horst Hummel nicht?",    //What, you don't know the famous Horst Hummel?
+	"Ich bin doch der, der immer im Fernsehen zu sehen ist.",    //I'm the guy who is always on TV.
+	"Ich kenne Sie wirklich nicht.",    //I really do not know you.
+	// 360
+	"Komisch.",    //Funny.
+	"Aha.",    //Aha.
+	"Ja, kann ich.",    //Yes, I can.
+	"Von wem denn?",    //From whom?
+	"Diese Information kostet einen Xa.",    //This information costs a Xa.
+	// 365
+	"Wie Sie meinen.",    //As you say.
+	"Sie k\224nnen die Karte von MIR bekommen!",    //You can get the card from ME!
+	"Aber nur eine Teilnahmekarte,|keine Eintrittskarte.",    //But only a participation ticket,|not an entrance ticket.
+	"Was wollen Sie daf\201r haben?",    //What do you want for it?
+	"Machen Sie ein Angebot!",    //Make an offer!
+	// 370
+	"Das ist ein gutes Angebot!",    //That's a good offer!
+	"Daf\201r gebe ich Ihnen meine|letzte Teilnahmekarte!",    //For that I give you my|last participation card!
+	"(Dieser Trottel!)",    //(That Idiot!)
+	"Ich w\201rde gern beim Musikwettbewerb zuschauen.",    //I would like to watch the music competition.
+	"Ich w\201rde gern am Musikwettbewerb teilnehmen.",    //I would like to participate in the music competition.
+	// 375
+	"Wieviel Uhr haben wir?",    //What time is it?
+	"Ja.",    //Yes.
+	"Nein.",    //No.
+	"Hallo, Leute!",    //Hi guys!
+	"Hi, Fans!",    //Hi, fans!
+	// 380
+	"Gute Nacht!",    //Good night!
+	"\216h, wie geht es euch?",    //Uh, how are you?
+	"Sch\224nes Wetter heute.",    //Nice weather today.
+	"Hmm ...",    //Hmm ...
+	"Tja ...",    //Well ...
+	// 385
+	"Also ...",    //So ...
+	"Ok, los gehts!",    //OK let's go!
+	"Ich klimper mal was auf dem Keyboard hier.",    //I'll fix something on the keyboard here.
+	"Halt, sie sind doch schon drangewesen!",    //Stop, you have already been on it!
+	"He, Sie! Haben Sie|eine Eintrittskarte?",    //Hey, you! Do you have|a ticket?
+	// 390
+	"Ja nat\201rlich, hier ist meine Teilnahmekarte.",    //Yes of course, here is my participation ticket.
+	"Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten k\224nnen.",    //You are a participant!|Please ask at the checkout|when you can go on stage.
+	"\216h, nein.",    //Uh, no.
+	"He, wo ist Ihr Musikchip?",    //Hey, where's your music chip?
+	"Laber nicht!",    //Stop talking!
+	// 395
+	"Fang an!",    //Get started!
+	"Einen Moment, ich mu\341 erstmal \201berlegen, was ich|euch spiele.",    //One moment, I have to think about what I'm playing for you.
+	"Anfangen!!!",    //Begin!!!
+	"Nun denn ...",    //Well then ...
+	"Raus!",    //Out!
+	// 400
+	"Buh!",    //Boo!
+	"Aufh\224ren!",    //Stop!
+	"Hilfe!",    //Help!
+	"Ich verziehe mich lieber.",    //I'd prefer to get lost.
+	"Mist, auf dem Chip war|gar keine Musik drauf.",    //Damn, there was no music on the chip at all.
+	// 405
+	"Das ging ja voll daneben!",    //That went completely wrong!
+	"Du n\204herst dich der B\201hne,|aber dir wird mulmig zumute.",    //You approach the stage,|but you feel queasy.
+	"Du traust dich nicht, vor|so vielen Menschen aufzutreten|und kehrst wieder um.",    //You do not dare to appear|in front of so many people|and turn around.
+	"Oh, Sie sind Teilnehmer!|Dann sind Sie aber sp\204t dran.",    //Oh, you are a participant!|But you are late.
+	"Spielen Sie die Musik live?",    //Do you play the music live?
+	// 410
+	"Dann geben Sie bitte Ihren Musikchip ab!|Er wird bei Ihrem Auftritt abgespielt.",    //Then please submit your music chip!|It will be played during your performance.
+	"Oh, Sie sind sofort an der Reihe!|Beeilen Sie sich! Der B\201hneneingang|ist hinter dem Haupteingang rechts.",    //Oh, it's your turn!|Hurry! The stage entrance|is to the right behind the main entrance.
+	"Habe ich noch einen zweiten Versuch?",    //Can I have another try?
+	"Nein!",    //No!
+	"Haben Sie schon eine Eintrittskarte?",    //Do you already have a ticket?
+	// 415
+	"Tut mir leid, die Karten|sind schon alle ausverkauft.",    //I'm sorry, the tickets|are already sold out.
+	"Mist!",    //Crap!
+	"Haben Sie schon eine Teilnahmekarte?",    //Do you already have a participation ticket?
+	"Ja, hier ist sie.",    //Yes, here it is.
+	"Tut mir leid, die Teilnahmekarten|sind schon alle ausverkauft.",    //I'm sorry, the participation tickets|are already sold out.
+	// 420
+	"Schei\341e!",    //Crap!
+	"Das kann ich Ihnen|leider nicht sagen.",    //I can not tell you that.
+	"Wo ist denn nun Ihr Musikchip?",    //Where is your music chip?
+	"Jetzt beeilen Sie sich doch!",    //Now hurry up!
+	"Huch, Sie sind hier bei einem Musik-,|nicht bei einem Imitationswettbewerb",    //Huh, you're here at a music contest,|not at an imitation contest
+	// 425
+	"Imitationswettbewerb?|Ich will niemanden imitieren.",    //Imitation contest?|I do not want to imitate anyone.
+	"Guter Witz, wieso sehen Sie|dann aus wie Horst Hummel?",    //Good joke. Then why do you look like Horst Hummel?
+	"Na, nun h\224ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht.",    //Oh come on! Your disguise isn't that perfect.
+	"Ich werde Ihnen beweisen, da\341 ich Horst Hummel bin,|indem ich diesen Wettbewerb hier gewinne.",    //I will prove to you that I am Horst Hummel|by winning this competition.
+	"Dann kann ich in dieser verdammten Fernsehshow|auftreten.",    //Then I can perform in this|damn TV show.
+	// 430
+	"Du hampelst ein bi\341chen zu|der Musik vom Chip herum.|Die Leute sind begeistert!",    //You're rocking a little bit|to the music from the chip.|The audience is excited!
+	"Guten Abend. Diesmal haben wir|einen besonderen Gast bei uns.",    //Good evening. This time we have|a special guest with us.
+	"Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort vor allem durch seine|Verkleidung aufgefallen war.",    //He is the winner of yesterday's music competition in the Palace of Culture.|He was particularly noteworthy|because of his disguise.
+	"Sie haben das Wort!",    //You have the floor!
+	"Nun ja, meine erste Frage lautet: ...",    //Well, my first question is ...
+	// 435
+	"Warum haben Sie sich sofort nach|Ihrer Landung entschlossen, f\201r|die Artus-GmbH zu arbeiten?",    //Why did you decide immediately|after your arrival to work for|Artus GmbH?
+	"Es war meine freie Entscheidung.|Die Artus-GmbH hat mir einfach gefallen.",    //It was a decision I made on my own.|I just decided I liked Artus-GmbH.
+	"Wieso betonen Sie, da\341 es|Ihre freie Entscheidung war?|Haben Sie Angst, da\341 man Ihnen|nicht glaubt?",    //Why do you stress that|it was your own decision?|Are you afraid that nobody will believe you otherwise?
+	"Also, ich mu\341 doch sehr bitten!|Was soll diese unsinnige Frage?",    //How dare you!|What is with this nonsensical question?
+	"Ich finde die Frage wichtig.|Nun, Herr Hummel, was haben|Sie dazu zu sagen?",    //I think the question is important.|Well, Mr. Hummel, what do you have to say?
+	// 440
+	"Auf solch eine Frage brauche|ich nicht zu antworten!",    //I don't feel that I have|to answer such a question!
+	"Gut, dann etwas anderes ...",    //Alright, something else then ...
+	"Sie sind von Beruf Koch.|Wie hie\341 das Restaurant,|in dem Sie auf der Erde|gearbeitet haben?",    //You are a chef by profession.|What was the name of the restaurant|where you worked|on Earth?
+	"Hmm, da\341 wei\341 ich nicht mehr.",    //Hmm, I do not remember that.
+	"Sie wollen mir doch nicht weismachen,|da\341 Sie den Namen vergessen haben!",    //Do you really expect me to believe you cannot remember the name?
+	// 445
+	"Schlie\341lich haben Sie|zehn Jahre dort gearbeitet!",    //After all, you worked there for ten years!
+	"Woher wollen Sie das wissen?",    //How do you know that?
+	"Nun, ich komme von der Erde,|im Gegensatz zu Ihnen!",    //Well, I come from Earth,|unlike you!
+	"Langsam gehen Sie zu weit!",    //Now you've gone too far!
+	"Sie sind ein Roboter!|Das merkt man schon an|Ihrer dummen Antwort!|Sie sind nicht optimal|programmiert!",    //You are a robot!|It is obvious from|your stupid answer!|You are not even programmed|correctly!
+	// 450
+	"Wenn Sie jetzt nicht mit Ihren|Beleidigungen aufh\224ren, mu\341 ich|Ihnen das Mikrofon abschalten!",    //If you do not stop right now|with your insults, I will have|to turn off the microphone!
+	"Ich bin der echte Horst Hummel,|und hier ist der Beweis!",    //I am the real Horst Hummel,|and here is the proof!
+	"Am n\204chsten Morgen sind alle|Zeitungen voll mit deiner spektakul\204ren|Enth\201llung des Schwindels.",    //The next morning, all the papers|are full of your spectacular|revelation of fraud.
+	"Die Manager der Artus-GmbH und Commander|Sumoti wurden sofort verhaftet.",    //The managers of Artus-GmbH and Commander|Sumoti were arrested immediately.
+	"Nach dem Stre\341 der letzten Tage,|entscheidest du dich, auf die|Erde zur\201ckzukehren.",    //After these stressful last few days|you decide to return to Earth.
+	// 455
+	"W\204hrend du dich vor Interviews|kaum noch retten kannst, ...",    //While you can barely save|yourself from interviews, ...
+	"... arbeiten die Axacussanischen|Techniker an einem Raumschiff,|das dich zur Erde zur\201ckbringen soll.",    //... the Axacussan|technicians are working on a spaceship|to bring you back to Earth.
+	"Eine Woche sp\204ter ist der|Tag des Starts gekommen.",    //One week later, the day of the launch has arrived.
+	"Zum dritten Mal in deinem|Leben verbringst du eine lange|Zeit im Tiefschlaf.",    //For the third time in your life,|you spend a long time|in deep sleep.
+	"Zehn Jahre sp\204ter ...",    //Ten years later ...
+	// 460
+	"Du wachst auf und beginnst,|dich schwach an deine|Erlebnisse zu erinnern.",    //You wake up and begin|to faintly remember|your experiences.
+	"Um dich herum ist alles dunkel.",    //Everything is dark around you.
+	"Sie zeigt %d an.",    //It displays %d.
+	"Ich interessiere mich f\201r den Job, bei dem man \201ber Nacht",    //I'm interested in the job where you can get
+	"reich werden kann.",    //rich overnight.
+	// 465
+	"Ich verkaufe frische Tomaten.",    //I sell fresh tomatoes.
+	"Ich bin der Klempner. Ich soll hier ein Rohr reparieren.",    //I am the plumber. I'm supposed to fix a pipe here.
+	"Ja, h\224rt sich gut an.",    //Yes, it sounds good.
+	"Krumme Gesch\204fte? F\201r wen halten Sie mich? Auf Wiedersehen!",    //Crooked business? Who do you think I am? Goodbye!
+	"\216h - k\224nnten Sie mir das Ganze nochmal erkl\204ren?",    //Uh - could you explain that to me again?
+	// 470
+	"Wie gro\341 ist mein Anteil?",    //How big is my share?
+	"Machen Sie es immer so, da\341 Sie Ihre Komplizen \201ber ein Graffitti anwerben?",    //Do you always use graffiti to recruit your accomplices?
+	"Hmm, Moment mal, ich frage den Boss.",    //Hmm wait, I will ask the boss.
+	"Kurze Zeit sp\204ter ...",    //A short while later ...
+	"Ok, der Boss will dich sprechen.",    //OK, the boss wants to talk to you.
+	// 475
+	"Du betrittst die Wohnung und|wirst zu einem Tisch gef\201hrt.",    //You enter the apartment and are led to a table.
+	"Hmm, du willst dir also|etwas Geld verdienen?",    //Hmm, so you want to earn some money?
+	"Nun ja, wir planen|einen n\204chtlichen Besuch|eines bekannten Museums.",    //Well, we're planning|a nightly visit|to a well-known museum.
+	"Wie sieht's aus, bist du interessiert?",    //So, are you interested?
+	"Halt, warte!",    //Stop, wait!
+	// 480
+	"\232berleg's dir, es springen|30000 Xa f\201r dich raus!",    //Think about it, your share would be|30000 Xa!
+	"30000?! Ok, ich mache mit.",    //30000?! Alright, count me in.
+	"Gut, dann zu den Einzelheiten.",    //Good, now then to the details.
+	"Bei dem Museum handelt es|sich um das Orzeng-Museum.",    //The museum in question is|the Orzeng Museum.
+	"Es enth\204lt die wertvollsten|Dinosaurierfunde von ganz Axacuss.",    //It contains the most valuable|dinosaur discoveries of Axacuss.
+	// 485
+	"Wir haben es auf das Sodo-Skelett|abgesehen. Es ist weltber\201hmt.",    //We're aiming to get the Sodo skeleton.|It is world-famous.
+	"Alle bekannten Pal\204ontologen haben|sich schon damit besch\204ftigt.",    //All known paleontologists|have already dealt with it.
+	"Der Grund daf\201r ist, da\341 es allen|bis jetzt bekannten Erkenntnissen|\232ber die Evolution widerspricht.",    //The reason for this is that it contradicts all known|knowledge about evolution.
+	"Irgendein verr\201ckter Forscher|bietet uns 200.000 Xa,|wenn wir ihm das Ding beschaffen.",    //Some crazy researcher|will give us 200,000 Xa|if we retrieve that thing for him.
+	"So, jetzt zu deiner Aufgabe:",    //So, now to your task:
+	// 490
+	"Du dringst durch den Nebeneingang|in das Geb\204ude ein.",    //You enter the building through|the side entrance.
+	"Dort schaltest du die Alarmanlage aus,|durch die das Sodo-Skelett gesichert wird.",    //There you switch off the alarm system,|which secures the Sodo skeleton.
+	"Wir betreten einen anderen Geb\204udeteil|und holen uns das Gerippe.",    //We'll enter another part of the building|and fetch the skeleton.
+	"Deine Aufgabe ist nicht leicht.|Schau dir diesen Plan an.",    //Your task is not easy.|Look at this plan.
+	"Unten siehst du die kleine Abstellkammer,|durch die du in die Austellungsr\204ume kommst.",    //Below you can see the small storage room,|through which you come to the showrooms.
+	// 495
+	"Bei der mit Y gekennzeichneten|Stelle ist die Alarmanlage.",    //The alarm system is at the location marked Y.
+	"Bei dem X steht ein gro\341er Dinosaurier|mit einem wertvollen Sch\204del.|Den Sch\204del nimmst du mit.",    //The X marks the spot with a big dinosaur|with a valuable skull.|You will take the skull with you.
+	"Nun zu den Problemen:",    //Now for the problems:
+	"Die wei\341 gekennzeichneten|T\201ren sind verschlossen.",    //The marked white doors|are locked.
+	"Sie m\201ssen mit einer Spezialkeycard ge\224ffnet|werden, was jedoch einige Zeit dauert.",    //They have to be opened with a special keycard,|which can take a while.
+	// 500
+	"Au\341erdem gibt es in den auf der Karte|farbigen R\204umen einen Druck-Alarm.",    //In addition, there are pressure alarms|in the rooms which are colored on the map.
+	"Du darfst dich dort nicht l\204nger|als 16 bzw. 8 Sekunden aufhalten,|sonst wird Alarm ausgel\224st.",    //You can not stay there longer than|16 or 8 seconds,|or the alarm will go off.
+	"Im Raum oben rechts ist|eine Kamera installiert.",    //In the room at the top right|there is a camera installed.
+	"Diese wird jedoch nur von|der 21. bis zur 40. Sekunde|einer Minute \201berwacht.",    //However, it is only monitored|between the 21st and the 40th second|of every minute.
+	"Das gr\224\341te Problem ist der W\204chter.",    //The biggest problem is the guard.
+	// 505
+	"Er braucht f\201r seine Runde genau|eine Minute, ist also ungef\204hr|zehn Sekunden in einem Raum.",    //He needs exactly one minute for his round,|so he is in each room|for about ten seconds.
+	"Du m\201\341test seine Schritte h\224ren k\224nnen,|wenn du in der Abstellkammer bist|und der W\204chter dort vorbeikommt.",    //You should be able to hear his footsteps|if you are in the closet|and the guard passes by.
+	"Wenn du es bis zur Alarmanlage|geschafft hast, h\204ngst du dich|mit dem Sauger an die Wand,|damit du keinen Druck-Alarm ausl\224st.",    //If you make it to the alarm system,|you'll use the sucker to hang on the wall|to avoid triggering the pressure alarm.
+	"Die Alarmanlage schaltest du|mit einem speziellen Ger\204t aus.",    //You switch off the alarm system|with a special device.
+	"Wenn du das geschafft hast, nichts|wie raus! Aber keine Panik,|du darfst keinen Alarm ausl\224sen.",    //Once you're done, get out of there!|But do not panic!|You must not set off the alarm.
+	// 510
+	"So, noch irgendwelche Fragen?",    //So, any more questions?
+	"Also gut.",    //All right then.
+	"Du bekommst 30000 Xa.",    //You get 30,000 Xa.
+	"Ja, die Methode hat sich bew\204hrt.",    //Yes, that method has proven itself worthy.
+	"Hast du sonst noch Fragen?",    //Do you have any questions?
+	// 515
+	"Nachdem wir alles gekl\204rt|haben, kann es ja losgehen!",    //Now that we are on the same page we can get started!
+	"Zur vereinbarten Zeit ...",    //At the agreed upon time ...
+	"Du stehst vor dem Orzeng Museum,|w\204hrend die Gangster schon in einen|anderen Geb\204uderteil eingedrungen sind.",    //You stand in front of the Orzeng Museum,|while the gangsters have already penetrated|into another part of the building.
+	"Wichtiger Hinweis:|Hier ist die letzte M\224glichkeit,|vor dem Einbruch abzuspeichern.",    //Important note:|Here is the last possibility to save|before the break-in.
+	"Wenn Sie das Museum betreten haben,|k\224nnen Sie nicht mehr speichern!",    //Once you enter the museum|you will not be able to save!
+	// 520
+	"Stecken Sie sich Ihre|Tomaten an den Hut!",    //You can keep your tomatoes!
+	"Das kann ja jeder sagen!",    //Anyone can say that!
+	"Niemand \224ffnet.",    //Nobody answers.
+	"Welche Zahl willst du eingeben:      ",    //What number do you want to enter:      
+	"Falsche Eingabe",    //Invalid input
+	// 525
+	"Der Aufzug bewegt sich.",    //The elevator is moving.
+	"Die Karte wird|nicht angenommen.",    //The card|is not accepted.
+	"Da ist nichts mehr.",    //There is nothing left.
+	"Da ist ein Schl\201ssel unter dem Bett!",    //There's a key under the bed!
+	"Hey, da ist etwas unter dem|Bett. Nach dem Ger\204usch zu|urteilen, ist es aus Metall.",    //Hey, there is something under the|bed. Judging by the noise,|it is made of metal.
+	// 530
+	"Mist, es gelingt dir nicht,|den Gegenstand hervorzuholen.",    //Damn, you do not succeed in getting the object out.
+	"Die Klappe ist schon offen.",    //The flap is already open.
+	"Der Schl\201sssel pa\341t nicht.",    //The key does not fit.
+	"Du steckst den Chip in die|Anlage, aber es passiert nichts.|Die Anlage scheint kaputt zu sein.",    //You put the chip in the stereo,|but nothing happens.|The stereo seems to be broken.
+	"Es passiert nichts. Das Ding|scheint kaputt zu sein.",    //Nothing happens. The thing|seems to be broken.
+	// 535
+	"Hochspannung ist ungesund, wie du aus|Teil 1 eigentlich wissen m\201\341test!",    //High voltage is unhealthy, as you|should already know|from Part 1!
+	"Es h\204ngt ein Kabel heraus.",    //A cable hangs out.
+	"Irgendetwas hat hier|nicht ganz funktioniert.",    //Something did not|quite work out here.
+	"Du ziehst den Raumanzug an.",    //You put on your space suit.
+	"Du ziehst den Raumanzug aus.",    //You take off your space suit.
+	// 540
+	"Das ist schon verbunden.",    //That is already connected.
+	"Die Leitung ist hier|schon ganz richtig.",    //The cable is already|at the right place.
+	"Roger W.! Wie kommen Sie denn hierher?",    //Roger W.! How did you get here?
+	"Ach, sieh mal einer an! Sie schon wieder!",    //Oh, look at that! It's you again!
+	"Wo haben Sie denn|Ihr Schiff gelassen?",    //Where did you|leave your ship?
+	// 545
+	"Schauen Sie mal hinter mich auf|den Turm! Da oben h\204ngt es.",    //Take a look behind me, up on|the tower! It's up there.
+	"Ich hatte es scheinbar etwas zu|eilig, aber ich mu\341te unbedingt|zu den Dreharbeiten nach Xenon!",    //Apparently I was too much in a hurry,|but I had to be at the film shooting in Xenon!
+	"Mich wundert, da\341 es die Leute|hier so gelassen nehmen.",    //I am surprised that people|here take things so calmly.
+	"Die tun gerade so, als ob der Turm|schon immer so schr\204g gestanden h\204tte!",    //They are pretending that the tower|has always been that slanted!
+	"Hat er auch, schon seit|mehreren Jahrhunderten!",    //It has, for|several centuries, actually!
+	// 550
+	"\216h ... ach so. Und von wo|kommen Sie? Sie hatten's ja|wohl auch ziemlich eilig.",    //Uh ... I see. And where are you coming from? It seems you were in quite a hurry as well.
+	"Ich komme von Axacuss.",    //I come from Axacuss.
+	"Hmm, was mach ich jetzt blo\341?",    //Hmm, what am I going to do now?
+	"Ich kenne ein gutes Cafe nicht|weit von hier, da k\224nnen|wir uns erstmal erholen.",    //I know a good cafe not far from here,|where we can get some rest.
+	"Ok, einverstanden.",    //OK, I agree.
+	// 555
+	"Faszinierend!",    //Fascinating!
+	"Taxis",    //Taxis
+	"Hier ist ja richtig was los!",    //There seems to be something really going on here!
+	"Axacussaner",    //Axacussan
+	"Teilnahmekarte",    //Participation card
+	// 560
+	"Axacussanerin",    //Axacussian
+	"Darauf steht:|\"115AY2,96A\"",    //It reads:|"115AY2,96A"
+	"Darauf steht:|\"115AY2,96B\"",    //It reads:|"115AY2,96B"
+	"Darauf steht:|\"341,105A\"",    //It reads:|"341,105A"
+	"Darauf steht:|\"341,105B\"",    //It reads:|"341,105B"
+	// 565
+	"Klingel",    //Bell
+	"Anzeige",    //Display
+	"Tastenblock",    //Keypad
+	"Es sind Tasten von 0 bis 9 darauf.",    //There are keys from 0 to 9 on it.
+	"Chip",    //Chip
+	// 570
+	"Es ist ein Musikchip!",    //It's a music chip!
+	"Klappe",    //Hatch
+	"Sie ist mit einem altmodischen|Schlo\341 verschlossen.",    //It is secured with an old-fashioned lock.
+	"Musikanlage",    //Music system
+	"Toll, eine in die Wand|integrierte Stereoanlage.",    //Great, a built-in stereo|in the wall.
+	// 575
+	"Boxen",    //Speakers
+	"Ganz normale Boxen.",    //Ordinary speakers.
+	"Stifte",    //Pencils
+	"Ganz normale Stifte.",    //Ordinary pencils.
+	"Metallkl\224tzchen",    //Metal blocks
+	// 580
+	"Es ist magnetisch.",    //It is magnetic.
+	"Bild",    //Image
+	"Ein ungew\224hnliches Bild.",    //An unusual picture.
+	"Schrank",    //Cabinet
+	"Er ist verschlossen",    //It is closed
+	// 585
+	"Aufzug",    //Elevator
+	"unter Bett",    //under bed
+	"Unter dem Bett sind bestimmt wichtige|Dinge zu finden, nur kommst du nicht darunter.|Du br\204uchtest einen Stock oder so etwas.",    //Under the bed are certainly important|things to find, only you cannot reach underneath.|You need a stick or something.
+	"Schl\201ssel",    //Key
+	"Ein kleiner Metallschl\201ssel.",    //A small metal key.
+	// 590
+	"Schalter",    //Switch
+	"Griff",    //Handle
+	"Luke",    //Hatch
+	"Raumanzug",    //Space suit
+	"Ein zusammenfaltbarer Raumanzug.",    //A collapsible spacesuit.
+	// 595
+	"Leitung",    //Cable
+	"Irgendetwas scheint hier|kaputtgegangen zu sein.",    //Something seems to|have broken here.
+	"Sie h\204ngt lose von der Decke runter.",    //It hangs loose from the ceiling.
+	"Zur Erinnerung:|Dir ist es gelungen, aus den|Artus-Geheimb\201ros zu fliehen.",    //Reminder:|You managed to escape from the|Artus-GmbH secret offices.
+	"Nun befindest du dich in|einem Passagierraumschiff,|das nach Axacuss City fliegt.",    //Now you are in a passenger|spaceship that|flies to Axacuss City.
+	// 600
+	"W\204hrend des Fluges schaust du dir|das axacussanische Fernsehprogramm an.|Du st\224\341t auf etwas Interessantes ...",    //During the flight, you watch the|Axacussan TV program.|You come across something interesting ...
+	"Herzlich willkommen!",    //Welcome!
+	"Heute zu Gast ist Alga Lorch.|Sie wird Fragen an den Erdling|Horst Hummel stellen.",    //Alga Lorch will be present today.|She will ask questions to the Earthling|Horst Hummel.
+	"Horst wird alle Fragen|beantworten, soweit es|ihm m\224glich ist.",    //Horst will answer all|questions as fully|as possible.
+	"Sie haben das Wort, Frau Lorch!",    //You have the floor, Mrs Lorch!
+	// 605
+	"Herr Hummel, hier ist meine erste Frage: ...",    //Mr. Hummel, here is my first question: ...
+	"Sie sind nun ein ber\201hmter Mann auf Axacuss.|Aber sicher vermissen Sie auch Ihren Heimatplaneten.",    //You are now a famous man on Axacuss.|But surely you miss your home planet.
+	"Wenn Sie w\204hlen k\224nnten, w\201rden Sie lieber|ein normales Leben auf der Erde f\201hren,|oder finden Sie das Leben hier gut?",    //If you could choose, would you prefer|to lead a normal life on Earth,|or do you find life here good?
+	"Ehrlich gesagt finde ich es sch\224n,|ber\201hmt zu sein. Das Leben ist|aufregender als auf der Erde.",    //Honestly, I think it's nice to be|famous. Life is more exciting here|than on Earth.
+	"Au\341erdem sind die Leute von der|Artus GmbH hervorragende Freunde.",    //In addition, the people of|Artus GmbH are excellent friends.
+	// 610
+	"Nun ja, planen Sie denn trotzdem,|irgendwann auf die Erde zur\201ckzukehren?",    //Well, are you still planning|to return to Earth someday?
+	"Das kann ich Ihnen zum jetzigen|Zeitpunkt noch nicht genau sagen.",    //At this point in time,|I haven't made up my mind, yet.
+	"Aber ich versichere Ihnen, ich|werde noch eine Weile hierbleiben.",    //But I assure you,|I will stay here for a while.
+	"Aha, mich interessiert au\341erdem,|ob es hier auf Axacuss etwas gibt,|das Sie besonders m\224gen.",    //I see. I'm also interested in|whether there's anything here on Axacuss that you particularly like.
+	"Oh mir gef\204llt der ganze Planet,|aber das Beste hier sind die|hervorragenden Artus-Zahnb\201rsten!",    //Oh I like the whole planet,|but the best thing here are the|extraordinary Artus toothbrushes!
+	// 615
+	"Zahnb\201rsten von solcher Qualit\204t|gab es auf der Erde nicht.",    //Toothbrushes of such quality|do not exist on Earth.
+	"\216h, ach so.",    //Um, I see.
+	"Pl\224tzlich lenkt dich eine|Lautsprecherstimme vom Fernseher ab.",    //Suddenly, a speaker's voice|distracts you from the television.
+	"\"Sehr geehrte Damen und Herren,|wir sind soeben auf dem Flughafen|von Axacuss City gelandet.\"",    //"Ladies and Gentlemen,|We just landed at the airport|at Axacuss City."
+	"\"Ich hoffe, Sie hatten einen angenehmen Flug.|Bitte verlassen Sie das Raumschiff! Auf Wiedersehen!\"",    //"I hope you had a nice flight.|Please leave the spaceship! Goodbye!"
+	// 620
+	"W\204hrend die anderen Passagiere|aussteigen, versuchst du,|den Schock zu verarbeiten.",    //While the other passengers|are disembarking, you are trying|to handle the shock.
+	"\"Ich mu\341 beweisen, da\341 dieser|Roboter der falsche Horst|Hummel ist!\", denkst du.",    //"I have to prove that this robot|is the wrong Horst|Hummel!", you think to yourself.
+	"\"Diese Mistkerle von der Artus GmbH und|Commander Sumoti m\201ssen entlarvt werden!\"", //"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!"
+	"Sieht gef\204hrlich aus!", //Looks dangerous
+	"Das Auge ist schon offen.", //This Eye is already opened
+	// 625
+	"Es gelingt dir, zu fliehen.", //You manage to escape
+	NULL
+};
+
 #endif // GAMETEXT_H
diff --git a/devtools/create_supernova/module.mk b/devtools/create_supernova/module.mk
index 806ccca..92af416 100644
--- a/devtools/create_supernova/module.mk
+++ b/devtools/create_supernova/module.mk
@@ -10,3 +10,6 @@ TOOL_EXECUTABLE := create_supernova
 
 # Include common rules
 include $(srcdir)/rules.mk
+
+include $(srcdir)/devtools/create_supernova2/create_image/module.mk
+.PHONY: $(srcdir)/devtools/create_supernova2/create_image/module.mk
diff --git a/devtools/create_supernova/ms2.doc-en b/devtools/create_supernova/ms2.doc-en
new file mode 100644
index 0000000..da6df8c
--- /dev/null
+++ b/devtools/create_supernova/ms2.doc-en
@@ -0,0 +1 @@
+PLACEHOLDER MS2.DOC
diff --git a/devtools/create_supernova/ms2.inf-en b/devtools/create_supernova/ms2.inf-en
new file mode 100644
index 0000000..ed3da50
--- /dev/null
+++ b/devtools/create_supernova/ms2.inf-en
@@ -0,0 +1 @@
+PLACEHOLDER MS2.INF
diff --git a/devtools/create_supernova/ms2_data.015-en b/devtools/create_supernova/ms2_data.015-en
new file mode 100644
index 0000000..20ab530
Binary files /dev/null and b/devtools/create_supernova/ms2_data.015-en differ
diff --git a/devtools/create_supernova/ms2_data.028-en b/devtools/create_supernova/ms2_data.028-en
new file mode 100644
index 0000000..88ab4c8
Binary files /dev/null and b/devtools/create_supernova/ms2_data.028-en differ
diff --git a/devtools/create_supernova/strings-en.po b/devtools/create_supernova/strings-en.po
deleted file mode 100644
index 1d03289..0000000
--- a/devtools/create_supernova/strings-en.po
+++ /dev/null
@@ -1,2906 +0,0 @@
-# Mission Supernova Translation.
-# Copyright (C) YEAR ScummVM Team
-# This file is distributed under the same license as the ScummVM package.
-# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Mission Supernova 1.0\n"
-"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
-"POT-Creation-Date: 2017-07-22 19:53+0100\n"
-"PO-Revision-Date: 2018-04-13 21:29+0000\n"
-"Last-Translator: Adrian Frhwirth <bonki at scummvm.org>\n"
-"Language-Team: none\n"
-"Language: en\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CP850\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.9\n"
-
-#. I18N: Go
-#: ../../msn/msn.c:1610
-msgid "Gehe"
-msgstr "Go"
-
-#. I18N: Look
-#: ../../msn/msn.c:1612
-msgid "Schau"
-msgstr "Look"
-
-#. I18N: Take
-#: ../../msn/msn.c:1614
-msgid "Nimm"
-msgstr "Take"
-
-#. I18N: Open
-#: ../../msn/msn.c:1616
-msgid "™ffne"
-msgstr "Open"
-
-#. I18N: Close
-#: ../../msn/msn.c:1618
-msgid "Schlieáe"
-msgstr "Close"
-
-#. I18N: Push
-#: ../../msn/msn.c:1620
-msgid "Drcke"
-msgstr "Push"
-
-#. I18N: Pull
-#: ../../msn/msn.c:1622
-msgid "Ziehe"
-msgstr "Pull"
-
-#. I18N: Use
-#: ../../msn/msn.c:1624
-msgid "Benutze"
-msgstr "Use"
-
-#. I18N: Talk
-#: ../../msn/msn.c:1626
-msgid "Rede"
-msgstr "Talk"
-
-#. I18N: Give
-#: ../../msn/msn.c:1628
-msgid "Gib"
-msgstr "Give"
-
-#. I18N: End of conversation
-#: ../../msn/msn.c:2204
-msgid "Gespr„ch beenden"
-msgstr "End of conversation"
-
-#. I18N: Go to
-#: ../../msn/msn.c:2334
-msgid "Gehe zu "
-msgstr "Go to "
-
-#. I18N: Look at
-#: ../../msn/msn.c:2336
-msgid "Schau "
-msgstr "Look at "
-
-#. I18N: Take
-#: ../../msn/msn.c:2338
-msgid "Nimm "
-msgstr "Take "
-
-#. I18N: Open
-#: ../../msn/msn.c:2340
-msgid "™ffne "
-msgstr "Open "
-
-#. I18N: Close
-#: ../../msn/msn.c:2342
-msgid "Schlieáe "
-msgstr "Close "
-
-#. I18N: Push
-#: ../../msn/msn.c:2344
-msgid "Drcke "
-msgstr "Push "
-
-#. I18N: Pull
-#: ../../msn/msn.c:2346
-msgid "Ziehe "
-msgstr "Pull "
-
-#. I18N: Use
-#: ../../msn/msn.c:2348
-msgid "Benutze "
-msgstr "Use "
-
-#. I18N: Talk to
-#: ../../msn/msn.c:2350
-msgid "Rede mit "
-msgstr "Talk to "
-
-#. I18N: Give
-#: ../../msn/msn.c:2352
-msgid "Gib "
-msgstr "Give "
-
-#: ../../msn/msn.c:2368
-msgid " an "
-msgstr " to "
-
-#: ../../msn/msn.c:2371
-msgid " mit "
-msgstr " with "
-
-#. I18N: Load
-#: ../../msn/msn.c:2880
-msgid "Laden"
-msgstr "Load"
-
-#. I18N: Save
-#: ../../msn/msn.c:2883
-msgid "Speichern"
-msgstr "Save"
-
-#. I18N: Back
-#: ../../msn/msn.c:2886
-msgid "Zurck"
-msgstr "Back"
-
-#. I18N: Restart
-#: ../../msn/msn.c:2889
-msgid "Neustart"
-msgstr "Restart"
-
-#. I18N: Help
-#: ../../msn/msn.c:3163
-msgid "F1    Hilfe"
-msgstr "F1    Help"
-
-#. I18N: Instructions
-#: ../../msn/msn.c:3165
-msgid "F2    Anleitung"
-msgstr "F2    Instructions"
-
-#. I18N: Program information
-#: ../../msn/msn.c:3167
-msgid "F3    Programminformationen"
-msgstr "F3    Program information"
-
-#. I18N: Text Speed
-#: ../../msn/msn.c:3169
-msgid "F4    Textgeschwindigkeit"
-msgstr "F4    Text speed"
-
-#. I18N: Load / Save
-#: ../../msn/msn.c:3171
-msgid "F5    Laden / Speichern"
-msgstr "F5    Load / Save"
-
-#. I18N: Skip intro
-#: ../../msn/msn.c:3173
-msgid "ESC   Vorspann berspringen"
-msgstr "ESC   Skip intro"
-
-#. I18N: Exit program
-#: ../../msn/msn.c:3175
-msgid "Alt-X Programm abbrechen"
-msgstr "Alt-X Exit program"
-
-#. I18N: Text Speed
-#: ../../msn/msn.c:3219
-msgid "Textgeschwindigkeit:"
-msgstr "Text speed:"
-
-#. I18N: Leave game?
-#: ../../msn/msn.c:3267
-msgid "Spiel abbrechen?"
-msgstr "Leave game?"
-
-#: ../../msn/msn.c:3270
-msgid "Ja"
-msgstr "Yes"
-
-#: ../../msn/msn.c:3271
-msgid "Nein"
-msgstr "No"
-
-#. I18N: You already carry this.
-#: ../../msn/msn.c:3341
-msgid "Das tr„gst du doch bei dir."
-msgstr "You already carry this."
-
-#. I18N: You're already there.
-#: ../../msn/msn.c:3344
-msgid "Du bist doch schon da."
-msgstr "You are already there."
-
-#. I18N: This is closed
-#: ../../msn/msn.c:3347 ../../msn/msn_r1.c:683
-msgid "Das ist geschlossen."
-msgstr "This is closed."
-
-#. I18N: You already have that
-#: ../../msn/msn.c:3357
-msgid "Das hast du doch schon."
-msgstr "You already have that."
-
-#. I18N: You do not need that.
-#: ../../msn/msn.c:3360
-msgid "Das brauchst du nicht."
-msgstr "You don't need that."
-
-#. I18N: You can't take that.
-#: ../../msn/msn.c:3363
-msgid "Das kannst du nicht nehmen."
-msgstr "You can't take that."
-
-#. I18N: This can't be opened
-#: ../../msn/msn.c:3370
-msgid "Das l„át sich nicht ”ffnen."
-msgstr "This cannot be opened."
-
-#. I18N: This is already opened.
-#: ../../msn/msn.c:3373
-msgid "Das ist schon offen."
-msgstr "This is already opened."
-
-#. I18N: This is locked.
-#: ../../msn/msn.c:3376
-msgid "Das ist verschlossen."
-msgstr "This is locked."
-
-#. I18N: This can't be closed.
-#: ../../msn/msn.c:3393
-msgid "Das l„át sich nicht schlieáen."
-msgstr "This cannot be closed."
-
-#. I18N: This is already closed.
-#: ../../msn/msn.c:3396 ../../msn/msn_r1.c:829
-msgid "Das ist schon geschlossen."
-msgstr "This is already closed."
-
-#. I18N: Better keep it!
-#: ../../msn/msn.c:3412
-msgid "Behalt es lieber!"
-msgstr "Better keep it!"
-
-#. I18N: This is not possible.
-#: ../../msn/msn.c:3418
-msgid "Das geht nicht."
-msgstr "You can't do that."
-
-#: ../../msn/msn_mod.c:573
-msgid "^(C) 1994 Thomas und Steffen Dingel#"
-msgstr "^(C) 1994 Thomas and Steffen Dingel#"
-
-#: ../../msn/msn_mod.c:574
-msgid "Story und Grafik:^ Thomas Dingel#"
-msgstr "Story and Graphics:^ Thomas Dingel#"
-
-#: ../../msn/msn_mod.c:575
-msgid "Programmierung:^ Steffen Dingel#"
-msgstr "Programming:^ Steffen Dingel#"
-
-#: ../../msn/msn_mod.c:576
-msgid "Musik:^ Bernd Hoffmann#"
-msgstr "Music:^ Bernd Hoffmann#"
-
-#: ../../msn/msn_mod.c:577
-msgid "Getestet von ...#"
-msgstr "Tested by ...#"
-
-#: ../../msn/msn_mod.c:587
-msgid "^             E#N#D#E ...########"
-msgstr "^          T#H#E E#N#D ...########"
-
-#: ../../msn/msn_mod.c:588
-msgid "#       ... des ersten Teils!########"
-msgstr "#       ... of the first part!########"
-
-#: ../../msn/msn_mod.c:590
-msgid "^Aber:#"
-msgstr "^But:#"
-
-#: ../../msn/msn_mod.c:591
-msgid "Das Abenteuer geht weiter, ...##"
-msgstr "The adventure continues ...##"
-
-#: ../../msn/msn_mod.c:592
-msgid "... wenn Sie sich fr 30,- DM registrieren lassen!##"
-msgstr "... if you register for 30, - DM!##"
-
-#: ../../msn/msn_mod.c:593
-msgid "(Falls Sie das nicht schon l„ngst getan haben.)##"
-msgstr "(If you have not already done so.)##"
-
-#: ../../msn/msn_mod.c:594
-msgid "In^ Teil 2 - Der Doppelg„nger^ erwarten Sie:##"
-msgstr "In^ Part 2 - The Doppelganger^ you can expect:##"
-
-#: ../../msn/msn_mod.c:595
-msgid "Knifflige Puzzles,##"
-msgstr "tricky puzzles,##"
-
-#: ../../msn/msn_mod.c:596
-msgid "noch mehr Grafik und Sound,##"
-msgstr "even more graphics and sound,##"
-
-#: ../../msn/msn_mod.c:597
-msgid "ein perfekt geplanter Museumseinbruch,##"
-msgstr "a perfectly planned museum burglary,##"
-
-#: ../../msn/msn_mod.c:598
-msgid "das Virtual-Reality-Spiel \"Indiana Joe\"##"
-msgstr "the virtual reality game \"Indiana Joe\"##"
-
-#: ../../msn/msn_mod.c:599
-msgid "und vieles mehr!##"
-msgstr "and much more!##"
-
-#. I18N: There's nothing special about it
-#: ../../msn/msn_r0.c:26
-msgid "Es ist nichts Besonderes daran."
-msgstr "There's nothing special about it."
-
-#. I18N: You first have to take it
-#: ../../msn/msn_r0.c:28 ../../msn/msn_r0.c:230
-msgid "Das muát du erst nehmen."
-msgstr "You first have to take it."
-
-#. I18N: Hello
-#: ../../msn/msn_r0.c:33
-msgid "Hallo!"
-msgstr "Hello!"
-
-#. I18N: Good day!
-#: ../../msn/msn_r0.c:35
-msgid "Guten Tag!"
-msgstr "Good day!"
-
-#. I18N: It's me, Horst Hummel
-#: ../../msn/msn_r0.c:37
-msgid "Ich bin's, Horst Hummel."
-msgstr "It's me, Horst Hummel."
-
-#: ../../msn/msn_r0.c:127
-#, c-format
-msgid "%d Xa"
-msgstr "%d Xa"
-
-#: ../../msn/msn_r0.c:147
-msgid "Ok."
-msgstr "OK."
-
-#: ../../msn/msn_r0.c:166
-msgid "Irgendwie ist ein Raumhelm|beim Essen unpraktisch."
-msgstr "Somehow, a space helmet is|impractical when eating."
-
-#: ../../msn/msn_r0.c:182 ../../msn/msn_r0.c:192
-msgid "Schmeckt ganz gut."
-msgstr "Tastes good."
-
-#: ../../msn/msn_r0.c:194
-msgid "Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt."
-msgstr "There was something in it, but now you swallowed it."
-
-#: ../../msn/msn_r0.c:202
-msgid "Du hast es doch schon ge”ffnet."
-msgstr "You've already opened it."
-
-#: ../../msn/msn_r0.c:206
-msgid "In dem Ei ist eine Tablette|in einer Plastikhlle."
-msgstr "The egg contains a pill|in a plastic sleeve."
-
-#: ../../msn/msn_r0.c:214
-msgid "Du iát die Tablette und merkst,|daá sich irgendetwas ver„ndert hat."
-msgstr "You eat the pill and realize|that something has changed."
-
-#: ../../msn/msn_r0.c:224
-msgid ""
-"Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie "
-"diese Schrift jetzt|lesen k”nnen, hat die Tablette gewirkt.\""
-msgstr ""
-"Funny! Now you can read the inscription!|It says, \"If you can read this "
-"text now,|the pill has worked.\""
-
-#: ../../msn/msn_r0.c:232
-msgid "Sie ist leer."
-msgstr "It is empty."
-
-#: ../../msn/msn_r0.c:235
-msgid "Du findest 10 Buckazoids und eine Keycard."
-msgstr "You find 10 buckazoids and a keycard."
-
-#: ../../msn/msn_r0.c:242
-msgid "Es ist eine Art elektronische Zeitung."
-msgstr "This is a kind of electronic newspaper."
-
-#: ../../msn/msn_r0.c:245
-msgid "Halt, hier ist ein interessanter Artikel."
-msgstr "Here, this article looks interesting."
-
-#: ../../msn/msn_r0.c:268
-msgid "Hmm, irgendwie komme|ich mir verarscht vor."
-msgstr "Hmm, somehow|I feel tricked."
-
-#: ../../msn/msn_r0.c:273
-msgid "Es ist die Keycard des Commanders."
-msgstr "This is the keycard of the Commander."
-
-#: ../../msn/msn_r0.c:277
-msgid ""
-"Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen "
-"der Alarmzeit.|Uhrzeit: %s   Alarmzeit: %s"
-msgstr ""
-"This is a clock with a very loud alarm. It has a button|for adjusting the "
-"alarm time.|Time: %s   Alarm: %s"
-
-#: ../../msn/msn_r0.c:291
-msgid "Neue Alarmzeit (hh:mm) :"
-msgstr "New alarm time (hh:mm):"
-
-#: ../../msn/msn_r0.c:332 ../../msn/msn_r1.c:486 ../../msn/msn_r1.c:595
-msgid "Leitung mit Lsterklemme"
-msgstr "Cable with terminal strip"
-
-#: ../../msn/msn_r0.c:344
-msgid "Kabelrolle mit Lsterklemme"
-msgstr "Cable reel with terminal strip"
-
-#: ../../msn/msn_r0.c:355 ../../msn/msn_r1.c:495 ../../msn/msn_r1.c:604
-msgid "Womit denn?"
-msgstr "With what?"
-
-#: ../../msn/msn_r0.c:366 ../../msn/msn_r1.c:499 ../../msn/msn_r1.c:608
-#: ../../msn/msn_r1_r.c:115
-msgid "langes Kabel mit Stecker"
-msgstr "long cable with plug"
-
-#: ../../msn/msn_r0.c:381 ../../msn/msn_r0.c:418 ../../msn/msn_r0.c:454
-msgid "Die Luft hier ist atembar,|du ziehst den Anzug aus."
-msgstr "The air here is breathable,|you take off your suit."
-
-#: ../../msn/msn_r0.c:387 ../../msn/msn_r0.c:424 ../../msn/msn_r0.c:460
-msgid "Hier drinnen brauchtst du deinen Anzug nicht."
-msgstr "Inside you do not need your suit."
-
-#: ../../msn/msn_r0.c:395
-msgid "Du muát erst den Helm abnehmen."
-msgstr "You must take off your helmet first."
-
-#: ../../msn/msn_r0.c:397
-msgid "Du muát erst den Versorgungsteil abnehmen."
-msgstr "You must take off your oxygen supply unit first."
-
-#: ../../msn/msn_r0.c:401
-msgid "Du ziehst den Raumanzug aus."
-msgstr "Your take off your space suit."
-
-#: ../../msn/msn_r0.c:407
-msgid "Du ziehst den Raumanzug an."
-msgstr "You put on your space suit."
-
-#: ../../msn/msn_r0.c:431
-msgid "Den Helm h„ttest du|besser angelassen!"
-msgstr "You should have kept your helmet on!"
-
-#: ../../msn/msn_r0.c:433
-msgid "Du ziehst den Helm ab."
-msgstr "You take off your helmet."
-
-#: ../../msn/msn_r0.c:441
-msgid "Du ziehst den Helm auf."
-msgstr "You put on your helmet."
-
-#: ../../msn/msn_r0.c:443 ../../msn/msn_r0.c:479
-msgid "Du muát erst den Anzug anziehen."
-msgstr "You must wear the suit first."
-
-#: ../../msn/msn_r0.c:467
-msgid "Den Versorungsteil h„ttest du|besser nicht abgenommen!"
-msgstr "You should not have taken off your oxygen supply unit!"
-
-#: ../../msn/msn_r0.c:469
-msgid "Du nimmst den Versorgungsteil ab."
-msgstr "You take off your oxygen supply unit."
-
-#: ../../msn/msn_r0.c:477
-msgid "Du ziehst den Versorgungsteil an."
-msgstr "You put on your oxygen supply unit."
-
-#: ../../msn/msn_r0.c:489
-msgid "Die Leitung ist hier unntz."
-msgstr "The cable is useless here."
-
-#: ../../msn/msn_r0.c:492
-msgid ""
-"Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende "
-"des Universums\"."
-msgstr ""
-"Great, this is the sequel to the \"Hitchhiker\":|\"The Restaurant at the End "
-"of the Universe\"."
-
-#: ../../msn/msn_r0.c:495
-msgid ""
-"Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht."
-msgstr "Wait a minute, there is a bookmark in it|that says \"Forty-two\"."
-
-#: ../../msn/msn_r0.c:507
-msgid "Du h„ttest besser vorher|den Stecker rausgezogen."
-msgstr "You should have pulled|the plug before."
-
-#: ../../msn/msn_r0.c:567
-msgid "Deine Armbanduhr piepst,|die Alarmzeit ist erreicht."
-msgstr "Your watch beeps,|this is the alarm."
-
-#: ../../msn/msn_r0.c:803 ../../msn/msn_r1_r.c:117
-msgid "Keycard"
-msgstr "Keycard"
-
-#: ../../msn/msn_r0.c:803
-msgid "Die Keycard fr deine Schr„nke."
-msgstr "The keycard for your locker."
-
-#: ../../msn/msn_r0.c:805
-msgid "Taschenmesser"
-msgstr "Pocket knife"
-
-#: ../../msn/msn_r0.c:805
-msgid "Es ist nicht mehr das sch„rfste."
-msgstr "It is quite blunt."
-
-#: ../../msn/msn_r0.c:807 ../../msn/msn_r3.c:1527
-msgid "Armbanduhr"
-msgstr "Watch"
-
-#: ../../msn/msn_r0.c:808 ../../msn/msn_r1_r.c:199
-msgid "Discman"
-msgstr "Discman"
-
-#: ../../msn/msn_r0.c:808 ../../msn/msn_r1_r.c:199
-msgid "Es ist eine \"Mad Monkeys\"-CD darin."
-msgstr "There is a \"Mad Monkeys\" CD in it."
-
-#: ../../msn/msn_r1.c:58
-msgid ""
-"In der Kche warst du schon|oft genug, im Moment hast|du keinen Appetit."
-msgstr ""
-"You have been often enough|in the kitchen and you are|no longer hungry."
-
-#. I18N: FORTYTWO
-#: ../../msn/msn_r1.c:91
-msgid "ZWEIUNDVIERZIG"
-msgstr "FORTY-TWO"
-
-#. I18N: Destination reached
-#: ../../msn/msn_r1.c:104
-msgid "Flugziel erreicht"
-msgstr "Destination reached"
-
-#. I18N: Energy depleted
-#: ../../msn/msn_r1.c:110
-msgid "Energie ersch”pft"
-msgstr "Energy depleted"
-
-#. I18N: Artificial coma interrupted
-#: ../../msn/msn_r1.c:112
-msgid "Tiefschlafprozess abgebrochen"
-msgstr "Stasis interrupted"
-
-#: ../../msn/msn_r1.c:120 ../../msn/msn_r1.c:156
-msgid "Bitte legen Sie sich in die angezeigte Schlafkammer."
-msgstr "Please lay down in the indicated stasis pod."
-
-#: ../../msn/msn_r1.c:125
-msgid "Bitte Passwort eingeben:"
-msgstr "Please enter your password:"
-
-#: ../../msn/msn_r1.c:135 ../../msn/msn_r3.c:1171
-msgid "Falsches Passwort"
-msgstr "Password incorrect"
-
-#: ../../msn/msn_r1.c:141
-msgid "Schlafdauer in Tagen:"
-msgstr "Sleep duration in days:"
-
-#: ../../msn/msn_r1.c:172
-msgid ""
-"Es wrde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht "
-"eingeschaltet ist."
-msgstr ""
-"You are not going to achieve anything|by using a stasis pod that is|not "
-"switched on."
-
-#: ../../msn/msn_r1.c:174
-msgid "Dazu muát du erst den Raumanzug ausziehen."
-msgstr "To do this you have to take off the space suit first."
-
-#: ../../msn/msn_r1.c:248 ../../msn/msn_s.c:210
-msgid "Was war das?"
-msgstr "What was that?"
-
-#: ../../msn/msn_r1.c:266
-msgid "Achtung"
-msgstr "Danger"
-
-#: ../../msn/msn_r1.c:289
-msgid ""
-"Du wachst mit brummendem Sch„del auf|und merkst, daá du nur getr„umt hast."
-msgstr ""
-"You wake up with a buzzing sensation in your head|and realise that it was "
-"only a dream."
-
-#: ../../msn/msn_r1.c:292
-msgid ""
-"Beim Aufprall des Raumschiffs|muát du mit dem Kopf aufgeschlagen|und "
-"bewuátlos geworden sein."
-msgstr ""
-"During the space ship impact|you must have hit your head|and lost "
-"consciousness."
-
-#: ../../msn/msn_r1.c:295
-msgid "Was steht dir jetzt wohl wirklich bevor?"
-msgstr "What is going to happen to you now?"
-
-#: ../../msn/msn_r1.c:307
-msgid "Geschwindigkeit: "
-msgstr "Speed: "
-
-#: ../../msn/msn_r1.c:308
-msgid "8000 hpm"
-msgstr "8000 hpm"
-
-#: ../../msn/msn_r1.c:309
-msgid "0 hpm"
-msgstr "0 hpm"
-
-#: ../../msn/msn_r1.c:310
-msgid "Ziel: Arsano 3"
-msgstr "Destination: Arsano 3"
-
-#: ../../msn/msn_r1.c:311
-msgid "Entfernung: "
-msgstr "Distance: "
-
-#: ../../msn/msn_r1.c:318
-msgid " Lichtjahre"
-msgstr " light years"
-
-#: ../../msn/msn_r1.c:319
-msgid "Dauer der Reise bei momentaner Geschwindigkeit:"
-msgstr "Duration of trip at current speed:"
-
-#: ../../msn/msn_r1.c:321
-msgid " Tage"
-msgstr " days"
-
-#: ../../msn/msn_r1.c:330
-msgid ""
-"Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein "
-"Raumschiff fliegt."
-msgstr ""
-"Do not forget, you're only the|ship's cook and have no idea|how to fly a "
-"spaceship."
-
-#: ../../msn/msn_r1.c:344
-msgid "Achtung: Triebwerke funktionsunf„hig"
-msgstr "Warning: Engine malfunction"
-
-#: ../../msn/msn_r1.c:357
-msgid "Energievorrat ersch”pft"
-msgstr "Energy supply exhausted"
-
-#: ../../msn/msn_r1.c:358
-msgid "Notstromversorgung aktiv"
-msgstr "Emergency energy supply active"
-
-#: ../../msn/msn_r1.c:447
-msgid "Zu niedriger Luftdruck soll ungesund sein."
-msgstr "Air pressure too low unhealthy is."
-
-#: ../../msn/msn_r1.c:454
-msgid "Er zeigt Null an."
-msgstr "It indicates zero."
-
-#: ../../msn/msn_r1.c:455
-msgid "Er zeigt Normaldruck an."
-msgstr "It indicates normal pressure."
-
-#: ../../msn/msn_r1.c:464
-msgid "Ein Stck Schrott."
-msgstr "Some scrap metal."
-
-#: ../../msn/msn_r1.c:476
-msgid "Du muát erst hingehen."
-msgstr "You must go there first."
-
-#: ../../msn/msn_r1.c:480 ../../msn/msn_r1.c:639 ../../msn/msn_r1.c:728
-msgid "Das Kabel ist im Weg."
-msgstr "The cable is in the way."
-
-#: ../../msn/msn_r1.c:483 ../../msn/msn_r1.c:642 ../../msn/msn_r1.c:698
-msgid "Das Kabel ist schon ganz|richtig an dieser Stelle."
-msgstr "The cable is already in the right place."
-
-#: ../../msn/msn_r1.c:519
-msgid "Die Leitung ist zu kurz."
-msgstr "The line is too short."
-
-#: ../../msn/msn_r1.c:567
-msgid "Es ist nicht spitz genug."
-msgstr "It is not sharp enough."
-
-#: ../../msn/msn_r1.c:570
-msgid "Du wirst aus den Anzeigen nicht schlau."
-msgstr "You cannot make sense of it."
-
-#: ../../msn/msn_r1.c:572
-msgid "Laá lieber die Finger davon!"
-msgstr "You better keep your hands off!"
-
-#: ../../msn/msn_r1.c:591
-msgid "An dem Kabel ist doch gar kein Stecker."
-msgstr "There is no plug on the cable."
-
-#: ../../msn/msn_r1.c:635
-msgid "Du solltest die Luke vielleicht erst ”ffnen."
-msgstr "You should open the hatch first."
-
-#: ../../msn/msn_r1.c:668
-msgid "Das Seil ist im Weg."
-msgstr "The cable is in the way."
-
-#: ../../msn/msn_r1.c:685
-msgid "Das geht nicht.|Die Luke ist mindestens|5 Meter ber dem Boden."
-msgstr "That will not do.|The hatch is at least|5 meters above the ground."
-
-#: ../../msn/msn_r1.c:694
-msgid "Keycard des Commanders"
-msgstr "Keycard of the Commander"
-
-#: ../../msn/msn_r1.c:766
-msgid "Was ntzt dir der Anschluá|ohne eine Stromquelle?!"
-msgstr "What good would come from connecting it|without a power source?!"
-
-#: ../../msn/msn_r1.c:770
-msgid "Die Spannung ist auf Null abgesunken."
-msgstr "The voltage has dropped to zero."
-
-#: ../../msn/msn_r1.c:771
-msgid "Es zeigt volle Spannung an."
-msgstr "It displays full voltage."
-
-#: ../../msn/msn_r1.c:782
-msgid "Du muát die Luke erst ”ffnen."
-msgstr "You must open the hatch first."
-
-#: ../../msn/msn_r1.c:801
-msgid "Das Seil ist hier schon ganz richtig."
-msgstr "The cable is in the right place."
-
-#: ../../msn/msn_r1.c:806
-msgid "Das Kabel ist zu kurz."
-msgstr "The cable is too short."
-
-#: ../../msn/msn_r1.c:913
-msgid "Du hast die Platte schon aufgelegt."
-msgstr "You already put the record on."
-
-#: ../../msn/msn_r1.c:925
-msgid "Es ist doch gar keine Platte aufgelegt."
-msgstr "You haven't put a record on yet."
-
-#: ../../msn/msn_r1.c:960
-msgid "Die Platte scheint einen Sprung zu haben."
-msgstr "The record seems to be scratched."
-
-#: ../../msn/msn_r1.c:981
-msgid "Schneid doch besser ein|l„ngeres Stck Kabel ab!"
-msgstr "You should cut a longer|piece of cable!"
-
-#: ../../msn/msn_r1.c:1003
-msgid "Leitung mit Stecker"
-msgstr "Cable with plug"
-
-#: ../../msn/msn_r1.c:1008 ../../msn/msn_r3.c:75
-msgid "Das ist befestigt."
-msgstr "This is fixed."
-
-#: ../../msn/msn_r1.c:1084
-msgid "Du hast jetzt besseres zu tun."
-msgstr "You have better things to do now."
-
-#: ../../msn/msn_r1.c:1086
-msgid "Wenn du unbedingt aufs Klo|willst, spiel doch Larry 1."
-msgstr "If you absolutely want to go|to the loo, play Larry 1."
-
-#: ../../msn/msn_r1.c:1097
-msgid "Was?! Keiner im Cockpit!|Die sind wohl verrckt!"
-msgstr "What?! No one in the cockpit!|They're crazy!"
-
-#: ../../msn/msn_r1.c:1105
-msgid "Komisch, es ist nur|noch ein Raumanzug da."
-msgstr "Funny, there's only|one space suit."
-
-#: ../../msn/msn_r1.c:1113
-msgid ""
-"Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt "
-"wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt."
-msgstr ""
-"What is that chaos? And also|the escape ship is missing!|Now I understand. "
-"The others|have escaped, and they left|me behind."
-
-#: ../../msn/msn_r1_r.c:16 ../../msn/msn_r1_r.c:17 ../../msn/msn_r1_r.c:18
-#: ../../msn/msn_r1_r.c:19 ../../msn/msn_r1_r.c:20 ../../msn/msn_r1_r.c:21
-#: ../../msn/msn_r1_r.c:22 ../../msn/msn_r1_r.c:31 ../../msn/msn_r1_r.c:32
-#: ../../msn/msn_r1_r.c:34 ../../msn/msn_r1_r.c:44 ../../msn/msn_r1_r.c:45
-#: ../../msn/msn_r1_r.c:63 ../../msn/msn_r1_r.c:65 ../../msn/msn_r1_r.c:89
-#: ../../msn/msn_r1_r.c:93 ../../msn/msn_r1_r.c:108 ../../msn/msn_r1_r.c:120
-#: ../../msn/msn_r1_r.c:122 ../../msn/msn_r1_r.c:136 ../../msn/msn_r1_r.c:150
-#: ../../msn/msn_r1_r.c:165 ../../msn/msn_r1_r.c:201 ../../msn/msn_r1_r.c:219
-#: ../../msn/msn_r1_r.c:245 ../../msn/msn_r1_r.c:279
-msgid "Luke"
-msgstr "Hatch"
-
-#: ../../msn/msn_r1_r.c:23 ../../msn/msn_r1_r.c:67 ../../msn/msn_r1_r.c:68
-#: ../../msn/msn_r1_r.c:103 ../../msn/msn_r1_r.c:239 ../../msn/msn_r2.c:1256
-#: ../../msn/msn_r2.c:1293 ../../msn/msn_r2.c:1294 ../../msn/msn_r2.c:1295
-#: ../../msn/msn_r2.c:1296 ../../msn/msn_r3.c:1479 ../../msn/msn_r3.c:1677
-#: ../../msn/msn_r3.c:1678
-msgid "Knopf"
-msgstr "Button"
-
-#: ../../msn/msn_r1_r.c:23
-msgid "Er geh”rt zu der groáen Luke."
-msgstr "It belongs to the large hatch."
-
-#: ../../msn/msn_r1_r.c:24 ../../msn/msn_r1_r.c:37 ../../msn/msn_r1_r.c:130
-msgid "Leiter"
-msgstr "Ladder"
-
-#: ../../msn/msn_r1_r.c:25 ../../msn/msn_r1_r.c:47 ../../msn/msn_r1_r.c:57
-#: ../../msn/msn_r1_r.c:92 ../../msn/msn_r1_r.c:293 ../../msn/msn_r2.c:1221
-#: ../../msn/msn_r2.c:1223 ../../msn/msn_r2.c:1259 ../../msn/msn_r2.c:1277
-#: ../../msn/msn_r2.c:1292 ../../msn/msn_r3.c:1498 ../../msn/msn_r3.c:1499
-#: ../../msn/msn_r3.c:1506 ../../msn/msn_r3.c:1507 ../../msn/msn_r3.c:1508
-#: ../../msn/msn_r3.c:1515 ../../msn/msn_r3.c:1522 ../../msn/msn_r3.c:1523
-#: ../../msn/msn_r3.c:1535 ../../msn/msn_r3.c:1536 ../../msn/msn_r3.c:1543
-#: ../../msn/msn_r3.c:1544 ../../msn/msn_r3.c:1552 ../../msn/msn_r3.c:1553
-#: ../../msn/msn_r3.c:1561 ../../msn/msn_r3.c:1568 ../../msn/msn_r3.c:1578
-#: ../../msn/msn_r3.c:1579 ../../msn/msn_r3.c:1594 ../../msn/msn_r3.c:1608
-#: ../../msn/msn_r3.c:1679 ../../msn/msn_r3.c:1695
-msgid "Ausgang"
-msgstr "Exit"
-
-#: ../../msn/msn_r1_r.c:31
-msgid "Sie fhrt ins Cockpit."
-msgstr "It leads into the cockpit."
-
-#: ../../msn/msn_r1_r.c:32
-msgid "Sie fhrt zur Kche."
-msgstr "It leads to the kitchen."
-
-#: ../../msn/msn_r1_r.c:34
-msgid "Sie fhrt zu den Tiefschlafkammern."
-msgstr "It leads to the stasis pods."
-
-#: ../../msn/msn_r1_r.c:36 ../../msn/msn_r1_r.c:123 ../../msn/msn_r1_r.c:151
-#: ../../msn/msn_r1_r.c:166 ../../msn/msn_r1_r.c:179 ../../msn/msn_r1_r.c:180
-#: ../../msn/msn_r1_r.c:181 ../../msn/msn_r1_r.c:182 ../../msn/msn_r1_r.c:202
-#: ../../msn/msn_r1_r.c:220 ../../msn/msn_r1_r.c:246 ../../msn/msn_r1_r.c:256
-#: ../../msn/msn_r1_r.c:257 ../../msn/msn_r1_r.c:258 ../../msn/msn_r1_r.c:259
-#: ../../msn/msn_r1_r.c:280 ../../msn/msn_r2.c:1252 ../../msn/msn_r2.c:1298
-#: ../../msn/msn_r3.c:1696
-msgid "Schlitz"
-msgstr "Slot"
-
-#: ../../msn/msn_r1_r.c:36 ../../msn/msn_r1_r.c:123 ../../msn/msn_r1_r.c:151
-#: ../../msn/msn_r1_r.c:166 ../../msn/msn_r1_r.c:179 ../../msn/msn_r1_r.c:180
-#: ../../msn/msn_r1_r.c:181 ../../msn/msn_r1_r.c:182 ../../msn/msn_r1_r.c:202
-#: ../../msn/msn_r1_r.c:220 ../../msn/msn_r1_r.c:246 ../../msn/msn_r1_r.c:256
-#: ../../msn/msn_r1_r.c:257 ../../msn/msn_r1_r.c:258 ../../msn/msn_r1_r.c:259
-#: ../../msn/msn_r1_r.c:280
-msgid "Es ist ein Keycard-Leser."
-msgstr "It is a keycard reader."
-
-#: ../../msn/msn_r1_r.c:38 ../../msn/msn_r3.c:1595
-msgid "Gang"
-msgstr "Corridor"
-
-#: ../../msn/msn_r1_r.c:44 ../../msn/msn_r1_r.c:45
-msgid "Dies ist eine der Tiefschlafkammern."
-msgstr "This is one of the stasis pods."
-
-#: ../../msn/msn_r1_r.c:46 ../../msn/msn_r3.c:1622 ../../msn/msn_r3.c:1634
-#: ../../msn/msn_r3.c:1645 ../../msn/msn_r3.c:1657 ../../msn/msn_r3.c:1668
-msgid "Computer"
-msgstr "Computer"
-
-#: ../../msn/msn_r1_r.c:53 ../../msn/msn_r2.c:1302
-msgid "Instrumente"
-msgstr "Instruments"
-
-#: ../../msn/msn_r1_r.c:53
-msgid "Hmm, sieht ziemlich kompliziert aus."
-msgstr "Hmm, this looks pretty complicated."
-
-#: ../../msn/msn_r1_r.c:55 ../../msn/msn_r1_r.c:56 ../../msn/msn_r1_r.c:105
-msgid "Monitor"
-msgstr "Monitor"
-
-#: ../../msn/msn_r1_r.c:56
-msgid "Dieser Monitor sagt dir nichts."
-msgstr "There is nothing on this monitor."
-
-#: ../../msn/msn_r1_r.c:63
-msgid "Das ist eine Luke !!!"
-msgstr "This is a hatch !!!"
-
-#: ../../msn/msn_r1_r.c:65
-msgid "Dies ist eine Luke !!!"
-msgstr "This is a hatch !!!"
-
-#: ../../msn/msn_r1_r.c:69
-msgid "Helm"
-msgstr "Helmet"
-
-#: ../../msn/msn_r1_r.c:69
-msgid "Es ist der Helm zum Raumanzug."
-msgstr "This is the helmet for the space suit."
-
-#: ../../msn/msn_r1_r.c:70
-msgid "Raumanzug"
-msgstr "Space suit"
-
-#: ../../msn/msn_r1_r.c:70
-msgid "Der einzige Raumanzug, den die|anderen hiergelassen haben ..."
-msgstr "The only space suit left behind by the others..."
-
-#: ../../msn/msn_r1_r.c:72
-msgid "Versorgung"
-msgstr "Oxygen Supply Unit"
-
-#: ../../msn/msn_r1_r.c:72
-msgid "Es ist der Versorgungsteil zum Raumanzug."
-msgstr "It is the oxygen supply unit for the space suit."
-
-#: ../../msn/msn_r1_r.c:74
-msgid "Druckmesser"
-msgstr "Manometer"
-
-#: ../../msn/msn_r1_r.c:81 ../../msn/msn_r1_r.c:84
-msgid "Schrott"
-msgstr "Scrap"
-
-#: ../../msn/msn_r1_r.c:81
-msgid ""
-"Da ist eine Lsterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme "
-"sie mit."
-msgstr ""
-"There is a terminal strip on it|that looks quite useful.|I will take it with "
-"me."
-
-#: ../../msn/msn_r1_r.c:83
-msgid "Lsterklemme"
-msgstr "Terminal strip"
-
-#: ../../msn/msn_r1_r.c:84
-msgid ""
-"Junge, Junge! Die Explosion hat ein|ganz sch”nes Durcheinander angerichtet."
-msgstr "Boy, oh boy! The explosion created|quite a mess."
-
-#: ../../msn/msn_r1_r.c:86
-msgid "Reaktor"
-msgstr "Reactor"
-
-#: ../../msn/msn_r1_r.c:86
-msgid "Das war einmal der Reaktor."
-msgstr "This was a reactor once."
-
-#: ../../msn/msn_r1_r.c:87
-msgid "Dse"
-msgstr "Thruster"
-
-#: ../../msn/msn_r1_r.c:88
-msgid "blauer Krbis"
-msgstr "blue pumpkin"
-
-#: ../../msn/msn_r1_r.c:88
-msgid "Keine Ahnung, was das ist."
-msgstr "No idea what this is."
-
-#: ../../msn/msn_r1_r.c:90
-msgid "Landef„hre"
-msgstr "Landing module"
-
-#: ../../msn/msn_r1_r.c:90
-msgid "Sie war eigentlich fr Bodenuntersuchungen|auf Arsano 3 gedacht."
-msgstr "It was supposed to be used for soil analysis|on Arsano 3."
-
-#: ../../msn/msn_r1_r.c:93 ../../msn/msn_r1_r.c:120
-msgid "Sie fhrt nach drauáen."
-msgstr "It leads outside."
-
-#: ../../msn/msn_r1_r.c:95
-msgid "Generator"
-msgstr "Generator"
-
-#: ../../msn/msn_r1_r.c:95
-msgid "Er versorgt das Raumschiff mit Strom."
-msgstr "It supplies power to the spaceship."
-
-#: ../../msn/msn_r1_r.c:102 ../../msn/msn_r1_r.c:154 ../../msn/msn_r1_r.c:169
-#: ../../msn/msn_r1_r.c:205 ../../msn/msn_r1_r.c:223 ../../msn/msn_r1_r.c:249
-#: ../../msn/msn_r1_r.c:283 ../../msn/msn_r3.c:1486
-msgid "Steckdose"
-msgstr "Socket"
-
-#: ../../msn/msn_r1_r.c:103
-msgid ""
-"Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand "
-"gedrckt werden."
-msgstr "It's a safety button.|It can only be pushed|with a pointed object."
-
-#: ../../msn/msn_r1_r.c:106 ../../msn/msn_r2.c:1300
-msgid "Tastatur"
-msgstr "Keyboard"
-
-#: ../../msn/msn_r1_r.c:116
-msgid "leere Kabelrolle"
-msgstr "Empty cable reel"
-
-#: ../../msn/msn_r1_r.c:117
-msgid ""
-"Hey, das ist die Keycard des Commanders!|Er muá sie bei dem berstrzten|"
-"Aufbruch verloren haben."
-msgstr ""
-"Hey, that's the commander's keycard!|He must have lost it in the rushed|"
-"departure."
-
-#: ../../msn/msn_r1_r.c:119 ../../msn/msn_r1_r.c:137 ../../msn/msn_r1_r.c:188
-#: ../../msn/msn_r2.c:1212
-msgid "Seil"
-msgstr "Rope"
-
-#: ../../msn/msn_r1_r.c:124
-msgid "Klappe"
-msgstr "Hatch"
-
-#: ../../msn/msn_r1_r.c:125 ../../msn/msn_r1_r.c:128 ../../msn/msn_r1_r.c:242
-#: ../../msn/msn_r1_r.c:243 ../../msn/msn_r3.c:1485
-msgid "Leitung"
-msgstr "Cable"
-
-#: ../../msn/msn_r1_r.c:126
-msgid "Spannungmessger„t"
-msgstr "Voltmeter"
-
-#: ../../msn/msn_r1_r.c:127
-msgid "Klemme"
-msgstr "Clamp"
-
-#: ../../msn/msn_r1_r.c:128
-msgid "Sie fhrt vom Generator zum Spannungmessger„t."
-msgstr "It goes from the generator to the voltage meter."
-
-#: ../../msn/msn_r1_r.c:143 ../../msn/msn_r1_r.c:212 ../../msn/msn_r1_r.c:213
-#: ../../msn/msn_r1_r.c:214 ../../msn/msn_r1_r.c:217 ../../msn/msn_r3.c:1599
-#: ../../msn/msn_r3.c:1614 ../../msn/msn_r3.c:1636 ../../msn/msn_r3.c:1646
-#: ../../msn/msn_r3.c:1647
-msgid "Bild"
-msgstr "Image"
-
-#: ../../msn/msn_r1_r.c:143
-msgid "Manche Leute haben schon|einen komischen Geschmack."
-msgstr "Some people have funny tastes."
-
-#: ../../msn/msn_r1_r.c:145
-msgid "Zeichenger„te"
-msgstr "Drawing instruments"
-
-#: ../../msn/msn_r1_r.c:146
-msgid ""
-"Auf dem Zettel sind lauter|unverst„ndliche Skizzen und Berechnungen.|"
-"(Jedenfalls fr dich unverst„ndlich.)"
-msgstr ""
-"There are incomprehensible sketches|and calculations on that note.|(At "
-"least, it's incomprehensible to you.)"
-
-#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
-#: ../../msn/msn_r1_r.c:276
-msgid "Magnete"
-msgstr "Magnets"
-
-#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
-#: ../../msn/msn_r1_r.c:276
-msgid "Damit werden Sachen auf|dem Tisch festgehalten."
-msgstr "This keeps things|on the table."
-
-#: ../../msn/msn_r1_r.c:152 ../../msn/msn_r1_r.c:167 ../../msn/msn_r1_r.c:190
-#: ../../msn/msn_r1_r.c:203 ../../msn/msn_r1_r.c:221 ../../msn/msn_r1_r.c:247
-#: ../../msn/msn_r1_r.c:260 ../../msn/msn_r1_r.c:281
-msgid "Schrank"
-msgstr "Cabinet"
-
-#: ../../msn/msn_r1_r.c:153 ../../msn/msn_r1_r.c:168 ../../msn/msn_r1_r.c:183
-#: ../../msn/msn_r1_r.c:186 ../../msn/msn_r1_r.c:195 ../../msn/msn_r1_r.c:204
-#: ../../msn/msn_r1_r.c:222 ../../msn/msn_r1_r.c:248 ../../msn/msn_r1_r.c:262
-#: ../../msn/msn_r1_r.c:264 ../../msn/msn_r1_r.c:267 ../../msn/msn_r1_r.c:282
-#: ../../msn/msn_r2.c:1299
-msgid "Fach"
-msgstr "Storage compartment"
-
-#: ../../msn/msn_r1_r.c:155 ../../msn/msn_r1_r.c:170 ../../msn/msn_r1_r.c:206
-#: ../../msn/msn_r1_r.c:224 ../../msn/msn_r1_r.c:250 ../../msn/msn_r1_r.c:278
-#: ../../msn/msn_r2.c:1254
-msgid "Toilette"
-msgstr "Toilet"
-
-#: ../../msn/msn_r1_r.c:161 ../../msn/msn_r1_r.c:176 ../../msn/msn_r2.c:1283
-msgid "Schachspiel"
-msgstr "Chessboard"
-
-#: ../../msn/msn_r1_r.c:161
-msgid "Es macht wohl Spaá, an|der Decke Schach zu spielen."
-msgstr "I guess it's fun to play|chess on the ceiling."
-
-#: ../../msn/msn_r1_r.c:163
-msgid "Tennisschl„ger"
-msgstr "Tennis racquets"
-
-#: ../../msn/msn_r1_r.c:163
-msgid "Fliegt Boris Becker auch mit?"
-msgstr "Is Boris Becker part of the crew?"
-
-#: ../../msn/msn_r1_r.c:164
-msgid "Tennisball"
-msgstr "Tennis ball"
-
-#: ../../msn/msn_r1_r.c:164 ../../msn/msn_r1_r.c:213
-msgid "Toll!"
-msgstr "Awesome!"
-
-#: ../../msn/msn_r1_r.c:176
-msgid "Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft."
-msgstr "Your magnetic chess game. Chess|has always been your passion."
-
-#: ../../msn/msn_r1_r.c:178
-msgid "Bett"
-msgstr "Bed"
-
-#: ../../msn/msn_r1_r.c:178
-msgid "Das ist dein Bett. Toll, nicht wahr?"
-msgstr "This is your bed. Great, isn't it?"
-
-#: ../../msn/msn_r1_r.c:183 ../../msn/msn_r1_r.c:186 ../../msn/msn_r1_r.c:195
-msgid "Das ist eins deiner drei F„cher."
-msgstr "It's one of your three storage compartments."
-
-#: ../../msn/msn_r1_r.c:185
-msgid "Alben"
-msgstr "Albums"
-
-#: ../../msn/msn_r1_r.c:185
-msgid "Deine Briefmarkensammlung."
-msgstr "Your stamp collection."
-
-#: ../../msn/msn_r1_r.c:188
-msgid "Es ist ungef„hr 10 m lang und 4 cm dick."
-msgstr "It is about 10 m long and 4 cm thick."
-
-#: ../../msn/msn_r1_r.c:190
-msgid "Das ist dein Schrank."
-msgstr "This is your cabinet."
-
-#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
-msgid "Krimskram"
-msgstr "Junk"
-
-#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
-msgid "Es ist nichts brauchbares dabei."
-msgstr "There is nothing useful in there."
-
-#: ../../msn/msn_r1_r.c:192 ../../msn/msn_r1_r.c:273
-msgid "Kleider"
-msgstr "Clothes"
-
-#: ../../msn/msn_r1_r.c:192
-msgid "Es sind Standard-Weltraum-Klamotten."
-msgstr "They are standard space gear."
-
-#: ../../msn/msn_r1_r.c:193 ../../msn/msn_r1_r.c:269 ../../msn/msn_r1_r.c:271
-msgid "Unterw„sche"
-msgstr "Underwear"
-
-#: ../../msn/msn_r1_r.c:194
-msgid "Strmpfe"
-msgstr "Socks"
-
-#: ../../msn/msn_r1_r.c:197 ../../msn/msn_r1_r.c:268
-msgid "Buch"
-msgstr "Book"
-
-#: ../../msn/msn_r1_r.c:197
-msgid "Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams."
-msgstr "This is|\"The Hitchhiker's Guide to the Galaxy\"|by Douglas Adams."
-
-#: ../../msn/msn_r1_r.c:212
-msgid "Herb!"
-msgstr "Austere!"
-
-#: ../../msn/msn_r1_r.c:214
-msgid "Genial!"
-msgstr "Brilliant!"
-
-#: ../../msn/msn_r1_r.c:217
-msgid "Es scheint noch nicht fertig zu sein."
-msgstr "It looks like it is not yet finished."
-
-#: ../../msn/msn_r1_r.c:218
-msgid "Stift"
-msgstr "Pen"
-
-#: ../../msn/msn_r1_r.c:218
-msgid "Ein Kugelschreiber."
-msgstr "A ballpoint pen."
-
-#: ../../msn/msn_r1_r.c:230 ../../msn/msn_r1_r.c:231
-msgid "Poster"
-msgstr "Poster"
-
-#: ../../msn/msn_r1_r.c:230
-msgid "Ein Poster von \"Big Boss\"."
-msgstr "A poster of \"Big Boss\"."
-
-#: ../../msn/msn_r1_r.c:231
-msgid "Ein Poster von \"Rock Desaster\"."
-msgstr "A poster for \"Rock Disaster\"."
-
-#: ../../msn/msn_r1_r.c:232
-msgid "Box"
-msgstr "Speaker"
-
-#: ../../msn/msn_r1_r.c:235
-msgid "Schallplatte"
-msgstr "Record"
-
-#: ../../msn/msn_r1_r.c:235
-msgid "Die Platte ist von \"Big Boss\"."
-msgstr "A record from \"Big Boss\"."
-
-#: ../../msn/msn_r1_r.c:237
-msgid "Schallplattenst„nder"
-msgstr "Record stand"
-
-#: ../../msn/msn_r1_r.c:237
-msgid "Du hast jetzt keine Zeit, in|der Plattensammlung rumzust”bern."
-msgstr "You don't have time to rummage|around the record collection now."
-
-#: ../../msn/msn_r1_r.c:240
-msgid "Plattenspieler"
-msgstr "Record player"
-
-#: ../../msn/msn_r1_r.c:240
-msgid "Sieht aus, als k„me|er aus dem Museum."
-msgstr "Looks like something from a museum."
-
-#: ../../msn/msn_r1_r.c:244
-msgid "Stecker"
-msgstr "Male plug"
-
-#: ../../msn/msn_r1_r.c:261
-msgid "Pistole"
-msgstr "Gun"
-
-#: ../../msn/msn_r1_r.c:261
-msgid "Es ist keine Munition drin."
-msgstr "There is no ammunition in it."
-
-#: ../../msn/msn_r1_r.c:263
-msgid "Bcher"
-msgstr "Books"
-
-#: ../../msn/msn_r1_r.c:263
-msgid "Lauter wissenschaftliche Bcher."
-msgstr "All scientific books."
-
-#: ../../msn/msn_r1_r.c:265
-msgid "Kabelrolle"
-msgstr "Cable reel"
-
-#: ../../msn/msn_r1_r.c:265
-msgid "Da sind mindestens zwanzig Meter drauf."
-msgstr "There is at least 20 meters of cable on it."
-
-#: ../../msn/msn_r1_r.c:269 ../../msn/msn_r1_r.c:271
-msgid "Ich habe keine Lust, in|der Unterw„sche des|Commanders rumzuwhlen."
-msgstr "I don't feel like digging around|in the commander's underwear."
-
-#: ../../msn/msn_r1_r.c:284
-msgid "Ordner"
-msgstr "Folders"
-
-#: ../../msn/msn_r1_r.c:284
-msgid ""
-"Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts "
-"wichtiges drin."
-msgstr ""
-"It says,\"Instructions for the Mission Supernova.\"|There is nothing "
-"important in it."
-
-#: ../../msn/msn_r1_r.c:291
-msgid "Klo"
-msgstr "Loo"
-
-#: ../../msn/msn_r1_r.c:291
-msgid "Ein Klo mit Saugmechanismus."
-msgstr "A toilet with suction mechanism."
-
-#: ../../msn/msn_r1_r.c:292
-msgid "Dusche"
-msgstr "Shower"
-
-#: ../../msn/msn_r2.c:57
-msgid "Die Raumschiffe sind alle verschlossen."
-msgstr "The spaceships are all locked."
-
-#: ../../msn/msn_r2.c:64 ../../msn/msn_r2.c:1098
-msgid "Unsinn!"
-msgstr "Nonsense!"
-
-#: ../../msn/msn_r2.c:91
-msgid ""
-"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt "
-"Galactica\"."
-msgstr "Funny! You can read the sign now!|It says \"Galactica meeting point\"."
-
-#: ../../msn/msn_r2.c:92
-msgid "Darauf steht:|\"Treffpunkt Galactica\"."
-msgstr "It says:|\"Galactica meeting point\"."
-
-#: ../../msn/msn_r2.c:144
-msgid "Wieso das denn nicht?"
-msgstr "Why the hell not?"
-
-#: ../../msn/msn_r2.c:145 ../../msn/msn_r2.c:154 ../../msn/msn_r2.c:1082
-msgid "Wo bin ich hier?"
-msgstr "Where am I here?"
-
-#: ../../msn/msn_r2.c:146 ../../msn/msn_r2.c:183
-msgid "Wo soll ich die Schuhe ablegen?"
-msgstr "Where should I put my shoes?"
-
-#: ../../msn/msn_r2.c:147
-msgid "Schwachsinn! Ich gehe jetzt nach oben!"
-msgstr "Bullshit! I'm going upstairs now!"
-
-#: ../../msn/msn_r2.c:155
-msgid "Sch”nes Wetter heute, nicht wahr?"
-msgstr "Nice weather today, isn't it?"
-
-#: ../../msn/msn_r2.c:156
-msgid "Wrden Sie mich bitte durchlassen."
-msgstr "Would you please let me through?"
-
-#: ../../msn/msn_r2.c:157
-msgid "Hey Alter, laá mich durch!"
-msgstr "Hey, dude, let me through!"
-
-#: ../../msn/msn_r2.c:164
-msgid "Was haben Sie gesagt?"
-msgstr "What did you say?"
-
-#: ../../msn/msn_r2.c:165
-msgid "Sprechen Sie bitte etwas deutlicher!"
-msgstr "Please speak more clearly!"
-
-#: ../../msn/msn_r2.c:174
-msgid "Durch deinen Helm kannst|du nicht sprechen."
-msgstr "You can't talk with your helmet on."
-
-#: ../../msn/msn_r2.c:189 ../../msn/msn_r2.c:251
-msgid "Was, das wissen Sie nicht?"
-msgstr "What, you don't know that?"
-
-#: ../../msn/msn_r2.c:190 ../../msn/msn_r2.c:252
-msgid "Sie befinden sich im Restaurant|\"Treffpunkt Galactica\"."
-msgstr "You are in the restaurant|\"Galactica meeting point\"."
-
-#: ../../msn/msn_r2.c:191 ../../msn/msn_r2.c:253
-msgid ""
-"Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur "
-"Stelle."
-msgstr "We are always there when|interesting things happen|in the galaxy."
-
-#: ../../msn/msn_r2.c:194
-msgid "Wenn Sie meinen."
-msgstr "If you say so."
-
-#: ../../msn/msn_r2.c:199 ../../msn/msn_r2.c:256
-msgid "In der Toilette gibt es|Schlieáf„cher fr Schuhe."
-msgstr "There are lockers for shoes|in the restroom."
-
-#: ../../msn/msn_r2.c:204
-msgid ""
-"Wenn Sie das Lokal betreten|wollen, mssen Sie erst|ihre Schuhe ausziehen."
-msgstr ""
-"If you want to enter the restaurant,|you have to take off your shoes first."
-
-#: ../../msn/msn_r2.c:208
-msgid "Wollen Sie, daá ich Sie rauáschmeiáe?"
-msgstr "You want me to kick you out?"
-
-#: ../../msn/msn_r2.c:216 ../../msn/msn_r2.c:274
-msgid "Hhius otgfh Dgfdrkjlh Fokj gf."
-msgstr "Hhius otgfh Dgfdrkjlh Fokj gf."
-
-#: ../../msn/msn_r2.c:230 ../../msn/msn_s.c:289
-msgid "Halt!"
-msgstr "Halt!"
-
-#: ../../msn/msn_r2.c:232
-msgid "Uhwdejkt!"
-msgstr "Uhwdejkt!"
-
-#: ../../msn/msn_r2.c:241
-msgid "Sie mssen erst ihre Schuhe ausziehen, Sie Trottel!"
-msgstr "You have to take off your shoes first, idiot!"
-
-#: ../../msn/msn_r2.c:243
-msgid ""
-"Was f„llt ihnen ein!|Sie k”nnen doch ein Lokal|nicht mit Schuhen betreten!"
-msgstr ""
-"What are you thinking!|You cannot enter a restaurant|with your shoes on!"
-
-#: ../../msn/msn_r2.c:249
-msgid "Fragen Sie nicht so doof!"
-msgstr "Quit asking so stupidly!"
-
-#: ../../msn/msn_r2.c:262
-msgid "Das wrde ich an ihrer|Stelle nicht versuchen!"
-msgstr "I would not try that if I were you!"
-
-#: ../../msn/msn_r2.c:300
-msgid "Du ziehst deine Schuhe|aus und legst sie in|eins der Schlieáf„cher."
-msgstr "You remove your shoes|and put them in one|of the lockers."
-
-#: ../../msn/msn_r2.c:307
-msgid "Du ziehst deine Schuhe wieder an."
-msgstr "You put your shoes on again."
-
-#: ../../msn/msn_r2.c:311
-msgid ""
-"Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts."
-msgstr "You search the toilet|for other useful items,|but find nothing."
-
-#: ../../msn/msn_r2.c:316
-msgid "Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen."
-msgstr "Before you use the toilet,| you had better take off|your space suit."
-
-#: ../../msn/msn_r2.c:319
-msgid "Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!"
-msgstr "You're now back in a lavatory,|for the first time in seven years!"
-
-#: ../../msn/msn_r2.c:322
-msgid ""
-"In einem der Schlieáf„cher,|die sich auch im Raum befinden,|findest du "
-"einige Mnzen."
-msgstr "You find some coins in one of|the lockers in this room."
-
-#: ../../msn/msn_r2.c:332
-msgid "Mach doch zuerst das Fach leer!"
-msgstr "First, empty the drawer!"
-
-#: ../../msn/msn_r2.c:340
-msgid "Mnze"
-msgstr "Coin"
-
-#: ../../msn/msn_r2.c:353
-msgid ""
-"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur "
-"fr Personal\"."
-msgstr ""
-"Strange! Suddenly you can |read the sign! It states:|\"Access Only for "
-"Personnel\"."
-
-#: ../../msn/msn_r2.c:361
-msgid ""
-"Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\"."
-msgstr "Strange! Suddenly you can read the sign!|It says:\"Toilet\"."
-
-#: ../../msn/msn_r2.c:362
-msgid "Darauf steht:|\"Toilette\"."
-msgstr "It says:|\"Toilet\"."
-
-#: ../../msn/msn_r2.c:372
-msgid "Du ziehst den Raumanzug wieder an."
-msgstr "You put the space suit back on."
-
-#: ../../msn/msn_r2.c:382 ../../msn/msn_r3.c:487 ../../msn/msn_r3.c:539
-msgid "Nicht so gewaltt„tig!"
-msgstr "Not so rough!"
-
-#: ../../msn/msn_r2.c:603
-msgid ""
-"Du hast das komische Gefhl,|daá drauáen etwas passiert,|und eilst zum "
-"Restaurant."
-msgstr ""
-"You get the funny feeling,|that something has happened outside,|and hurry to "
-"the restaurant."
-
-#: ../../msn/msn_r2.c:617
-msgid "Da! Die Supernova!"
-msgstr "There! The supernova!"
-
-#: ../../msn/msn_r2.c:630
-msgid "Zwei Minuten sp„ter ..."
-msgstr "Two minutes later ..."
-
-#: ../../msn/msn_r2.c:638
-msgid "Hey, was machen Sie in meinem Raumschiff?!"
-msgstr "Hey, what are you doing in my spaceship?!"
-
-#: ../../msn/msn_r2.c:641
-msgid "Geben Sie mir sofort meine Brieftasche wieder!"
-msgstr "Just give me my wallet back!"
-
-#: ../../msn/msn_r2.c:644
-msgid "Versuchen Sie das ja nicht nochmal!"
-msgstr "Do not try that again!"
-
-#: ../../msn/msn_r2.c:647
-msgid "Und jetzt raus mit Ihnen!"
-msgstr "And now, get out of here!"
-
-#: ../../msn/msn_r2.c:660
-msgid "Zehn Minuten sp„ter ..."
-msgstr "Ten Minutes later ..."
-
-#: ../../msn/msn_r2.c:690
-msgid "K”nnten Sie mir ein Gericht empfehlen?"
-msgstr "Could you recommend a dish for me?"
-
-#: ../../msn/msn_r2.c:691
-msgid "Wie lange dauert es denn noch bis zur Supernova?"
-msgstr "How long do we have before the supernova?"
-
-#: ../../msn/msn_r2.c:692
-msgid "Sie kommen mir irgendwie bekannt vor."
-msgstr "You look kind of familiar to me."
-
-#: ../../msn/msn_r2.c:704
-msgid "Hey, Witzkeks, laá die Brieftasche da liegen!"
-msgstr "Hey, Joker, leave the Wallet there!"
-
-#: ../../msn/msn_r2.c:708
-msgid "Das ist nicht deine."
-msgstr "This is not yours."
-
-#: ../../msn/msn_r2.c:713
-msgid "Roger ist im Moment nicht ansprechbar."
-msgstr "Roger is not available at the moment."
-
-#: ../../msn/msn_r2.c:718
-msgid "Bestellen Sie lieber nichts!"
-msgstr "Do Not order anything!"
-
-#: ../../msn/msn_r2.c:719
-msgid ""
-"Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen."
-msgstr "I ordered my food two hours ago|and I still haven't received it."
-
-#: ../../msn/msn_r2.c:721
-msgid "Noch mindestens zwei Stunden."
-msgstr "At least two more hours."
-
-#: ../../msn/msn_r2.c:722
-msgid ""
-"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben k”nnen?"
-msgstr "Do you have an idea what we could|do to pass the time?"
-
-#: ../../msn/msn_r2.c:723
-msgid ""
-"Hmm ... im Moment f„llt mir nichts ein, aber vielleicht|hat der Spieler des "
-"Adventures ja eine Idee."
-msgstr ""
-"Hmm ... at the moment I'm not sure, but maybe|the Adventure Game Player has "
-"an idea."
-
-#: ../../msn/msn_r2.c:725
-msgid "Nein, Sie mssen sich irren.|Ich kenne Sie jedenfalls nicht."
-msgstr "No, you must be mistaken.|I don't know you."
-
-#: ../../msn/msn_r2.c:726
-msgid "Aber ihre Kleidung habe ich irgendwo schon mal gesehen."
-msgstr "However, I've seen your clothes somewhere before."
-
-#: ../../msn/msn_r2.c:727
-msgid "Ja? Komisch."
-msgstr "Yes? Strange."
-
-#: ../../msn/msn_r2.c:728
-msgid "Jetzt weiá ich's. Sie sind Roger W. !"
-msgstr "Now I know. You are Roger W.!"
-
-#: ../../msn/msn_r2.c:729
-msgid "Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir."
-msgstr "Pssst, not so loud, otherwise everyone|will want an autograph from me."
-
-#: ../../msn/msn_r2.c:730
-msgid ""
-"Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde."
-msgstr "I'm deliberately wearing a mask so I don't|get yakked on by everyone."
-
-#: ../../msn/msn_r2.c:731
-msgid "Žh ... ach so."
-msgstr "Uh... I see."
-
-#: ../../msn/msn_r2.c:732
-msgid "Wann kommt denn das n„chste SQ-Abenteuer raus?"
-msgstr "When does the next SQ adventure come out?"
-
-#: ../../msn/msn_r2.c:733
-msgid "SQ 127 máte in einem Monat erscheinen."
-msgstr "SQ 127 should come out in a month."
-
-#: ../../msn/msn_r2.c:734
-msgid "Was, Teil 127 ??"
-msgstr "What, part 127 ??"
-
-#: ../../msn/msn_r2.c:735
-msgid "Bei uns ist gerade Teil 8 erschienen."
-msgstr "Part 8 has just been released."
-
-#: ../../msn/msn_r2.c:736
-msgid "Hmm ... von welchem Planeten sind Sie denn?"
-msgstr "Hmm ... what planet are you from?"
-
-#: ../../msn/msn_r2.c:737
-msgid "Von der Erde."
-msgstr "From the Earth."
-
-#: ../../msn/msn_r2.c:738
-msgid "Erde? Nie geh”rt."
-msgstr "Earth? Never heard of it."
-
-#: ../../msn/msn_r2.c:739
-msgid ""
-"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre sp„ter "
-"hingelangen."
-msgstr "Probably some dump, where innovations|happen only a century late."
-
-#: ../../msn/msn_r2.c:740
-msgid "Žh ... kann sein."
-msgstr "Uh ... maybe."
-
-#: ../../msn/msn_r2.c:741
-msgid "Aber eins mssen Sie mir erkl„ren!"
-msgstr "But you must tell me!"
-
-#: ../../msn/msn_r2.c:742
-msgid ""
-"Wieso sehen Sie mir so verdammt „hnlich, wenn|Sie nicht von Xenon stammen, "
-"wie ich?"
-msgstr ""
-"Why do you look so damn similar to me|if you are not from Xenon, like me?"
-
-#: ../../msn/msn_r2.c:743
-msgid ""
-"Keine Ahnung. Bis jetzt dachte ich immer, Sie w„ren ein|von Programmierern "
-"auf der Erde erfundenes Computersprite."
-msgstr ""
-"I have no idea. Until now, I've always thought you were|a computer sprite, "
-"invented by programmers on Earth."
-
-#: ../../msn/msn_r2.c:744
-msgid "Was? Lachhaft!"
-msgstr "What? Ridiculous!"
-
-#: ../../msn/msn_r2.c:745
-msgid "Wie erkl„ren Sie sich dann,|daá ich ihnen gegenbersitze?"
-msgstr "Then how do you explain the fact that|I am seated opposite you?"
-
-#: ../../msn/msn_r2.c:746
-msgid "Ja, das ist in der Tat seltsam."
-msgstr "Yes, this is definitely strange."
-
-#: ../../msn/msn_r2.c:747
-msgid ""
-"Halt, jetzt weiá ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games"
-"\" und wollen mich verunsichern."
-msgstr ""
-"Wait, now I understand! You are from the competition,|\"Georgefilm Games\", "
-"and want to unnerve me."
-
-#: ../../msn/msn_r2.c:748
-msgid "Nein, ich bin nur ein Ahnungsloser Koch von der Erde."
-msgstr "No, I'm just a clueless cook from the Earth."
-
-#: ../../msn/msn_r2.c:749
-msgid ""
-"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir "
-"zu bunt!"
-msgstr ""
-"Fair enough, I believe you. Let's move away from|this topic before it goes "
-"too far!"
-
-#: ../../msn/msn_r2.c:761
-msgid "Eine Partie Schach! Das ist eine gute Idee."
-msgstr "A game of chess! That's a good idea."
-
-#: ../../msn/msn_r2.c:762
-msgid "Schach? Was ist das denn?"
-msgstr "Chess? What is that?"
-
-#: ../../msn/msn_r2.c:763
-msgid "Schach ist ein interessantes Spiel.|Ich werde es Ihnen erkl„ren."
-msgstr "Chess is an interesting game.|I will explain it to you."
-
-#: ../../msn/msn_r2.c:769
-msgid "Knapp zwei Stunden sp„ter ..."
-msgstr "Almost two hours later ..."
-
-#: ../../msn/msn_r2.c:787
-msgid "Roger W. steht kurz vor dem Schachmatt|und grbelt nach einem Ausweg."
-msgstr "Roger W. is on the brink of checkmate|and trying to find a way out."
-
-#: ../../msn/msn_r2.c:831
-msgid "Darf ich hier Platz nehmen?"
-msgstr "Can I sit here?"
-
-#: ../../msn/msn_r2.c:832
-msgid "Klar!"
-msgstr "Sure!"
-
-#: ../../msn/msn_r2.c:892
-msgid "Du tippst auf den Tasten herum,|aber es passiert nichts."
-msgstr "You tap the buttons,|but nothing happens."
-
-#: ../../msn/msn_r2.c:917
-msgid "Ach, Ihnen geh”rt die. Ich habe sie eben im Sand gefunden."
-msgstr "Oh, it is yours. I just found it in the sand."
-
-#: ../../msn/msn_r2.c:918
-msgid "Nein, tut mir leid."
-msgstr "No, I'm sorry."
-
-#: ../../msn/msn_r2.c:924
-msgid "Nein, danke. Ich bleibe lieber hier."
-msgstr "No thanks. I'd rather stay here."
-
-#: ../../msn/msn_r2.c:925
-msgid "Ja, das w„re gut."
-msgstr "Yes, that would be good."
-
-#: ../../msn/msn_r2.c:931
-msgid "Zur Erde."
-msgstr "To Earth."
-
-#: ../../msn/msn_r2.c:932
-msgid "Zum Pr„sident der Galaxis."
-msgstr "To the President of the Galaxy."
-
-#: ../../msn/msn_r2.c:933
-msgid "Nach Xenon."
-msgstr "To Xenon."
-
-#: ../../msn/msn_r2.c:934
-msgid "Mir egal, setzen Sie mich irgendwo ab!"
-msgstr "I don't care, drop me off somewhere!"
-
-#: ../../msn/msn_r2.c:940
-msgid "Ich habe gerade Ihre Brieftasche gefunden!"
-msgstr "I just found your wallet!"
-
-#: ../../msn/msn_r2.c:941
-msgid "Sie lag da drben hinter einem Felsen."
-msgstr "It was over there behind a rock."
-
-#: ../../msn/msn_r2.c:942
-msgid "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben."
-msgstr "I just wanted to know if you got the wallet back."
-
-#: ../../msn/msn_r2.c:959
-msgid "Was wollen Sie denn schon wieder?"
-msgstr "What do you want again?"
-
-#: ../../msn/msn_r2.c:965
-msgid ""
-"Haben Sie zuf„llig meine Brieftasche gesehen?|Ich muá Sie irgendwo verloren "
-"haben."
-msgstr "Have you seen my wallet, by chance?|I must have lost it somewhere."
-
-#: ../../msn/msn_r2.c:966
-msgid ""
-"Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist."
-msgstr "Without my wallet I can not take off|because my keycard is in it."
-
-#: ../../msn/msn_r2.c:975
-msgid "Oh! Vielen Dank."
-msgstr "Oh! Many thanks."
-
-#: ../../msn/msn_r2.c:976
-msgid "Wo ist denn Ihr Raumschiff?|Soll ich Sie ein Stck mitnehmen?"
-msgstr "Where is your spaceship?|Shall I give you a lift?"
-
-#: ../../msn/msn_r2.c:979
-msgid "Wo wollen Sie denn hin?"
-msgstr "Where do you want to go?"
-
-#: ../../msn/msn_r2.c:981
-msgid "Ok, steigen Sie ein!"
-msgstr "Ok, get in!"
-
-#: ../../msn/msn_r2.c:983
-msgid "Wie Sie wollen."
-msgstr "As you wish."
-
-#: ../../msn/msn_r2.c:1030
-msgid "Huch, du lebst ja noch!"
-msgstr "Huh, you're still alive!"
-
-#: ../../msn/msn_r2.c:1057
-msgid ""
-"Das wrde ich jetzt nicht tun, schlieálich|steht Roger W. neben seinem "
-"Schiff."
-msgstr "I wouldn't do that now, because|Roger W. is standing beside his ship."
-
-#: ../../msn/msn_r2.c:1069
-msgid "Alle Raumschiffe haben|den Planeten verlassen."
-msgstr "All spaceships|have left the planet."
-
-#: ../../msn/msn_r2.c:1071
-msgid "Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ..."
-msgstr "All spaceships have left the planet,|except for one ..."
-
-#: ../../msn/msn_r2.c:1083
-msgid "Was wollen Sie von mir?"
-msgstr "What do you want from me?"
-
-#: ../../msn/msn_r2.c:1084
-msgid "Hilfe!!"
-msgstr "Help!!"
-
-#: ../../msn/msn_r2.c:1085
-msgid "Warum sprechen Sie meine Sprache?"
-msgstr "Why do you speak my language?"
-
-#: ../../msn/msn_r2.c:1091
-msgid "Ja, ich bin einverstanden."
-msgstr "Yes, I agree."
-
-#: ../../msn/msn_r2.c:1092
-msgid "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen."
-msgstr "No, I'd rather stay here than fly with you."
-
-#: ../../msn/msn_r2.c:1141
-msgid "Ich glaube, er wacht auf."
-msgstr "I think he's waking up."
-
-#: ../../msn/msn_r2.c:1143
-msgid "Ja, sieht so aus."
-msgstr "Yes, it looks like it."
-
-#: ../../msn/msn_r2.c:1148
-msgid "Sie befinden sich im Raumschiff \"Dexxa\"."
-msgstr "You are in the spaceship \"Dexxa\"."
-
-#: ../../msn/msn_r2.c:1149
-msgid ""
-"Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie "
-"Sie,|n„mlich zur Erforschung der Supernova."
-msgstr ""
-"We come from the planet Axacuss|and are here for the same reason as you,|"
-"namely, to observe the supernova."
-
-#: ../../msn/msn_r2.c:1151
-msgid "Sie k”nnen beruhigt sein, wir wollen Ihnen nur helfen."
-msgstr "Don't worry, we just want to help you."
-
-#: ../../msn/msn_r2.c:1152
-msgid "Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?"
-msgstr "And why did the guy in the space suit|shoot at me?"
-
-#: ../../msn/msn_r2.c:1153
-msgid "Das war eine Schreckreaktion."
-msgstr "It was a reflex."
-
-#: ../../msn/msn_r2.c:1154
-msgid ""
-"Schlieálich ist es fr uns das erste Mal,|daá wir auf eine fremde "
-"Intelligenz treffen."
-msgstr ""
-"After all, this is the first time we have|come across an alien intelligence."
-
-#: ../../msn/msn_r2.c:1155
-msgid "Wie wir festgestellt haben, ist|Ihr Raumschiff v”llig zerst”rt."
-msgstr "As we've established, your spaceship|is completely destroyed."
-
-#: ../../msn/msn_r2.c:1156
-msgid "Wahrscheinlich k”nnen Sie nicht|mehr auf ihren Heimatplaneten zurck."
-msgstr "You may not be able to return to your home planet."
-
-#: ../../msn/msn_r2.c:1157
-msgid "Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen."
-msgstr "We offer to take you|with us to Axacuss."
-
-#: ../../msn/msn_r2.c:1160 ../../msn/msn_r2.c:1169
-msgid "Sind Sie sich da wirklich sicher?"
-msgstr "Are you really sure about that?"
-
-#: ../../msn/msn_r2.c:1161 ../../msn/msn_r2.c:1170
-msgid "Wenn ich es mir genau berlege,|fliege ich doch lieber mit."
-msgstr "If I think about it,|I'd rather fly with you."
-
-#: ../../msn/msn_r2.c:1163
-msgid ""
-"Gut, wir nehmen Sie unter der|Bedingung mit, daá wir Sie jetzt|sofort in "
-"Tiefschlaf versetzen drfen."
-msgstr ""
-"All right, we'll take you with us|on condition that we can put you|into a "
-"deep sleep right now."
-
-#: ../../msn/msn_r2.c:1164
-msgid "Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt."
-msgstr "You seem to be familiar with|this kind of traveling."
-
-#: ../../msn/msn_r2.c:1165
-msgid ""
-"Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt."
-msgstr ""
-"You will be woken up again in four years|after the \"Dexxa\" has landed."
-
-#: ../../msn/msn_r2.c:1166
-msgid "Sind Sie damit einverstanden?"
-msgstr "Are you okay with this?"
-
-#: ../../msn/msn_r2.c:1172
-msgid "Gut, haben Sie noch irgendwelche Fragen?"
-msgstr "Good, do you have any questions?"
-
-#: ../../msn/msn_r2.c:1174
-msgid "Keine Panik!"
-msgstr "Don't panic!"
-
-#: ../../msn/msn_r2.c:1175
-msgid "Wir tun Ihnen nichts."
-msgstr "We are not going to hurt you."
-
-#: ../../msn/msn_r2.c:1177
-msgid "Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere."
-msgstr "We don't speak your language,|you speak ours."
-
-#: ../../msn/msn_r2.c:1178
-msgid ""
-"Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen."
-msgstr ""
-"After a brain analysis, we were able|to adapt your brain to our speech."
-
-#: ../../msn/msn_r2.c:1179
-msgid "Was? Sie haben in mein Gehirn eingegriffen?"
-msgstr "What? You've interfered with my brain?"
-
-#: ../../msn/msn_r2.c:1180
-msgid "Keine Angst, wir haben sonst nichts ver„ndert."
-msgstr "Don't worry, we haven't changed anything else."
-
-#: ../../msn/msn_r2.c:1181
-msgid "Ohne diesen Eingriff w„ren|Sie verloren gewesen."
-msgstr "Without this intervention,|you would have been lost."
-
-#: ../../msn/msn_r2.c:1186
-msgid "Ich habe keine weiteren Fragen mehr."
-msgstr "I have no more questions."
-
-#: ../../msn/msn_r2.c:1187
-msgid "Gut, dann versetzen wir Sie jetzt in Tiefschlaf."
-msgstr "Good, let's put you in a deep sleep now."
-
-#: ../../msn/msn_r2.c:1188
-msgid "Gute Nacht!"
-msgstr "Good night!"
-
-#: ../../msn/msn_r2.c:1213 ../../msn/msn_r2.c:1214
-msgid "Stein"
-msgstr "Stone"
-
-#: ../../msn/msn_r2.c:1215
-msgid "Loch"
-msgstr "Opening"
-
-#: ../../msn/msn_r2.c:1215
-msgid "Es scheint eine H”hle zu sein."
-msgstr "It seems to be a cave."
-
-#: ../../msn/msn_r2.c:1221
-msgid "Hier bist du gerade hergekommen."
-msgstr "You just came from there."
-
-#: ../../msn/msn_r2.c:1229 ../../msn/msn_r2.c:1310 ../../msn/msn_r2.c:1319
-msgid "H”hle"
-msgstr "Cave"
-
-#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
-#: ../../msn/msn_r3.c:1687
-msgid "Schild"
-msgstr "Sign"
-
-#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
-msgid "Diese Schrift kannst du nicht lesen."
-msgstr "You cannot read these inscriptions."
-
-#: ../../msn/msn_r2.c:1231
-msgid "Eingang"
-msgstr "Entrance"
-
-#: ../../msn/msn_r2.c:1232 ../../msn/msn_r2.c:1318
-msgid "Stern"
-msgstr "Star"
-
-#: ../../msn/msn_r2.c:1233 ../../msn/msn_r2.c:1234 ../../msn/msn_r2.c:1309
-msgid "Raumschiff"
-msgstr "Spaceship"
-
-#: ../../msn/msn_r2.c:1240
-msgid "Portier"
-msgstr "Doorman"
-
-#: ../../msn/msn_r2.c:1240
-msgid "Du siehst doch selbst, wie er aussieht."
-msgstr "You can see for yourself what he looks like."
-
-#: ../../msn/msn_r2.c:1242 ../../msn/msn_r3.c:1480 ../../msn/msn_r3.c:1545
-#: ../../msn/msn_r3.c:1560 ../../msn/msn_r3.c:1569 ../../msn/msn_r3.c:1580
-#: ../../msn/msn_r3.c:1582 ../../msn/msn_r3.c:1584 ../../msn/msn_r3.c:1586
-#: ../../msn/msn_r3.c:1596 ../../msn/msn_r3.c:1609 ../../msn/msn_r3.c:1610
-#: ../../msn/msn_r3.c:1611 ../../msn/msn_r3.c:1621 ../../msn/msn_r3.c:1633
-#: ../../msn/msn_r3.c:1644 ../../msn/msn_r3.c:1656 ../../msn/msn_r3.c:1667
-#: ../../msn/msn_r3.c:1688
-msgid "Tr"
-msgstr "Door"
-
-#: ../../msn/msn_r2.c:1245
-msgid "Kaugummi"
-msgstr "Chewing gum"
-
-#: ../../msn/msn_r2.c:1246
-msgid "Gummib„rchen"
-msgstr "Gummy bear"
-
-#: ../../msn/msn_r2.c:1247
-msgid "Schokokugel"
-msgstr "Chocolate ball"
-
-#: ../../msn/msn_r2.c:1248
-msgid "šberraschungsei"
-msgstr "Surprise egg"
-
-#: ../../msn/msn_r2.c:1249
-msgid "Lakritz"
-msgstr "Liquorice"
-
-#: ../../msn/msn_r2.c:1250
-msgid "Tablette"
-msgstr "Pill"
-
-#: ../../msn/msn_r2.c:1250
-msgid ""
-"Die Plastikhlle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, "
-"kannst du nicht lesen."
-msgstr ""
-"The plastic envelope shows|a mouth with a speech bubble.|You can't read what "
-"it says."
-
-#: ../../msn/msn_r2.c:1253
-msgid "Automat"
-msgstr "Vending machine"
-
-#: ../../msn/msn_r2.c:1253
-msgid "Sieht aus wie ein Kaugummiautomat."
-msgstr "Looks like a gum dispenser."
-
-#: ../../msn/msn_r2.c:1254
-msgid "Die Toiletten sind denen|auf der Erde sehr „hnlich."
-msgstr "The toilets are very similar|to those on Earth."
-
-#: ../../msn/msn_r2.c:1258 ../../msn/msn_r2.c:1269
-msgid "Treppe"
-msgstr "Staircase"
-
-#: ../../msn/msn_r2.c:1260
-msgid "Mnzen"
-msgstr "Coins"
-
-#: ../../msn/msn_r2.c:1260
-msgid "Es sind seltsame|K”pfe darauf abgebildet."
-msgstr "They have strange|heads on them."
-
-#: ../../msn/msn_r2.c:1262
-msgid "Tablettenhlle"
-msgstr "Pill envelope"
-
-#: ../../msn/msn_r2.c:1262
-msgid ""
-"Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k”nnen,|hat die Tablette "
-"gewirkt.\""
-msgstr "It says,\"If you can read|this writing now,|the pill worked.\""
-
-#: ../../msn/msn_r2.c:1270
-msgid "Stuhl"
-msgstr "Chair"
-
-#: ../../msn/msn_r2.c:1271
-msgid "Schuhe"
-msgstr "Shoes"
-
-#: ../../msn/msn_r2.c:1271
-msgid "Wie ist der denn mit|Schuhen hier reingekommen?"
-msgstr "How did he get in here|with his shoes on?"
-
-#: ../../msn/msn_r2.c:1278
-msgid "Froschgesicht"
-msgstr "Frog face"
-
-#: ../../msn/msn_r2.c:1279
-msgid "Gekritzel"
-msgstr "Scribble"
-
-#: ../../msn/msn_r2.c:1279
-msgid "\"Mr Spock was here\""
-msgstr "\"Mr Spock was here\""
-
-#: ../../msn/msn_r2.c:1280
-msgid "Brieftasche"
-msgstr "Wallet"
-
-#: ../../msn/msn_r2.c:1281
-msgid "Speisekarte"
-msgstr "Menu"
-
-#: ../../msn/msn_r2.c:1281
-msgid "\"Heute empfehlen wir:|Fonua Opra mit Ulk.\""
-msgstr "\"Today we recommend: Fonua Opra with a joke.\""
-
-#: ../../msn/msn_r2.c:1282
-msgid "Tasse"
-msgstr "Cup"
-
-#: ../../msn/msn_r2.c:1282
-msgid "Sie enth„lt eine grnliche Flssigkeit."
-msgstr "It contains a greenish liquid."
-
-#: ../../msn/msn_r2.c:1284
-msgid "10-Buckazoid-Schein"
-msgstr "A 10 buckazoid bill"
-
-#: ../../msn/msn_r2.c:1284
-msgid "Nicht gerade sehr viel Geld."
-msgstr "Not a lot of money."
-
-#: ../../msn/msn_r2.c:1286 ../../msn/msn_r2.c:1297
-msgid "Keycard von Roger"
-msgstr "Roger's keycard"
-
-#: ../../msn/msn_r2.c:1301
-msgid "Anzeige"
-msgstr "Display"
-
-#: ../../msn/msn_r2.c:1301 ../../msn/msn_r2.c:1302
-msgid "Hmm, seltsame Anzeigen."
-msgstr "Hmm, weird instruments."
-
-#: ../../msn/msn_r2.c:1308
-msgid "Roger W."
-msgstr "Roger W."
-
-#: ../../msn/msn_r2.c:1317
-msgid "Ufo"
-msgstr "UFO"
-
-#: ../../msn/msn_r2.c:1317
-msgid "Der Eingang scheint offen zu sein."
-msgstr "The entrance appears to be open."
-
-#: ../../msn/msn_r3.c:27
-msgid "Du drckst den Knopf,|aber nichts passiert."
-msgstr "You push the button,|but nothing happens."
-
-#: ../../msn/msn_r3.c:88
-msgid "Bei deinem Fluchtversuch hat|dich der Roboter erschossen."
-msgstr "When you tried to escape,|the robot shot you."
-
-#: ../../msn/msn_r3.c:91
-msgid "Du iát etwas, aber|es schmeckt scheuálich."
-msgstr "You're eating something,|but it tastes horrible."
-
-#: ../../msn/msn_r3.c:171
-msgid "Du wachst auf und findest dich in|einem geschlossenen Raum wieder."
-msgstr "You wake up and find yourself|in a closed room."
-
-#: ../../msn/msn_r3.c:230
-msgid "Žh ... nein, mein Name ist Mller."
-msgstr "Uh... no, my name is Mller."
-
-#: ../../msn/msn_r3.c:231
-msgid "Oh, ich habe mich im Gang vertan."
-msgstr "Oh, I got lost."
-
-#: ../../msn/msn_r3.c:237
-msgid "Wrden Sie mich bitte zum Fahrstuhl lassen?"
-msgstr "Will you please let me go to the elevator?"
-
-#: ../../msn/msn_r3.c:238
-msgid "Ich gehe wieder."
-msgstr "I'm leaving."
-
-#: ../../msn/msn_r3.c:243
-msgid "Dann gehe ich eben wieder."
-msgstr "Then I will be going."
-
-#: ../../msn/msn_r3.c:244
-msgid "Ach, halten Sie's Maul, ich gehe trotzdem!"
-msgstr "Oh, shut up, I'm leaving anyway!"
-
-#: ../../msn/msn_r3.c:245 ../../msn/msn_r3.c:246
-msgid "Wenn Sie mich durchlassen gebe ich Ihnen %d Xa."
-msgstr "I will give you %d Xa if you let me through."
-
-#: ../../msn/msn_r3.c:258
-msgid "Sie schon wieder?"
-msgstr "You again?"
-
-#: ../../msn/msn_r3.c:264
-msgid "Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!"
-msgstr "Stop! You're this Hummel.|Stop right there!"
-
-#: ../../msn/msn_r3.c:266
-msgid "Sehr witzig!"
-msgstr "Very funny!"
-
-#: ../../msn/msn_r3.c:269
-msgid "Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner."
-msgstr "Well, you're the non-Axacussan,|you know."
-
-#: ../../msn/msn_r3.c:273
-msgid "Nein!"
-msgstr "No!"
-
-#: ../../msn/msn_r3.c:310
-msgid "Das máte schon ein biáchen mehr sein."
-msgstr "It should be a little more than that."
-
-#: ../../msn/msn_r3.c:324
-msgid "Ok, dann machen Sie daá Sie wegkommen!"
-msgstr "Okay, then get out of here!"
-
-#: ../../msn/msn_r3.c:430
-msgid "Der Axacussaner hat dich erwischt."
-msgstr "The Axacussan caught you."
-
-#: ../../msn/msn_r3.c:547
-msgid ""
-"Diese Tr wrde ich lieber|nicht ”ffnen. Nach dem Schild zu|urteilen, ist "
-"jemand in dem Raum."
-msgstr ""
-"I'd rather not open that door.|Judging by the sign, there's|someone in that "
-"room."
-
-#: ../../msn/msn_r3.c:642
-msgid "Du stellst dich hinter die S„ule."
-msgstr "You stand behind the column."
-
-#: ../../msn/msn_r3.c:656
-msgid "Hmm, er scheint kaputt zu sein."
-msgstr "Hmm, it seems to be broken."
-
-#: ../../msn/msn_r3.c:696
-msgid "Welche Zahlenkombination willst|du eingeben?"
-msgstr "Which combination do you want|to enter?"
-
-#: ../../msn/msn_r3.c:708
-msgid ""
-"Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code "
-"zusammenh„ngen."
-msgstr ""
-"Hmm, that doesn't really work,|but somehow the number|must be related to the "
-"code."
-
-#: ../../msn/msn_r3.c:710
-msgid "Das war die falsche Kombination."
-msgstr "That combination is incorrect."
-
-#: ../../msn/msn_r3.c:748
-msgid "Streng geheim"
-msgstr "Strictly secret"
-
-#: ../../msn/msn_r3.c:749
-msgid "418-98"
-msgstr "418-98"
-
-#: ../../msn/msn_r3.c:750
-msgid "Sehr geehrter Dr. Hansi,"
-msgstr "Dear Dr. Hansi,"
-
-#: ../../msn/msn_r3.c:751
-msgid "Ich muá Ihren Roboterexperten ein Lob aussprechen. Die"
-msgstr "I must commend your robot expert. The imitation"
-
-#: ../../msn/msn_r3.c:752
-msgid "Imitation von Horst Hummel ist perfekt gelungen, wie ich"
-msgstr "of Horst Hummel was a perfect success, as I found"
-
-#: ../../msn/msn_r3.c:753
-msgid "heute bei der šbertragung des Interviews feststellen"
-msgstr "out today during the broadcast of the interview."
-
-#: ../../msn/msn_r3.c:754
-msgid "konnte. Dem Aufschwung Ihrer Firma durch die Werbe-"
-msgstr "Nothing should stand in the way of your company's"
-
-#: ../../msn/msn_r3.c:755
-msgid "kampagne mit dem falschen Horst Hummel drfte ja jetzt"
-msgstr "recovery through the advertising campaign with"
-
-#: ../../msn/msn_r3.c:756
-msgid "nichts mehr im Wege stehen."
-msgstr "the false Horst Hummel now."
-
-#: ../../msn/msn_r3.c:757
-msgid "PS: Herzlichen zum Geburtstag!"
-msgstr "PS: Happy Birthday!"
-
-#: ../../msn/msn_r3.c:758
-msgid "Hochachtungsvoll"
-msgstr "Yours sincerely"
-
-#: ../../msn/msn_r3.c:759
-msgid "Commander Sumoti"
-msgstr "Commander Sumoti"
-
-#: ../../msn/msn_r3.c:766
-msgid "Nicht zu fassen!"
-msgstr "I can't believe it!"
-
-#: ../../msn/msn_r3.c:838
-msgid "Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit."
-msgstr "Hey, there's money hidden behind that|picture. I'll take it with me."
-
-#: ../../msn/msn_r3.c:1047
-msgid "DR. ALAB HANSI"
-msgstr "DR. ALAB HANSI"
-
-#: ../../msn/msn_r3.c:1047
-msgid "ALAB HANSI"
-msgstr "ALAB HANSI"
-
-#: ../../msn/msn_r3.c:1048
-msgid "SAVAL LUN"
-msgstr "SAVAL LUN"
-
-#: ../../msn/msn_r3.c:1048 ../../msn/msn_r3.c:1050
-msgid "x"
-msgstr "x"
-
-#: ../../msn/msn_r3.c:1049
-msgid "PROF. DR. UGNUL TSCHABB"
-msgstr "PROF. DR. UGNUL TSCHABB"
-
-#: ../../msn/msn_r3.c:1049
-msgid "UGNUL TSCHABB"
-msgstr "UGNUL TSCHABB"
-
-#: ../../msn/msn_r3.c:1050
-msgid "ALGA HURZ LI"
-msgstr "ALGA HURZ LI"
-
-#: ../../msn/msn_r3.c:1054
-msgid "Alab Hansi"
-msgstr "Alab Hansi"
-
-#: ../../msn/msn_r3.c:1054
-msgid "Saval Lun"
-msgstr "Saval Lun"
-
-#: ../../msn/msn_r3.c:1054
-msgid "Ugnul Tschabb"
-msgstr "Ugnul Tschabb"
-
-#: ../../msn/msn_r3.c:1054
-msgid "Alga Hurz Li"
-msgstr "Alga Hurz Li"
-
-#: ../../msn/msn_r3.c:1060
-msgid "Guten Tag, hier ist Horst Hummel."
-msgstr "Hello, I am Horst Hummel."
-
-#: ../../msn/msn_r3.c:1062
-msgid "Es ist sehr wichtig."
-msgstr "It's very important."
-
-#: ../../msn/msn_r3.c:1068
-msgid "Vom Mars."
-msgstr "From Mars."
-
-#: ../../msn/msn_r3.c:1069
-msgid "Vom Klo."
-msgstr "The toilet."
-
-#: ../../msn/msn_r3.c:1070
-msgid "Das werde ich kaum erz„hlen."
-msgstr "I won't tell you that."
-
-#: ../../msn/msn_r3.c:1079
-msgid "1 Bromanager"
-msgstr "1 Office manager"
-
-#: ../../msn/msn_r3.c:1080
-msgid "2 Telomat"
-msgstr "2 Phone"
-
-#: ../../msn/msn_r3.c:1081
-msgid "3 ProText"
-msgstr "3 ProText"
-
-#: ../../msn/msn_r3.c:1082
-msgid "4 Calculata"
-msgstr "4 Calculata"
-
-#: ../../msn/msn_r3.c:1083
-msgid "Bitte w„hlen"
-msgstr "Please select an option"
-
-#: ../../msn/msn_r3.c:1091
-msgid "Geben Sie den gewnschten Namen ein:"
-msgstr "Enter the desired name:"
-
-#: ../../msn/msn_r3.c:1092
-msgid "(Vor- und Nachname)"
-msgstr "(first and last name)"
-
-#: ../../msn/msn_r3.c:1106
-msgid "Name unbekannt"
-msgstr "Name unknown"
-
-#: ../../msn/msn_r3.c:1112
-msgid "Verbindung unm”glich"
-msgstr "Connection not possible"
-
-#: ../../msn/msn_r3.c:1116
-msgid "Verbindung wird hergestellt"
-msgstr "Connection is established"
-
-#. I18N: Here the %s is a name
-#: ../../msn/msn_r3.c:1121
-#, c-format
-msgid "%s am Apparat."
-msgstr "%s speaking."
-
-#: ../../msn/msn_r3.c:1127
-#, c-format
-msgid "Hier ist %s. K”nnen Sie mal gerade kommen?"
-msgstr "This is %s. Can you come over now?"
-
-#: ../../msn/msn_r3.c:1134
-msgid "Huch, Sie h”ren sich aber|nicht gut an. Ich komme sofort."
-msgstr "You don't sound good.|I'll be right there."
-
-#: ../../msn/msn_r3.c:1145
-msgid "Horst Hummel! Von wo rufen Sie an?"
-msgstr "Horst Hummel! Where are you calling from?"
-
-#: ../../msn/msn_r3.c:1151
-msgid "Hmm, keine Antwort."
-msgstr "Hmm, no answer."
-
-#: ../../msn/msn_r3.c:1164
-msgid "Passwort:"
-msgstr "Password:"
-
-#: ../../msn/msn_r3.c:1215
-msgid "Was war das fr ein Ger„usch?"
-msgstr "What was that noise?"
-
-#: ../../msn/msn_r3.c:1217 ../../msn/msn_s.c:312
-msgid "Ich werde mal nachsehen."
-msgstr "Let's find out..."
-
-#: ../../msn/msn_r3.c:1305
-msgid "Jetzt verschwinden Sie endlich!"
-msgstr "Get the hell out of here!"
-
-#: ../../msn/msn_r3.c:1306
-msgid "Huch, ich habe mich vertan."
-msgstr "Oops, I made a mistake."
-
-#: ../../msn/msn_r3.c:1368
-msgid ""
-"Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein "
-"Geb„ude."
-msgstr ""
-"After you've been wandering around|the jungle for two hours,|you find a "
-"building."
-
-#: ../../msn/msn_r3.c:1481
-msgid "Tablett"
-msgstr "Tray"
-
-#: ../../msn/msn_r3.c:1481
-msgid "Es ist irgendein Fraá und|etwas zu Trinken darauf."
-msgstr "There is some kind of food|and a drink on it."
-
-#: ../../msn/msn_r3.c:1483
-msgid "Stange"
-msgstr "Rod"
-
-#: ../../msn/msn_r3.c:1483
-msgid "Es scheint eine Lampe zu sein."
-msgstr "It seems to be a lamp."
-
-#: ../../msn/msn_r3.c:1484
-msgid "Augen"
-msgstr "Eyes"
-
-#: ../../msn/msn_r3.c:1484
-msgid "Es ist nur ein Bild."
-msgstr "It's just a picture."
-
-#: ../../msn/msn_r3.c:1486
-msgid "Sieht etwas anders aus als auf der Erde."
-msgstr "Looks a little different than on Earth."
-
-#: ../../msn/msn_r3.c:1488
-msgid "Metallblock"
-msgstr "Metal block"
-
-#: ../../msn/msn_r3.c:1488
-msgid "Er ist ziemlich schwer."
-msgstr "It's pretty heavy."
-
-#: ../../msn/msn_r3.c:1490
-msgid "Roboter"
-msgstr "Robot"
-
-#: ../../msn/msn_r3.c:1490
-msgid "Den hast du erledigt."
-msgstr "You took care of it."
-
-#: ../../msn/msn_r3.c:1491 ../../msn/msn_r3.c:1528
-msgid "Tisch"
-msgstr "Table"
-
-#: ../../msn/msn_r3.c:1491
-msgid "Ein kleiner Metalltisch."
-msgstr "A small metal table."
-
-#: ../../msn/msn_r3.c:1524
-msgid "Zellentr"
-msgstr "Cell door"
-
-#: ../../msn/msn_r3.c:1524
-msgid "Hier warst du eingesperrt."
-msgstr "You were locked up here."
-
-#: ../../msn/msn_r3.c:1526
-msgid "Laptop"
-msgstr "Laptop"
-
-#: ../../msn/msn_r3.c:1576 ../../msn/msn_r3.c:1577
-msgid "S„ule"
-msgstr "Pillar"
-
-#: ../../msn/msn_r3.c:1580
-msgid "Auf einem Schild an der Tr steht \"Dr. Alab Hansi\"."
-msgstr "A sign on the door says \"Dr. Alab Hansi\"."
-
-#: ../../msn/msn_r3.c:1582
-msgid "Auf einem Schild an der Tr steht \"Saval Lun\"."
-msgstr "A sign on the door says \"Saval Lun\"."
-
-#: ../../msn/msn_r3.c:1584
-msgid "Auf einem Schild an der Tr steht \"Prof. Dr. Ugnul Tschabb\"."
-msgstr "A sign on the door says \"Prof. Dr. Ugnul Tschabb\"."
-
-#: ../../msn/msn_r3.c:1586
-msgid "Auf einem Schild an der Tr steht \"Alga Hurz Li\"."
-msgstr "A sign on the door says \"Alga Hurz Li\"."
-
-#: ../../msn/msn_r3.c:1597 ../../msn/msn_r3.c:1613
-msgid "Axacussaner"
-msgstr "Axacussan"
-
-#: ../../msn/msn_r3.c:1597
-msgid "Du mátest ihn irgendwie ablenken."
-msgstr "You have to distract him somehow."
-
-#: ../../msn/msn_r3.c:1599
-msgid "Komisches Bild."
-msgstr "Funny picture."
-
-#: ../../msn/msn_r3.c:1600
-msgid "Karte"
-msgstr "Keycard"
-
-#: ../../msn/msn_r3.c:1600
-msgid "Darauf steht: \"Generalkarte\"."
-msgstr "It says: \"Master keycard\"."
-
-#: ../../msn/msn_r3.c:1612
-msgid "Lampe"
-msgstr "Lamp"
-
-#: ../../msn/msn_r3.c:1614
-msgid "Seltsam!"
-msgstr "Strange!"
-
-#: ../../msn/msn_r3.c:1623 ../../msn/msn_r3.c:1670
-msgid "Geld"
-msgstr "Cash"
-
-#: ../../msn/msn_r3.c:1623
-msgid "Es sind 500 Xa."
-msgstr "It's 500 Xa."
-
-#: ../../msn/msn_r3.c:1624
-msgid "Schlieáfach"
-msgstr "Locker"
-
-#: ../../msn/msn_r3.c:1624
-msgid "Es hat ein elektronisches Zahlenschloá."
-msgstr "It has an electronic combination lock."
-
-#: ../../msn/msn_r3.c:1626
-msgid "Brief"
-msgstr "Note"
-
-#: ../../msn/msn_r3.c:1635
-msgid "Wrfel"
-msgstr "Cubes"
-
-#: ../../msn/msn_r3.c:1635
-msgid "Sonderbar!"
-msgstr "Quirky!"
-
-#: ../../msn/msn_r3.c:1636
-msgid "Affenstark!"
-msgstr "Awesome!"
-
-#: ../../msn/msn_r3.c:1637
-msgid "Komisches Ding"
-msgstr "Strange thing"
-
-#: ../../msn/msn_r3.c:1637
-msgid "Wundersam!"
-msgstr "Amazing!"
-
-#: ../../msn/msn_r3.c:1646 ../../msn/msn_r3.c:1647
-msgid "Es ist ein Axacussanerkopf auf dem Bild."
-msgstr "There is an Axacussan head in the picture."
-
-#: ../../msn/msn_r3.c:1648 ../../msn/msn_r3.c:1659
-msgid "Pflanze"
-msgstr "Plant"
-
-#: ../../msn/msn_r3.c:1658
-msgid "Figur"
-msgstr "Figure"
-
-#: ../../msn/msn_r3.c:1658
-msgid "Stark!"
-msgstr "Strong!"
-
-#: ../../msn/msn_r3.c:1659
-msgid "Sie ist den Pflanzen auf der Erde sehr „hnlich."
-msgstr "It is very similar to the plants on earth."
-
-#: ../../msn/msn_r3.c:1668
-msgid "Er funktioniert nicht."
-msgstr "It doesn't work."
-
-#: ../../msn/msn_r3.c:1669
-msgid "Graffiti"
-msgstr "Graffiti"
-
-#: ../../msn/msn_r3.c:1669
-msgid "Seltsamer Broschmuck!"
-msgstr "Strange office decoration!"
-
-#: ../../msn/msn_r3.c:1670
-msgid "Es sind 350 Xa."
-msgstr "It's 350 Xa."
-
-#: ../../msn/msn_r3.c:1680
-msgid "Dschungel"
-msgstr "Jungle"
-
-#: ../../msn/msn_r3.c:1680
-msgid "Lauter B„ume."
-msgstr "Nothing but trees."
-
-#: ../../msn/msn_s.c:84
-msgid "Teil 1:"
-msgstr "Part 1:"
-
-#: ../../msn/msn_s.c:85
-msgid "Das Schicksal"
-msgstr "The fate of"
-
-#: ../../msn/msn_s.c:86
-msgid "des Horst Hummel"
-msgstr "Horst Hummel"
-
-#: ../../msn/msn_s.c:131
-msgid "Viertausend"
-msgstr "Four thousand"
-
-#: ../../msn/msn_s.c:131
-msgid "Fnftausend"
-msgstr "Five thousand"
-
-#: ../../msn/msn_s.c:131
-msgid "Sechstausend"
-msgstr "Six thousand"
-
-#: ../../msn/msn_s.c:131
-msgid "Siebentausend"
-msgstr "Seven thousand"
-
-#: ../../msn/msn_s.c:144
-msgid "Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ..."
-msgstr "Two days after take-off|in the cockpit of the \"Supernova\"..."
-
-#: ../../msn/msn_s.c:153
-msgid "Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!"
-msgstr "Distance from the sun: 1 500 000 km.|Go to 8000 hpm, Captain!"
-
-#: ../../msn/msn_s.c:168
-msgid "Geschwindigkeit:"
-msgstr "Speed:"
-
-#: ../../msn/msn_s.c:169
-msgid "Zweitausend hpm"
-msgstr "Two thousand hpm"
-
-#: ../../msn/msn_s.c:172
-msgid "Dreitausend"
-msgstr "Three thousand"
-
-#: ../../msn/msn_s.c:189
-msgid "Achttau..."
-msgstr "Eight thous..."
-
-#: ../../msn/msn_s.c:214
-msgid "Keine Ahnung, Sir."
-msgstr "I have no idea, Sir."
-
-#: ../../msn/msn_s.c:215
-msgid "Ingenieur an Commander, bitte kommen!"
-msgstr "Engineer to Commander, come in!"
-
-#: ../../msn/msn_s.c:221
-msgid "Was ist los?"
-msgstr "What's going on?"
-
-#: ../../msn/msn_s.c:222
-msgid ""
-"Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich "
-"schaue sofort nach, woran es liegt."
-msgstr ""
-"We have a pressure drop in the main propulsion system, sir.|Wait a minute, "
-"I'll have a look."
-
-#: ../../msn/msn_s.c:224
-msgid ""
-"Scheiáe, der Ionenantrieb ist explodiert!|Die Teile sind ber den ganzen|"
-"Maschinenraum verstreut."
-msgstr "Shit, the Ion drive blew up!|The parts are all over the engine room."
-
-#: ../../msn/msn_s.c:225
-msgid ""
-"Ach, du meine Gte!|Gibt es irgendeine M”glichkeit,|den Schaden schnell zu "
-"beheben?"
-msgstr "Oh, my God!|Any way to fix the damage quickly?"
-
-#: ../../msn/msn_s.c:226
-msgid "Nein, Sir. Es sieht schlecht aus."
-msgstr "No, sir. It looks bad."
-
-#: ../../msn/msn_s.c:230
-msgid "Hmm, die Erde zu alarmieren, wrde zu lange dauern."
-msgstr "Hmm, alerting Earth would take too long."
-
-#: ../../msn/msn_s.c:231
-msgid "Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!"
-msgstr "I can't take any chances.|Captain, sound the alarm!"
-
-#: ../../msn/msn_s.c:232 ../../msn/msn_s.c:264
-msgid "Ok, Sir."
-msgstr "Ok, Sir."
-
-#: ../../msn/msn_s.c:255
-msgid ""
-"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum "
-"Notraumschiff!"
-msgstr ""
-"Commander to all! Attention, attention!|Get to the emergency ship "
-"immediately!"
-
-#: ../../msn/msn_s.c:256
-msgid "Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!"
-msgstr "I repeat, proceed immediately|to the emergency spaceship!"
-
-#: ../../msn/msn_s.c:263
-msgid ""
-"Captain, bereiten Sie alles fr den Start vor!|Wir mssen zurck zur Erde!"
-msgstr ""
-"Captain, get everything ready for departure!|We have to get back to Earth!"
-
-#: ../../msn/msn_s.c:277
-msgid "Eine Stunde sp„ter ..."
-msgstr "An hour later..."
-
-#: ../../msn/msn_s.c:284
-msgid "Die Besatzung hat die \"Supernova\" verlassen."
-msgstr "The crew has left the \"Supernova\"."
-
-#: ../../msn/msn_s.c:285
-msgid ""
-"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne "
-"Mannschaft."
-msgstr ""
-"The ship will reach its destination in eight years,|but without a crew."
-
-#: ../../msn/msn_s.c:286
-msgid "Das ist das kl„gliche Ende|der Mission Supernova."
-msgstr "This is the pitiful end|of the Supernova mission."
-
-#: ../../msn/msn_s.c:287
-msgid "Sie k”nnen jetzt ihren Computer ausschalten."
-msgstr "You can now turn off your computer."
-
-#: ../../msn/msn_s.c:290
-msgid "Warten Sie!"
-msgstr "Wait, wait!"
-
-#: ../../msn/msn_s.c:291
-msgid "Es regt sich etwas im Schiff."
-msgstr "There's something stirring in the ship."
-
-#: ../../msn/msn_s.c:307
-msgid "Uuuuaaaahhhhh"
-msgstr "Uuuuaaaahhhhh"
-
-#: ../../msn/msn_s.c:309
-msgid "Huch, ich bin ja gefesselt!|Wo bin ich?"
-msgstr "Argh, I'm tied up!|Where am I?"
-
-#: ../../msn/msn_s.c:310
-msgid ""
-"Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem "
-"Raumschiff hier."
-msgstr "Ah yes, these are the seat belts.|I work in this spaceship now."
-
-#: ../../msn/msn_s.c:311
-msgid ""
-"Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett "
-"geschmissen?"
-msgstr "What? It's 2:00 already!|How come no one has kicked me|out of bed yet?"
-
-#: ../../msn/msn_s.c:314
-msgid "Autsch!"
-msgstr "Ouch!"
-
-#: ../../msn/msn_s.c:315
-msgid "Scheiáetagenbett!"
-msgstr "Shitty bunk bed!"
-
-#: ../../msn/msn_s.c:317
-msgid "Erst mal den Lichtschalter finden."
-msgstr "First, find the light switch."
-
-#: ../../msn/msn_s.c:318
-msgid "Hmm, gar nicht so einfach|bei Schwerelosigkeit."
-msgstr "Hmm, not so easy|in weightlessness."
-
-#: ../../msn/msn_s.c:320
-msgid "Ah, hier ist er."
-msgstr "Ah, here it is."
diff --git a/devtools/create_supernova/strings1-en.po b/devtools/create_supernova/strings1-en.po
new file mode 100644
index 0000000..1d03289
--- /dev/null
+++ b/devtools/create_supernova/strings1-en.po
@@ -0,0 +1,2906 @@
+# Mission Supernova Translation.
+# Copyright (C) YEAR ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mission Supernova 1.0\n"
+"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
+"POT-Creation-Date: 2017-07-22 19:53+0100\n"
+"PO-Revision-Date: 2018-04-13 21:29+0000\n"
+"Last-Translator: Adrian Frhwirth <bonki at scummvm.org>\n"
+"Language-Team: none\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CP850\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9\n"
+
+#. I18N: Go
+#: ../../msn/msn.c:1610
+msgid "Gehe"
+msgstr "Go"
+
+#. I18N: Look
+#: ../../msn/msn.c:1612
+msgid "Schau"
+msgstr "Look"
+
+#. I18N: Take
+#: ../../msn/msn.c:1614
+msgid "Nimm"
+msgstr "Take"
+
+#. I18N: Open
+#: ../../msn/msn.c:1616
+msgid "™ffne"
+msgstr "Open"
+
+#. I18N: Close
+#: ../../msn/msn.c:1618
+msgid "Schlieáe"
+msgstr "Close"
+
+#. I18N: Push
+#: ../../msn/msn.c:1620
+msgid "Drcke"
+msgstr "Push"
+
+#. I18N: Pull
+#: ../../msn/msn.c:1622
+msgid "Ziehe"
+msgstr "Pull"
+
+#. I18N: Use
+#: ../../msn/msn.c:1624
+msgid "Benutze"
+msgstr "Use"
+
+#. I18N: Talk
+#: ../../msn/msn.c:1626
+msgid "Rede"
+msgstr "Talk"
+
+#. I18N: Give
+#: ../../msn/msn.c:1628
+msgid "Gib"
+msgstr "Give"
+
+#. I18N: End of conversation
+#: ../../msn/msn.c:2204
+msgid "Gespr„ch beenden"
+msgstr "End of conversation"
+
+#. I18N: Go to
+#: ../../msn/msn.c:2334
+msgid "Gehe zu "
+msgstr "Go to "
+
+#. I18N: Look at
+#: ../../msn/msn.c:2336
+msgid "Schau "
+msgstr "Look at "
+
+#. I18N: Take
+#: ../../msn/msn.c:2338
+msgid "Nimm "
+msgstr "Take "
+
+#. I18N: Open
+#: ../../msn/msn.c:2340
+msgid "™ffne "
+msgstr "Open "
+
+#. I18N: Close
+#: ../../msn/msn.c:2342
+msgid "Schlieáe "
+msgstr "Close "
+
+#. I18N: Push
+#: ../../msn/msn.c:2344
+msgid "Drcke "
+msgstr "Push "
+
+#. I18N: Pull
+#: ../../msn/msn.c:2346
+msgid "Ziehe "
+msgstr "Pull "
+
+#. I18N: Use
+#: ../../msn/msn.c:2348
+msgid "Benutze "
+msgstr "Use "
+
+#. I18N: Talk to
+#: ../../msn/msn.c:2350
+msgid "Rede mit "
+msgstr "Talk to "
+
+#. I18N: Give
+#: ../../msn/msn.c:2352
+msgid "Gib "
+msgstr "Give "
+
+#: ../../msn/msn.c:2368
+msgid " an "
+msgstr " to "
+
+#: ../../msn/msn.c:2371
+msgid " mit "
+msgstr " with "
+
+#. I18N: Load
+#: ../../msn/msn.c:2880
+msgid "Laden"
+msgstr "Load"
+
+#. I18N: Save
+#: ../../msn/msn.c:2883
+msgid "Speichern"
+msgstr "Save"
+
+#. I18N: Back
+#: ../../msn/msn.c:2886
+msgid "Zurck"
+msgstr "Back"
+
+#. I18N: Restart
+#: ../../msn/msn.c:2889
+msgid "Neustart"
+msgstr "Restart"
+
+#. I18N: Help
+#: ../../msn/msn.c:3163
+msgid "F1    Hilfe"
+msgstr "F1    Help"
+
+#. I18N: Instructions
+#: ../../msn/msn.c:3165
+msgid "F2    Anleitung"
+msgstr "F2    Instructions"
+
+#. I18N: Program information
+#: ../../msn/msn.c:3167
+msgid "F3    Programminformationen"
+msgstr "F3    Program information"
+
+#. I18N: Text Speed
+#: ../../msn/msn.c:3169
+msgid "F4    Textgeschwindigkeit"
+msgstr "F4    Text speed"
+
+#. I18N: Load / Save
+#: ../../msn/msn.c:3171
+msgid "F5    Laden / Speichern"
+msgstr "F5    Load / Save"
+
+#. I18N: Skip intro
+#: ../../msn/msn.c:3173
+msgid "ESC   Vorspann berspringen"
+msgstr "ESC   Skip intro"
+
+#. I18N: Exit program
+#: ../../msn/msn.c:3175
+msgid "Alt-X Programm abbrechen"
+msgstr "Alt-X Exit program"
+
+#. I18N: Text Speed
+#: ../../msn/msn.c:3219
+msgid "Textgeschwindigkeit:"
+msgstr "Text speed:"
+
+#. I18N: Leave game?
+#: ../../msn/msn.c:3267
+msgid "Spiel abbrechen?"
+msgstr "Leave game?"
+
+#: ../../msn/msn.c:3270
+msgid "Ja"
+msgstr "Yes"
+
+#: ../../msn/msn.c:3271
+msgid "Nein"
+msgstr "No"
+
+#. I18N: You already carry this.
+#: ../../msn/msn.c:3341
+msgid "Das tr„gst du doch bei dir."
+msgstr "You already carry this."
+
+#. I18N: You're already there.
+#: ../../msn/msn.c:3344
+msgid "Du bist doch schon da."
+msgstr "You are already there."
+
+#. I18N: This is closed
+#: ../../msn/msn.c:3347 ../../msn/msn_r1.c:683
+msgid "Das ist geschlossen."
+msgstr "This is closed."
+
+#. I18N: You already have that
+#: ../../msn/msn.c:3357
+msgid "Das hast du doch schon."
+msgstr "You already have that."
+
+#. I18N: You do not need that.
+#: ../../msn/msn.c:3360
+msgid "Das brauchst du nicht."
+msgstr "You don't need that."
+
+#. I18N: You can't take that.
+#: ../../msn/msn.c:3363
+msgid "Das kannst du nicht nehmen."
+msgstr "You can't take that."
+
+#. I18N: This can't be opened
+#: ../../msn/msn.c:3370
+msgid "Das l„át sich nicht ”ffnen."
+msgstr "This cannot be opened."
+
+#. I18N: This is already opened.
+#: ../../msn/msn.c:3373
+msgid "Das ist schon offen."
+msgstr "This is already opened."
+
+#. I18N: This is locked.
+#: ../../msn/msn.c:3376
+msgid "Das ist verschlossen."
+msgstr "This is locked."
+
+#. I18N: This can't be closed.
+#: ../../msn/msn.c:3393
+msgid "Das l„át sich nicht schlieáen."
+msgstr "This cannot be closed."
+
+#. I18N: This is already closed.
+#: ../../msn/msn.c:3396 ../../msn/msn_r1.c:829
+msgid "Das ist schon geschlossen."
+msgstr "This is already closed."
+
+#. I18N: Better keep it!
+#: ../../msn/msn.c:3412
+msgid "Behalt es lieber!"
+msgstr "Better keep it!"
+
+#. I18N: This is not possible.
+#: ../../msn/msn.c:3418
+msgid "Das geht nicht."
+msgstr "You can't do that."
+
+#: ../../msn/msn_mod.c:573
+msgid "^(C) 1994 Thomas und Steffen Dingel#"
+msgstr "^(C) 1994 Thomas and Steffen Dingel#"
+
+#: ../../msn/msn_mod.c:574
+msgid "Story und Grafik:^ Thomas Dingel#"
+msgstr "Story and Graphics:^ Thomas Dingel#"
+
+#: ../../msn/msn_mod.c:575
+msgid "Programmierung:^ Steffen Dingel#"
+msgstr "Programming:^ Steffen Dingel#"
+
+#: ../../msn/msn_mod.c:576
+msgid "Musik:^ Bernd Hoffmann#"
+msgstr "Music:^ Bernd Hoffmann#"
+
+#: ../../msn/msn_mod.c:577
+msgid "Getestet von ...#"
+msgstr "Tested by ...#"
+
+#: ../../msn/msn_mod.c:587
+msgid "^             E#N#D#E ...########"
+msgstr "^          T#H#E E#N#D ...########"
+
+#: ../../msn/msn_mod.c:588
+msgid "#       ... des ersten Teils!########"
+msgstr "#       ... of the first part!########"
+
+#: ../../msn/msn_mod.c:590
+msgid "^Aber:#"
+msgstr "^But:#"
+
+#: ../../msn/msn_mod.c:591
+msgid "Das Abenteuer geht weiter, ...##"
+msgstr "The adventure continues ...##"
+
+#: ../../msn/msn_mod.c:592
+msgid "... wenn Sie sich fr 30,- DM registrieren lassen!##"
+msgstr "... if you register for 30, - DM!##"
+
+#: ../../msn/msn_mod.c:593
+msgid "(Falls Sie das nicht schon l„ngst getan haben.)##"
+msgstr "(If you have not already done so.)##"
+
+#: ../../msn/msn_mod.c:594
+msgid "In^ Teil 2 - Der Doppelg„nger^ erwarten Sie:##"
+msgstr "In^ Part 2 - The Doppelganger^ you can expect:##"
+
+#: ../../msn/msn_mod.c:595
+msgid "Knifflige Puzzles,##"
+msgstr "tricky puzzles,##"
+
+#: ../../msn/msn_mod.c:596
+msgid "noch mehr Grafik und Sound,##"
+msgstr "even more graphics and sound,##"
+
+#: ../../msn/msn_mod.c:597
+msgid "ein perfekt geplanter Museumseinbruch,##"
+msgstr "a perfectly planned museum burglary,##"
+
+#: ../../msn/msn_mod.c:598
+msgid "das Virtual-Reality-Spiel \"Indiana Joe\"##"
+msgstr "the virtual reality game \"Indiana Joe\"##"
+
+#: ../../msn/msn_mod.c:599
+msgid "und vieles mehr!##"
+msgstr "and much more!##"
+
+#. I18N: There's nothing special about it
+#: ../../msn/msn_r0.c:26
+msgid "Es ist nichts Besonderes daran."
+msgstr "There's nothing special about it."
+
+#. I18N: You first have to take it
+#: ../../msn/msn_r0.c:28 ../../msn/msn_r0.c:230
+msgid "Das muát du erst nehmen."
+msgstr "You first have to take it."
+
+#. I18N: Hello
+#: ../../msn/msn_r0.c:33
+msgid "Hallo!"
+msgstr "Hello!"
+
+#. I18N: Good day!
+#: ../../msn/msn_r0.c:35
+msgid "Guten Tag!"
+msgstr "Good day!"
+
+#. I18N: It's me, Horst Hummel
+#: ../../msn/msn_r0.c:37
+msgid "Ich bin's, Horst Hummel."
+msgstr "It's me, Horst Hummel."
+
+#: ../../msn/msn_r0.c:127
+#, c-format
+msgid "%d Xa"
+msgstr "%d Xa"
+
+#: ../../msn/msn_r0.c:147
+msgid "Ok."
+msgstr "OK."
+
+#: ../../msn/msn_r0.c:166
+msgid "Irgendwie ist ein Raumhelm|beim Essen unpraktisch."
+msgstr "Somehow, a space helmet is|impractical when eating."
+
+#: ../../msn/msn_r0.c:182 ../../msn/msn_r0.c:192
+msgid "Schmeckt ganz gut."
+msgstr "Tastes good."
+
+#: ../../msn/msn_r0.c:194
+msgid "Da war irgendetwas drin,|aber jetzt hast du es|mit runtergeschluckt."
+msgstr "There was something in it, but now you swallowed it."
+
+#: ../../msn/msn_r0.c:202
+msgid "Du hast es doch schon ge”ffnet."
+msgstr "You've already opened it."
+
+#: ../../msn/msn_r0.c:206
+msgid "In dem Ei ist eine Tablette|in einer Plastikhlle."
+msgstr "The egg contains a pill|in a plastic sleeve."
+
+#: ../../msn/msn_r0.c:214
+msgid "Du iát die Tablette und merkst,|daá sich irgendetwas ver„ndert hat."
+msgstr "You eat the pill and realize|that something has changed."
+
+#: ../../msn/msn_r0.c:224
+msgid ""
+"Komisch! Auf einmal kannst du die Schrift lesen!|Darauf steht:\"Wenn Sie "
+"diese Schrift jetzt|lesen k”nnen, hat die Tablette gewirkt.\""
+msgstr ""
+"Funny! Now you can read the inscription!|It says, \"If you can read this "
+"text now,|the pill has worked.\""
+
+#: ../../msn/msn_r0.c:232
+msgid "Sie ist leer."
+msgstr "It is empty."
+
+#: ../../msn/msn_r0.c:235
+msgid "Du findest 10 Buckazoids und eine Keycard."
+msgstr "You find 10 buckazoids and a keycard."
+
+#: ../../msn/msn_r0.c:242
+msgid "Es ist eine Art elektronische Zeitung."
+msgstr "This is a kind of electronic newspaper."
+
+#: ../../msn/msn_r0.c:245
+msgid "Halt, hier ist ein interessanter Artikel."
+msgstr "Here, this article looks interesting."
+
+#: ../../msn/msn_r0.c:268
+msgid "Hmm, irgendwie komme|ich mir verarscht vor."
+msgstr "Hmm, somehow|I feel tricked."
+
+#: ../../msn/msn_r0.c:273
+msgid "Es ist die Keycard des Commanders."
+msgstr "This is the keycard of the Commander."
+
+#: ../../msn/msn_r0.c:277
+msgid ""
+"Es ist eine Uhr mit extra|lautem Wecker. Sie hat einen|Knopf zum Verstellen "
+"der Alarmzeit.|Uhrzeit: %s   Alarmzeit: %s"
+msgstr ""
+"This is a clock with a very loud alarm. It has a button|for adjusting the "
+"alarm time.|Time: %s   Alarm: %s"
+
+#: ../../msn/msn_r0.c:291
+msgid "Neue Alarmzeit (hh:mm) :"
+msgstr "New alarm time (hh:mm):"
+
+#: ../../msn/msn_r0.c:332 ../../msn/msn_r1.c:486 ../../msn/msn_r1.c:595
+msgid "Leitung mit Lsterklemme"
+msgstr "Cable with terminal strip"
+
+#: ../../msn/msn_r0.c:344
+msgid "Kabelrolle mit Lsterklemme"
+msgstr "Cable reel with terminal strip"
+
+#: ../../msn/msn_r0.c:355 ../../msn/msn_r1.c:495 ../../msn/msn_r1.c:604
+msgid "Womit denn?"
+msgstr "With what?"
+
+#: ../../msn/msn_r0.c:366 ../../msn/msn_r1.c:499 ../../msn/msn_r1.c:608
+#: ../../msn/msn_r1_r.c:115
+msgid "langes Kabel mit Stecker"
+msgstr "long cable with plug"
+
+#: ../../msn/msn_r0.c:381 ../../msn/msn_r0.c:418 ../../msn/msn_r0.c:454
+msgid "Die Luft hier ist atembar,|du ziehst den Anzug aus."
+msgstr "The air here is breathable,|you take off your suit."
+
+#: ../../msn/msn_r0.c:387 ../../msn/msn_r0.c:424 ../../msn/msn_r0.c:460
+msgid "Hier drinnen brauchtst du deinen Anzug nicht."
+msgstr "Inside you do not need your suit."
+
+#: ../../msn/msn_r0.c:395
+msgid "Du muát erst den Helm abnehmen."
+msgstr "You must take off your helmet first."
+
+#: ../../msn/msn_r0.c:397
+msgid "Du muát erst den Versorgungsteil abnehmen."
+msgstr "You must take off your oxygen supply unit first."
+
+#: ../../msn/msn_r0.c:401
+msgid "Du ziehst den Raumanzug aus."
+msgstr "Your take off your space suit."
+
+#: ../../msn/msn_r0.c:407
+msgid "Du ziehst den Raumanzug an."
+msgstr "You put on your space suit."
+
+#: ../../msn/msn_r0.c:431
+msgid "Den Helm h„ttest du|besser angelassen!"
+msgstr "You should have kept your helmet on!"
+
+#: ../../msn/msn_r0.c:433
+msgid "Du ziehst den Helm ab."
+msgstr "You take off your helmet."
+
+#: ../../msn/msn_r0.c:441
+msgid "Du ziehst den Helm auf."
+msgstr "You put on your helmet."
+
+#: ../../msn/msn_r0.c:443 ../../msn/msn_r0.c:479
+msgid "Du muát erst den Anzug anziehen."
+msgstr "You must wear the suit first."
+
+#: ../../msn/msn_r0.c:467
+msgid "Den Versorungsteil h„ttest du|besser nicht abgenommen!"
+msgstr "You should not have taken off your oxygen supply unit!"
+
+#: ../../msn/msn_r0.c:469
+msgid "Du nimmst den Versorgungsteil ab."
+msgstr "You take off your oxygen supply unit."
+
+#: ../../msn/msn_r0.c:477
+msgid "Du ziehst den Versorgungsteil an."
+msgstr "You put on your oxygen supply unit."
+
+#: ../../msn/msn_r0.c:489
+msgid "Die Leitung ist hier unntz."
+msgstr "The cable is useless here."
+
+#: ../../msn/msn_r0.c:492
+msgid ""
+"Stark, das ist ja die Fortsetzung zum \"Anhalter\":|\"Das Restaurant am Ende "
+"des Universums\"."
+msgstr ""
+"Great, this is the sequel to the \"Hitchhiker\":|\"The Restaurant at the End "
+"of the Universe\"."
+
+#: ../../msn/msn_r0.c:495
+msgid ""
+"Moment mal, es ist ein Lesezeichen drin,|auf dem \"Zweiundvierzig\" steht."
+msgstr "Wait a minute, there is a bookmark in it|that says \"Forty-two\"."
+
+#: ../../msn/msn_r0.c:507
+msgid "Du h„ttest besser vorher|den Stecker rausgezogen."
+msgstr "You should have pulled|the plug before."
+
+#: ../../msn/msn_r0.c:567
+msgid "Deine Armbanduhr piepst,|die Alarmzeit ist erreicht."
+msgstr "Your watch beeps,|this is the alarm."
+
+#: ../../msn/msn_r0.c:803 ../../msn/msn_r1_r.c:117
+msgid "Keycard"
+msgstr "Keycard"
+
+#: ../../msn/msn_r0.c:803
+msgid "Die Keycard fr deine Schr„nke."
+msgstr "The keycard for your locker."
+
+#: ../../msn/msn_r0.c:805
+msgid "Taschenmesser"
+msgstr "Pocket knife"
+
+#: ../../msn/msn_r0.c:805
+msgid "Es ist nicht mehr das sch„rfste."
+msgstr "It is quite blunt."
+
+#: ../../msn/msn_r0.c:807 ../../msn/msn_r3.c:1527
+msgid "Armbanduhr"
+msgstr "Watch"
+
+#: ../../msn/msn_r0.c:808 ../../msn/msn_r1_r.c:199
+msgid "Discman"
+msgstr "Discman"
+
+#: ../../msn/msn_r0.c:808 ../../msn/msn_r1_r.c:199
+msgid "Es ist eine \"Mad Monkeys\"-CD darin."
+msgstr "There is a \"Mad Monkeys\" CD in it."
+
+#: ../../msn/msn_r1.c:58
+msgid ""
+"In der Kche warst du schon|oft genug, im Moment hast|du keinen Appetit."
+msgstr ""
+"You have been often enough|in the kitchen and you are|no longer hungry."
+
+#. I18N: FORTYTWO
+#: ../../msn/msn_r1.c:91
+msgid "ZWEIUNDVIERZIG"
+msgstr "FORTY-TWO"
+
+#. I18N: Destination reached
+#: ../../msn/msn_r1.c:104
+msgid "Flugziel erreicht"
+msgstr "Destination reached"
+
+#. I18N: Energy depleted
+#: ../../msn/msn_r1.c:110
+msgid "Energie ersch”pft"
+msgstr "Energy depleted"
+
+#. I18N: Artificial coma interrupted
+#: ../../msn/msn_r1.c:112
+msgid "Tiefschlafprozess abgebrochen"
+msgstr "Stasis interrupted"
+
+#: ../../msn/msn_r1.c:120 ../../msn/msn_r1.c:156
+msgid "Bitte legen Sie sich in die angezeigte Schlafkammer."
+msgstr "Please lay down in the indicated stasis pod."
+
+#: ../../msn/msn_r1.c:125
+msgid "Bitte Passwort eingeben:"
+msgstr "Please enter your password:"
+
+#: ../../msn/msn_r1.c:135 ../../msn/msn_r3.c:1171
+msgid "Falsches Passwort"
+msgstr "Password incorrect"
+
+#: ../../msn/msn_r1.c:141
+msgid "Schlafdauer in Tagen:"
+msgstr "Sleep duration in days:"
+
+#: ../../msn/msn_r1.c:172
+msgid ""
+"Es wrde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht "
+"eingeschaltet ist."
+msgstr ""
+"You are not going to achieve anything|by using a stasis pod that is|not "
+"switched on."
+
+#: ../../msn/msn_r1.c:174
+msgid "Dazu muát du erst den Raumanzug ausziehen."
+msgstr "To do this you have to take off the space suit first."
+
+#: ../../msn/msn_r1.c:248 ../../msn/msn_s.c:210
+msgid "Was war das?"
+msgstr "What was that?"
+
+#: ../../msn/msn_r1.c:266
+msgid "Achtung"
+msgstr "Danger"
+
+#: ../../msn/msn_r1.c:289
+msgid ""
+"Du wachst mit brummendem Sch„del auf|und merkst, daá du nur getr„umt hast."
+msgstr ""
+"You wake up with a buzzing sensation in your head|and realise that it was "
+"only a dream."
+
+#: ../../msn/msn_r1.c:292
+msgid ""
+"Beim Aufprall des Raumschiffs|muát du mit dem Kopf aufgeschlagen|und "
+"bewuátlos geworden sein."
+msgstr ""
+"During the space ship impact|you must have hit your head|and lost "
+"consciousness."
+
+#: ../../msn/msn_r1.c:295
+msgid "Was steht dir jetzt wohl wirklich bevor?"
+msgstr "What is going to happen to you now?"
+
+#: ../../msn/msn_r1.c:307
+msgid "Geschwindigkeit: "
+msgstr "Speed: "
+
+#: ../../msn/msn_r1.c:308
+msgid "8000 hpm"
+msgstr "8000 hpm"
+
+#: ../../msn/msn_r1.c:309
+msgid "0 hpm"
+msgstr "0 hpm"
+
+#: ../../msn/msn_r1.c:310
+msgid "Ziel: Arsano 3"
+msgstr "Destination: Arsano 3"
+
+#: ../../msn/msn_r1.c:311
+msgid "Entfernung: "
+msgstr "Distance: "
+
+#: ../../msn/msn_r1.c:318
+msgid " Lichtjahre"
+msgstr " light years"
+
+#: ../../msn/msn_r1.c:319
+msgid "Dauer der Reise bei momentaner Geschwindigkeit:"
+msgstr "Duration of trip at current speed:"
+
+#: ../../msn/msn_r1.c:321
+msgid " Tage"
+msgstr " days"
+
+#: ../../msn/msn_r1.c:330
+msgid ""
+"Vergiá nicht, du bist nur der|Schiffskoch und hast keine Ahnung,|wie man ein "
+"Raumschiff fliegt."
+msgstr ""
+"Do not forget, you're only the|ship's cook and have no idea|how to fly a "
+"spaceship."
+
+#: ../../msn/msn_r1.c:344
+msgid "Achtung: Triebwerke funktionsunf„hig"
+msgstr "Warning: Engine malfunction"
+
+#: ../../msn/msn_r1.c:357
+msgid "Energievorrat ersch”pft"
+msgstr "Energy supply exhausted"
+
+#: ../../msn/msn_r1.c:358
+msgid "Notstromversorgung aktiv"
+msgstr "Emergency energy supply active"
+
+#: ../../msn/msn_r1.c:447
+msgid "Zu niedriger Luftdruck soll ungesund sein."
+msgstr "Air pressure too low unhealthy is."
+
+#: ../../msn/msn_r1.c:454
+msgid "Er zeigt Null an."
+msgstr "It indicates zero."
+
+#: ../../msn/msn_r1.c:455
+msgid "Er zeigt Normaldruck an."
+msgstr "It indicates normal pressure."
+
+#: ../../msn/msn_r1.c:464
+msgid "Ein Stck Schrott."
+msgstr "Some scrap metal."
+
+#: ../../msn/msn_r1.c:476
+msgid "Du muát erst hingehen."
+msgstr "You must go there first."
+
+#: ../../msn/msn_r1.c:480 ../../msn/msn_r1.c:639 ../../msn/msn_r1.c:728
+msgid "Das Kabel ist im Weg."
+msgstr "The cable is in the way."
+
+#: ../../msn/msn_r1.c:483 ../../msn/msn_r1.c:642 ../../msn/msn_r1.c:698
+msgid "Das Kabel ist schon ganz|richtig an dieser Stelle."
+msgstr "The cable is already in the right place."
+
+#: ../../msn/msn_r1.c:519
+msgid "Die Leitung ist zu kurz."
+msgstr "The line is too short."
+
+#: ../../msn/msn_r1.c:567
+msgid "Es ist nicht spitz genug."
+msgstr "It is not sharp enough."
+
+#: ../../msn/msn_r1.c:570
+msgid "Du wirst aus den Anzeigen nicht schlau."
+msgstr "You cannot make sense of it."
+
+#: ../../msn/msn_r1.c:572
+msgid "Laá lieber die Finger davon!"
+msgstr "You better keep your hands off!"
+
+#: ../../msn/msn_r1.c:591
+msgid "An dem Kabel ist doch gar kein Stecker."
+msgstr "There is no plug on the cable."
+
+#: ../../msn/msn_r1.c:635
+msgid "Du solltest die Luke vielleicht erst ”ffnen."
+msgstr "You should open the hatch first."
+
+#: ../../msn/msn_r1.c:668
+msgid "Das Seil ist im Weg."
+msgstr "The cable is in the way."
+
+#: ../../msn/msn_r1.c:685
+msgid "Das geht nicht.|Die Luke ist mindestens|5 Meter ber dem Boden."
+msgstr "That will not do.|The hatch is at least|5 meters above the ground."
+
+#: ../../msn/msn_r1.c:694
+msgid "Keycard des Commanders"
+msgstr "Keycard of the Commander"
+
+#: ../../msn/msn_r1.c:766
+msgid "Was ntzt dir der Anschluá|ohne eine Stromquelle?!"
+msgstr "What good would come from connecting it|without a power source?!"
+
+#: ../../msn/msn_r1.c:770
+msgid "Die Spannung ist auf Null abgesunken."
+msgstr "The voltage has dropped to zero."
+
+#: ../../msn/msn_r1.c:771
+msgid "Es zeigt volle Spannung an."
+msgstr "It displays full voltage."
+
+#: ../../msn/msn_r1.c:782
+msgid "Du muát die Luke erst ”ffnen."
+msgstr "You must open the hatch first."
+
+#: ../../msn/msn_r1.c:801
+msgid "Das Seil ist hier schon ganz richtig."
+msgstr "The cable is in the right place."
+
+#: ../../msn/msn_r1.c:806
+msgid "Das Kabel ist zu kurz."
+msgstr "The cable is too short."
+
+#: ../../msn/msn_r1.c:913
+msgid "Du hast die Platte schon aufgelegt."
+msgstr "You already put the record on."
+
+#: ../../msn/msn_r1.c:925
+msgid "Es ist doch gar keine Platte aufgelegt."
+msgstr "You haven't put a record on yet."
+
+#: ../../msn/msn_r1.c:960
+msgid "Die Platte scheint einen Sprung zu haben."
+msgstr "The record seems to be scratched."
+
+#: ../../msn/msn_r1.c:981
+msgid "Schneid doch besser ein|l„ngeres Stck Kabel ab!"
+msgstr "You should cut a longer|piece of cable!"
+
+#: ../../msn/msn_r1.c:1003
+msgid "Leitung mit Stecker"
+msgstr "Cable with plug"
+
+#: ../../msn/msn_r1.c:1008 ../../msn/msn_r3.c:75
+msgid "Das ist befestigt."
+msgstr "This is fixed."
+
+#: ../../msn/msn_r1.c:1084
+msgid "Du hast jetzt besseres zu tun."
+msgstr "You have better things to do now."
+
+#: ../../msn/msn_r1.c:1086
+msgid "Wenn du unbedingt aufs Klo|willst, spiel doch Larry 1."
+msgstr "If you absolutely want to go|to the loo, play Larry 1."
+
+#: ../../msn/msn_r1.c:1097
+msgid "Was?! Keiner im Cockpit!|Die sind wohl verrckt!"
+msgstr "What?! No one in the cockpit!|They're crazy!"
+
+#: ../../msn/msn_r1.c:1105
+msgid "Komisch, es ist nur|noch ein Raumanzug da."
+msgstr "Funny, there's only|one space suit."
+
+#: ../../msn/msn_r1.c:1113
+msgid ""
+"Was ist denn das fr ein Chaos?|Und auáerdem fehlt das Notraumschiff!|Jetzt "
+"wird mir einiges klar.|Die anderen sind geflchtet,|und ich habe es verpennt."
+msgstr ""
+"What is that chaos? And also|the escape ship is missing!|Now I understand. "
+"The others|have escaped, and they left|me behind."
+
+#: ../../msn/msn_r1_r.c:16 ../../msn/msn_r1_r.c:17 ../../msn/msn_r1_r.c:18
+#: ../../msn/msn_r1_r.c:19 ../../msn/msn_r1_r.c:20 ../../msn/msn_r1_r.c:21
+#: ../../msn/msn_r1_r.c:22 ../../msn/msn_r1_r.c:31 ../../msn/msn_r1_r.c:32
+#: ../../msn/msn_r1_r.c:34 ../../msn/msn_r1_r.c:44 ../../msn/msn_r1_r.c:45
+#: ../../msn/msn_r1_r.c:63 ../../msn/msn_r1_r.c:65 ../../msn/msn_r1_r.c:89
+#: ../../msn/msn_r1_r.c:93 ../../msn/msn_r1_r.c:108 ../../msn/msn_r1_r.c:120
+#: ../../msn/msn_r1_r.c:122 ../../msn/msn_r1_r.c:136 ../../msn/msn_r1_r.c:150
+#: ../../msn/msn_r1_r.c:165 ../../msn/msn_r1_r.c:201 ../../msn/msn_r1_r.c:219
+#: ../../msn/msn_r1_r.c:245 ../../msn/msn_r1_r.c:279
+msgid "Luke"
+msgstr "Hatch"
+
+#: ../../msn/msn_r1_r.c:23 ../../msn/msn_r1_r.c:67 ../../msn/msn_r1_r.c:68
+#: ../../msn/msn_r1_r.c:103 ../../msn/msn_r1_r.c:239 ../../msn/msn_r2.c:1256
+#: ../../msn/msn_r2.c:1293 ../../msn/msn_r2.c:1294 ../../msn/msn_r2.c:1295
+#: ../../msn/msn_r2.c:1296 ../../msn/msn_r3.c:1479 ../../msn/msn_r3.c:1677
+#: ../../msn/msn_r3.c:1678
+msgid "Knopf"
+msgstr "Button"
+
+#: ../../msn/msn_r1_r.c:23
+msgid "Er geh”rt zu der groáen Luke."
+msgstr "It belongs to the large hatch."
+
+#: ../../msn/msn_r1_r.c:24 ../../msn/msn_r1_r.c:37 ../../msn/msn_r1_r.c:130
+msgid "Leiter"
+msgstr "Ladder"
+
+#: ../../msn/msn_r1_r.c:25 ../../msn/msn_r1_r.c:47 ../../msn/msn_r1_r.c:57
+#: ../../msn/msn_r1_r.c:92 ../../msn/msn_r1_r.c:293 ../../msn/msn_r2.c:1221
+#: ../../msn/msn_r2.c:1223 ../../msn/msn_r2.c:1259 ../../msn/msn_r2.c:1277
+#: ../../msn/msn_r2.c:1292 ../../msn/msn_r3.c:1498 ../../msn/msn_r3.c:1499
+#: ../../msn/msn_r3.c:1506 ../../msn/msn_r3.c:1507 ../../msn/msn_r3.c:1508
+#: ../../msn/msn_r3.c:1515 ../../msn/msn_r3.c:1522 ../../msn/msn_r3.c:1523
+#: ../../msn/msn_r3.c:1535 ../../msn/msn_r3.c:1536 ../../msn/msn_r3.c:1543
+#: ../../msn/msn_r3.c:1544 ../../msn/msn_r3.c:1552 ../../msn/msn_r3.c:1553
+#: ../../msn/msn_r3.c:1561 ../../msn/msn_r3.c:1568 ../../msn/msn_r3.c:1578
+#: ../../msn/msn_r3.c:1579 ../../msn/msn_r3.c:1594 ../../msn/msn_r3.c:1608
+#: ../../msn/msn_r3.c:1679 ../../msn/msn_r3.c:1695
+msgid "Ausgang"
+msgstr "Exit"
+
+#: ../../msn/msn_r1_r.c:31
+msgid "Sie fhrt ins Cockpit."
+msgstr "It leads into the cockpit."
+
+#: ../../msn/msn_r1_r.c:32
+msgid "Sie fhrt zur Kche."
+msgstr "It leads to the kitchen."
+
+#: ../../msn/msn_r1_r.c:34
+msgid "Sie fhrt zu den Tiefschlafkammern."
+msgstr "It leads to the stasis pods."
+
+#: ../../msn/msn_r1_r.c:36 ../../msn/msn_r1_r.c:123 ../../msn/msn_r1_r.c:151
+#: ../../msn/msn_r1_r.c:166 ../../msn/msn_r1_r.c:179 ../../msn/msn_r1_r.c:180
+#: ../../msn/msn_r1_r.c:181 ../../msn/msn_r1_r.c:182 ../../msn/msn_r1_r.c:202
+#: ../../msn/msn_r1_r.c:220 ../../msn/msn_r1_r.c:246 ../../msn/msn_r1_r.c:256
+#: ../../msn/msn_r1_r.c:257 ../../msn/msn_r1_r.c:258 ../../msn/msn_r1_r.c:259
+#: ../../msn/msn_r1_r.c:280 ../../msn/msn_r2.c:1252 ../../msn/msn_r2.c:1298
+#: ../../msn/msn_r3.c:1696
+msgid "Schlitz"
+msgstr "Slot"
+
+#: ../../msn/msn_r1_r.c:36 ../../msn/msn_r1_r.c:123 ../../msn/msn_r1_r.c:151
+#: ../../msn/msn_r1_r.c:166 ../../msn/msn_r1_r.c:179 ../../msn/msn_r1_r.c:180
+#: ../../msn/msn_r1_r.c:181 ../../msn/msn_r1_r.c:182 ../../msn/msn_r1_r.c:202
+#: ../../msn/msn_r1_r.c:220 ../../msn/msn_r1_r.c:246 ../../msn/msn_r1_r.c:256
+#: ../../msn/msn_r1_r.c:257 ../../msn/msn_r1_r.c:258 ../../msn/msn_r1_r.c:259
+#: ../../msn/msn_r1_r.c:280
+msgid "Es ist ein Keycard-Leser."
+msgstr "It is a keycard reader."
+
+#: ../../msn/msn_r1_r.c:38 ../../msn/msn_r3.c:1595
+msgid "Gang"
+msgstr "Corridor"
+
+#: ../../msn/msn_r1_r.c:44 ../../msn/msn_r1_r.c:45
+msgid "Dies ist eine der Tiefschlafkammern."
+msgstr "This is one of the stasis pods."
+
+#: ../../msn/msn_r1_r.c:46 ../../msn/msn_r3.c:1622 ../../msn/msn_r3.c:1634
+#: ../../msn/msn_r3.c:1645 ../../msn/msn_r3.c:1657 ../../msn/msn_r3.c:1668
+msgid "Computer"
+msgstr "Computer"
+
+#: ../../msn/msn_r1_r.c:53 ../../msn/msn_r2.c:1302
+msgid "Instrumente"
+msgstr "Instruments"
+
+#: ../../msn/msn_r1_r.c:53
+msgid "Hmm, sieht ziemlich kompliziert aus."
+msgstr "Hmm, this looks pretty complicated."
+
+#: ../../msn/msn_r1_r.c:55 ../../msn/msn_r1_r.c:56 ../../msn/msn_r1_r.c:105
+msgid "Monitor"
+msgstr "Monitor"
+
+#: ../../msn/msn_r1_r.c:56
+msgid "Dieser Monitor sagt dir nichts."
+msgstr "There is nothing on this monitor."
+
+#: ../../msn/msn_r1_r.c:63
+msgid "Das ist eine Luke !!!"
+msgstr "This is a hatch !!!"
+
+#: ../../msn/msn_r1_r.c:65
+msgid "Dies ist eine Luke !!!"
+msgstr "This is a hatch !!!"
+
+#: ../../msn/msn_r1_r.c:69
+msgid "Helm"
+msgstr "Helmet"
+
+#: ../../msn/msn_r1_r.c:69
+msgid "Es ist der Helm zum Raumanzug."
+msgstr "This is the helmet for the space suit."
+
+#: ../../msn/msn_r1_r.c:70
+msgid "Raumanzug"
+msgstr "Space suit"
+
+#: ../../msn/msn_r1_r.c:70
+msgid "Der einzige Raumanzug, den die|anderen hiergelassen haben ..."
+msgstr "The only space suit left behind by the others..."
+
+#: ../../msn/msn_r1_r.c:72
+msgid "Versorgung"
+msgstr "Oxygen Supply Unit"
+
+#: ../../msn/msn_r1_r.c:72
+msgid "Es ist der Versorgungsteil zum Raumanzug."
+msgstr "It is the oxygen supply unit for the space suit."
+
+#: ../../msn/msn_r1_r.c:74
+msgid "Druckmesser"
+msgstr "Manometer"
+
+#: ../../msn/msn_r1_r.c:81 ../../msn/msn_r1_r.c:84
+msgid "Schrott"
+msgstr "Scrap"
+
+#: ../../msn/msn_r1_r.c:81
+msgid ""
+"Da ist eine Lsterklemme dran, die|noch ganz brauchbar aussieht.|Ich nehme "
+"sie mit."
+msgstr ""
+"There is a terminal strip on it|that looks quite useful.|I will take it with "
+"me."
+
+#: ../../msn/msn_r1_r.c:83
+msgid "Lsterklemme"
+msgstr "Terminal strip"
+
+#: ../../msn/msn_r1_r.c:84
+msgid ""
+"Junge, Junge! Die Explosion hat ein|ganz sch”nes Durcheinander angerichtet."
+msgstr "Boy, oh boy! The explosion created|quite a mess."
+
+#: ../../msn/msn_r1_r.c:86
+msgid "Reaktor"
+msgstr "Reactor"
+
+#: ../../msn/msn_r1_r.c:86
+msgid "Das war einmal der Reaktor."
+msgstr "This was a reactor once."
+
+#: ../../msn/msn_r1_r.c:87
+msgid "Dse"
+msgstr "Thruster"
+
+#: ../../msn/msn_r1_r.c:88
+msgid "blauer Krbis"
+msgstr "blue pumpkin"
+
+#: ../../msn/msn_r1_r.c:88
+msgid "Keine Ahnung, was das ist."
+msgstr "No idea what this is."
+
+#: ../../msn/msn_r1_r.c:90
+msgid "Landef„hre"
+msgstr "Landing module"
+
+#: ../../msn/msn_r1_r.c:90
+msgid "Sie war eigentlich fr Bodenuntersuchungen|auf Arsano 3 gedacht."
+msgstr "It was supposed to be used for soil analysis|on Arsano 3."
+
+#: ../../msn/msn_r1_r.c:93 ../../msn/msn_r1_r.c:120
+msgid "Sie fhrt nach drauáen."
+msgstr "It leads outside."
+
+#: ../../msn/msn_r1_r.c:95
+msgid "Generator"
+msgstr "Generator"
+
+#: ../../msn/msn_r1_r.c:95
+msgid "Er versorgt das Raumschiff mit Strom."
+msgstr "It supplies power to the spaceship."
+
+#: ../../msn/msn_r1_r.c:102 ../../msn/msn_r1_r.c:154 ../../msn/msn_r1_r.c:169
+#: ../../msn/msn_r1_r.c:205 ../../msn/msn_r1_r.c:223 ../../msn/msn_r1_r.c:249
+#: ../../msn/msn_r1_r.c:283 ../../msn/msn_r3.c:1486
+msgid "Steckdose"
+msgstr "Socket"
+
+#: ../../msn/msn_r1_r.c:103
+msgid ""
+"Es ist ein Sicherheitsknopf.|Er kann nur mit einem spitzen|Gegenstand "
+"gedrckt werden."
+msgstr "It's a safety button.|It can only be pushed|with a pointed object."
+
+#: ../../msn/msn_r1_r.c:106 ../../msn/msn_r2.c:1300
+msgid "Tastatur"
+msgstr "Keyboard"
+
+#: ../../msn/msn_r1_r.c:116
+msgid "leere Kabelrolle"
+msgstr "Empty cable reel"
+
+#: ../../msn/msn_r1_r.c:117
+msgid ""
+"Hey, das ist die Keycard des Commanders!|Er muá sie bei dem berstrzten|"
+"Aufbruch verloren haben."
+msgstr ""
+"Hey, that's the commander's keycard!|He must have lost it in the rushed|"
+"departure."
+
+#: ../../msn/msn_r1_r.c:119 ../../msn/msn_r1_r.c:137 ../../msn/msn_r1_r.c:188
+#: ../../msn/msn_r2.c:1212
+msgid "Seil"
+msgstr "Rope"
+
+#: ../../msn/msn_r1_r.c:124
+msgid "Klappe"
+msgstr "Hatch"
+
+#: ../../msn/msn_r1_r.c:125 ../../msn/msn_r1_r.c:128 ../../msn/msn_r1_r.c:242
+#: ../../msn/msn_r1_r.c:243 ../../msn/msn_r3.c:1485
+msgid "Leitung"
+msgstr "Cable"
+
+#: ../../msn/msn_r1_r.c:126
+msgid "Spannungmessger„t"
+msgstr "Voltmeter"
+
+#: ../../msn/msn_r1_r.c:127
+msgid "Klemme"
+msgstr "Clamp"
+
+#: ../../msn/msn_r1_r.c:128
+msgid "Sie fhrt vom Generator zum Spannungmessger„t."
+msgstr "It goes from the generator to the voltage meter."
+
+#: ../../msn/msn_r1_r.c:143 ../../msn/msn_r1_r.c:212 ../../msn/msn_r1_r.c:213
+#: ../../msn/msn_r1_r.c:214 ../../msn/msn_r1_r.c:217 ../../msn/msn_r3.c:1599
+#: ../../msn/msn_r3.c:1614 ../../msn/msn_r3.c:1636 ../../msn/msn_r3.c:1646
+#: ../../msn/msn_r3.c:1647
+msgid "Bild"
+msgstr "Image"
+
+#: ../../msn/msn_r1_r.c:143
+msgid "Manche Leute haben schon|einen komischen Geschmack."
+msgstr "Some people have funny tastes."
+
+#: ../../msn/msn_r1_r.c:145
+msgid "Zeichenger„te"
+msgstr "Drawing instruments"
+
+#: ../../msn/msn_r1_r.c:146
+msgid ""
+"Auf dem Zettel sind lauter|unverst„ndliche Skizzen und Berechnungen.|"
+"(Jedenfalls fr dich unverst„ndlich.)"
+msgstr ""
+"There are incomprehensible sketches|and calculations on that note.|(At "
+"least, it's incomprehensible to you.)"
+
+#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
+#: ../../msn/msn_r1_r.c:276
+msgid "Magnete"
+msgstr "Magnets"
+
+#: ../../msn/msn_r1_r.c:148 ../../msn/msn_r1_r.c:215 ../../msn/msn_r1_r.c:233
+#: ../../msn/msn_r1_r.c:276
+msgid "Damit werden Sachen auf|dem Tisch festgehalten."
+msgstr "This keeps things|on the table."
+
+#: ../../msn/msn_r1_r.c:152 ../../msn/msn_r1_r.c:167 ../../msn/msn_r1_r.c:190
+#: ../../msn/msn_r1_r.c:203 ../../msn/msn_r1_r.c:221 ../../msn/msn_r1_r.c:247
+#: ../../msn/msn_r1_r.c:260 ../../msn/msn_r1_r.c:281
+msgid "Schrank"
+msgstr "Cabinet"
+
+#: ../../msn/msn_r1_r.c:153 ../../msn/msn_r1_r.c:168 ../../msn/msn_r1_r.c:183
+#: ../../msn/msn_r1_r.c:186 ../../msn/msn_r1_r.c:195 ../../msn/msn_r1_r.c:204
+#: ../../msn/msn_r1_r.c:222 ../../msn/msn_r1_r.c:248 ../../msn/msn_r1_r.c:262
+#: ../../msn/msn_r1_r.c:264 ../../msn/msn_r1_r.c:267 ../../msn/msn_r1_r.c:282
+#: ../../msn/msn_r2.c:1299
+msgid "Fach"
+msgstr "Storage compartment"
+
+#: ../../msn/msn_r1_r.c:155 ../../msn/msn_r1_r.c:170 ../../msn/msn_r1_r.c:206
+#: ../../msn/msn_r1_r.c:224 ../../msn/msn_r1_r.c:250 ../../msn/msn_r1_r.c:278
+#: ../../msn/msn_r2.c:1254
+msgid "Toilette"
+msgstr "Toilet"
+
+#: ../../msn/msn_r1_r.c:161 ../../msn/msn_r1_r.c:176 ../../msn/msn_r2.c:1283
+msgid "Schachspiel"
+msgstr "Chessboard"
+
+#: ../../msn/msn_r1_r.c:161
+msgid "Es macht wohl Spaá, an|der Decke Schach zu spielen."
+msgstr "I guess it's fun to play|chess on the ceiling."
+
+#: ../../msn/msn_r1_r.c:163
+msgid "Tennisschl„ger"
+msgstr "Tennis racquets"
+
+#: ../../msn/msn_r1_r.c:163
+msgid "Fliegt Boris Becker auch mit?"
+msgstr "Is Boris Becker part of the crew?"
+
+#: ../../msn/msn_r1_r.c:164
+msgid "Tennisball"
+msgstr "Tennis ball"
+
+#: ../../msn/msn_r1_r.c:164 ../../msn/msn_r1_r.c:213
+msgid "Toll!"
+msgstr "Awesome!"
+
+#: ../../msn/msn_r1_r.c:176
+msgid "Dein Magnetschachspiel. Schach war|schon immer deine Leidenschaft."
+msgstr "Your magnetic chess game. Chess|has always been your passion."
+
+#: ../../msn/msn_r1_r.c:178
+msgid "Bett"
+msgstr "Bed"
+
+#: ../../msn/msn_r1_r.c:178
+msgid "Das ist dein Bett. Toll, nicht wahr?"
+msgstr "This is your bed. Great, isn't it?"
+
+#: ../../msn/msn_r1_r.c:183 ../../msn/msn_r1_r.c:186 ../../msn/msn_r1_r.c:195
+msgid "Das ist eins deiner drei F„cher."
+msgstr "It's one of your three storage compartments."
+
+#: ../../msn/msn_r1_r.c:185
+msgid "Alben"
+msgstr "Albums"
+
+#: ../../msn/msn_r1_r.c:185
+msgid "Deine Briefmarkensammlung."
+msgstr "Your stamp collection."
+
+#: ../../msn/msn_r1_r.c:188
+msgid "Es ist ungef„hr 10 m lang und 4 cm dick."
+msgstr "It is about 10 m long and 4 cm thick."
+
+#: ../../msn/msn_r1_r.c:190
+msgid "Das ist dein Schrank."
+msgstr "This is your cabinet."
+
+#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
+msgid "Krimskram"
+msgstr "Junk"
+
+#: ../../msn/msn_r1_r.c:191 ../../msn/msn_r1_r.c:274 ../../msn/msn_r1_r.c:275
+msgid "Es ist nichts brauchbares dabei."
+msgstr "There is nothing useful in there."
+
+#: ../../msn/msn_r1_r.c:192 ../../msn/msn_r1_r.c:273
+msgid "Kleider"
+msgstr "Clothes"
+
+#: ../../msn/msn_r1_r.c:192
+msgid "Es sind Standard-Weltraum-Klamotten."
+msgstr "They are standard space gear."
+
+#: ../../msn/msn_r1_r.c:193 ../../msn/msn_r1_r.c:269 ../../msn/msn_r1_r.c:271
+msgid "Unterw„sche"
+msgstr "Underwear"
+
+#: ../../msn/msn_r1_r.c:194
+msgid "Strmpfe"
+msgstr "Socks"
+
+#: ../../msn/msn_r1_r.c:197 ../../msn/msn_r1_r.c:268
+msgid "Buch"
+msgstr "Book"
+
+#: ../../msn/msn_r1_r.c:197
+msgid "Es ist|\"Per Anhalter durch die Galaxis\"|von Douglas Adams."
+msgstr "This is|\"The Hitchhiker's Guide to the Galaxy\"|by Douglas Adams."
+
+#: ../../msn/msn_r1_r.c:212
+msgid "Herb!"
+msgstr "Austere!"
+
+#: ../../msn/msn_r1_r.c:214
+msgid "Genial!"
+msgstr "Brilliant!"
+
+#: ../../msn/msn_r1_r.c:217
+msgid "Es scheint noch nicht fertig zu sein."
+msgstr "It looks like it is not yet finished."
+
+#: ../../msn/msn_r1_r.c:218
+msgid "Stift"
+msgstr "Pen"
+
+#: ../../msn/msn_r1_r.c:218
+msgid "Ein Kugelschreiber."
+msgstr "A ballpoint pen."
+
+#: ../../msn/msn_r1_r.c:230 ../../msn/msn_r1_r.c:231
+msgid "Poster"
+msgstr "Poster"
+
+#: ../../msn/msn_r1_r.c:230
+msgid "Ein Poster von \"Big Boss\"."
+msgstr "A poster of \"Big Boss\"."
+
+#: ../../msn/msn_r1_r.c:231
+msgid "Ein Poster von \"Rock Desaster\"."
+msgstr "A poster for \"Rock Disaster\"."
+
+#: ../../msn/msn_r1_r.c:232
+msgid "Box"
+msgstr "Speaker"
+
+#: ../../msn/msn_r1_r.c:235
+msgid "Schallplatte"
+msgstr "Record"
+
+#: ../../msn/msn_r1_r.c:235
+msgid "Die Platte ist von \"Big Boss\"."
+msgstr "A record from \"Big Boss\"."
+
+#: ../../msn/msn_r1_r.c:237
+msgid "Schallplattenst„nder"
+msgstr "Record stand"
+
+#: ../../msn/msn_r1_r.c:237
+msgid "Du hast jetzt keine Zeit, in|der Plattensammlung rumzust”bern."
+msgstr "You don't have time to rummage|around the record collection now."
+
+#: ../../msn/msn_r1_r.c:240
+msgid "Plattenspieler"
+msgstr "Record player"
+
+#: ../../msn/msn_r1_r.c:240
+msgid "Sieht aus, als k„me|er aus dem Museum."
+msgstr "Looks like something from a museum."
+
+#: ../../msn/msn_r1_r.c:244
+msgid "Stecker"
+msgstr "Male plug"
+
+#: ../../msn/msn_r1_r.c:261
+msgid "Pistole"
+msgstr "Gun"
+
+#: ../../msn/msn_r1_r.c:261
+msgid "Es ist keine Munition drin."
+msgstr "There is no ammunition in it."
+
+#: ../../msn/msn_r1_r.c:263
+msgid "Bcher"
+msgstr "Books"
+
+#: ../../msn/msn_r1_r.c:263
+msgid "Lauter wissenschaftliche Bcher."
+msgstr "All scientific books."
+
+#: ../../msn/msn_r1_r.c:265
+msgid "Kabelrolle"
+msgstr "Cable reel"
+
+#: ../../msn/msn_r1_r.c:265
+msgid "Da sind mindestens zwanzig Meter drauf."
+msgstr "There is at least 20 meters of cable on it."
+
+#: ../../msn/msn_r1_r.c:269 ../../msn/msn_r1_r.c:271
+msgid "Ich habe keine Lust, in|der Unterw„sche des|Commanders rumzuwhlen."
+msgstr "I don't feel like digging around|in the commander's underwear."
+
+#: ../../msn/msn_r1_r.c:284
+msgid "Ordner"
+msgstr "Folders"
+
+#: ../../msn/msn_r1_r.c:284
+msgid ""
+"Darauf steht \"Dienstanweisungen|zur Mission Supernova\".|Es steht nichts "
+"wichtiges drin."
+msgstr ""
+"It says,\"Instructions for the Mission Supernova.\"|There is nothing "
+"important in it."
+
+#: ../../msn/msn_r1_r.c:291
+msgid "Klo"
+msgstr "Loo"
+
+#: ../../msn/msn_r1_r.c:291
+msgid "Ein Klo mit Saugmechanismus."
+msgstr "A toilet with suction mechanism."
+
+#: ../../msn/msn_r1_r.c:292
+msgid "Dusche"
+msgstr "Shower"
+
+#: ../../msn/msn_r2.c:57
+msgid "Die Raumschiffe sind alle verschlossen."
+msgstr "The spaceships are all locked."
+
+#: ../../msn/msn_r2.c:64 ../../msn/msn_r2.c:1098
+msgid "Unsinn!"
+msgstr "Nonsense!"
+
+#: ../../msn/msn_r2.c:91
+msgid ""
+"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Treffpunkt "
+"Galactica\"."
+msgstr "Funny! You can read the sign now!|It says \"Galactica meeting point\"."
+
+#: ../../msn/msn_r2.c:92
+msgid "Darauf steht:|\"Treffpunkt Galactica\"."
+msgstr "It says:|\"Galactica meeting point\"."
+
+#: ../../msn/msn_r2.c:144
+msgid "Wieso das denn nicht?"
+msgstr "Why the hell not?"
+
+#: ../../msn/msn_r2.c:145 ../../msn/msn_r2.c:154 ../../msn/msn_r2.c:1082
+msgid "Wo bin ich hier?"
+msgstr "Where am I here?"
+
+#: ../../msn/msn_r2.c:146 ../../msn/msn_r2.c:183
+msgid "Wo soll ich die Schuhe ablegen?"
+msgstr "Where should I put my shoes?"
+
+#: ../../msn/msn_r2.c:147
+msgid "Schwachsinn! Ich gehe jetzt nach oben!"
+msgstr "Bullshit! I'm going upstairs now!"
+
+#: ../../msn/msn_r2.c:155
+msgid "Sch”nes Wetter heute, nicht wahr?"
+msgstr "Nice weather today, isn't it?"
+
+#: ../../msn/msn_r2.c:156
+msgid "Wrden Sie mich bitte durchlassen."
+msgstr "Would you please let me through?"
+
+#: ../../msn/msn_r2.c:157
+msgid "Hey Alter, laá mich durch!"
+msgstr "Hey, dude, let me through!"
+
+#: ../../msn/msn_r2.c:164
+msgid "Was haben Sie gesagt?"
+msgstr "What did you say?"
+
+#: ../../msn/msn_r2.c:165
+msgid "Sprechen Sie bitte etwas deutlicher!"
+msgstr "Please speak more clearly!"
+
+#: ../../msn/msn_r2.c:174
+msgid "Durch deinen Helm kannst|du nicht sprechen."
+msgstr "You can't talk with your helmet on."
+
+#: ../../msn/msn_r2.c:189 ../../msn/msn_r2.c:251
+msgid "Was, das wissen Sie nicht?"
+msgstr "What, you don't know that?"
+
+#: ../../msn/msn_r2.c:190 ../../msn/msn_r2.c:252
+msgid "Sie befinden sich im Restaurant|\"Treffpunkt Galactica\"."
+msgstr "You are in the restaurant|\"Galactica meeting point\"."
+
+#: ../../msn/msn_r2.c:191 ../../msn/msn_r2.c:253
+msgid ""
+"Wir sind bei den interessantesten|Ereignissen in der Galaxis|immer zur "
+"Stelle."
+msgstr "We are always there when|interesting things happen|in the galaxy."
+
+#: ../../msn/msn_r2.c:194
+msgid "Wenn Sie meinen."
+msgstr "If you say so."
+
+#: ../../msn/msn_r2.c:199 ../../msn/msn_r2.c:256
+msgid "In der Toilette gibt es|Schlieáf„cher fr Schuhe."
+msgstr "There are lockers for shoes|in the restroom."
+
+#: ../../msn/msn_r2.c:204
+msgid ""
+"Wenn Sie das Lokal betreten|wollen, mssen Sie erst|ihre Schuhe ausziehen."
+msgstr ""
+"If you want to enter the restaurant,|you have to take off your shoes first."
+
+#: ../../msn/msn_r2.c:208
+msgid "Wollen Sie, daá ich Sie rauáschmeiáe?"
+msgstr "You want me to kick you out?"
+
+#: ../../msn/msn_r2.c:216 ../../msn/msn_r2.c:274
+msgid "Hhius otgfh Dgfdrkjlh Fokj gf."
+msgstr "Hhius otgfh Dgfdrkjlh Fokj gf."
+
+#: ../../msn/msn_r2.c:230 ../../msn/msn_s.c:289
+msgid "Halt!"
+msgstr "Halt!"
+
+#: ../../msn/msn_r2.c:232
+msgid "Uhwdejkt!"
+msgstr "Uhwdejkt!"
+
+#: ../../msn/msn_r2.c:241
+msgid "Sie mssen erst ihre Schuhe ausziehen, Sie Trottel!"
+msgstr "You have to take off your shoes first, idiot!"
+
+#: ../../msn/msn_r2.c:243
+msgid ""
+"Was f„llt ihnen ein!|Sie k”nnen doch ein Lokal|nicht mit Schuhen betreten!"
+msgstr ""
+"What are you thinking!|You cannot enter a restaurant|with your shoes on!"
+
+#: ../../msn/msn_r2.c:249
+msgid "Fragen Sie nicht so doof!"
+msgstr "Quit asking so stupidly!"
+
+#: ../../msn/msn_r2.c:262
+msgid "Das wrde ich an ihrer|Stelle nicht versuchen!"
+msgstr "I would not try that if I were you!"
+
+#: ../../msn/msn_r2.c:300
+msgid "Du ziehst deine Schuhe|aus und legst sie in|eins der Schlieáf„cher."
+msgstr "You remove your shoes|and put them in one|of the lockers."
+
+#: ../../msn/msn_r2.c:307
+msgid "Du ziehst deine Schuhe wieder an."
+msgstr "You put your shoes on again."
+
+#: ../../msn/msn_r2.c:311
+msgid ""
+"Du durchsuchst die Klos nach|anderen brauchbaren Sachen,|findest aber nichts."
+msgstr "You search the toilet|for other useful items,|but find nothing."
+
+#: ../../msn/msn_r2.c:316
+msgid "Bevor du aufs Klo gehst,|solltest du besser deinen|Raumanzug ausziehen."
+msgstr "Before you use the toilet,| you had better take off|your space suit."
+
+#: ../../msn/msn_r2.c:319
+msgid "Du gehst seit sieben Jahren das|erste Mal wieder aufs Klo!"
+msgstr "You're now back in a lavatory,|for the first time in seven years!"
+
+#: ../../msn/msn_r2.c:322
+msgid ""
+"In einem der Schlieáf„cher,|die sich auch im Raum befinden,|findest du "
+"einige Mnzen."
+msgstr "You find some coins in one of|the lockers in this room."
+
+#: ../../msn/msn_r2.c:332
+msgid "Mach doch zuerst das Fach leer!"
+msgstr "First, empty the drawer!"
+
+#: ../../msn/msn_r2.c:340
+msgid "Mnze"
+msgstr "Coin"
+
+#: ../../msn/msn_r2.c:353
+msgid ""
+"Komisch! Auf einmal kannst du|das Schild lesen! Darauf steht:|\"Zutritt nur "
+"fr Personal\"."
+msgstr ""
+"Strange! Suddenly you can |read the sign! It states:|\"Access Only for "
+"Personnel\"."
+
+#: ../../msn/msn_r2.c:361
+msgid ""
+"Komisch! Auf einmal kannst|du das Schild lesen!|Darauf steht:\"Toilette\"."
+msgstr "Strange! Suddenly you can read the sign!|It says:\"Toilet\"."
+
+#: ../../msn/msn_r2.c:362
+msgid "Darauf steht:|\"Toilette\"."
+msgstr "It says:|\"Toilet\"."
+
+#: ../../msn/msn_r2.c:372
+msgid "Du ziehst den Raumanzug wieder an."
+msgstr "You put the space suit back on."
+
+#: ../../msn/msn_r2.c:382 ../../msn/msn_r3.c:487 ../../msn/msn_r3.c:539
+msgid "Nicht so gewaltt„tig!"
+msgstr "Not so rough!"
+
+#: ../../msn/msn_r2.c:603
+msgid ""
+"Du hast das komische Gefhl,|daá drauáen etwas passiert,|und eilst zum "
+"Restaurant."
+msgstr ""
+"You get the funny feeling,|that something has happened outside,|and hurry to "
+"the restaurant."
+
+#: ../../msn/msn_r2.c:617
+msgid "Da! Die Supernova!"
+msgstr "There! The supernova!"
+
+#: ../../msn/msn_r2.c:630
+msgid "Zwei Minuten sp„ter ..."
+msgstr "Two minutes later ..."
+
+#: ../../msn/msn_r2.c:638
+msgid "Hey, was machen Sie in meinem Raumschiff?!"
+msgstr "Hey, what are you doing in my spaceship?!"
+
+#: ../../msn/msn_r2.c:641
+msgid "Geben Sie mir sofort meine Brieftasche wieder!"
+msgstr "Just give me my wallet back!"
+
+#: ../../msn/msn_r2.c:644
+msgid "Versuchen Sie das ja nicht nochmal!"
+msgstr "Do not try that again!"
+
+#: ../../msn/msn_r2.c:647
+msgid "Und jetzt raus mit Ihnen!"
+msgstr "And now, get out of here!"
+
+#: ../../msn/msn_r2.c:660
+msgid "Zehn Minuten sp„ter ..."
+msgstr "Ten Minutes later ..."
+
+#: ../../msn/msn_r2.c:690
+msgid "K”nnten Sie mir ein Gericht empfehlen?"
+msgstr "Could you recommend a dish for me?"
+
+#: ../../msn/msn_r2.c:691
+msgid "Wie lange dauert es denn noch bis zur Supernova?"
+msgstr "How long do we have before the supernova?"
+
+#: ../../msn/msn_r2.c:692
+msgid "Sie kommen mir irgendwie bekannt vor."
+msgstr "You look kind of familiar to me."
+
+#: ../../msn/msn_r2.c:704
+msgid "Hey, Witzkeks, laá die Brieftasche da liegen!"
+msgstr "Hey, Joker, leave the Wallet there!"
+
+#: ../../msn/msn_r2.c:708
+msgid "Das ist nicht deine."
+msgstr "This is not yours."
+
+#: ../../msn/msn_r2.c:713
+msgid "Roger ist im Moment nicht ansprechbar."
+msgstr "Roger is not available at the moment."
+
+#: ../../msn/msn_r2.c:718
+msgid "Bestellen Sie lieber nichts!"
+msgstr "Do Not order anything!"
+
+#: ../../msn/msn_r2.c:719
+msgid ""
+"Ich habe vor zwei Stunden mein Essen|bestellt und immer noch nichts bekommen."
+msgstr "I ordered my food two hours ago|and I still haven't received it."
+
+#: ../../msn/msn_r2.c:721
+msgid "Noch mindestens zwei Stunden."
+msgstr "At least two more hours."
+
+#: ../../msn/msn_r2.c:722
+msgid ""
+"Haben Sie keine Idee, womit wir uns|bis dahin die Zeit vertreiben k”nnen?"
+msgstr "Do you have an idea what we could|do to pass the time?"
+
+#: ../../msn/msn_r2.c:723
+msgid ""
+"Hmm ... im Moment f„llt mir nichts ein, aber vielleicht|hat der Spieler des "
+"Adventures ja eine Idee."
+msgstr ""
+"Hmm ... at the moment I'm not sure, but maybe|the Adventure Game Player has "
+"an idea."
+
+#: ../../msn/msn_r2.c:725
+msgid "Nein, Sie mssen sich irren.|Ich kenne Sie jedenfalls nicht."
+msgstr "No, you must be mistaken.|I don't know you."
+
+#: ../../msn/msn_r2.c:726
+msgid "Aber ihre Kleidung habe ich irgendwo schon mal gesehen."
+msgstr "However, I've seen your clothes somewhere before."
+
+#: ../../msn/msn_r2.c:727
+msgid "Ja? Komisch."
+msgstr "Yes? Strange."
+
+#: ../../msn/msn_r2.c:728
+msgid "Jetzt weiá ich's. Sie sind Roger W. !"
+msgstr "Now I know. You are Roger W.!"
+
+#: ../../msn/msn_r2.c:729
+msgid "Pssst, nicht so laut, sonst will|gleich jeder ein Autogramm von mir."
+msgstr "Pssst, not so loud, otherwise everyone|will want an autograph from me."
+
+#: ../../msn/msn_r2.c:730
+msgid ""
+"Ich habe extra eine Maske auf, damit|ich nicht von jedem angelabert werde."
+msgstr "I'm deliberately wearing a mask so I don't|get yakked on by everyone."
+
+#: ../../msn/msn_r2.c:731
+msgid "Žh ... ach so."
+msgstr "Uh... I see."
+
+#: ../../msn/msn_r2.c:732
+msgid "Wann kommt denn das n„chste SQ-Abenteuer raus?"
+msgstr "When does the next SQ adventure come out?"
+
+#: ../../msn/msn_r2.c:733
+msgid "SQ 127 máte in einem Monat erscheinen."
+msgstr "SQ 127 should come out in a month."
+
+#: ../../msn/msn_r2.c:734
+msgid "Was, Teil 127 ??"
+msgstr "What, part 127 ??"
+
+#: ../../msn/msn_r2.c:735
+msgid "Bei uns ist gerade Teil 8 erschienen."
+msgstr "Part 8 has just been released."
+
+#: ../../msn/msn_r2.c:736
+msgid "Hmm ... von welchem Planeten sind Sie denn?"
+msgstr "Hmm ... what planet are you from?"
+
+#: ../../msn/msn_r2.c:737
+msgid "Von der Erde."
+msgstr "From the Earth."
+
+#: ../../msn/msn_r2.c:738
+msgid "Erde? Nie geh”rt."
+msgstr "Earth? Never heard of it."
+
+#: ../../msn/msn_r2.c:739
+msgid ""
+"Wahrscheinlich irgendein Kaff, wo Neuerungen|erst hundert Jahre sp„ter "
+"hingelangen."
+msgstr "Probably some dump, where innovations|happen only a century late."
+
+#: ../../msn/msn_r2.c:740
+msgid "Žh ... kann sein."
+msgstr "Uh ... maybe."
+
+#: ../../msn/msn_r2.c:741
+msgid "Aber eins mssen Sie mir erkl„ren!"
+msgstr "But you must tell me!"
+
+#: ../../msn/msn_r2.c:742
+msgid ""
+"Wieso sehen Sie mir so verdammt „hnlich, wenn|Sie nicht von Xenon stammen, "
+"wie ich?"
+msgstr ""
+"Why do you look so damn similar to me|if you are not from Xenon, like me?"
+
+#: ../../msn/msn_r2.c:743
+msgid ""
+"Keine Ahnung. Bis jetzt dachte ich immer, Sie w„ren ein|von Programmierern "
+"auf der Erde erfundenes Computersprite."
+msgstr ""
+"I have no idea. Until now, I've always thought you were|a computer sprite, "
+"invented by programmers on Earth."
+
+#: ../../msn/msn_r2.c:744
+msgid "Was? Lachhaft!"
+msgstr "What? Ridiculous!"
+
+#: ../../msn/msn_r2.c:745
+msgid "Wie erkl„ren Sie sich dann,|daá ich ihnen gegenbersitze?"
+msgstr "Then how do you explain the fact that|I am seated opposite you?"
+
+#: ../../msn/msn_r2.c:746
+msgid "Ja, das ist in der Tat seltsam."
+msgstr "Yes, this is definitely strange."
+
+#: ../../msn/msn_r2.c:747
+msgid ""
+"Halt, jetzt weiá ich es. Sie sind von der Konkurrenz,|von \"Georgefilm Games"
+"\" und wollen mich verunsichern."
+msgstr ""
+"Wait, now I understand! You are from the competition,|\"Georgefilm Games\", "
+"and want to unnerve me."
+
+#: ../../msn/msn_r2.c:748
+msgid "Nein, ich bin nur ein Ahnungsloser Koch von der Erde."
+msgstr "No, I'm just a clueless cook from the Earth."
+
+#: ../../msn/msn_r2.c:749
+msgid ""
+"Na gut, ich glaube Ihnen. Lassen wir jetzt|dieses Thema, langsam wird es mir "
+"zu bunt!"
+msgstr ""
+"Fair enough, I believe you. Let's move away from|this topic before it goes "
+"too far!"
+
+#: ../../msn/msn_r2.c:761
+msgid "Eine Partie Schach! Das ist eine gute Idee."
+msgstr "A game of chess! That's a good idea."
+
+#: ../../msn/msn_r2.c:762
+msgid "Schach? Was ist das denn?"
+msgstr "Chess? What is that?"
+
+#: ../../msn/msn_r2.c:763
+msgid "Schach ist ein interessantes Spiel.|Ich werde es Ihnen erkl„ren."
+msgstr "Chess is an interesting game.|I will explain it to you."
+
+#: ../../msn/msn_r2.c:769
+msgid "Knapp zwei Stunden sp„ter ..."
+msgstr "Almost two hours later ..."
+
+#: ../../msn/msn_r2.c:787
+msgid "Roger W. steht kurz vor dem Schachmatt|und grbelt nach einem Ausweg."
+msgstr "Roger W. is on the brink of checkmate|and trying to find a way out."
+
+#: ../../msn/msn_r2.c:831
+msgid "Darf ich hier Platz nehmen?"
+msgstr "Can I sit here?"
+
+#: ../../msn/msn_r2.c:832
+msgid "Klar!"
+msgstr "Sure!"
+
+#: ../../msn/msn_r2.c:892
+msgid "Du tippst auf den Tasten herum,|aber es passiert nichts."
+msgstr "You tap the buttons,|but nothing happens."
+
+#: ../../msn/msn_r2.c:917
+msgid "Ach, Ihnen geh”rt die. Ich habe sie eben im Sand gefunden."
+msgstr "Oh, it is yours. I just found it in the sand."
+
+#: ../../msn/msn_r2.c:918
+msgid "Nein, tut mir leid."
+msgstr "No, I'm sorry."
+
+#: ../../msn/msn_r2.c:924
+msgid "Nein, danke. Ich bleibe lieber hier."
+msgstr "No thanks. I'd rather stay here."
+
+#: ../../msn/msn_r2.c:925
+msgid "Ja, das w„re gut."
+msgstr "Yes, that would be good."
+
+#: ../../msn/msn_r2.c:931
+msgid "Zur Erde."
+msgstr "To Earth."
+
+#: ../../msn/msn_r2.c:932
+msgid "Zum Pr„sident der Galaxis."
+msgstr "To the President of the Galaxy."
+
+#: ../../msn/msn_r2.c:933
+msgid "Nach Xenon."
+msgstr "To Xenon."
+
+#: ../../msn/msn_r2.c:934
+msgid "Mir egal, setzen Sie mich irgendwo ab!"
+msgstr "I don't care, drop me off somewhere!"
+
+#: ../../msn/msn_r2.c:940
+msgid "Ich habe gerade Ihre Brieftasche gefunden!"
+msgstr "I just found your wallet!"
+
+#: ../../msn/msn_r2.c:941
+msgid "Sie lag da drben hinter einem Felsen."
+msgstr "It was over there behind a rock."
+
+#: ../../msn/msn_r2.c:942
+msgid "Ich wollte nur wissen, ob Sie die Brieftasche wiederhaben."
+msgstr "I just wanted to know if you got the wallet back."
+
+#: ../../msn/msn_r2.c:959
+msgid "Was wollen Sie denn schon wieder?"
+msgstr "What do you want again?"
+
+#: ../../msn/msn_r2.c:965
+msgid ""
+"Haben Sie zuf„llig meine Brieftasche gesehen?|Ich muá Sie irgendwo verloren "
+"haben."
+msgstr "Have you seen my wallet, by chance?|I must have lost it somewhere."
+
+#: ../../msn/msn_r2.c:966
+msgid ""
+"Ohne die Brieftasche kann ich nicht|starten, weil meine Keycard darin ist."
+msgstr "Without my wallet I can not take off|because my keycard is in it."
+
+#: ../../msn/msn_r2.c:975
+msgid "Oh! Vielen Dank."
+msgstr "Oh! Many thanks."
+
+#: ../../msn/msn_r2.c:976
+msgid "Wo ist denn Ihr Raumschiff?|Soll ich Sie ein Stck mitnehmen?"
+msgstr "Where is your spaceship?|Shall I give you a lift?"
+
+#: ../../msn/msn_r2.c:979
+msgid "Wo wollen Sie denn hin?"
+msgstr "Where do you want to go?"
+
+#: ../../msn/msn_r2.c:981
+msgid "Ok, steigen Sie ein!"
+msgstr "Ok, get in!"
+
+#: ../../msn/msn_r2.c:983
+msgid "Wie Sie wollen."
+msgstr "As you wish."
+
+#: ../../msn/msn_r2.c:1030
+msgid "Huch, du lebst ja noch!"
+msgstr "Huh, you're still alive!"
+
+#: ../../msn/msn_r2.c:1057
+msgid ""
+"Das wrde ich jetzt nicht tun, schlieálich|steht Roger W. neben seinem "
+"Schiff."
+msgstr "I wouldn't do that now, because|Roger W. is standing beside his ship."
+
+#: ../../msn/msn_r2.c:1069
+msgid "Alle Raumschiffe haben|den Planeten verlassen."
+msgstr "All spaceships|have left the planet."
+
+#: ../../msn/msn_r2.c:1071
+msgid "Alle Raumschiffe haben den Planeten|verlassen, bis auf eins ..."
+msgstr "All spaceships have left the planet,|except for one ..."
+
+#: ../../msn/msn_r2.c:1083
+msgid "Was wollen Sie von mir?"
+msgstr "What do you want from me?"
+
+#: ../../msn/msn_r2.c:1084
+msgid "Hilfe!!"
+msgstr "Help!!"
+
+#: ../../msn/msn_r2.c:1085
+msgid "Warum sprechen Sie meine Sprache?"
+msgstr "Why do you speak my language?"
+
+#: ../../msn/msn_r2.c:1091
+msgid "Ja, ich bin einverstanden."
+msgstr "Yes, I agree."
+
+#: ../../msn/msn_r2.c:1092
+msgid "Nein, lieber bleibe ich hier, als mit Ihnen zu fliegen."
+msgstr "No, I'd rather stay here than fly with you."
+
+#: ../../msn/msn_r2.c:1141
+msgid "Ich glaube, er wacht auf."
+msgstr "I think he's waking up."
+
+#: ../../msn/msn_r2.c:1143
+msgid "Ja, sieht so aus."
+msgstr "Yes, it looks like it."
+
+#: ../../msn/msn_r2.c:1148
+msgid "Sie befinden sich im Raumschiff \"Dexxa\"."
+msgstr "You are in the spaceship \"Dexxa\"."
+
+#: ../../msn/msn_r2.c:1149
+msgid ""
+"Wir kommen vom Planeten Axacuss und|sind aus dem gleichen Grund hier wie "
+"Sie,|n„mlich zur Erforschung der Supernova."
+msgstr ""
+"We come from the planet Axacuss|and are here for the same reason as you,|"
+"namely, to observe the supernova."
+
+#: ../../msn/msn_r2.c:1151
+msgid "Sie k”nnen beruhigt sein, wir wollen Ihnen nur helfen."
+msgstr "Don't worry, we just want to help you."
+
+#: ../../msn/msn_r2.c:1152
+msgid "Und wieso hat der Typ im Raumanzug|eben auf mich geschossen?"
+msgstr "And why did the guy in the space suit|shoot at me?"
+
+#: ../../msn/msn_r2.c:1153
+msgid "Das war eine Schreckreaktion."
+msgstr "It was a reflex."
+
+#: ../../msn/msn_r2.c:1154
+msgid ""
+"Schlieálich ist es fr uns das erste Mal,|daá wir auf eine fremde "
+"Intelligenz treffen."
+msgstr ""
+"After all, this is the first time we have|come across an alien intelligence."
+
+#: ../../msn/msn_r2.c:1155
+msgid "Wie wir festgestellt haben, ist|Ihr Raumschiff v”llig zerst”rt."
+msgstr "As we've established, your spaceship|is completely destroyed."
+
+#: ../../msn/msn_r2.c:1156
+msgid "Wahrscheinlich k”nnen Sie nicht|mehr auf ihren Heimatplaneten zurck."
+msgstr "You may not be able to return to your home planet."
+
+#: ../../msn/msn_r2.c:1157
+msgid "Wir bieten Ihnen an, Sie|mit nach Axacuss zu nehmen."
+msgstr "We offer to take you|with us to Axacuss."
+
+#: ../../msn/msn_r2.c:1160 ../../msn/msn_r2.c:1169
+msgid "Sind Sie sich da wirklich sicher?"
+msgstr "Are you really sure about that?"
+
+#: ../../msn/msn_r2.c:1161 ../../msn/msn_r2.c:1170
+msgid "Wenn ich es mir genau berlege,|fliege ich doch lieber mit."
+msgstr "If I think about it,|I'd rather fly with you."
+
+#: ../../msn/msn_r2.c:1163
+msgid ""
+"Gut, wir nehmen Sie unter der|Bedingung mit, daá wir Sie jetzt|sofort in "
+"Tiefschlaf versetzen drfen."
+msgstr ""
+"All right, we'll take you with us|on condition that we can put you|into a "
+"deep sleep right now."
+
+#: ../../msn/msn_r2.c:1164
+msgid "Diese Art des Reisens ist Ihnen|ja scheinbar nicht unbekannt."
+msgstr "You seem to be familiar with|this kind of traveling."
+
+#: ../../msn/msn_r2.c:1165
+msgid ""
+"Sie werden in vier Jahren nach der|Landung der \"Dexxa\" wieder aufgeweckt."
+msgstr ""
+"You will be woken up again in four years|after the \"Dexxa\" has landed."
+
+#: ../../msn/msn_r2.c:1166
+msgid "Sind Sie damit einverstanden?"
+msgstr "Are you okay with this?"
+
+#: ../../msn/msn_r2.c:1172
+msgid "Gut, haben Sie noch irgendwelche Fragen?"
+msgstr "Good, do you have any questions?"
+
+#: ../../msn/msn_r2.c:1174
+msgid "Keine Panik!"
+msgstr "Don't panic!"
+
+#: ../../msn/msn_r2.c:1175
+msgid "Wir tun Ihnen nichts."
+msgstr "We are not going to hurt you."
+
+#: ../../msn/msn_r2.c:1177
+msgid "Wir sprechen nicht ihre Sprache,|sondern Sie sprechen unsere."
+msgstr "We don't speak your language,|you speak ours."
+
+#: ../../msn/msn_r2.c:1178
+msgid ""
+"Nach einer Gehirnanalyse konnten|wir Ihr Gehirn an unsere Sprache anpassen."
+msgstr ""
+"After a brain analysis, we were able|to adapt your brain to our speech."
+
+#: ../../msn/msn_r2.c:1179
+msgid "Was? Sie haben in mein Gehirn eingegriffen?"
+msgstr "What? You've interfered with my brain?"
+
+#: ../../msn/msn_r2.c:1180
+msgid "Keine Angst, wir haben sonst nichts ver„ndert."
+msgstr "Don't worry, we haven't changed anything else."
+
+#: ../../msn/msn_r2.c:1181
+msgid "Ohne diesen Eingriff w„ren|Sie verloren gewesen."
+msgstr "Without this intervention,|you would have been lost."
+
+#: ../../msn/msn_r2.c:1186
+msgid "Ich habe keine weiteren Fragen mehr."
+msgstr "I have no more questions."
+
+#: ../../msn/msn_r2.c:1187
+msgid "Gut, dann versetzen wir Sie jetzt in Tiefschlaf."
+msgstr "Good, let's put you in a deep sleep now."
+
+#: ../../msn/msn_r2.c:1188
+msgid "Gute Nacht!"
+msgstr "Good night!"
+
+#: ../../msn/msn_r2.c:1213 ../../msn/msn_r2.c:1214
+msgid "Stein"
+msgstr "Stone"
+
+#: ../../msn/msn_r2.c:1215
+msgid "Loch"
+msgstr "Opening"
+
+#: ../../msn/msn_r2.c:1215
+msgid "Es scheint eine H”hle zu sein."
+msgstr "It seems to be a cave."
+
+#: ../../msn/msn_r2.c:1221
+msgid "Hier bist du gerade hergekommen."
+msgstr "You just came from there."
+
+#: ../../msn/msn_r2.c:1229 ../../msn/msn_r2.c:1310 ../../msn/msn_r2.c:1319
+msgid "H”hle"
+msgstr "Cave"
+
+#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
+#: ../../msn/msn_r3.c:1687
+msgid "Schild"
+msgstr "Sign"
+
+#: ../../msn/msn_r2.c:1230 ../../msn/msn_r2.c:1243 ../../msn/msn_r2.c:1257
+msgid "Diese Schrift kannst du nicht lesen."
+msgstr "You cannot read these inscriptions."
+
+#: ../../msn/msn_r2.c:1231
+msgid "Eingang"
+msgstr "Entrance"
+
+#: ../../msn/msn_r2.c:1232 ../../msn/msn_r2.c:1318
+msgid "Stern"
+msgstr "Star"
+
+#: ../../msn/msn_r2.c:1233 ../../msn/msn_r2.c:1234 ../../msn/msn_r2.c:1309
+msgid "Raumschiff"
+msgstr "Spaceship"
+
+#: ../../msn/msn_r2.c:1240
+msgid "Portier"
+msgstr "Doorman"
+
+#: ../../msn/msn_r2.c:1240
+msgid "Du siehst doch selbst, wie er aussieht."
+msgstr "You can see for yourself what he looks like."
+
+#: ../../msn/msn_r2.c:1242 ../../msn/msn_r3.c:1480 ../../msn/msn_r3.c:1545
+#: ../../msn/msn_r3.c:1560 ../../msn/msn_r3.c:1569 ../../msn/msn_r3.c:1580
+#: ../../msn/msn_r3.c:1582 ../../msn/msn_r3.c:1584 ../../msn/msn_r3.c:1586
+#: ../../msn/msn_r3.c:1596 ../../msn/msn_r3.c:1609 ../../msn/msn_r3.c:1610
+#: ../../msn/msn_r3.c:1611 ../../msn/msn_r3.c:1621 ../../msn/msn_r3.c:1633
+#: ../../msn/msn_r3.c:1644 ../../msn/msn_r3.c:1656 ../../msn/msn_r3.c:1667
+#: ../../msn/msn_r3.c:1688
+msgid "Tr"
+msgstr "Door"
+
+#: ../../msn/msn_r2.c:1245
+msgid "Kaugummi"
+msgstr "Chewing gum"
+
+#: ../../msn/msn_r2.c:1246
+msgid "Gummib„rchen"
+msgstr "Gummy bear"
+
+#: ../../msn/msn_r2.c:1247
+msgid "Schokokugel"
+msgstr "Chocolate ball"
+
+#: ../../msn/msn_r2.c:1248
+msgid "šberraschungsei"
+msgstr "Surprise egg"
+
+#: ../../msn/msn_r2.c:1249
+msgid "Lakritz"
+msgstr "Liquorice"
+
+#: ../../msn/msn_r2.c:1250
+msgid "Tablette"
+msgstr "Pill"
+
+#: ../../msn/msn_r2.c:1250
+msgid ""
+"Die Plastikhlle zeigt einen|Mund mit einer Sprechblase. Was|darin steht, "
+"kannst du nicht lesen."
+msgstr ""
+"The plastic envelope shows|a mouth with a speech bubble.|You can't read what "
+"it says."
+
+#: ../../msn/msn_r2.c:1253
+msgid "Automat"
+msgstr "Vending machine"
+
+#: ../../msn/msn_r2.c:1253
+msgid "Sieht aus wie ein Kaugummiautomat."
+msgstr "Looks like a gum dispenser."
+
+#: ../../msn/msn_r2.c:1254
+msgid "Die Toiletten sind denen|auf der Erde sehr „hnlich."
+msgstr "The toilets are very similar|to those on Earth."
+
+#: ../../msn/msn_r2.c:1258 ../../msn/msn_r2.c:1269
+msgid "Treppe"
+msgstr "Staircase"
+
+#: ../../msn/msn_r2.c:1260
+msgid "Mnzen"
+msgstr "Coins"
+
+#: ../../msn/msn_r2.c:1260
+msgid "Es sind seltsame|K”pfe darauf abgebildet."
+msgstr "They have strange|heads on them."
+
+#: ../../msn/msn_r2.c:1262
+msgid "Tablettenhlle"
+msgstr "Pill envelope"
+
+#: ../../msn/msn_r2.c:1262
+msgid ""
+"Darauf steht:\"Wenn Sie diese|Schrift jetzt lesen k”nnen,|hat die Tablette "
+"gewirkt.\""
+msgstr "It says,\"If you can read|this writing now,|the pill worked.\""
+
+#: ../../msn/msn_r2.c:1270
+msgid "Stuhl"
+msgstr "Chair"
+
+#: ../../msn/msn_r2.c:1271
+msgid "Schuhe"
+msgstr "Shoes"
+
+#: ../../msn/msn_r2.c:1271
+msgid "Wie ist der denn mit|Schuhen hier reingekommen?"
+msgstr "How did he get in here|with his shoes on?"
+
+#: ../../msn/msn_r2.c:1278
+msgid "Froschgesicht"
+msgstr "Frog face"
+
+#: ../../msn/msn_r2.c:1279
+msgid "Gekritzel"
+msgstr "Scribble"
+
+#: ../../msn/msn_r2.c:1279
+msgid "\"Mr Spock was here\""
+msgstr "\"Mr Spock was here\""
+
+#: ../../msn/msn_r2.c:1280
+msgid "Brieftasche"
+msgstr "Wallet"
+
+#: ../../msn/msn_r2.c:1281
+msgid "Speisekarte"
+msgstr "Menu"
+
+#: ../../msn/msn_r2.c:1281
+msgid "\"Heute empfehlen wir:|Fonua Opra mit Ulk.\""
+msgstr "\"Today we recommend: Fonua Opra with a joke.\""
+
+#: ../../msn/msn_r2.c:1282
+msgid "Tasse"
+msgstr "Cup"
+
+#: ../../msn/msn_r2.c:1282
+msgid "Sie enth„lt eine grnliche Flssigkeit."
+msgstr "It contains a greenish liquid."
+
+#: ../../msn/msn_r2.c:1284
+msgid "10-Buckazoid-Schein"
+msgstr "A 10 buckazoid bill"
+
+#: ../../msn/msn_r2.c:1284
+msgid "Nicht gerade sehr viel Geld."
+msgstr "Not a lot of money."
+
+#: ../../msn/msn_r2.c:1286 ../../msn/msn_r2.c:1297
+msgid "Keycard von Roger"
+msgstr "Roger's keycard"
+
+#: ../../msn/msn_r2.c:1301
+msgid "Anzeige"
+msgstr "Display"
+
+#: ../../msn/msn_r2.c:1301 ../../msn/msn_r2.c:1302
+msgid "Hmm, seltsame Anzeigen."
+msgstr "Hmm, weird instruments."
+
+#: ../../msn/msn_r2.c:1308
+msgid "Roger W."
+msgstr "Roger W."
+
+#: ../../msn/msn_r2.c:1317
+msgid "Ufo"
+msgstr "UFO"
+
+#: ../../msn/msn_r2.c:1317
+msgid "Der Eingang scheint offen zu sein."
+msgstr "The entrance appears to be open."
+
+#: ../../msn/msn_r3.c:27
+msgid "Du drckst den Knopf,|aber nichts passiert."
+msgstr "You push the button,|but nothing happens."
+
+#: ../../msn/msn_r3.c:88
+msgid "Bei deinem Fluchtversuch hat|dich der Roboter erschossen."
+msgstr "When you tried to escape,|the robot shot you."
+
+#: ../../msn/msn_r3.c:91
+msgid "Du iát etwas, aber|es schmeckt scheuálich."
+msgstr "You're eating something,|but it tastes horrible."
+
+#: ../../msn/msn_r3.c:171
+msgid "Du wachst auf und findest dich in|einem geschlossenen Raum wieder."
+msgstr "You wake up and find yourself|in a closed room."
+
+#: ../../msn/msn_r3.c:230
+msgid "Žh ... nein, mein Name ist Mller."
+msgstr "Uh... no, my name is Mller."
+
+#: ../../msn/msn_r3.c:231
+msgid "Oh, ich habe mich im Gang vertan."
+msgstr "Oh, I got lost."
+
+#: ../../msn/msn_r3.c:237
+msgid "Wrden Sie mich bitte zum Fahrstuhl lassen?"
+msgstr "Will you please let me go to the elevator?"
+
+#: ../../msn/msn_r3.c:238
+msgid "Ich gehe wieder."
+msgstr "I'm leaving."
+
+#: ../../msn/msn_r3.c:243
+msgid "Dann gehe ich eben wieder."
+msgstr "Then I will be going."
+
+#: ../../msn/msn_r3.c:244
+msgid "Ach, halten Sie's Maul, ich gehe trotzdem!"
+msgstr "Oh, shut up, I'm leaving anyway!"
+
+#: ../../msn/msn_r3.c:245 ../../msn/msn_r3.c:246
+msgid "Wenn Sie mich durchlassen gebe ich Ihnen %d Xa."
+msgstr "I will give you %d Xa if you let me through."
+
+#: ../../msn/msn_r3.c:258
+msgid "Sie schon wieder?"
+msgstr "You again?"
+
+#: ../../msn/msn_r3.c:264
+msgid "Halt! Sie sind doch dieser Hummel.|Bleiben Sie sofort stehen!"
+msgstr "Stop! You're this Hummel.|Stop right there!"
+
+#: ../../msn/msn_r3.c:266
+msgid "Sehr witzig!"
+msgstr "Very funny!"
+
+#: ../../msn/msn_r3.c:269
+msgid "Kann auch sein, auf jeden Fall|sind Sie der Nicht-Axacussaner."
+msgstr "Well, you're the non-Axacussan,|you know."
+
+#: ../../msn/msn_r3.c:273
+msgid "Nein!"
+msgstr "No!"
+
+#: ../../msn/msn_r3.c:310
+msgid "Das máte schon ein biáchen mehr sein."
+msgstr "It should be a little more than that."
+
+#: ../../msn/msn_r3.c:324
+msgid "Ok, dann machen Sie daá Sie wegkommen!"
+msgstr "Okay, then get out of here!"
+
+#: ../../msn/msn_r3.c:430
+msgid "Der Axacussaner hat dich erwischt."
+msgstr "The Axacussan caught you."
+
+#: ../../msn/msn_r3.c:547
+msgid ""
+"Diese Tr wrde ich lieber|nicht ”ffnen. Nach dem Schild zu|urteilen, ist "
+"jemand in dem Raum."
+msgstr ""
+"I'd rather not open that door.|Judging by the sign, there's|someone in that "
+"room."
+
+#: ../../msn/msn_r3.c:642
+msgid "Du stellst dich hinter die S„ule."
+msgstr "You stand behind the column."
+
+#: ../../msn/msn_r3.c:656
+msgid "Hmm, er scheint kaputt zu sein."
+msgstr "Hmm, it seems to be broken."
+
+#: ../../msn/msn_r3.c:696
+msgid "Welche Zahlenkombination willst|du eingeben?"
+msgstr "Which combination do you want|to enter?"
+
+#: ../../msn/msn_r3.c:708
+msgid ""
+"Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code "
+"zusammenh„ngen."
+msgstr ""
+"Hmm, that doesn't really work,|but somehow the number|must be related to the "
+"code."
+
+#: ../../msn/msn_r3.c:710
+msgid "Das war die falsche Kombination."
+msgstr "That combination is incorrect."
+
+#: ../../msn/msn_r3.c:748
+msgid "Streng geheim"
+msgstr "Strictly secret"
+
+#: ../../msn/msn_r3.c:749
+msgid "418-98"
+msgstr "418-98"
+
+#: ../../msn/msn_r3.c:750
+msgid "Sehr geehrter Dr. Hansi,"
+msgstr "Dear Dr. Hansi,"
+
+#: ../../msn/msn_r3.c:751
+msgid "Ich muá Ihren Roboterexperten ein Lob aussprechen. Die"
+msgstr "I must commend your robot expert. The imitation"
+
+#: ../../msn/msn_r3.c:752
+msgid "Imitation von Horst Hummel ist perfekt gelungen, wie ich"
+msgstr "of Horst Hummel was a perfect success, as I found"
+
+#: ../../msn/msn_r3.c:753
+msgid "heute bei der šbertragung des Interviews feststellen"
+msgstr "out today during the broadcast of the interview."
+
+#: ../../msn/msn_r3.c:754
+msgid "konnte. Dem Aufschwung Ihrer Firma durch die Werbe-"
+msgstr "Nothing should stand in the way of your company's"
+
+#: ../../msn/msn_r3.c:755
+msgid "kampagne mit dem falschen Horst Hummel drfte ja jetzt"
+msgstr "recovery through the advertising campaign with"
+
+#: ../../msn/msn_r3.c:756
+msgid "nichts mehr im Wege stehen."
+msgstr "the false Horst Hummel now."
+
+#: ../../msn/msn_r3.c:757
+msgid "PS: Herzlichen zum Geburtstag!"
+msgstr "PS: Happy Birthday!"
+
+#: ../../msn/msn_r3.c:758
+msgid "Hochachtungsvoll"
+msgstr "Yours sincerely"
+
+#: ../../msn/msn_r3.c:759
+msgid "Commander Sumoti"
+msgstr "Commander Sumoti"
+
+#: ../../msn/msn_r3.c:766
+msgid "Nicht zu fassen!"
+msgstr "I can't believe it!"
+
+#: ../../msn/msn_r3.c:838
+msgid "Hey, hinter dem Bild ist Geld|versteckt. Ich nehme es mit."
+msgstr "Hey, there's money hidden behind that|picture. I'll take it with me."
+
+#: ../../msn/msn_r3.c:1047
+msgid "DR. ALAB HANSI"
+msgstr "DR. ALAB HANSI"
+
+#: ../../msn/msn_r3.c:1047
+msgid "ALAB HANSI"
+msgstr "ALAB HANSI"
+
+#: ../../msn/msn_r3.c:1048
+msgid "SAVAL LUN"
+msgstr "SAVAL LUN"
+
+#: ../../msn/msn_r3.c:1048 ../../msn/msn_r3.c:1050
+msgid "x"
+msgstr "x"
+
+#: ../../msn/msn_r3.c:1049
+msgid "PROF. DR. UGNUL TSCHABB"
+msgstr "PROF. DR. UGNUL TSCHABB"
+
+#: ../../msn/msn_r3.c:1049
+msgid "UGNUL TSCHABB"
+msgstr "UGNUL TSCHABB"
+
+#: ../../msn/msn_r3.c:1050
+msgid "ALGA HURZ LI"
+msgstr "ALGA HURZ LI"
+
+#: ../../msn/msn_r3.c:1054
+msgid "Alab Hansi"
+msgstr "Alab Hansi"
+
+#: ../../msn/msn_r3.c:1054
+msgid "Saval Lun"
+msgstr "Saval Lun"
+
+#: ../../msn/msn_r3.c:1054
+msgid "Ugnul Tschabb"
+msgstr "Ugnul Tschabb"
+
+#: ../../msn/msn_r3.c:1054
+msgid "Alga Hurz Li"
+msgstr "Alga Hurz Li"
+
+#: ../../msn/msn_r3.c:1060
+msgid "Guten Tag, hier ist Horst Hummel."
+msgstr "Hello, I am Horst Hummel."
+
+#: ../../msn/msn_r3.c:1062
+msgid "Es ist sehr wichtig."
+msgstr "It's very important."
+
+#: ../../msn/msn_r3.c:1068
+msgid "Vom Mars."
+msgstr "From Mars."
+
+#: ../../msn/msn_r3.c:1069
+msgid "Vom Klo."
+msgstr "The toilet."
+
+#: ../../msn/msn_r3.c:1070
+msgid "Das werde ich kaum erz„hlen."
+msgstr "I won't tell you that."
+
+#: ../../msn/msn_r3.c:1079
+msgid "1 Bromanager"
+msgstr "1 Office manager"
+
+#: ../../msn/msn_r3.c:1080
+msgid "2 Telomat"
+msgstr "2 Phone"
+
+#: ../../msn/msn_r3.c:1081
+msgid "3 ProText"
+msgstr "3 ProText"
+
+#: ../../msn/msn_r3.c:1082
+msgid "4 Calculata"
+msgstr "4 Calculata"
+
+#: ../../msn/msn_r3.c:1083
+msgid "Bitte w„hlen"
+msgstr "Please select an option"
+
+#: ../../msn/msn_r3.c:1091
+msgid "Geben Sie den gewnschten Namen ein:"
+msgstr "Enter the desired name:"
+
+#: ../../msn/msn_r3.c:1092
+msgid "(Vor- und Nachname)"
+msgstr "(first and last name)"
+
+#: ../../msn/msn_r3.c:1106
+msgid "Name unbekannt"
+msgstr "Name unknown"
+
+#: ../../msn/msn_r3.c:1112
+msgid "Verbindung unm”glich"
+msgstr "Connection not possible"
+
+#: ../../msn/msn_r3.c:1116
+msgid "Verbindung wird hergestellt"
+msgstr "Connection is established"
+
+#. I18N: Here the %s is a name
+#: ../../msn/msn_r3.c:1121
+#, c-format
+msgid "%s am Apparat."
+msgstr "%s speaking."
+
+#: ../../msn/msn_r3.c:1127
+#, c-format
+msgid "Hier ist %s. K”nnen Sie mal gerade kommen?"
+msgstr "This is %s. Can you come over now?"
+
+#: ../../msn/msn_r3.c:1134
+msgid "Huch, Sie h”ren sich aber|nicht gut an. Ich komme sofort."
+msgstr "You don't sound good.|I'll be right there."
+
+#: ../../msn/msn_r3.c:1145
+msgid "Horst Hummel! Von wo rufen Sie an?"
+msgstr "Horst Hummel! Where are you calling from?"
+
+#: ../../msn/msn_r3.c:1151
+msgid "Hmm, keine Antwort."
+msgstr "Hmm, no answer."
+
+#: ../../msn/msn_r3.c:1164
+msgid "Passwort:"
+msgstr "Password:"
+
+#: ../../msn/msn_r3.c:1215
+msgid "Was war das fr ein Ger„usch?"
+msgstr "What was that noise?"
+
+#: ../../msn/msn_r3.c:1217 ../../msn/msn_s.c:312
+msgid "Ich werde mal nachsehen."
+msgstr "Let's find out..."
+
+#: ../../msn/msn_r3.c:1305
+msgid "Jetzt verschwinden Sie endlich!"
+msgstr "Get the hell out of here!"
+
+#: ../../msn/msn_r3.c:1306
+msgid "Huch, ich habe mich vertan."
+msgstr "Oops, I made a mistake."
+
+#: ../../msn/msn_r3.c:1368
+msgid ""
+"Nachdem du zwei Stunden im|Dschungel herumgeirrt bist,|findest du ein "
+"Geb„ude."
+msgstr ""
+"After you've been wandering around|the jungle for two hours,|you find a "
+"building."
+
+#: ../../msn/msn_r3.c:1481
+msgid "Tablett"
+msgstr "Tray"
+
+#: ../../msn/msn_r3.c:1481
+msgid "Es ist irgendein Fraá und|etwas zu Trinken darauf."
+msgstr "There is some kind of food|and a drink on it."
+
+#: ../../msn/msn_r3.c:1483
+msgid "Stange"
+msgstr "Rod"
+
+#: ../../msn/msn_r3.c:1483
+msgid "Es scheint eine Lampe zu sein."
+msgstr "It seems to be a lamp."
+
+#: ../../msn/msn_r3.c:1484
+msgid "Augen"
+msgstr "Eyes"
+
+#: ../../msn/msn_r3.c:1484
+msgid "Es ist nur ein Bild."
+msgstr "It's just a picture."
+
+#: ../../msn/msn_r3.c:1486
+msgid "Sieht etwas anders aus als auf der Erde."
+msgstr "Looks a little different than on Earth."
+
+#: ../../msn/msn_r3.c:1488
+msgid "Metallblock"
+msgstr "Metal block"
+
+#: ../../msn/msn_r3.c:1488
+msgid "Er ist ziemlich schwer."
+msgstr "It's pretty heavy."
+
+#: ../../msn/msn_r3.c:1490
+msgid "Roboter"
+msgstr "Robot"
+
+#: ../../msn/msn_r3.c:1490
+msgid "Den hast du erledigt."
+msgstr "You took care of it."
+
+#: ../../msn/msn_r3.c:1491 ../../msn/msn_r3.c:1528
+msgid "Tisch"
+msgstr "Table"
+
+#: ../../msn/msn_r3.c:1491
+msgid "Ein kleiner Metalltisch."
+msgstr "A small metal table."
+
+#: ../../msn/msn_r3.c:1524
+msgid "Zellentr"
+msgstr "Cell door"
+
+#: ../../msn/msn_r3.c:1524
+msgid "Hier warst du eingesperrt."
+msgstr "You were locked up here."
+
+#: ../../msn/msn_r3.c:1526
+msgid "Laptop"
+msgstr "Laptop"
+
+#: ../../msn/msn_r3.c:1576 ../../msn/msn_r3.c:1577
+msgid "S„ule"
+msgstr "Pillar"
+
+#: ../../msn/msn_r3.c:1580
+msgid "Auf einem Schild an der Tr steht \"Dr. Alab Hansi\"."
+msgstr "A sign on the door says \"Dr. Alab Hansi\"."
+
+#: ../../msn/msn_r3.c:1582
+msgid "Auf einem Schild an der Tr steht \"Saval Lun\"."
+msgstr "A sign on the door says \"Saval Lun\"."
+
+#: ../../msn/msn_r3.c:1584
+msgid "Auf einem Schild an der Tr steht \"Prof. Dr. Ugnul Tschabb\"."
+msgstr "A sign on the door says \"Prof. Dr. Ugnul Tschabb\"."
+
+#: ../../msn/msn_r3.c:1586
+msgid "Auf einem Schild an der Tr steht \"Alga Hurz Li\"."
+msgstr "A sign on the door says \"Alga Hurz Li\"."
+
+#: ../../msn/msn_r3.c:1597 ../../msn/msn_r3.c:1613
+msgid "Axacussaner"
+msgstr "Axacussan"
+
+#: ../../msn/msn_r3.c:1597
+msgid "Du mátest ihn irgendwie ablenken."
+msgstr "You have to distract him somehow."
+
+#: ../../msn/msn_r3.c:1599
+msgid "Komisches Bild."
+msgstr "Funny picture."
+
+#: ../../msn/msn_r3.c:1600
+msgid "Karte"
+msgstr "Keycard"
+
+#: ../../msn/msn_r3.c:1600
+msgid "Darauf steht: \"Generalkarte\"."
+msgstr "It says: \"Master keycard\"."
+
+#: ../../msn/msn_r3.c:1612
+msgid "Lampe"
+msgstr "Lamp"
+
+#: ../../msn/msn_r3.c:1614
+msgid "Seltsam!"
+msgstr "Strange!"
+
+#: ../../msn/msn_r3.c:1623 ../../msn/msn_r3.c:1670
+msgid "Geld"
+msgstr "Cash"
+
+#: ../../msn/msn_r3.c:1623
+msgid "Es sind 500 Xa."
+msgstr "It's 500 Xa."
+
+#: ../../msn/msn_r3.c:1624
+msgid "Schlieáfach"
+msgstr "Locker"
+
+#: ../../msn/msn_r3.c:1624
+msgid "Es hat ein elektronisches Zahlenschloá."
+msgstr "It has an electronic combination lock."
+
+#: ../../msn/msn_r3.c:1626
+msgid "Brief"
+msgstr "Note"
+
+#: ../../msn/msn_r3.c:1635
+msgid "Wrfel"
+msgstr "Cubes"
+
+#: ../../msn/msn_r3.c:1635
+msgid "Sonderbar!"
+msgstr "Quirky!"
+
+#: ../../msn/msn_r3.c:1636
+msgid "Affenstark!"
+msgstr "Awesome!"
+
+#: ../../msn/msn_r3.c:1637
+msgid "Komisches Ding"
+msgstr "Strange thing"
+
+#: ../../msn/msn_r3.c:1637
+msgid "Wundersam!"
+msgstr "Amazing!"
+
+#: ../../msn/msn_r3.c:1646 ../../msn/msn_r3.c:1647
+msgid "Es ist ein Axacussanerkopf auf dem Bild."
+msgstr "There is an Axacussan head in the picture."
+
+#: ../../msn/msn_r3.c:1648 ../../msn/msn_r3.c:1659
+msgid "Pflanze"
+msgstr "Plant"
+
+#: ../../msn/msn_r3.c:1658
+msgid "Figur"
+msgstr "Figure"
+
+#: ../../msn/msn_r3.c:1658
+msgid "Stark!"
+msgstr "Strong!"
+
+#: ../../msn/msn_r3.c:1659
+msgid "Sie ist den Pflanzen auf der Erde sehr „hnlich."
+msgstr "It is very similar to the plants on earth."
+
+#: ../../msn/msn_r3.c:1668
+msgid "Er funktioniert nicht."
+msgstr "It doesn't work."
+
+#: ../../msn/msn_r3.c:1669
+msgid "Graffiti"
+msgstr "Graffiti"
+
+#: ../../msn/msn_r3.c:1669
+msgid "Seltsamer Broschmuck!"
+msgstr "Strange office decoration!"
+
+#: ../../msn/msn_r3.c:1670
+msgid "Es sind 350 Xa."
+msgstr "It's 350 Xa."
+
+#: ../../msn/msn_r3.c:1680
+msgid "Dschungel"
+msgstr "Jungle"
+
+#: ../../msn/msn_r3.c:1680
+msgid "Lauter B„ume."
+msgstr "Nothing but trees."
+
+#: ../../msn/msn_s.c:84
+msgid "Teil 1:"
+msgstr "Part 1:"
+
+#: ../../msn/msn_s.c:85
+msgid "Das Schicksal"
+msgstr "The fate of"
+
+#: ../../msn/msn_s.c:86
+msgid "des Horst Hummel"
+msgstr "Horst Hummel"
+
+#: ../../msn/msn_s.c:131
+msgid "Viertausend"
+msgstr "Four thousand"
+
+#: ../../msn/msn_s.c:131
+msgid "Fnftausend"
+msgstr "Five thousand"
+
+#: ../../msn/msn_s.c:131
+msgid "Sechstausend"
+msgstr "Six thousand"
+
+#: ../../msn/msn_s.c:131
+msgid "Siebentausend"
+msgstr "Seven thousand"
+
+#: ../../msn/msn_s.c:144
+msgid "Zwei Tage nach dem Start|im Cockpit der \"Supernova\" ..."
+msgstr "Two days after take-off|in the cockpit of the \"Supernova\"..."
+
+#: ../../msn/msn_s.c:153
+msgid "Entferung von der Sonne: 1 500 000 km.|Gehen Sie auf 8000 hpm, Captain!"
+msgstr "Distance from the sun: 1 500 000 km.|Go to 8000 hpm, Captain!"
+
+#: ../../msn/msn_s.c:168
+msgid "Geschwindigkeit:"
+msgstr "Speed:"
+
+#: ../../msn/msn_s.c:169
+msgid "Zweitausend hpm"
+msgstr "Two thousand hpm"
+
+#: ../../msn/msn_s.c:172
+msgid "Dreitausend"
+msgstr "Three thousand"
+
+#: ../../msn/msn_s.c:189
+msgid "Achttau..."
+msgstr "Eight thous..."
+
+#: ../../msn/msn_s.c:214
+msgid "Keine Ahnung, Sir."
+msgstr "I have no idea, Sir."
+
+#: ../../msn/msn_s.c:215
+msgid "Ingenieur an Commander, bitte kommen!"
+msgstr "Engineer to Commander, come in!"
+
+#: ../../msn/msn_s.c:221
+msgid "Was ist los?"
+msgstr "What's going on?"
+
+#: ../../msn/msn_s.c:222
+msgid ""
+"Wir haben einen Druckabfall im Hauptantriebssystem, Sir.|Einen Moment, ich "
+"schaue sofort nach, woran es liegt."
+msgstr ""
+"We have a pressure drop in the main propulsion system, sir.|Wait a minute, "
+"I'll have a look."
+
+#: ../../msn/msn_s.c:224
+msgid ""
+"Scheiáe, der Ionenantrieb ist explodiert!|Die Teile sind ber den ganzen|"
+"Maschinenraum verstreut."
+msgstr "Shit, the Ion drive blew up!|The parts are all over the engine room."
+
+#: ../../msn/msn_s.c:225
+msgid ""
+"Ach, du meine Gte!|Gibt es irgendeine M”glichkeit,|den Schaden schnell zu "
+"beheben?"
+msgstr "Oh, my God!|Any way to fix the damage quickly?"
+
+#: ../../msn/msn_s.c:226
+msgid "Nein, Sir. Es sieht schlecht aus."
+msgstr "No, sir. It looks bad."
+
+#: ../../msn/msn_s.c:230
+msgid "Hmm, die Erde zu alarmieren, wrde zu lange dauern."
+msgstr "Hmm, alerting Earth would take too long."
+
+#: ../../msn/msn_s.c:231
+msgid "Ich darf kein Risiko eingehen.|Captain, geben Sie sofort Alarm!"
+msgstr "I can't take any chances.|Captain, sound the alarm!"
+
+#: ../../msn/msn_s.c:232 ../../msn/msn_s.c:264
+msgid "Ok, Sir."
+msgstr "Ok, Sir."
+
+#: ../../msn/msn_s.c:255
+msgid ""
+"Commander an alle! Achtung, Achtung!|Begeben Sie sich sofort zum "
+"Notraumschiff!"
+msgstr ""
+"Commander to all! Attention, attention!|Get to the emergency ship "
+"immediately!"
+
+#: ../../msn/msn_s.c:256
+msgid "Ich wiederhole:|Begeben Sie sich sofort zum Notraumschiff!"
+msgstr "I repeat, proceed immediately|to the emergency spaceship!"
+
+#: ../../msn/msn_s.c:263
+msgid ""
+"Captain, bereiten Sie alles fr den Start vor!|Wir mssen zurck zur Erde!"
+msgstr ""
+"Captain, get everything ready for departure!|We have to get back to Earth!"
+
+#: ../../msn/msn_s.c:277
+msgid "Eine Stunde sp„ter ..."
+msgstr "An hour later..."
+
+#: ../../msn/msn_s.c:284
+msgid "Die Besatzung hat die \"Supernova\" verlassen."
+msgstr "The crew has left the \"Supernova\"."
+
+#: ../../msn/msn_s.c:285
+msgid ""
+"Das Schiff wird zwar in acht Jahren sein Ziel|erreichen, allerdings ohne "
+"Mannschaft."
+msgstr ""
+"The ship will reach its destination in eight years,|but without a crew."
+
+#: ../../msn/msn_s.c:286
+msgid "Das ist das kl„gliche Ende|der Mission Supernova."
+msgstr "This is the pitiful end|of the Supernova mission."
+
+#: ../../msn/msn_s.c:287
+msgid "Sie k”nnen jetzt ihren Computer ausschalten."
+msgstr "You can now turn off your computer."
+
+#: ../../msn/msn_s.c:290
+msgid "Warten Sie!"
+msgstr "Wait, wait!"
+
+#: ../../msn/msn_s.c:291
+msgid "Es regt sich etwas im Schiff."
+msgstr "There's something stirring in the ship."
+
+#: ../../msn/msn_s.c:307
+msgid "Uuuuaaaahhhhh"
+msgstr "Uuuuaaaahhhhh"
+
+#: ../../msn/msn_s.c:309
+msgid "Huch, ich bin ja gefesselt!|Wo bin ich?"
+msgstr "Argh, I'm tied up!|Where am I?"
+
+#: ../../msn/msn_s.c:310
+msgid ""
+"Ach so, das sind ja die Sicherheitsgurte.|Ich arbeite ja jetzt in diesem "
+"Raumschiff hier."
+msgstr "Ah yes, these are the seat belts.|I work in this spaceship now."
+
+#: ../../msn/msn_s.c:311
+msgid ""
+"Was? Schon zwei Uhr! Wieso|hat mich denn noch keiner|aus dem Bett "
+"geschmissen?"
+msgstr "What? It's 2:00 already!|How come no one has kicked me|out of bed yet?"
+
+#: ../../msn/msn_s.c:314
+msgid "Autsch!"
+msgstr "Ouch!"
+
+#: ../../msn/msn_s.c:315
+msgid "Scheiáetagenbett!"
+msgstr "Shitty bunk bed!"
+
+#: ../../msn/msn_s.c:317
+msgid "Erst mal den Lichtschalter finden."
+msgstr "First, find the light switch."
+
+#: ../../msn/msn_s.c:318
+msgid "Hmm, gar nicht so einfach|bei Schwerelosigkeit."
+msgstr "Hmm, not so easy|in weightlessness."
+
+#: ../../msn/msn_s.c:320
+msgid "Ah, hier ist er."
+msgstr "Ah, here it is."
diff --git a/devtools/create_supernova/strings2-en.po b/devtools/create_supernova/strings2-en.po
new file mode 100644
index 0000000..d4e58c6
--- /dev/null
+++ b/devtools/create_supernova/strings2-en.po
@@ -0,0 +1,2797 @@
+# Mission Supernova Translation.
+# Copyright (C) YEAR ScummVM Team
+# This file is distributed under the same license as the ScummVM package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mission Supernova Part 2 1.0\n"
+"Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
+"POT-Creation-Date: 2019-06-10 22:58+0100\n"
+"PO-Revision-Date: 2019-06-10 22:13+0000\n"
+"Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
+"Language-Team: none\n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.3\n"
+
+#: ../../ms2/ms2.c:1641
+msgid "Gehe"
+msgstr "Go"
+
+#: ../../ms2/ms2.c:1641
+msgid "Schau"
+msgstr "Look"
+
+#: ../../ms2/ms2.c:1641
+msgid "Nimm"
+msgstr "Take"
+
+#: ../../ms2/ms2.c:1641
+msgid "™ffne"
+msgstr "Open"
+
+#: ../../ms2/ms2.c:1641
+msgid "Schlieáe"
+msgstr "Close"
+
+#: ../../ms2/ms2.c:1642
+msgid "Drcke"
+msgstr "Push"
+
+#: ../../ms2/ms2.c:1642
+msgid "Ziehe"
+msgstr "Pull"
+
+#: ../../ms2/ms2.c:1642
+msgid "Benutze"
+msgstr "Use"
+
+#: ../../ms2/ms2.c:1642
+msgid "Rede"
+msgstr "Talk"
+
+#: ../../ms2/ms2.c:1642
+msgid "Gib"
+msgstr "Give"
+
+#: ../../ms2/ms2.c:2199
+msgid "Gespr„ch beenden"
+msgstr "End of conversation"
+
+#: ../../ms2/ms2.c:2333
+msgid "Gehe zu "
+msgstr "Go to "
+
+#: ../../ms2/ms2.c:2333
+msgid "Schau "
+msgstr "Look at "
+
+#: ../../ms2/ms2.c:2333
+msgid "Nimm "
+msgstr "Take "
+
+#: ../../ms2/ms2.c:2333
+msgid "™ffne "
+msgstr "Open "
+
+#: ../../ms2/ms2.c:2333
+msgid "Schlieáe "
+msgstr "Close "
+
+#: ../../ms2/ms2.c:2334
+msgid "Drcke "
+msgstr "Push "
+
+#: ../../ms2/ms2.c:2334
+msgid "Ziehe "
+msgstr "Pull "
+
+#: ../../ms2/ms2.c:2334
+msgid "Benutze "
+msgstr "Use "
+
+#: ../../ms2/ms2.c:2334
+msgid "Rede mit "
+msgstr "Talk to "
+
+#: ../../ms2/ms2.c:2334
+msgid "Gib "
+msgstr "Give "
+
+#: ../../ms2/ms2.c:2344
+msgid " an "
+msgstr " to "
+
+#: ../../ms2/ms2.c:2345
+msgid " mit "
+msgstr " with "
+
+#: ../../ms2/ms2.c:2903
+msgid "Laden"
+msgstr "Load"
+
+#: ../../ms2/ms2.c:2905
+msgid "Speichern"
+msgstr "Save"
+
+#: ../../ms2/ms2.c:2907
+msgid "Zurck"
+msgstr "Back"
+
+#: ../../ms2/ms2.c:2909
+msgid "Neustart"
+msgstr "Restart"
+
+#: ../../ms2/ms2.c:3002
+msgid "Schreibfehler"
+msgstr "write error"
+
+#: ../../ms2/ms2.c:3243
+msgid "Textgeschwindigkeit:"
+msgstr "Text speed:"
+
+#: ../../ms2/ms2.c:3292
+msgid "Spiel abbrechen?"
+msgstr "Leave game?"
+
+#: ../../ms2/ms2.c:3295
+msgid "Ja"
+msgstr "Yes"
+
+#: ../../ms2/ms2.c:3296
+msgid "Nein"
+msgstr "No"
+
+#: ../../ms2/ms2.c:3368
+msgid "Das tr„gst du doch bei dir."
+msgstr "You already carry this."
+
+#: ../../ms2/ms2.c:3370
+msgid "Du bist doch schon da."
+msgstr "You are already there."
+
+#: ../../ms2/ms2.c:3373
+msgid "Das ist geschlossen."
+msgstr "This is closed."
+
+#: ../../ms2/ms2.c:3383
+msgid "Das hast du doch schon."
+msgstr "You already have that."
+
+#: ../../ms2/ms2.c:3385
+msgid "Das brauchst du nicht."
+msgstr "You don't need that."
+
+#: ../../ms2/ms2.c:3387
+msgid "Das kannst du nicht nehmen."
+msgstr "You can't take that."
+
+#: ../../ms2/ms2.c:3393
+msgid "Das l„át sich nicht ”ffnen."
+msgstr "This cannot be opened."
+
+#: ../../ms2/ms2.c:3395 ../../ms2/ms2_pyra.c:646
+msgid "Das ist schon offen."
+msgstr "This is already opened."
+
+#: ../../ms2/ms2.c:3397
+msgid "Das ist verschlossen."
+msgstr "This is locked."
+
+#: ../../ms2/ms2.c:3413
+msgid "Das l„át sich nicht schlieáen."
+msgstr "This cannot be closed."
+
+#: ../../ms2/ms2.c:3415 ../../ms2/ms2_pyra.c:671
+msgid "Das ist schon geschlossen."
+msgstr "This is already closed."
+
+#: ../../ms2/ms2.c:3430
+msgid "Behalt es lieber!"
+msgstr "Better keep it!"
+
+#: ../../ms2/ms2.c:3434
+msgid "Das geht nicht."
+msgstr "You can't do that."
+
+#: ../../ms2/ms2_mod.c:533
+msgid "^(C) 1994 Thomas und Steffen Dingel#"
+msgstr "^(C) 1994 Thomas and Steffen Dingel#"
+
+#: ../../ms2/ms2_mod.c:534
+msgid "Story und Grafik:^ Thomas Dingel#"
+msgstr "Story and Graphics:^ Thomas Dingel#"
+
+#: ../../ms2/ms2_mod.c:535
+msgid "Programmierung:^ Steffen Dingel#"
+msgstr "Programming:^ Steffen Dingel#"
+
+#: ../../ms2/ms2_mod.c:536
+msgid "Musik:^ Bernd Hoffmann#"
+msgstr "Music:^ Bernd Hoffmann#"
+
+#: ../../ms2/ms2_mod.c:537
+msgid "Getestet von ...#"
+msgstr "Tested by ...#"
+
+#: ../../ms2/ms2_mod.c:548
+msgid "^Das war's.#"
+msgstr "^That's it.#"
+
+#: ../../ms2/ms2_mod.c:549
+msgid "^Schluá!#"
+msgstr "^Over!#"
+
+#: ../../ms2/ms2_mod.c:550
+msgid "^Ende!#"
+msgstr "^End!#"
+
+#: ../../ms2/ms2_mod.c:551
+msgid "^Aus!#"
+msgstr "^Done!#"
+
+#: ../../ms2/ms2_mod.c:552
+msgid "^Tschá!#"
+msgstr "^Bye!#"
+
+#: ../../ms2/ms2_mod.c:603
+msgid "Oh!"
+msgstr "Oh!"
+
+#: ../../ms2/ms2_mod.c:605
+msgid "Nicht schlecht!"
+msgstr "Not bad!"
+
+#: ../../ms2/ms2_mod.c:607
+msgid "Supersound!"
+msgstr "Supersound!"
+
+#: ../../ms2/ms2_mod.c:609
+msgid "Klasse!"
+msgstr "Great!"
+
+#: ../../ms2/ms2_mod.c:611
+msgid "Nicht zu fassen!"
+msgstr "I can't believe it!"
+
+#: ../../ms2/ms2_mod.c:613
+msgid "Super, ey!"
+msgstr "Dope, yo!"
+
+#: ../../ms2/ms2_mod.c:615
+msgid "Fantastisch!"
+msgstr "Fantastic!"
+
+#: ../../ms2/ms2_mod.c:617
+msgid "Umwerfend!"
+msgstr "Stunning!"
+
+#: ../../ms2/ms2_mod.c:619
+msgid "Genial!"
+msgstr "Brilliant!"
+
+#: ../../ms2/ms2_mod.c:621
+msgid "Spitze!"
+msgstr "Awesome!"
+
+#: ../../ms2/ms2_mod.c:623
+msgid "Jawoll!"
+msgstr "Alright!"
+
+#: ../../ms2/ms2_mod.c:625
+msgid "Hervorragend!"
+msgstr "Outstanding!"
+
+#: ../../ms2/ms2_mod.c:627
+msgid "Ultragut!"
+msgstr "Ultra-good!"
+
+#: ../../ms2/ms2_mod.c:629
+msgid "Megacool!"
+msgstr "Mega cool!"
+
+#: ../../ms2/ms2_mod.c:631
+msgid "Yeah!"
+msgstr "Yeah!"
+
+#: ../../ms2/ms2_mus.c:60
+msgid "Ein W„chter betritt den Raum.|Du wirst verhaftet."
+msgstr "A guard enters the room.|You are getting arrested."
+
+#: ../../ms2/ms2_mus.c:73
+msgid "Die n„chsten paar Jahre|verbringst du im Knast."
+msgstr "You will spend the next|few years in jail."
+
+#: ../../ms2/ms2_mus.c:145
+msgid "Es wird Alarm ausgel”st."
+msgstr "The alarm is about to be set off."
+
+#: ../../ms2/ms2_mus.c:200
+msgid "Du h”rst Schritte."
+msgstr "You are hearing footsteps."
+
+#: ../../ms2/ms2_mus.c:232
+msgid "Um das Schloss zu ”ffnen,|brauchst du einige Zeit."
+msgstr "You will take some time,|to pick that lock."
+
+#: ../../ms2/ms2_mus.c:238
+msgid "Du ger„tst in Panik|und ziehst die Keycard|aus der Tr."
+msgstr "You are panicking|and remove the keycard|from the door."
+
+#: ../../ms2/ms2_mus.c:316
+msgid "Du hast deinen Auftrag|noch nicht ausgefhrt."
+msgstr "You have not completed|your task yet."
+
+#: ../../ms2/ms2_mus.c:330
+msgid ""
+"Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du "
+"dich, zu fliehen."
+msgstr "Although you haven't|disabled the alarm yet,|you decide to escape."
+
+#: ../../ms2/ms2_mus.c:337
+msgid ""
+"Du entledigst dich der Einbruchswerkzeuge|und nimmst ein Taxi zum "
+"Kulturpalast."
+msgstr ""
+"You get rid of your burglar tools|and take a cab to the Palace of Culture."
+
+#: ../../ms2/ms2_mus.c:376 ../../ms2/ms2_mus.c:532 ../../ms2/ms2_mus.c:631
+msgid "Diese Tr brauchst|du nicht zu ”ffnen."
+msgstr "You don't need|to open this door."
+
+#: ../../ms2/ms2_mus.c:394
+msgid "Uff, es hat geklappt!"
+msgstr "Phew, it worked!"
+
+#: ../../ms2/ms2_mus.c:407
+msgid "Zurck im Quartier der Gangster ..."
+msgstr "Back in the gangsters' hideout ..."
+
+#: ../../ms2/ms2_mus.c:417
+msgid "Das lief ja wie am Schnrchen!"
+msgstr "Everything went like clockwork!"
+
+#: ../../ms2/ms2_mus.c:418
+msgid "Hier, dein Anteil von 30000 Xa."
+msgstr "Here, your share of 30000 Xa."
+
+#: ../../ms2/ms2_mus.c:425
+msgid "Wo ist denn der Saurierkopf?"
+msgstr "Where's the dinosaur skull?"
+
+#: ../../ms2/ms2_mus.c:426
+msgid "Dazu hatte ich keine Zeit mehr."
+msgstr "I didn't have enough time for that."
+
+#: ../../ms2/ms2_mus.c:427
+msgid "Was? Du spinnst wohl!|Dann kriegst du auch deinen|Anteil nicht. Raus!"
+msgstr "What? You're nuts!|Then you won't get your|share. Beat it!"
+
+#: ../../ms2/ms2_mus.c:703
+msgid "Der Sauger ist schon dort."
+msgstr "The suction cup is already there."
+
+#: ../../ms2/ms2_mus.c:707
+msgid "Du heftest den Sauger an die Wand|und h„lst dich daran fest."
+msgstr "You attach the suction cup to the wall|and hold on to it."
+
+#: ../../ms2/ms2_mus.c:718
+msgid "Du stellst dich auf den|Boden nimmst den Sauger|wieder von der Wand"
+msgstr "You stand on the floor|then remove the suction cup from the wall"
+
+#: ../../ms2/ms2_mus.c:722
+msgid "Die Alarmanlage ist|schon ausgeschaltet."
+msgstr "The alarm system is|already switched off."
+
+#: ../../ms2/ms2_mus.c:725
+msgid "Um die Anlage abzuschalten,|brauchst du einige Zeit."
+msgstr "To turn off the system,|you need some time."
+
+#: ../../ms2/ms2_mus.c:729
+msgid "Die Alarmanlage ist jetzt ausgeschaltet."
+msgstr "The alarm system is now switched off."
+
+#: ../../ms2/ms2_mus.c:746 ../../ms2/ms2_mus.c:875
+msgid "Saurier"
+msgstr "Dinosaur"
+
+#: ../../ms2/ms2_mus.c:746
+msgid "Du hast jetzt besseres zu tun,|als das Ding anzuschauen."
+msgstr "You have better things to do now|than look at that thing."
+
+#: ../../ms2/ms2_mus.c:747 ../../ms2/ms2_pyra.c:1010 ../../ms2/ms2_r1.c:805
+#: ../../ms2/ms2_r1.c:816 ../../ms2/ms2_r2.c:1203 ../../ms2/ms2_r2.c:1214
+msgid "Eingang"
+msgstr "Entrance"
+
+#: ../../ms2/ms2_mus.c:748 ../../ms2/ms2_mus.c:756 ../../ms2/ms2_mus.c:757
+#: ../../ms2/ms2_mus.c:765 ../../ms2/ms2_mus.c:766 ../../ms2/ms2_mus.c:774
+#: ../../ms2/ms2_mus.c:775 ../../ms2/ms2_mus.c:783 ../../ms2/ms2_mus.c:784
+#: ../../ms2/ms2_mus.c:792 ../../ms2/ms2_mus.c:801 ../../ms2/ms2_mus.c:802
+#: ../../ms2/ms2_mus.c:804 ../../ms2/ms2_mus.c:812 ../../ms2/ms2_mus.c:814
+#: ../../ms2/ms2_mus.c:815 ../../ms2/ms2_mus.c:823 ../../ms2/ms2_mus.c:824
+#: ../../ms2/ms2_mus.c:832 ../../ms2/ms2_mus.c:833 ../../ms2/ms2_mus.c:842
+#: ../../ms2/ms2_mus.c:844 ../../ms2/ms2_mus.c:845 ../../ms2/ms2_mus.c:854
+#: ../../ms2/ms2_mus.c:855 ../../ms2/ms2_mus.c:864 ../../ms2/ms2_mus.c:865
+#: ../../ms2/ms2_mus.c:866 ../../ms2/ms2_mus.c:872 ../../ms2/ms2_mus.c:894
+#: ../../ms2/ms2_mus.c:895 ../../ms2/ms2_mus.c:903 ../../ms2/ms2_mus.c:911
+#: ../../ms2/ms2_mus.c:912 ../../ms2/ms2_mus.c:920 ../../ms2/ms2_mus.c:921
+#: ../../ms2/ms2_mus.c:929 ../../ms2/ms2_mus.c:930 ../../ms2/ms2_mus.c:931
+#: ../../ms2/ms2_mus.c:932 ../../ms2/ms2_mus.c:940 ../../ms2/ms2_mus.c:941
+#: ../../ms2/ms2_mus.c:949 ../../ms2/ms2_mus.c:957 ../../ms2/ms2_mus.c:965
+#: ../../ms2/ms2_mus.c:966 ../../ms2/ms2_mus.c:974 ../../ms2/ms2_pyra.c:1070
+#: ../../ms2/ms2_pyra.c:1079 ../../ms2/ms2_pyra.c:1103
+#: ../../ms2/ms2_pyra.c:1111 ../../ms2/ms2_pyra.c:1135
+#: ../../ms2/ms2_pyra.c:1309 ../../ms2/ms2_r2.c:1225 ../../ms2/ms2_r2.c:1226
+#: ../../ms2/ms2_r2.c:1235 ../../ms2/ms2_r2.c:1236 ../../ms2/ms2_r2.c:1247
+msgid "Tr"
+msgstr "Door"
+
+#: ../../ms2/ms2_mus.c:749
+msgid "Strasse zum Stadtzentrum"
+msgstr "Road to the city center"
+
+#: ../../ms2/ms2_mus.c:793
+msgid "Kamera"
+msgstr "Security camera"
+
+#: ../../ms2/ms2_mus.c:793
+msgid "Hoffentlich bemerkt dich niemand."
+msgstr "Hopefully nobody will notice you."
+
+#: ../../ms2/ms2_mus.c:856
+msgid "Haupteingang"
+msgstr "Main entrance"
+
+#: ../../ms2/ms2_mus.c:873 ../../ms2/ms2_mus.c:874 ../../ms2/ms2_mus.c:885
+#: ../../ms2/ms2_mus.c:893 ../../ms2/ms2_pyra.c:1046 ../../ms2/ms2_pyra.c:1054
+#: ../../ms2/ms2_pyra.c:1062 ../../ms2/ms2_pyra.c:1087
+#: ../../ms2/ms2_pyra.c:1095 ../../ms2/ms2_pyra.c:1222
+#: ../../ms2/ms2_pyra.c:1230 ../../ms2/ms2_pyra.c:1238
+#: ../../ms2/ms2_pyra.c:1246
+msgid "Gang"
+msgstr "Corridor"
+
+#: ../../ms2/ms2_mus.c:875
+msgid "Ziemlich groá."
+msgstr "Quite large."
+
+#: ../../ms2/ms2_mus.c:876 ../../ms2/ms2_r1.c:787
+msgid "Saurierkopf"
+msgstr "Dinosaur head"
+
+#: ../../ms2/ms2_mus.c:876
+msgid "Dies ist der Kopf,|den du suchst."
+msgstr "This is the head|you're looking for."
+
+#: ../../ms2/ms2_mus.c:975
+msgid "Alarmanlage"
+msgstr "Alarm system"
+
+#: ../../ms2/ms2_mus.c:976 ../../ms2/ms2_r1.c:783
+msgid "Sauger"
+msgstr "Suction cup"
+
+#: ../../ms2/ms2_mus.c:977
+msgid "Wand"
+msgstr "Wall"
+
+#: ../../ms2/ms2_pyra.c:26 ../../ms2/ms2_pyra.c:1255 ../../ms2/ms2_pyra.c:1256
+#: ../../ms2/ms2_pyra.c:1274 ../../ms2/ms2_pyra.c:1284
+msgid "Loch"
+msgstr "Opening"
+
+#: ../../ms2/ms2_pyra.c:27
+msgid "Buchstabe"
+msgstr "Letter"
+
+#: ../../ms2/ms2_pyra.c:28
+msgid "Sie ist sehr massiv."
+msgstr "It is very massive."
+
+#: ../../ms2/ms2_pyra.c:29
+msgid "Hmm, X und Y, irgendwo|habe ich die Buchstaben|schon gesehen."
+msgstr "Hmm, X and Y|I have seen these letters|somewhere before."
+
+#: ../../ms2/ms2_pyra.c:34
+msgid "Deine Zeit ist um, Fremder!"
+msgstr "Your Time is up, Stranger!"
+
+#: ../../ms2/ms2_pyra.c:76
+msgid "Du hast das Seil|doch schon festgebunden."
+msgstr "You already tied the rope."
+
+#: ../../ms2/ms2_pyra.c:80
+msgid "Das wrde wenig bringen."
+msgstr "That would have little effect."
+
+#: ../../ms2/ms2_pyra.c:126
+msgid "Sonnenstich, oder was?"
+msgstr "Sunstroke, or what?"
+
+#: ../../ms2/ms2_pyra.c:385
+msgid "Du merkst, daá der Boden|unter dir nachgibt, und|springst zur Seite."
+msgstr ""
+"You notice that the ground|is giving way under you,|and you leap aside."
+
+#: ../../ms2/ms2_pyra.c:537
+msgid "Puzzleteil"
+msgstr "Puzzle piece"
+
+#: ../../ms2/ms2_pyra.c:570
+msgid "Neben diesem Stein|ist kein freies Feld."
+msgstr "There's no free square|next to this stone."
+
+#: ../../ms2/ms2_pyra.c:683
+msgid "Du spielst gerade ein|Adventure, kein Rollenspiel!"
+msgstr "You are currently playing an|Adventure, not a Role-Playing Game!"
+
+#: ../../ms2/ms2_pyra.c:699 ../../ms2/ms2_pyra.c:800
+msgid "Du kannst das Seil|nirgends befestigen."
+msgstr "There's nowhere|to attach the rope."
+
+#: ../../ms2/ms2_pyra.c:705 ../../ms2/ms2_pyra.c:784
+msgid "Es paát nicht|zwischen die Steine."
+msgstr "It does not fit|between the stones."
+
+#: ../../ms2/ms2_pyra.c:710 ../../ms2/ms2_pyra.c:741 ../../ms2/ms2_pyra.c:840
+msgid "Das ist doch|oben festgebunden!"
+msgstr "That is already|tied up above!"
+
+#: ../../ms2/ms2_pyra.c:715
+msgid "Hey, das ist|mindestens 10 Meter tief!"
+msgstr "Hey, that is|at least 10 meters deep!"
+
+#: ../../ms2/ms2_pyra.c:731
+msgid "In dem Schlitz|ist nichts mehr."
+msgstr "There is nothing|left in the slot."
+
+#: ../../ms2/ms2_pyra.c:765
+msgid "Das ist mindestens 5 Meter tief!"
+msgstr "That is at least 5 meters deep!"
+
+#: ../../ms2/ms2_pyra.c:900
+msgid ""
+"Du versuchst, den Sarg zu|”ffnen, aber der Deckel bewegt|sich keinen "
+"Millimeter."
+msgstr "You try to open the coffin,|but the lid does not|move a millimeter."
+
+#: ../../ms2/ms2_pyra.c:913 ../../ms2/ms2_pyra.c:923
+msgid "Du hast die Kugel schon gedrckt."
+msgstr "You have already|pushed the ball."
+
+#: ../../ms2/ms2_pyra.c:944
+msgid "Die Kugel bewegt sich ein Stck."
+msgstr "The ball moves a bit."
+
+#: ../../ms2/ms2_pyra.c:961
+msgid "Das Auge ist schon offen."
+msgstr "This Eye is already open."
+
+#: ../../ms2/ms2_pyra.c:965
+msgid "Herzlichen Glckwunsch!"
+msgstr "Congratulations!"
+
+#: ../../ms2/ms2_pyra.c:966
+msgid "Sie haben das Spiel gel”st|und gewinnen 400 Xa!"
+msgstr "You solved the game|and won 400 Xa!"
+
+#: ../../ms2/ms2_pyra.c:967
+msgid "Vielen Dank fr die Benutzung eines|VIRTUAL-REALITY-SYSTEMS-Produkts!"
+msgstr "Thank you for using a|VIRTUAL-REALITY-SYSTEMS product!"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "N"
+msgstr "N"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "O"
+msgstr "E"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "S"
+msgstr "S"
+
+#: ../../ms2/ms2_pyra.c:991
+msgid "W"
+msgstr "W"
+
+#: ../../ms2/ms2_pyra.c:1008 ../../ms2/ms2_pyra.c:1200
+#: ../../ms2/ms2_pyra.c:1254 ../../ms2/ms2_pyra.c:1262
+#: ../../ms2/ms2_pyra.c:1273 ../../ms2/ms2_pyra.c:1283
+msgid "Seil"
+msgstr "Rope"
+
+#: ../../ms2/ms2_pyra.c:1009 ../../ms2/ms2_pyra.c:1043 ../../ms2/ms2_r1.c:850
+#: ../../ms2/ms2_r2.c:1223 ../../ms2/ms2_r2.c:1224 ../../ms2/ms2_r2.c:1233
+#: ../../ms2/ms2_r2.c:1234
+msgid "Schild"
+msgstr "Sign"
+
+#: ../../ms2/ms2_pyra.c:1009
+msgid ""
+"Darauf steht:|\"Willst du finden das|richtige Loch, so wage|dich in die "
+"Pyramide!\"."
+msgstr ""
+"It reads:|\"Want to find|the right hole? Then dare|to enter the pyramid!\"."
+
+#: ../../ms2/ms2_pyra.c:1010
+msgid "Es ist eine kleine ™ffnung."
+msgstr "It is a small opening."
+
+#: ../../ms2/ms2_pyra.c:1011
+msgid "Pyramide"
+msgstr "Pyramid"
+
+#: ../../ms2/ms2_pyra.c:1011
+msgid ""
+"Komisch! Was soll eine Pyramide|bei den Axacussanern? Deine|eigenen Gedanken "
+"scheinen|den Spielverlauf zu beeinflussen."
+msgstr ""
+"Weird! What is a pyramid doing|at the Axacussians? Your own thoughts seem to "
+"influence|the course of the game."
+
+#: ../../ms2/ms2_pyra.c:1012
+msgid "Sonne"
+msgstr "Sun"
+
+#: ../../ms2/ms2_pyra.c:1012
+msgid "Sch”n!"
+msgstr "Nice!"
+
+#: ../../ms2/ms2_pyra.c:1043
+msgid ""
+"\"Hallo Fremder, wenn du diesen|Raum betreten hast, bleibt|dir nur noch eine "
+"Stunde Zeit,|um deine Aufgabe zu erfllen!\""
+msgstr ""
+"\"Hello, Stranger, when you enter|this room, you have only an hour|to "
+"accomplish your task!\""
+
+#: ../../ms2/ms2_pyra.c:1044 ../../ms2/ms2_pyra.c:1052
+#: ../../ms2/ms2_pyra.c:1060 ../../ms2/ms2_pyra.c:1068
+#: ../../ms2/ms2_pyra.c:1077 ../../ms2/ms2_pyra.c:1085
+#: ../../ms2/ms2_pyra.c:1093 ../../ms2/ms2_pyra.c:1101
+#: ../../ms2/ms2_pyra.c:1109 ../../ms2/ms2_pyra.c:1133
+#: ../../ms2/ms2_pyra.c:1141 ../../ms2/ms2_pyra.c:1149
+#: ../../ms2/ms2_pyra.c:1157 ../../ms2/ms2_pyra.c:1165
+#: ../../ms2/ms2_pyra.c:1173 ../../ms2/ms2_pyra.c:1181
+#: ../../ms2/ms2_pyra.c:1190 ../../ms2/ms2_pyra.c:1198
+#: ../../ms2/ms2_pyra.c:1209 ../../ms2/ms2_pyra.c:1220
+#: ../../ms2/ms2_pyra.c:1228 ../../ms2/ms2_pyra.c:1236
+#: ../../ms2/ms2_pyra.c:1244 ../../ms2/ms2_pyra.c:1252
+#: ../../ms2/ms2_pyra.c:1270 ../../ms2/ms2_pyra.c:1281
+#: ../../ms2/ms2_pyra.c:1291
+msgid "rechte Seite"
+msgstr "right side"
+
+#: ../../ms2/ms2_pyra.c:1045 ../../ms2/ms2_pyra.c:1053
+#: ../../ms2/ms2_pyra.c:1061 ../../ms2/ms2_pyra.c:1069
+#: ../../ms2/ms2_pyra.c:1078 ../../ms2/ms2_pyra.c:1086
+#: ../../ms2/ms2_pyra.c:1094 ../../ms2/ms2_pyra.c:1102
+#: ../../ms2/ms2_pyra.c:1110 ../../ms2/ms2_pyra.c:1134
+#: ../../ms2/ms2_pyra.c:1142 ../../ms2/ms2_pyra.c:1150
+#: ../../ms2/ms2_pyra.c:1158 ../../ms2/ms2_pyra.c:1166
+#: ../../ms2/ms2_pyra.c:1174 ../../ms2/ms2_pyra.c:1182
+#: ../../ms2/ms2_pyra.c:1191 ../../ms2/ms2_pyra.c:1199
+#: ../../ms2/ms2_pyra.c:1210 ../../ms2/ms2_pyra.c:1221
+#: ../../ms2/ms2_pyra.c:1229 ../../ms2/ms2_pyra.c:1237
+#: ../../ms2/ms2_pyra.c:1245 ../../ms2/ms2_pyra.c:1253
+#: ../../ms2/ms2_pyra.c:1271 ../../ms2/ms2_pyra.c:1282
+#: ../../ms2/ms2_pyra.c:1292
+msgid "linke Seite"
+msgstr "left side"
+
+#: ../../ms2/ms2_pyra.c:1071
+msgid "Knopf"
+msgstr "Button"
+
+#: ../../ms2/ms2_pyra.c:1143 ../../ms2/ms2_pyra.c:1151
+#: ../../ms2/ms2_pyra.c:1159 ../../ms2/ms2_pyra.c:1167
+msgid "Schrift"
+msgstr "Inscription"
+
+#: ../../ms2/ms2_pyra.c:1175 ../../ms2/ms2_pyra.c:1184
+msgid "Tomate"
+msgstr "Tomato"
+
+#: ../../ms2/ms2_pyra.c:1175 ../../ms2/ms2_pyra.c:1184
+msgid "Komisch!"
+msgstr "Funny!"
+
+#: ../../ms2/ms2_pyra.c:1183 ../../ms2/ms2_pyra.c:1272
+msgid "Messer"
+msgstr "Knife"
+
+#: ../../ms2/ms2_pyra.c:1183
+msgid "Es ist ein relativ stabiles Messer."
+msgstr "It is a relatively sturdy knife."
+
+#: ../../ms2/ms2_pyra.c:1192 ../../ms2/ms2_pyra.c:1203
+#: ../../ms2/ms2_pyra.c:1214
+msgid "Monster"
+msgstr "Monster"
+
+#: ../../ms2/ms2_pyra.c:1192
+msgid "Sieht gef„hrlich aus!"
+msgstr "Looks dangerous!"
+
+#: ../../ms2/ms2_pyra.c:1200
+msgid "Es ist dick und|ungef„hr 15 Meter lang."
+msgstr "It is thick and|about 15 meters long."
+
+#: ../../ms2/ms2_pyra.c:1201 ../../ms2/ms2_pyra.c:1212
+msgid "Augen"
+msgstr "Eyes"
+
+#: ../../ms2/ms2_pyra.c:1202 ../../ms2/ms2_pyra.c:1213
+#: ../../ms2/ms2_pyra.c:1336
+msgid "Mund"
+msgstr "Mouth"
+
+#: ../../ms2/ms2_pyra.c:1203 ../../ms2/ms2_pyra.c:1214
+msgid "Es ist nur eine Statue."
+msgstr "It's just a statue."
+
+#: ../../ms2/ms2_pyra.c:1211 ../../ms2/ms2_pyra.c:1263
+msgid "Zettel"
+msgstr "Note"
+
+#: ../../ms2/ms2_pyra.c:1211
+msgid "Darauf steht:|\"Wenn du fast am Ziel|bist, tu folgendes:|Sauf!\""
+msgstr "It reads:|\"When you're almost there,|do the following:|Drink!\""
+
+#: ../../ms2/ms2_pyra.c:1255
+msgid "Es ist ca. 10 Meter tief."
+msgstr "It is about 10 meters deep."
+
+#: ../../ms2/ms2_pyra.c:1256
+msgid "Oben siehst du helles Licht."
+msgstr "Above you is a bright light."
+
+#: ../../ms2/ms2_pyra.c:1263
+msgid ""
+"Darauf steht:|\"Ruhe eine Minute im Raum|zwischen den Monstern,|und du wirst "
+"belohnt!\""
+msgstr ""
+"It reads:|\"Rest a minute in the room|between the monsters,|and you'll be "
+"rewarded!\""
+
+#: ../../ms2/ms2_pyra.c:1264 ../../ms2/ms2_r1.c:844 ../../ms2/ms2_r1.c:845
+#: ../../ms2/ms2_r2.c:1243
+msgid "Schlitz"
+msgstr "Slot"
+
+#: ../../ms2/ms2_pyra.c:1264
+msgid "Du kommst mit den|H„nden nicht rein."
+msgstr "You cannot get in|with your hands."
+
+#: ../../ms2/ms2_pyra.c:1274
+msgid "Es ist ca. 5 Meter tief."
+msgstr "It is about 5 meters deep."
+
+#: ../../ms2/ms2_pyra.c:1275
+msgid "Steine"
+msgstr "Stones"
+
+#: ../../ms2/ms2_pyra.c:1285
+msgid "Platte"
+msgstr "Plate"
+
+#: ../../ms2/ms2_pyra.c:1315 ../../ms2/ms2_pyra.c:1323
+msgid "Sarg"
+msgstr "Coffin"
+
+#: ../../ms2/ms2_pyra.c:1316 ../../ms2/ms2_pyra.c:1322
+#: ../../ms2/ms2_pyra.c:1333 ../../ms2/ms2_r1.c:833 ../../ms2/ms2_r1.c:840
+#: ../../ms2/ms2_r1.c:857 ../../ms2/ms2_r2.c:1215 ../../ms2/ms2_r2.c:1248
+msgid "Ausgang"
+msgstr "Exit"
+
+#: ../../ms2/ms2_pyra.c:1323
+msgid "Unheimlich!"
+msgstr "Creepy!"
+
+#: ../../ms2/ms2_pyra.c:1324 ../../ms2/ms2_r1.c:865
+msgid "Zahnbrste"
+msgstr "Toothbrush"
+
+#: ../../ms2/ms2_pyra.c:1324 ../../ms2/ms2_pyra.c:1325
+msgid "Die Sache mit der|Artus GmbH scheint dir zu|Kopf gestiegen zu sein."
+msgstr "The thing with the|Artus GmbH seems to have|gotten to your head."
+
+#: ../../ms2/ms2_pyra.c:1325
+msgid "Zahnpastatube"
+msgstr "Toothpaste"
+
+#: ../../ms2/ms2_pyra.c:1326 ../../ms2/ms2_pyra.c:1327
+msgid "Kugel"
+msgstr "Ball"
+
+#: ../../ms2/ms2_pyra.c:1326 ../../ms2/ms2_pyra.c:1327
+msgid "Hmm, die Kugel sieht lose aus."
+msgstr "Hmm, the ball looks loose."
+
+#: ../../ms2/ms2_pyra.c:1334 ../../ms2/ms2_pyra.c:1335
+msgid "Auge"
+msgstr "Eye"
+
+#: ../../ms2/ms2_pyra.c:1334 ../../ms2/ms2_pyra.c:1335
+msgid "Irgendwas stimmt damit nicht."
+msgstr "Something is wrong with that."
+
+#: ../../ms2/ms2_r1.c:11
+msgid "Es ist nichts Besonderes daran."
+msgstr "There's nothing special about it."
+
+#: ../../ms2/ms2_r1.c:12
+msgid "Sieht nach Metall aus."
+msgstr "It looks like metal."
+
+#: ../../ms2/ms2_r1.c:83
+msgid "Ein Taxi kommt angerauscht,|du steigst ein."
+msgstr "A taxi arrives, and you get in."
+
+#: ../../ms2/ms2_r1.c:90
+msgid "Du drckst auf den Knopf, aber nichts passiert"
+msgstr "You press the button, but nothing happens"
+
+#: ../../ms2/ms2_r1.c:94
+msgid "Es ist leer."
+msgstr "It is empty."
+
+#: ../../ms2/ms2_r1.c:97
+msgid "Du findest ein kleines Ger„t,|einen Ausweis und einen Xa."
+msgstr "You find a small device,|an ID card and a Xa."
+
+#: ../../ms2/ms2_r1.c:109
+msgid "Du heftest den|Magnet an die Stange."
+msgstr "You attach the|magnet to the pole."
+
+#: ../../ms2/ms2_r1.c:110
+msgid "Stange mit Magnet"
+msgstr "Pole with magnet"
+
+#: ../../ms2/ms2_r1.c:111
+msgid "Raffiniert!"
+msgstr "Cunning!"
+
+#: ../../ms2/ms2_r1.c:118
+msgid "Du muát das|Ger„t erst kaufen."
+msgstr "You must buy|this device first."
+
+#: ../../ms2/ms2_r1.c:127
+msgid "Du legst den Chip|in das Ger„t ein."
+msgstr "You insert the chip|into the device."
+
+#: ../../ms2/ms2_r1.c:137
+msgid "Du berspielst die CD|auf den Musikchip."
+msgstr "You transfer the CD|to the Music chip."
+
+#: ../../ms2/ms2_r1.c:141
+msgid ""
+"Ohne einen eingelegten|Musikchip kannst du auf dem|Ger„t nichts aufnehmen."
+msgstr "Without an inserted|music chip, you can not|record on the device."
+
+#: ../../ms2/ms2_r1.c:152
+msgid "Du nimmst den Chip|aus dem Ger„t."
+msgstr "You remove the chip|from the device."
+
+#: ../../ms2/ms2_r1.c:157
+msgid "Es ist kein Chip eingelegt."
+msgstr "There is no chip inserted."
+
+#: ../../ms2/ms2_r1.c:162
+msgid "Wozu? Du hast sowieso nur die eine CD."
+msgstr "What for? You only have one CD anyway."
+
+#: ../../ms2/ms2_r1.c:166
+msgid "Die \"Mad Monkeys\"-CD. Du hast|sie schon tausendmal geh”rt."
+msgstr "The \"Mad Monkeys\" CD.|You've heard them a thousand times."
+
+#: ../../ms2/ms2_r1.c:183
+msgid "Du h”rst nichts.|Der Chip ist unbespielt."
+msgstr "All you hear is silence.|The chip is empty."
+
+#: ../../ms2/ms2_r1.c:185
+msgid "Du h”rst dir den Anfang|der berspielten CD an."
+msgstr "You are listening to the beginning|of the copied CD."
+
+#: ../../ms2/ms2_r1.c:187
+msgid "Es ist kein Chip einglegt."
+msgstr "There is no chip inserted."
+
+#: ../../ms2/ms2_r1.c:193
+msgid "Du trinkst etwas von den Zeug, danach|fhlst du dich leicht beschwipst."
+msgstr "You drink some of the stuff,|then begin to feel slightly tipsy."
+
+#: ../../ms2/ms2_r1.c:224
+#, c-format
+msgid "%d Xa"
+msgstr "%d Xa"
+
+#: ../../ms2/ms2_r1.c:242
+msgid ""
+"Als du ebenfalls aussteigst haben|die anderen Passagiere das|Fluggel„nde "
+"bereits verlassen."
+msgstr ""
+"When you get off the plane|the other passengers|have already left the "
+"airport."
+
+#: ../../ms2/ms2_r1.c:285 ../../ms2/ms2_r1.c:809
+msgid "Flughafen"
+msgstr "Airport"
+
+#: ../../ms2/ms2_r1.c:286
+msgid "Stadtzentrum"
+msgstr "Downtown"
+
+#: ../../ms2/ms2_r1.c:287 ../../ms2/ms2_r2.c:1204
+msgid "Kulturpalast"
+msgstr "Palace of Culture"
+
+#: ../../ms2/ms2_r1.c:288
+msgid "Erde"
+msgstr "Earth"
+
+#: ../../ms2/ms2_r1.c:289
+msgid "Privatwohnung"
+msgstr "Private apartment"
+
+#: ../../ms2/ms2_r1.c:290 ../../ms2/ms2_r1.c:295
+msgid "(Taxi verlassen)"
+msgstr "(Leave the taxi)"
+
+#: ../../ms2/ms2_r1.c:294
+msgid "(Bezahlen)"
+msgstr "(Pay)"
+
+#: ../../ms2/ms2_r1.c:337
+msgid "Adresse:|                              "
+msgstr "Address:|                              "
+
+#: ../../ms2/ms2_r1.c:356
+msgid ""
+"Fuddeln gilt nicht!|Zu diesem Zeitpunkt kannst du diese|Adresse noch gar "
+"nicht kennen!"
+msgstr ""
+"Fiddling with the system doesn't work!|At this time you can not|even know "
+"this address!"
+
+#: ../../ms2/ms2_r1.c:378
+msgid "Du hast nicht|mehr genug Geld."
+msgstr "You do not|have enough money left."
+
+#: ../../ms2/ms2_r1.c:389
+msgid "Du merkst, daá das Taxi stark beschleunigt."
+msgstr "You notice the taxi is accelerating rapidly."
+
+#: ../../ms2/ms2_r1.c:398
+msgid "Fnf Minuten sp„ter ..."
+msgstr "Five minutes later ..."
+
+#: ../../ms2/ms2_r1.c:433
+msgid "Du hast doch schon eine Stange"
+msgstr "You already have a pole"
+
+#: ../../ms2/ms2_r1.c:436
+msgid "Du s„gst eine der Stangen ab."
+msgstr "You saw off one of the poles."
+
+#: ../../ms2/ms2_r1.c:444
+msgid "Du betrittst das einzige|offene Gesch„ft, das|du finden kannst."
+msgstr "You enter the only|open shop that|you can find."
+
+#: ../../ms2/ms2_r1.c:507
+msgid "Die Kabine ist besetzt."
+msgstr "The cabin is occupied."
+
+#: ../../ms2/ms2_r1.c:524
+msgid "He, nimm erstmal das Geld|aus dem Rckgabeschlitz!"
+msgstr "Hey, take the money|from the return slot!"
+
+#: ../../ms2/ms2_r1.c:526
+msgid "Du hast doch schon bezahlt."
+msgstr "You have already paid."
+
+#: ../../ms2/ms2_r1.c:528
+msgid "Du hast nicht mehr genug Geld."
+msgstr "You do not have enough money left."
+
+#: ../../ms2/ms2_r1.c:531
+msgid "Du wirfst 10 Xa in den Schlitz."
+msgstr "You put 10 Xa in the slot."
+
+#: ../../ms2/ms2_r1.c:566
+msgid "Dir wird schwarz vor Augen."
+msgstr "You are about to pass out."
+
+#: ../../ms2/ms2_r1.c:582
+msgid "Du ruhst dich eine Weile aus."
+msgstr "You rest for a while."
+
+#: ../../ms2/ms2_r1.c:598
+msgid ""
+"An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|"
+"0=0, 1=9, 2=8 ...\""
+msgstr ""
+"On the Wall is:|\"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
+"\""
+
+#: ../../ms2/ms2_r1.c:657
+msgid "Ok, ich nehme es."
+msgstr "OK, I'll take it."
+
+#: ../../ms2/ms2_r1.c:658
+msgid "Nein danke, das ist mir zu teuer."
+msgstr "No thanks, that's too expensive for me."
+
+#: ../../ms2/ms2_r1.c:662
+msgid "Ich wrde gern etwas kaufen."
+msgstr "I would like to buy something."
+
+#: ../../ms2/ms2_r1.c:663
+msgid "Ich bin's, Horst Hummel."
+msgstr "It's me, Horst Hummel."
+
+#: ../../ms2/ms2_r1.c:664
+msgid "Haben Sie auch einen Musikchip fr das Ger„t?"
+msgstr "Do you have a music chip for the device?"
+
+#: ../../ms2/ms2_r1.c:668
+msgid "Eine tolle Maske, nicht wahr?"
+msgstr "It's a great mask, right?"
+
+#: ../../ms2/ms2_r1.c:668
+msgid "Komisch, daá sie schon drei Jahre da steht."
+msgstr "Strange that it has been there for three years."
+
+#: ../../ms2/ms2_r1.c:669
+msgid "Ein starker Trunk. Zieht ganz sch”n rein."
+msgstr "A strong drink. It hits you pretty hard."
+
+#: ../../ms2/ms2_r1.c:670
+msgid "Ein Abspiel- und Aufnahmeger„t fr die neuen Musikchips."
+msgstr "A playback and recording device for the new music chips."
+
+#: ../../ms2/ms2_r1.c:671
+msgid "Eine ARTUS-Zahnbrste. Der letzte Schrei."
+msgstr "An ARTUS toothbrush. The latest craze."
+
+#: ../../ms2/ms2_r1.c:671
+msgid "Verkaufe ich massenhaft, die Dinger."
+msgstr "I sell these things in bulk."
+
+#: ../../ms2/ms2_r1.c:672
+msgid "Das sind echte Rarit„ten. Bcher in gebundener Form."
+msgstr "These are real rarities. Books in bound form."
+
+#: ../../ms2/ms2_r1.c:673
+msgid "Die Encyclopedia Axacussana."
+msgstr "The Encyclopedia Axacussana."
+
+#: ../../ms2/ms2_r1.c:673
+msgid "Das gr”áte erh„ltliche Lexikon auf 30 Speicherchips."
+msgstr "The largest available dictionary on 30 memory chips."
+
+#: ../../ms2/ms2_r1.c:673
+msgid "šber 400 Trilliarden Stichw”rter."
+msgstr "Over 400 sextillion keywords."
+
+#: ../../ms2/ms2_r1.c:674
+msgid "Die ist nicht zu verkaufen."
+msgstr "It is not for sale."
+
+#: ../../ms2/ms2_r1.c:675
+msgid "So eine habe ich meinem Enkel zum Geburtstag geschenkt."
+msgstr "I gave one to my grandson for his birthday."
+
+#: ../../ms2/ms2_r1.c:675
+msgid "Er war begeistert von dem Ding."
+msgstr "He was excited about this thing."
+
+#: ../../ms2/ms2_r1.c:676
+msgid "Der stammt aus einem bekannten Computerspiel."
+msgstr "It comes from a well-known computer game."
+
+#: ../../ms2/ms2_r1.c:677
+msgid "Robust, handlich und stromsparend."
+msgstr "Sturdy, handy and energy-saving."
+
+#: ../../ms2/ms2_r1.c:678 ../../ms2/ms2_r1.c:679 ../../ms2/ms2_r1.c:680
+#: ../../ms2/ms2_r1.c:681
+msgid "Irgendein lasches Ges”ff."
+msgstr "Some cheap swill."
+
+#: ../../ms2/ms2_r1.c:682
+msgid "Das sind Protestaufkleber gegen die hohen Taxigebhren."
+msgstr "These are stickers protesting the high taxi fees."
+
+#: ../../ms2/ms2_r1.c:683
+msgid "Das ist Geschirr aus der neuen Umbina-Kollektion."
+msgstr "These are dishes from the new Umbina-Collection."
+
+#: ../../ms2/ms2_r1.c:683
+msgid "H„álich, nicht wahr?"
+msgstr "Ugly, right?"
+
+#: ../../ms2/ms2_r1.c:683
+msgid "Aber verkaufen tut sich das Zeug gut."
+msgstr "But this stuff sells well."
+
+#: ../../ms2/ms2_r1.c:699
+#, c-format
+msgid "Das kostet %d Xa."
+msgstr "That costs %d Xa."
+
+#: ../../ms2/ms2_r1.c:726
+msgid "Schauen Sie sich ruhig um!"
+msgstr "Take a look around!"
+
+#: ../../ms2/ms2_r1.c:728
+msgid "Unsinn!"
+msgstr "Nonsense!"
+
+#: ../../ms2/ms2_r1.c:730
+msgid "Tut mir leid, die sind|schon alle ausverkauft."
+msgstr "I'm very sorry,|they are already sold out."
+
+#: ../../ms2/ms2_r1.c:743
+msgid "Guten Abend."
+msgstr "Good evening."
+
+#: ../../ms2/ms2_r1.c:744
+msgid "Hallo."
+msgstr "Hello."
+
+#: ../../ms2/ms2_r1.c:754
+msgid "Huch, Sie haben mich aber erschreckt!"
+msgstr "Yikes, you scared me!"
+
+#: ../../ms2/ms2_r1.c:755
+msgid "Wieso?"
+msgstr "How so?"
+
+#: ../../ms2/ms2_r1.c:756
+msgid "Ihre Verkleidung ist wirklich t„uschend echt."
+msgstr "Your disguise is deceptively real-looking."
+
+#: ../../ms2/ms2_r1.c:757
+msgid "Welche Verkleidung?"
+msgstr "What disguise?"
+
+#: ../../ms2/ms2_r1.c:758
+msgid "Na, tun Sie nicht so!"
+msgstr "Stop pretending you don't know!"
+
+#: ../../ms2/ms2_r1.c:759
+msgid ""
+"Sie haben sich verkleidet wie der Auáerirdische,|dieser Horst Hummel, oder "
+"wie er heiát."
+msgstr ""
+"You disguised yourself as that extraterrestrial guy,|Horst Hummel, or "
+"whatever his name is."
+
+#: ../../ms2/ms2_r1.c:760 ../../ms2/ms2_r2.c:419
+msgid "Ich BIN Horst Hummel!"
+msgstr "I AM Horst Hummel!"
+
+#: ../../ms2/ms2_r1.c:761
+msgid "Geben Sie's auf!"
+msgstr "Give it up!"
+
+#: ../../ms2/ms2_r1.c:762
+msgid "An Ihrer Gestik merkt man, daá Sie|ein verkleideter Axacussaner sind."
+msgstr "You can tell from your gestures that you are|a disguised Axacussan."
+
+#: ../../ms2/ms2_r1.c:763
+msgid "Der echte Hummel bewegt sich|anders, irgendwie ruckartig."
+msgstr "The real Hummel moves|differently, kind of jerky."
+
+#: ../../ms2/ms2_r1.c:764
+msgid "Weil er ein Roboter ist! ICH bin der Echte!"
+msgstr "Because he is a robot! I am the real one!"
+
+#: ../../ms2/ms2_r1.c:765 ../../ms2/ms2_r2.c:56
+msgid "Ach, Sie spinnen ja!"
+msgstr "Oh, you are crazy!"
+
+#: ../../ms2/ms2_r1.c:766
+msgid "Sie Trottel!!!"
+msgstr "You Idiot!!!"
+
+#: ../../ms2/ms2_r1.c:767
+msgid "Seien Sie still, oder ich werfe Sie raus!"
+msgstr "Shut up or I'll kick you out!"
+
+#: ../../ms2/ms2_r1.c:780
+msgid "Taschenmesser"
+msgstr "Pocket knife"
+
+#: ../../ms2/ms2_r1.c:780
+msgid "Hey, da ist sogar eine S„ge dran."
+msgstr "Hey, there's even a saw on it."
+
+#: ../../ms2/ms2_r1.c:781
+msgid "20 Xa"
+msgstr "20 Xa"
+
+#: ../../ms2/ms2_r1.c:782
+msgid "Discman"
+msgstr "Discman"
+
+#: ../../ms2/ms2_r1.c:782
+msgid "Da ist noch die \"Mad Monkeys\"-CD drin."
+msgstr "The \"Mad Monkeys\" CD is still in there."
+
+#: ../../ms2/ms2_r1.c:783
+msgid "Mit dem Ding sollst du dich|an der Wand festhalten."
+msgstr "You should hold onto the wall|using that thing."
+
+#: ../../ms2/ms2_r1.c:785
+msgid "Spezialkeycard"
+msgstr "Special keycard"
+
+#: ../../ms2/ms2_r1.c:785
+msgid "Damit sollst du die|Tren knacken k”nnen."
+msgstr "With that you should be able to crack the doors."
+
+#: ../../ms2/ms2_r1.c:786
+msgid "Alarmknacker"
+msgstr "Alarm cracker"
+
+#: ../../ms2/ms2_r1.c:786
+msgid "Ein kleines Ger„t, um|die Alarmanlage auszuschalten."
+msgstr "A small device|to turn off the alarm."
+
+#: ../../ms2/ms2_r1.c:788
+msgid "Karte"
+msgstr "Keycard"
+
+#: ../../ms2/ms2_r1.c:795
+msgid "Raumschiff"
+msgstr "Spaceship"
+
+#: ../../ms2/ms2_r1.c:795
+msgid "Damit bist du hierhergekommen."
+msgstr "You came here with it."
+
+#: ../../ms2/ms2_r1.c:796
+msgid "Fahrzeuge"
+msgstr "Vehicles"
+
+#: ../../ms2/ms2_r1.c:796
+msgid "Du kannst von hier aus nicht erkennen,|was das fr Fahrzeuge sind."
+msgstr "You cannot tell from here|what those vehicles are."
+
+#: ../../ms2/ms2_r1.c:803 ../../ms2/ms2_r1.c:804
+msgid "Fahrzeug"
+msgstr "Vehicle"
+
+#: ../../ms2/ms2_r1.c:803 ../../ms2/ms2_r1.c:804
+msgid "Es scheint ein Taxi zu sein."
+msgstr "It seems to be a taxi."
+
+#: ../../ms2/ms2_r1.c:805
+msgid "Komisch, er ist verschlossen."
+msgstr "Funny, it is closed."
+
+#: ../../ms2/ms2_r1.c:806
+msgid "Portemonnaie"
+msgstr "Wallet"
+
+#: ../../ms2/ms2_r1.c:806
+msgid "Das muá ein Axacussaner|hier verloren haben."
+msgstr "This must have been|lost by an Axacussan."
+
+#: ../../ms2/ms2_r1.c:807
+msgid "Ger„t"
+msgstr "Device"
+
+#: ../../ms2/ms2_r1.c:807
+msgid "Auf dem Ger„t steht: \"Taxi-Call\".|Es ist ein kleiner Knopf daran."
+msgstr "The device says \"Taxi Call.\"|There is a small button on it."
+
+#: ../../ms2/ms2_r1.c:808
+msgid "Ausweis"
+msgstr "ID card"
+
+#: ../../ms2/ms2_r1.c:808
+msgid "Auf dem Ausweis steht:|  Berta Tschell|  Axacuss City|  115AY2,96A,32"
+msgstr "On the card it reads: | Berta Tschell | Axacuss City | 115AY2,96A,32"
+
+#: ../../ms2/ms2_r1.c:817
+msgid "Treppe"
+msgstr "Staircase"
+
+#: ../../ms2/ms2_r1.c:817
+msgid "Sie fhrt zu den Gesch„ften."
+msgstr "It leads to the shops."
+
+#: ../../ms2/ms2_r1.c:818
+msgid "Gesch„ftsstraáe im Hintergrund"
+msgstr "Business street in the background"
+
+#: ../../ms2/ms2_r1.c:818
+msgid "Die Straáe scheint kein Ende zu haben."
+msgstr "The road seems to have no end."
+
+#: ../../ms2/ms2_r1.c:819 ../../ms2/ms2_r1.c:820
+msgid "Stange"
+msgstr "Rod"
+
+#: ../../ms2/ms2_r1.c:821
+msgid "Pfosten"
+msgstr "Post"
+
+#: ../../ms2/ms2_r1.c:822
+msgid "Gel„nder"
+msgstr "Railing"
+
+#: ../../ms2/ms2_r1.c:829
+msgid "Plakat"
+msgstr "Poster"
+
+#: ../../ms2/ms2_r1.c:829
+msgid ""
+"Musik Pur - Der Musikwettbewerb!|Heute im Kulturpalast|Hauptpreis:|"
+"Fernsehauftritt mit Horst Hummel|Sponsored by Artus GmbH"
+msgstr ""
+"Pure Music - The Music Competition!|Today at the Palace of Culture|Main "
+"Prize:|Television appearance with Horst Hummel|Sponsored by Artus GmbH"
+
+#: ../../ms2/ms2_r1.c:830 ../../ms2/ms2_r1.c:831
+msgid "Kabine"
+msgstr "Cabin"
+
+#: ../../ms2/ms2_r1.c:830
+msgid "Sie ist frei!"
+msgstr "It is free!"
+
+#: ../../ms2/ms2_r1.c:831
+msgid "Sie ist besetzt."
+msgstr "It is occupied."
+
+#: ../../ms2/ms2_r1.c:832
+msgid "Fáe"
+msgstr "Feet"
+
+#: ../../ms2/ms2_r1.c:832
+msgid "Komisch, die|Fáe scheinen|erstarrt zu sein."
+msgstr "Strange, the|feet seem to be frozen."
+
+#: ../../ms2/ms2_r1.c:841
+msgid "Haube"
+msgstr "Hood"
+
+#: ../../ms2/ms2_r1.c:841
+msgid "Sieht aus wie beim Fris”r."
+msgstr "Looks like the hairdresser."
+
+#: ../../ms2/ms2_r1.c:842
+msgid "400 Xa"
+msgstr "400 Xa"
+
+#: ../../ms2/ms2_r1.c:843
+msgid "10 Xa"
+msgstr "10 Xa"
+
+#: ../../ms2/ms2_r1.c:844
+msgid "Darber steht:|\"Geldeinwurf: 10 Xa\"."
+msgstr "It says:|\"Coins: 10 Xa\"."
+
+#: ../../ms2/ms2_r1.c:845
+msgid "Darber steht:|\"Gewinnausgabe / Geldrckgabe\"."
+msgstr "It says:|\"Prize / Money Return\"."
+
+#: ../../ms2/ms2_r1.c:846 ../../ms2/ms2_r2.c:1264
+msgid "Stuhl"
+msgstr "Chair"
+
+#: ../../ms2/ms2_r1.c:846
+msgid "Etwas Entspannung k”nntest du jetzt gebrauchen."
+msgstr "You could use some relaxation right about now."
+
+#: ../../ms2/ms2_r1.c:847 ../../ms2/ms2_r1.c:848
+msgid "Gekritzel"
+msgstr "Scribble"
+
+#: ../../ms2/ms2_r1.c:849 ../../ms2/ms2_r1.c:873
+msgid "Gesicht"
+msgstr "Face"
+
+#: ../../ms2/ms2_r1.c:849
+msgid "Nicht zu fassen! Die|W„nde sind genauso beschmutzt|wie auf der Erde."
+msgstr "Unbelievable! The walls|are just as dirty|as those on Earth."
+
+#: ../../ms2/ms2_r1.c:858
+msgid "Bcher"
+msgstr "Books"
+
+#: ../../ms2/ms2_r1.c:859
+msgid "Lexikon"
+msgstr "Dictionary"
+
+#: ../../ms2/ms2_r1.c:860
+msgid "Pflanze"
+msgstr "Plant"
+
+#: ../../ms2/ms2_r1.c:861
+msgid "Maske"
+msgstr "Mask"
+
+#: ../../ms2/ms2_r1.c:862
+msgid "Schlange"
+msgstr "Snake"
+
+#: ../../ms2/ms2_r1.c:863
+msgid "Becher"
+msgstr "Cup"
+
+#: ../../ms2/ms2_r1.c:864
+msgid "Joystick"
+msgstr "Joystick"
+
+#: ../../ms2/ms2_r1.c:865
+msgid "Eine normale Zahnbrste,|es steht nur \"Artus\" darauf."
+msgstr "An ordinary toothbrush.|It says \"Artus\" on it."
+
+#: ../../ms2/ms2_r1.c:866
+msgid "Musikger„t"
+msgstr "Music device"
+
+#: ../../ms2/ms2_r1.c:866
+msgid ""
+"Ein Ger„t zum Abspielen und|Aufnehmen von Musikchips.|Es ist ein Mikrofon "
+"daran."
+msgstr ""
+"A device for playing and recording music chips.|There is a microphone on it."
+
+#: ../../ms2/ms2_r1.c:867 ../../ms2/ms2_r1.c:868 ../../ms2/ms2_r1.c:869
+#: ../../ms2/ms2_r1.c:870 ../../ms2/ms2_r1.c:871
+msgid "Flasche"
+msgstr "Bottle"
+
+#: ../../ms2/ms2_r1.c:867
+msgid "Auf dem Etikett steht:|\"Enth„lt 10% Hyperalkohol\"."
+msgstr "The label says: \"Contains 10% hyperalcohol\"."
+
+#: ../../ms2/ms2_r1.c:872
+msgid "Kiste"
+msgstr "Box"
+
+#: ../../ms2/ms2_r1.c:874
+msgid "Verk„ufer"
+msgstr "Seller"
+
+#: ../../ms2/ms2_r2.c:36
+msgid "Was? Dafr wollen Sie die Karte haben?"
+msgstr "What? Do you want the card for that?"
+
+#: ../../ms2/ms2_r2.c:37
+msgid "Sie sind wohl nicht ganz ber|die aktuellen Preise informiert!"
+msgstr "You are probably not completely|informed about the current prices!"
+
+#: ../../ms2/ms2_r2.c:47
+msgid "Ich bin's, Horst Hummel!"
+msgstr "It's me, Horst Hummel!"
+
+#: ../../ms2/ms2_r2.c:48
+msgid "Sch”nes Wetter heute!"
+msgstr "Nice weather today!"
+
+#: ../../ms2/ms2_r2.c:49
+msgid ""
+"K”nnen Sie mir sagen, von wem ich eine Eintrittskarte fr den "
+"Musikwettbewerb kriegen kann?"
+msgstr "Can you tell me who can get me a ticket for the music contest?"
+
+#: ../../ms2/ms2_r2.c:55
+msgid "Ok, hier haben Sie den Xa."
+msgstr "OK, here is the Xa."
+
+#: ../../ms2/ms2_r2.c:60
+msgid "Ich biete Ihnen 500 Xa."
+msgstr "I offer you 500 Xa."
+
+#: ../../ms2/ms2_r2.c:61
+msgid "Ich biete Ihnen 1000 Xa."
+msgstr "I offer you 1000 Xa."
+
+#: ../../ms2/ms2_r2.c:62
+msgid "Ich biete Ihnen 5000 Xa."
+msgstr "I offer you 5000 Xa."
+
+#: ../../ms2/ms2_r2.c:63
+msgid "Ich biete Ihnen 10000 Xa."
+msgstr "I offer you 10000 Xa."
+
+#: ../../ms2/ms2_r2.c:72
+msgid "Vielen Dank fr Ihren Kauf!"
+msgstr "Thank you for your purchase!"
+
+#: ../../ms2/ms2_r2.c:77
+msgid "Was bieten Sie mir|denn nun fr die Karte?"
+msgstr "What will you offer me|for the card?"
+
+#: ../../ms2/ms2_r2.c:81
+msgid "Hallo, Sie!"
+msgstr "Hello to you!"
+
+#: ../../ms2/ms2_r2.c:83 ../../ms2/ms2_r2.c:719
+msgid "Was wollen Sie?"
+msgstr "What do you want?"
+
+#: ../../ms2/ms2_r2.c:87
+msgid "Wer sind Sie?"
+msgstr "Who are you?"
+
+#: ../../ms2/ms2_r2.c:88
+msgid "Horst Hummel!"
+msgstr "Horst Hummel!"
+
+#: ../../ms2/ms2_r2.c:89
+msgid "Kenne ich nicht."
+msgstr "Never heard of him."
+
+#: ../../ms2/ms2_r2.c:90
+msgid "Was, Sie kennen den berhmten Horst Hummel nicht?"
+msgstr "What, you don't know the famous Horst Hummel?"
+
+#: ../../ms2/ms2_r2.c:91
+msgid "Ich bin doch der, der immer im Fernsehen zu sehen ist."
+msgstr "I'm the guy who is always on TV."
+
+#: ../../ms2/ms2_r2.c:92
+msgid "Ich kenne Sie wirklich nicht."
+msgstr "I really do not know you."
+
+#: ../../ms2/ms2_r2.c:93
+msgid "Komisch."
+msgstr "Funny."
+
+#: ../../ms2/ms2_r2.c:95 ../../ms2/ms2_r2.c:1155
+msgid "Aha."
+msgstr "Aha."
+
+#: ../../ms2/ms2_r2.c:97
+msgid "Ja, kann ich."
+msgstr "Yes, I can."
+
+#: ../../ms2/ms2_r2.c:98
+msgid "Von wem denn?"
+msgstr "From whom?"
+
+#: ../../ms2/ms2_r2.c:99
+msgid "Diese Information kostet einen Xa."
+msgstr "This information costs a Xa."
+
+#: ../../ms2/ms2_r2.c:104
+msgid "Wie Sie meinen."
+msgstr "As you say."
+
+#: ../../ms2/ms2_r2.c:110
+msgid "Sie k”nnen die Karte von MIR bekommen!"
+msgstr "You can get the card from ME!"
+
+#: ../../ms2/ms2_r2.c:111
+msgid "Aber nur eine Teilnahmekarte,|keine Eintrittskarte."
+msgstr "But only a participation ticket,|not an entrance ticket."
+
+#: ../../ms2/ms2_r2.c:112
+msgid "Was wollen Sie dafr haben?"
+msgstr "What do you want for it?"
+
+#: ../../ms2/ms2_r2.c:113
+msgid "Machen Sie ein Angebot!"
+msgstr "Make an offer!"
+
+#: ../../ms2/ms2_r2.c:133
+msgid "Das ist ein gutes Angebot!"
+msgstr "That's a good offer!"
+
+#: ../../ms2/ms2_r2.c:135
+msgid "Dafr gebe ich Ihnen meine|letzte Teilnahmekarte!"
+msgstr "For that I give you my|last participation card!"
+
+#: ../../ms2/ms2_r2.c:140
+msgid "(Dieser Trottel!)"
+msgstr "(That Idiot!)"
+
+#: ../../ms2/ms2_r2.c:190
+msgid "Ich wrde gern beim Musikwettbewerb zuschauen."
+msgstr "I would like to watch the music competition."
+
+#: ../../ms2/ms2_r2.c:191
+msgid "Ich wrde gern am Musikwettbewerb teilnehmen."
+msgstr "I would like to participate in the music competition."
+
+#: ../../ms2/ms2_r2.c:192
+msgid "Wieviel Uhr haben wir?"
+msgstr "What time is it?"
+
+#: ../../ms2/ms2_r2.c:196 ../../ms2/ms2_r2.c:749
+msgid "Ja."
+msgstr "Yes."
+
+#: ../../ms2/ms2_r2.c:197 ../../ms2/ms2_r2.c:379 ../../ms2/ms2_r2.c:391
+#: ../../ms2/ms2_r2.c:697
+msgid "Nein."
+msgstr "No."
+
+#: ../../ms2/ms2_r2.c:201
+msgid "Hallo, Leute!"
+msgstr "Hi guys!"
+
+#: ../../ms2/ms2_r2.c:202
+msgid "Hi, Fans!"
+msgstr "Hi, fans!"
+
+#: ../../ms2/ms2_r2.c:203
+msgid "Gute Nacht!"
+msgstr "Good night!"
+
+#: ../../ms2/ms2_r2.c:207
+msgid "Žh, wie geht es euch?"
+msgstr "Uh, how are you?"
+
+#: ../../ms2/ms2_r2.c:208
+msgid "Sch”nes Wetter heute."
+msgstr "Nice weather today."
+
+#: ../../ms2/ms2_r2.c:212
+msgid "Hmm ..."
+msgstr "Hmm ..."
+
+#: ../../ms2/ms2_r2.c:213
+msgid "Tja ..."
+msgstr "Well ..."
+
+#: ../../ms2/ms2_r2.c:214
+msgid "Also ..."
+msgstr "So ..."
+
+#: ../../ms2/ms2_r2.c:218
+msgid "Ok, los gehts!"
+msgstr "OK let's go!"
+
+#: ../../ms2/ms2_r2.c:219
+msgid "Ich klimper mal was auf dem Keyboard hier."
+msgstr "I'll fix something on the keyboard here."
+
+#: ../../ms2/ms2_r2.c:234
+msgid "Halt, sie sind doch schon drangewesen!"
+msgstr "Stop, you have already been on it!"
+
+#: ../../ms2/ms2_r2.c:240
+msgid "He, Sie! Haben Sie|eine Eintrittskarte?"
+msgstr "Hey, you! Do you have|a ticket?"
+
+#: ../../ms2/ms2_r2.c:244
+msgid "Ja natrlich, hier ist meine Teilnahmekarte."
+msgstr "Yes of course, here is my participation ticket."
+
+#: ../../ms2/ms2_r2.c:245
+msgid ""
+"Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten "
+"k”nnen."
+msgstr ""
+"You are a participant!|Please ask at the checkout|when you can go on stage."
+
+#: ../../ms2/ms2_r2.c:247
+msgid "Žh, nein."
+msgstr "Uh, no."
+
+#: ../../ms2/ms2_r2.c:252
+msgid "He, wo ist Ihr Musikchip?"
+msgstr "Hey, where's your music chip?"
+
+#: ../../ms2/ms2_r2.c:267
+msgid "Laber nicht!"
+msgstr "Stop talking!"
+
+#: ../../ms2/ms2_r2.c:270
+msgid "Fang an!"
+msgstr "Get started!"
+
+#: ../../ms2/ms2_r2.c:273
+msgid "Einen Moment, ich muá erstmal berlegen, was ich|euch spiele."
+msgstr "One moment, I have to think about what I'm playing for you."
+
+#: ../../ms2/ms2_r2.c:275
+msgid "Anfangen!!!"
+msgstr "Begin!!!"
+
+#: ../../ms2/ms2_r2.c:278
+msgid "Nun denn ..."
+msgstr "Well then ..."
+
+#: ../../ms2/ms2_r2.c:279
+msgid "Raus!"
+msgstr "Out!"
+
+#: ../../ms2/ms2_r2.c:291 ../../ms2/ms2_r2.c:306
+msgid "Buh!"
+msgstr "Boo!"
+
+#: ../../ms2/ms2_r2.c:298
+msgid "Aufh”ren!"
+msgstr "Stop!"
+
+#: ../../ms2/ms2_r2.c:309
+msgid "Hilfe!"
+msgstr "Help!"
+
+#: ../../ms2/ms2_r2.c:312
+msgid "Ich verziehe mich lieber."
+msgstr "I'd prefer to get lost."
+
+#: ../../ms2/ms2_r2.c:317
+msgid "Mist, auf dem Chip war|gar keine Musik drauf."
+msgstr "Damn, there was no music on the chip at all."
+
+#: ../../ms2/ms2_r2.c:319
+msgid "Das ging ja voll daneben!"
+msgstr "That went completely wrong!"
+
+#: ../../ms2/ms2_r2.c:327
+msgid "Du n„herst dich der Bhne,|aber dir wird mulmig zumute."
+msgstr "You approach the stage,|but you feel queasy."
+
+#: ../../ms2/ms2_r2.c:330
+msgid ""
+"Du traust dich nicht, vor|so vielen Menschen aufzutreten|und kehrst wieder "
+"um."
+msgstr "You do not dare to appear|in front of so many people|and turn around."
+
+#: ../../ms2/ms2_r2.c:347
+msgid "Oh, Sie sind Teilnehmer!|Dann sind Sie aber sp„t dran."
+msgstr "Oh, you are a participant!|But you are late."
+
+#: ../../ms2/ms2_r2.c:348
+msgid "Spielen Sie die Musik live?"
+msgstr "Do you play the music live?"
+
+#: ../../ms2/ms2_r2.c:351
+msgid ""
+"Dann geben Sie bitte Ihren Musikchip ab!|Er wird bei Ihrem Auftritt "
+"abgespielt."
+msgstr ""
+"Then please submit your music chip!|It will be played during your "
+"performance."
+
+#: ../../ms2/ms2_r2.c:357
+msgid ""
+"Oh, Sie sind sofort an der Reihe!|Beeilen Sie sich! Der Bhneneingang|ist "
+"hinter dem Haupteingang rechts."
+msgstr ""
+"Oh, it's your turn!|Hurry! The stage entrance|is to the right behind the "
+"main entrance."
+
+#: ../../ms2/ms2_r2.c:367
+msgid "Habe ich noch einen zweiten Versuch?"
+msgstr "Can I have another try?"
+
+#: ../../ms2/ms2_r2.c:368
+msgid "Nein!"
+msgstr "No!"
+
+#: ../../ms2/ms2_r2.c:378
+msgid "Haben Sie schon eine Eintrittskarte?"
+msgstr "Do you already have a ticket?"
+
+#: ../../ms2/ms2_r2.c:380
+msgid "Tut mir leid, die Karten|sind schon alle ausverkauft."
+msgstr "I'm sorry, the tickets|are already sold out."
+
+#: ../../ms2/ms2_r2.c:381
+msgid "Mist!"
+msgstr "Crap!"
+
+#: ../../ms2/ms2_r2.c:383
+msgid "Haben Sie schon eine Teilnahmekarte?"
+msgstr "Do you already have a participation ticket?"
+
+#: ../../ms2/ms2_r2.c:386
+msgid "Ja, hier ist sie."
+msgstr "Yes, here it is."
+
+#: ../../ms2/ms2_r2.c:392
+msgid "Tut mir leid, die Teilnahmekarten|sind schon alle ausverkauft."
+msgstr "I'm sorry, the participation tickets|are already sold out."
+
+#: ../../ms2/ms2_r2.c:393
+msgid "Scheiáe!"
+msgstr "Crap!"
+
+#: ../../ms2/ms2_r2.c:396
+msgid "Das kann ich Ihnen|leider nicht sagen."
+msgstr "I can not tell you that."
+
+#: ../../ms2/ms2_r2.c:401
+msgid "Wo ist denn nun Ihr Musikchip?"
+msgstr "Where is your music chip?"
+
+#: ../../ms2/ms2_r2.c:403
+msgid "Jetzt beeilen Sie sich doch!"
+msgstr "Now hurry up!"
+
+#: ../../ms2/ms2_r2.c:416
+msgid ""
+"Huch, Sie sind hier bei einem Musik-,|nicht bei einem Imitationswettbewerb"
+msgstr "Huh, you're here at a music contest,|not at an imitation contest"
+
+#: ../../ms2/ms2_r2.c:417
+msgid "Imitationswettbewerb?|Ich will niemanden imitieren."
+msgstr "Imitation contest?|I do not want to imitate anyone."
+
+#: ../../ms2/ms2_r2.c:418
+msgid "Guter Witz, wieso sehen Sie|dann aus wie Horst Hummel?"
+msgstr "Good joke. Then why do you look like Horst Hummel?"
+
+#: ../../ms2/ms2_r2.c:420
+msgid ""
+"Na, nun h”ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht."
+msgstr "Oh come on! Your disguise isn't that perfect."
+
+#: ../../ms2/ms2_r2.c:421
+msgid ""
+"Ich werde Ihnen beweisen, daá ich Horst Hummel bin,|indem ich diesen "
+"Wettbewerb hier gewinne."
+msgstr ""
+"I will prove to you that I am Horst Hummel|by winning this competition."
+
+#: ../../ms2/ms2_r2.c:422
+msgid "Dann kann ich in dieser verdammten Fernsehshow|auftreten."
+msgstr "Then I can perform in this|damn TV show."
+
+#: ../../ms2/ms2_r2.c:447
+msgid ""
+"Du hampelst ein biáchen zu|der Musik vom Chip herum.|Die Leute sind "
+"begeistert!"
+msgstr ""
+"You're rocking a little bit|to the music from the chip.|The audience is "
+"excited!"
+
+#: ../../ms2/ms2_r2.c:484
+msgid "Guten Abend. Diesmal haben wir|einen besonderen Gast bei uns."
+msgstr "Good evening. This time we have|a special guest with us."
+
+#: ../../ms2/ms2_r2.c:485
+msgid ""
+"Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort "
+"vor allem durch seine|Verkleidung aufgefallen war."
+msgstr ""
+"He is the winner of yesterday's music competition in the Palace of Culture.|"
+"He was particularly noteworthy|because of his disguise."
+
+#: ../../ms2/ms2_r2.c:489
+msgid "Sie haben das Wort!"
+msgstr "You have the floor!"
+
+#: ../../ms2/ms2_r2.c:490
+msgid "Nun ja, meine erste Frage lautet: ..."
+msgstr "Well, my first question is ..."
+
+#: ../../ms2/ms2_r2.c:491


Commit: 7164016b34d86329a26c8b47ec986ff810ff7b73
    https://github.com/scummvm/scummvm/commit/7164016b34d86329a26c8b47ec986ff810ff7b73
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Refactor .dat file access

Changed paths:
    engines/supernova/graphics.cpp
    engines/supernova/graphics.h
    engines/supernova/resman.cpp
    engines/supernova/resman.h
    engines/supernova/supernova.cpp


diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index fb248e3..e8b4ce1 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -36,8 +36,8 @@
 
 namespace Supernova {
 
-MSNImage::MSNImage(int MSPart)
-	: _MSPart(MSPart) {
+MSNImage::MSNImage(SupernovaEngine *vm)
+	: _vm(vm) {
 	_palette = nullptr;
 	_encodedImage = nullptr;
 	_filenumber = -1;
@@ -71,14 +71,14 @@ MSNImage::~MSNImage() {
 bool MSNImage::init(int filenumber) {
 	Common::File file;
 	_filenumber = filenumber;
-	if (_MSPart == 1) {
+	if (_vm->_MSPart == 1) {
 		if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
 			warning("Image data file msn_data.%03d could not be read!", filenumber);
 			return false;
 		}
 		loadStream(file);
 	}
-	else if (_MSPart == 2) {
+	else if (_vm->_MSPart == 2) {
 		if (!loadFromEngineDataFile()) {
 			if (!file.open(Common::String::format("ms2_data.%03d", filenumber))) {
 				warning("Image data file ms2_data.%03d could not be read!", filenumber);
@@ -93,125 +93,38 @@ bool MSNImage::init(int filenumber) {
 
 bool MSNImage::loadPbmFromEngineDataFile() {
 	Common::String name;
-	Common::File f;
-	char id[5], lang[5];
-	id[4] = lang[4] = '\0';
-	if (_MSPart == 2)
+	if (_vm->_MSPart == 2)
 		return false;
 	if (_filenumber == 1)
 		name = "IMG1";
 	else if (_filenumber == 2)
 		name = "IMG2";
 	else
-
-		return false;
-	if (!f.open(SUPERNOVA_DAT))
 		return false;
-	
-	f.read(id, 3);
-	if (strncmp(id, "MSN", 3) != 0)
+	Common::SeekableReadStream *stream = _vm->getBlockFromDatFile(name);
+	if (stream == nullptr)
 		return false;
-	int version = f.readByte();
-	if (version != SUPERNOVA_DAT_VERSION)
-		return false;
-
-	Common::String cur_lang = ConfMan.get("language");
-
-	// Note: we don't print any warning or errors here if we cannot find the file
-	// or the format is not as expected. We will get those warning when reading the
-	// strings anyway (actually the engine will even refuse to start).
-
-	int part;
-	uint32 gameBlockSize;
-	while (!f.eos()) {
-		part = f.readByte();
-		gameBlockSize = f.readUint32LE();
-		if (f.eos()){
-			return false;
-		}
-		if (part == _MSPart) {
-			break;
-		} else
-			f.skip(gameBlockSize);
-	}
-
-	uint32 readSize = 0;
-
-	while (readSize < gameBlockSize) {
-		f.read(id, 4);
-		f.read(lang, 4);
-		uint32 size = f.readUint32LE();
-		if (f.eos())
-			break;
-		if (name == id && cur_lang == lang) {
-			return f.read(_encodedImage, size) == size;
-		} else {
-			f.skip(size);
-			readSize += size;
-		}
-	}
-
-	return false;
+	stream->read(_encodedImage, stream->size());
+	return true;
 }
 
 bool MSNImage::loadFromEngineDataFile() {
 	Common::String name;
-	Common::File f;
-	char id[5], lang[5];
-	id[4] = lang[4] = '\0';
-	if (_MSPart == 1) {
+	if (_vm->_MSPart == 1) {
 		return false;
-	} else if (_MSPart == 2) {
+	} else if (_vm->_MSPart == 2) {
 		if (_filenumber == 15)
 			name = "M015";
 		else if (_filenumber == 28)
 			name = "M028";
 		else
 			return false;
-
-		if (!f.open(SUPERNOVA_DAT))
-			return false;
-
-		f.read(id, 3);
-		if (strncmp(id, "MSN", 3) != 0)
-			return false;
-		int version = f.readByte();
-		if (version != SUPERNOVA_DAT_VERSION)
-			return false;
 	}
 
-	Common::String cur_lang = ConfMan.get("language");
-
-	int part;
-	uint32 gameBlockSize;
-	while (!f.eos()) {
-		part = f.readByte();
-		gameBlockSize = f.readUint32LE();
-		if (f.eos()){
-			return false;
-		}
-		if (part == _MSPart) {
-			break;
-		} else
-			f.skip(gameBlockSize);
-	}
-
-	uint32 readSize = 0;
-	while (readSize < gameBlockSize) {
-		f.read(id, 4);
-		f.read(lang, 4);
-		uint32 size = f.readUint32LE();
-		if (f.eos())
-			break;
-		if (name == id && cur_lang == lang) {
-			return loadStream(*f.readStream(size));
-		} else {
-			f.skip(size);
-			readSize += size;
-		}
-	}
-
-	return false;
+	Common::SeekableReadStream *stream = _vm->getBlockFromDatFile(name);
+	if (stream == nullptr)
+		return false;
+	return loadStream(*stream);
 }
 
 bool MSNImage::loadStream(Common::SeekableReadStream &stream) {
@@ -312,8 +225,8 @@ bool MSNImage::loadStream(Common::SeekableReadStream &stream) {
 }
 
 bool MSNImage::loadSections() {
-	bool isNewspaper = (_MSPart == 1 && (_filenumber == 1 || _filenumber == 2)) ||
-					   (_MSPart == 2 && _filenumber == 38);
+	bool isNewspaper = (_vm->_MSPart == 1 && (_filenumber == 1 || _filenumber == 2)) ||
+					   (_vm->_MSPart == 2 && _filenumber == 38);
 	int imageWidth = isNewspaper ? 640 : 320;
 	int imageHeight = isNewspaper ? 480 : 200;
 	_pitch = imageWidth;
diff --git a/engines/supernova/graphics.h b/engines/supernova/graphics.h
index c69d650..060bb99 100644
--- a/engines/supernova/graphics.h
+++ b/engines/supernova/graphics.h
@@ -25,6 +25,7 @@
 
 #include "common/scummsys.h"
 #include "image/image_decoder.h"
+#include "supernova/supernova.h"
 
 namespace Common {
 class SeekableReadStream;
@@ -35,10 +36,11 @@ struct Surface;
 }
 
 namespace Supernova {
+class SupernovaEngine;
 
 class MSNImage : public Image::ImageDecoder {
 public:
-	MSNImage(int MSPart);
+	MSNImage(SupernovaEngine *vm);
 	virtual ~MSNImage();
 
 	virtual void destroy();
@@ -79,7 +81,7 @@ public:
 	} _clickField[kMaxClickFields];
 
 private:
-	int _MSPart;
+	SupernovaEngine *_vm;
 	bool loadFromEngineDataFile();
 	bool loadPbmFromEngineDataFile();
 	bool loadSections();
diff --git a/engines/supernova/resman.cpp b/engines/supernova/resman.cpp
index e827ba3..d16cf39 100644
--- a/engines/supernova/resman.cpp
+++ b/engines/supernova/resman.cpp
@@ -114,22 +114,22 @@ static const byte mouseWait[64] = {
 };
 
 
-ResourceManager::ResourceManager(int MSPart)
+ResourceManager::ResourceManager(SupernovaEngine *vm)
 	: _audioRate(11931)
-	, _MSPart(MSPart) {
-	if (MSPart == 1)
+	, _vm(vm) {
+	if (_vm->_MSPart == 1)
 		_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples1];
-	else if (MSPart == 2)
+	else if (_vm->_MSPart == 2)
 		_soundSamples = new Common::ScopedPtr<Audio::SeekableAudioStream>[kAudioNumSamples2];
 	initGraphics();
 }
 
 ResourceManager::~ResourceManager() {
-	if (_MSPart == 1) {	
+	if (_vm->_MSPart == 1) {	
 		for (int i = 0; i < 44; i++)
 			delete _images[i];
 	}
-	if (_MSPart == 2) {	
+	if (_vm->_MSPart == 2) {	
 		for (int i = 0; i < 47; i++)
 			delete _images[i];
 	}
@@ -140,9 +140,9 @@ ResourceManager::~ResourceManager() {
 void ResourceManager::initGraphics() {
 	Screen::initPalette();
 	initCursorGraphics();
-	if (_MSPart == 1)
+	if (_vm->_MSPart == 1)
 		initImages1();
-	else if (_MSPart == 2)
+	else if (_vm->_MSPart == 2)
 		initImages2();
 }
 
@@ -238,18 +238,18 @@ void ResourceManager::loadSound2(AudioId id) {
 }
 
 void ResourceManager::loadImage(int filenumber) {
-	if (_MSPart == 1) {
+	if (_vm->_MSPart == 1) {
 		if (filenumber < 44) {
-			_images[filenumber] = new MSNImage(_MSPart);
+			_images[filenumber] = new MSNImage(_vm);
 			if (!_images[filenumber]->init(filenumber))
 				error("Failed reading image file msn_data.%03d", filenumber);
 		} else {
-			_images[44] = new MSNImage(_MSPart);
+			_images[44] = new MSNImage(_vm);
 			if (!_images[44]->init(filenumber))
 				error("Failed reading image file msn_data.%03d", filenumber);
 		}
-	} else if (_MSPart == 2) {
-		_images[filenumber] = new MSNImage(_MSPart);
+	} else if (_vm->_MSPart == 2) {
+		_images[filenumber] = new MSNImage(_vm);
 		if (!_images[filenumber]->init(filenumber))
 			error("Failed reading image file ms2_data.%03d", filenumber);
 	}
@@ -257,9 +257,9 @@ void ResourceManager::loadImage(int filenumber) {
 
 Audio::SeekableAudioStream *ResourceManager::getSoundStream(AudioId index) {
 	if (!_soundSamples[index]) {
-		if (_MSPart == 1)
+		if (_vm->_MSPart == 1)
 			loadSound1(index);
-		else if (_MSPart == 2)
+		else if (_vm->_MSPart == 2)
 			loadSound2(index);
 	}
 	Audio::SeekableAudioStream *stream;
@@ -273,9 +273,9 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 	switch (index) {
 	case kMusicIntro:
 		if (!_musicIntroBuffer) {
-			if (_MSPart == 1)
+			if (_vm->_MSPart == 1)
 				_musicIntroBuffer.reset(convertToMod("msn_data.052", 1));
-			else if (_MSPart == 2)
+			else if (_vm->_MSPart == 2)
 				_musicIntroBuffer.reset(convertToMod("ms2_data.052", 2));
 		}
 		_musicIntro.reset(Audio::makeProtrackerStream(_musicIntroBuffer.get()));
@@ -284,9 +284,9 @@ Audio::AudioStream *ResourceManager::getSoundStream(MusicId index) {
 		// fall through
 	case kMusicOutro:
 		if (!_musicOutroBuffer) {
-			if (_MSPart == 1)
+			if (_vm->_MSPart == 1)
 				_musicOutroBuffer.reset(convertToMod("msn_data.049", 1));
-			else if (_MSPart == 2)
+			else if (_vm->_MSPart == 2)
 				_musicOutroBuffer.reset(convertToMod("ms2_data.056", 2));
 		}
 		_musicOutro.reset(Audio::makeProtrackerStream(_musicOutroBuffer.get()));
@@ -304,9 +304,9 @@ Audio::AudioStream *ResourceManager::getSirenStream() {
 
 MSNImage *ResourceManager::getImage(int filenumber) {
 	//check array boundaries
-	if (_MSPart == 1 && filenumber > 43 && filenumber != 55)
+	if (_vm->_MSPart == 1 && filenumber > 43 && filenumber != 55)
 		return nullptr;
-	if (_MSPart == 2 && filenumber > 46)
+	if (_vm->_MSPart == 2 && filenumber > 46)
 		return nullptr;
 
 	if (filenumber == 55) {
diff --git a/engines/supernova/resman.h b/engines/supernova/resman.h
index 9a4f739..5fbb3cd 100644
--- a/engines/supernova/resman.h
+++ b/engines/supernova/resman.h
@@ -29,6 +29,7 @@
 
 #include "supernova/graphics.h"
 #include "supernova/sound.h"
+#include "supernova/supernova.h"
 
 
 namespace Common {
@@ -36,6 +37,7 @@ class MemoryReadStream;
 }
 
 namespace Supernova {
+class SupernovaEngine;
 
 class ResourceManager {
 public:
@@ -49,7 +51,7 @@ public:
 	static const int kNumImageFiles2 = 47;
 
 public:
-	ResourceManager(int MSPart);
+	ResourceManager(SupernovaEngine *vm);
 	~ResourceManager();
 
 	Audio::SeekableAudioStream *getSoundStream(AudioId index);
@@ -77,7 +79,7 @@ private:
 	Common::ScopedPtr<Audio::AudioStream> _musicIntro;
 	Common::ScopedPtr<Audio::AudioStream> _musicOutro;
 	Common::ScopedPtr<Audio::AudioStream> _sirenStream;
-	int _MSPart;
+	SupernovaEngine *_vm;
 	int _audioRate;
 	MSNImage **_images;
 	byte _cursorNormal[256];
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 16569cf..10a460a 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -148,7 +148,7 @@ void SupernovaEngine::init() {
 	if (status.getCode() != Common::kNoError)
 		error("Failed reading game strings");
 
-	_resMan = new ResourceManager(_MSPart);
+	_resMan = new ResourceManager(this);
 	_sound = new Sound(_mixer, _resMan);
 	_screen = new Screen(this, _resMan);
 	if (_MSPart == 1)
@@ -185,78 +185,26 @@ void SupernovaEngine::pauseEngineIntern(bool pause) {
 }
 
 Common::Error SupernovaEngine::loadGameStrings() {
-	Common::String cur_lang = ConfMan.get("language");
 	Common::String string_id("TEXT");
 
-	// Note: we don't print any warning or errors here if we cannot find the file
-	// or the format is not as expected. We will get those warning when reading the
-	// strings anyway (actually the engine will even refuse to start).
-
+	Common::SeekableReadStream *stream = getBlockFromDatFile(string_id);
 
-	// Validate the data file header
-	Common::File f;
-	char id[5], lang[5];
-	id[4] = lang[4] = '\0';
-	if (!f.open(SUPERNOVA_DAT)) {
-		GUIErrorMessageFormat(_("Unable to locate the '%s' engine data file."), SUPERNOVA_DAT);
-		return Common::kReadingFailed;
-	}
-	f.read(id, 3);
-	if (strncmp(id, "MSN", 3) != 0) {
-		GUIErrorMessageFormat(_("The '%s' engine data file is corrupt."), SUPERNOVA_DAT);
+	if (stream == nullptr) {
+		Common::Language l = Common::parseLanguage(ConfMan.get("language"));
+		GUIErrorMessageFormat(_("Unable to locate the text for %s language in engine data file."), Common::getLanguageDescription(l));
 		return Common::kReadingFailed;
 	}
 
-	int version = f.readByte();
-	if (version != SUPERNOVA_DAT_VERSION) {
-		GUIErrorMessageFormat(
-			_("Incorrect version of the '%s' engine data file found. Expected %d but got %d."),
-			SUPERNOVA_DAT, SUPERNOVA_DAT_VERSION, version);
-		return Common::kReadingFailed;
+	int size = stream->size();
+	while (size > 0) {
+		Common::String s;
+		char ch;
+		while ((ch = (char)stream->readByte()) != '\0')
+			s += ch;
+		_gameStrings.push_back(s);
+		size -= s.size() + 1;
 	}
-
-	int part;
-	uint32 gameBlockSize;
-	while (!f.eos()) {
-		part = f.readByte();
-		gameBlockSize = f.readUint32LE();
-		if (f.eos()){
-			GUIErrorMessageFormat(_("Unable to find block for part %d"), _MSPart);
-			return Common::kReadingFailed;
-		}
-		if (part == _MSPart) {
-			break;
-		} else
-			f.skip(gameBlockSize);
-	}
-
-	uint32 readSize = 0;
-
-	while (readSize < gameBlockSize) {
-		f.read(id, 4);
-		f.read(lang, 4);
-		uint32 size = f.readUint32LE();
-		if (f.eos())
-			break;
-		if (string_id == id && cur_lang == lang) {
-			while (size > 0) {
-				Common::String s;
-				char ch;
-				while ((ch = (char)f.readByte()) != '\0')
-					s += ch;
-				_gameStrings.push_back(s);
-				size -= s.size() + 1;
-			}
-			return Common::kNoError;
-		} else {
-			f.skip(size);
-			readSize += size;
-		}
-	}
-
-	Common::Language l = Common::parseLanguage(cur_lang);
-	GUIErrorMessageFormat(_("Unable to locate the text for %s language in engine data file."), Common::getLanguageDescription(l));
-	return Common::kReadingFailed;
+	return Common::kNoError;
 }
 
 const Common::String &SupernovaEngine::getGameString(int idx) const {


Commit: 0f82716ca32bc2d82081797deede4814560750b4
    https://github.com/scummvm/scummvm/commit/0f82716ca32bc2d82081797deede4814560750b4
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Replace placeholder files

Changed paths:
    devtools/create_supernova/ms2.doc-en
    devtools/create_supernova/ms2.inf-en
    devtools/create_supernova/msn.doc-en
    devtools/create_supernova/msn.inf-en


diff --git a/devtools/create_supernova/ms2.doc-en b/devtools/create_supernova/ms2.doc-en
old mode 100644
new mode 100755
index da6df8c..c44c565
--- a/devtools/create_supernova/ms2.doc-en
+++ b/devtools/create_supernova/ms2.doc-en
@@ -1 +1,34 @@
-PLACEHOLDER MS2.DOC
+       Mission Supernova - Part 2: The Doppelg„nger
+       --------------------------------------
+
+Press F1 during the game for help. You can run SETUP.BAT,
+to change the sound settings. If you have problems with the
+game (especially with the sound), read the PROBLEME.TXT
+file.
+
+You can find detailed instructions on how to use the program
+in the game 1st part.
+
+Special passages in part 2:
+-----------------------
+1. Pyramid
+---------
+During the game you will get into a pyramid at one point. It
+is advisable to draw a map of the corridors of the pyramid.
+The control there is a bit different than usual. The exit
+window turns into a compass. If you click with the mouse on
+the right edge of the screen, you turn to the right. However,
+you remain in the same place.
+Click on the left edge to turn to the left. When you turn,
+the compass rotates at the same time, so that you always
+know in which direction you are looking.
+You can move around by clicking in the middle of the screen.
+You will then always go one room further.
+
+2. Museum
+--------
+Further into the game, at one point you will have to break
+into a museum. During the burglary you cannot save the game,
+but you can load a previously saved game. This time the exit
+window changes into a clock. You must therefore always click
+on the exits in the room view itself.
diff --git a/devtools/create_supernova/ms2.inf-en b/devtools/create_supernova/ms2.inf-en
old mode 100644
new mode 100755
index ed3da50..0296045
--- a/devtools/create_supernova/ms2.inf-en
+++ b/devtools/create_supernova/ms2.inf-en
@@ -1 +1,18 @@
-PLACEHOLDER MS2.INF
+       Mission Supernova - Part 2: The Doppelg„nger
+       --------------------------------------
+
+The game MISSION SUPERNOVA was created in 1992-94 and was
+distributed as shareware. It consists of two parts, the
+first of which could be freely copied and distributed. The
+second part of the game was only available for registered
+users.
+
+However both parts are now freely copyable and available on
+the internet at :
+
+               http://www.simplicity.de/
+
+
+Copyright 1994, 1995    Thomas and Steffen Dingel
+
+Musik:                       Bernd Hoffmann
diff --git a/devtools/create_supernova/msn.doc-en b/devtools/create_supernova/msn.doc-en
index 6add950..898291c 100644
--- a/devtools/create_supernova/msn.doc-en
+++ b/devtools/create_supernova/msn.doc-en
@@ -1 +1,93 @@
-PLACEHOLDER MSN.DOC
+                            Instructions
+                            --------
+In this game you take over the role of Horst Hummel, the
+ship's cook of the "Supernova". You can determine his actions
+by clicking on commands with the mouse.
+
+Press F1 during the game for help. You can run SETUP.BAT to
+change the sound settings.
+If you have problems with the game (especially with the
+sound) read the PROBLEME.TXT file.
+
+1. Commands selection
+------------------
+A command is composed of 1 verb and 1 or 2 objects.
+You can select a verb by clicking on the desired verb in the
+command bar (e.g. Look, Take). It will then appear in the
+line above the command bar. This is the record line (it
+contains the current command that you are building).
+
+You can select an object in two different ways:
+-You click on an object in the graphics window. Important
+ items in the graphics window appear in the record line when
+ you move the mouse over them.
+-You click on an item in your inventory. Your inventory is
+ located at the bottom of the screen. There you will see all
+ the items you carry with you. You can take as many items as
+ you want during the game. If you have more than 8 items,
+ arrows will appear to the right of the inventory. With these
+ arrows you can scroll the list.
+
+If you have selected a verb and an object, the command is
+usually executed.
+  Examples: Open Hatch
+            Look Chessboard
+            Take Chessboard
+            Look Keycard
+  You can try these examples directly in the room in which
+  you start the game.
+
+The verb "Use" sometimes requires 2 objects. The verb "Give"
+always requires 2 objects.
+ Example: You are in the room in which you start the game.
+          Select the verb "Use" and as object the keycard
+          from your inventory. The sentence line says:
+          "Use keycard with". Now click on the slot of the
+          middle cabinet to open the cabinet.
+
+Additional information about the commands:
+-After a command has been executed, the game always
+ switches to the verb "Go to".
+-Some actions can be simplified by pressing the right mouse
+ button:
+ -Opening and closing hatches/doors etc.
+ -Pushing buttons.
+ -Talking with people.
+ -Looking at objects.
+ Example: You want to open a closed hatch.
+          Move the mouse over the hatch and press the right
+          mouse button. The hatch opens. If you press the
+          right mouse button again, the hatch closes.
+
+ For objects where it is not quite obvious that you can open,
+ close, push or talk to them, pressing the right mouse button
+ automatically executes the command "Look".
+
+2. Moving around
+-------------
+You can move around in two ways.
+-Click a box in the small area at the bottom right of the
+ screen while selecting the Go To command. The boxes
+ symbolize the exits of the room you are in.
+-You can also click on an exit directly in the graphics
+ window (e.g. an open hatch).
+
+ Important: The graphics window does not always show all the
+            exits that a room really has. Some exits can only
+            be used in the exit view at the bottom right.
+
+3. Load/save
+-----------
+You can save or load a game at any time. To do this, press
+"F5". A menu appears.
+If you want to save a game, select one of the 10 slots with
+the mouse or the arrow keys. Then type in a name
+under which you want to save the game and click on "Save".
+To load a savegame, simply click on the desired savegame and
+then on "Load".
+
+4. Talking to other creatures
+----------------------------
+Later in the game you will meet other creatures. When talking
+to them you have different questions/answers. Select one of
+these options with the mouse.
diff --git a/devtools/create_supernova/msn.inf-en b/devtools/create_supernova/msn.inf-en
index b1f25f5..2746609 100644
--- a/devtools/create_supernova/msn.inf-en
+++ b/devtools/create_supernova/msn.inf-en
@@ -1 +1,58 @@
-PLACEHOLDER MSN.INF
+                    Program information
+                    -------------------
+The 1st part of the game "Mission Supernova" is shareware,
+i.e. you may and should copy and distribute it to others.
+If you like the game, register for 30,- DM!
+
+Advantages for registered users:
+------------------------------
+- You will receive the 2nd part of the game.
+  In "Part 2 - The Doppelg„nger" you will find
+   - more tricky puzzles
+   - Superjokes and surprises
+   - even more graphics and sound
+
+- You also get a help system on floppy disk for both parts
+  of "Mission Supernova". The help system contains the
+  solutions to all puzzles in the game. So if you are stuck
+  somewhere in the 1st part, you can look there.
+
+The 2nd part of the game is not available as shareware, it
+is for registered users only!
+
+Send the registrations to:
+
+  Steffen Dingel
+  Idsteiner Str. 5
+  57074 Siegen
+
+If possible, use the registration form ("REGISTER.TXT")
+that you can print by pressing "D" now.
+
+Be sure to specify the following:
+
+  - name
+  - address
+  - desired disk format
+     (5.25"/1.2MB or 3.5"/1.44MB)
+
+You have the following options to pay the registration fee
+of 30,- DM:
+
+  - payment by cheque
+  - cash (no stamps)
+  - bank transfer (advance payment) to account 1794379 at
+    Sparkasse Siegen (BLZ 460 500 01)
+
+Registrations are also possible from abroad without
+surcharge. The fee must be paid in DM.
+
+
+Copyright 1994         Thomas and Steffen Dingel
+                            Idsteiner Str. 5
+                            57074 Siegen
+
+
+Musik:                     Bernd Hoffmann
+                            Biedenkopfer Str. 34
+                            57072 Siegen


Commit: b883958c0582660dd0d7aa0bdf8a1edad30c7448
    https://github.com/scummvm/scummvm/commit/b883958c0582660dd0d7aa0bdf8a1edad30c7448
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix module.mk to make create_image tool

Changed paths:
    devtools/create_supernova/module.mk


diff --git a/devtools/create_supernova/module.mk b/devtools/create_supernova/module.mk
index 92af416..7827acd 100644
--- a/devtools/create_supernova/module.mk
+++ b/devtools/create_supernova/module.mk
@@ -11,5 +11,5 @@ TOOL_EXECUTABLE := create_supernova
 # Include common rules
 include $(srcdir)/rules.mk
 
-include $(srcdir)/devtools/create_supernova2/create_image/module.mk
-.PHONY: $(srcdir)/devtools/create_supernova2/create_image/module.mk
+include $(srcdir)/devtools/create_supernova/create_image/module.mk
+.PHONY: $(srcdir)/devtools/create_supernova/create_image/module.mk


Commit: f9d13b8d2c92757eafe29fb796602f2fad0d98ed
    https://github.com/scummvm/scummvm/commit/f9d13b8d2c92757eafe29fb796602f2fad0d98ed
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add translated Indiana Joe image

Changed paths:
  A devtools/create_supernova/img3-en.pbm
  A devtools/create_supernova/img3-en.xcf
    devtools/create_supernova/create_supernova.cpp
    engines/supernova/graphics.cpp


diff --git a/devtools/create_supernova/create_supernova.cpp b/devtools/create_supernova/create_supernova.cpp
index b9571e4..72d478a 100644
--- a/devtools/create_supernova/create_supernova.cpp
+++ b/devtools/create_supernova/create_supernova.cpp
@@ -354,6 +354,7 @@ void writeMS2(File &outputFile) {
 	// Other languages
 	const char **l = &lang[0];
 	while(*l) {
+		writeImage(outputFile, "img3", *l);
 		writeDatafile(outputFile, 15, *l, 2);
 		writeDatafile(outputFile, 28, *l, 2);
 		writeStrings(outputFile, *l, 2);
diff --git a/devtools/create_supernova/img3-en.pbm b/devtools/create_supernova/img3-en.pbm
new file mode 100644
index 0000000..3d4a5d6
Binary files /dev/null and b/devtools/create_supernova/img3-en.pbm differ
diff --git a/devtools/create_supernova/img3-en.xcf b/devtools/create_supernova/img3-en.xcf
new file mode 100644
index 0000000..1774d0b
Binary files /dev/null and b/devtools/create_supernova/img3-en.xcf differ
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index e8b4ce1..a9ef2e5 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -93,13 +93,19 @@ bool MSNImage::init(int filenumber) {
 
 bool MSNImage::loadPbmFromEngineDataFile() {
 	Common::String name;
-	if (_vm->_MSPart == 2)
-		return false;
-	if (_filenumber == 1)
-		name = "IMG1";
-	else if (_filenumber == 2)
-		name = "IMG2";
-	else
+	if (_vm->_MSPart == 2) {
+		if (_filenumber == 38)
+			name = "IMG3";
+		else
+			return false;
+	} else if (_vm->_MSPart == 1) {
+		if (_filenumber == 1)
+			name = "IMG1";
+		else if (_filenumber == 2)
+			name = "IMG2";
+		else
+			return false;
+	} else
 		return false;
 	Common::SeekableReadStream *stream = _vm->getBlockFromDatFile(name);
 	if (stream == nullptr)


Commit: e5a5aed28c804dea8e1afd8bb4136c0d9bb4e735
    https://github.com/scummvm/scummvm/commit/e5a5aed28c804dea8e1afd8bb4136c0d9bb4e735
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Update translation

Changed paths:
  R dists/engine-data/supernova2.dat
    devtools/create_supernova/strings2-en.po
    dists/engine-data/supernova.dat


diff --git a/devtools/create_supernova/strings2-en.po b/devtools/create_supernova/strings2-en.po
index d4e58c6..30922b8 100644
--- a/devtools/create_supernova/strings2-en.po
+++ b/devtools/create_supernova/strings2-en.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Mission Supernova Part 2 1.0\n"
 "Report-Msgid-Bugs-To: scummvm-devel at lists.scummvm.org\n"
-"POT-Creation-Date: 2019-06-10 22:58+0100\n"
-"PO-Revision-Date: 2019-06-10 22:13+0000\n"
+"POT-Creation-Date: 2019-06-13 00:06+0100\n"
+"PO-Revision-Date: 2019-06-12 23:15+0000\n"
 "Last-Translator: Thierry Crozat <criezy at scummvm.org>\n"
 "Language-Team: none\n"
 "Language: en\n"
@@ -326,6 +326,10 @@ msgstr "You are panicking|and remove the keycard|from the door."
 msgid "Du hast deinen Auftrag|noch nicht ausgefhrt."
 msgstr "You have not completed|your task yet."
 
+#: ../../ms2/ms2_mus.c:322
+msgid "Es gelingt dir, zu fliehen."
+msgstr "You manage to escape."
+
 #: ../../ms2/ms2_mus.c:330
 msgid ""
 "Obwohl du die Alarmanlage noch|nicht ausgeschaltet hast,|entscheidest du "
@@ -532,7 +536,7 @@ msgstr "You are currently playing an|Adventure, not a Role-Playing Game!"
 
 #: ../../ms2/ms2_pyra.c:699 ../../ms2/ms2_pyra.c:800
 msgid "Du kannst das Seil|nirgends befestigen."
-msgstr "There's nowhere|to attach the rope."
+msgstr "You cannot see anything to which|you could attach the rope."
 
 #: ../../ms2/ms2_pyra.c:705 ../../ms2/ms2_pyra.c:784
 msgid "Es paát nicht|zwischen die Steine."
@@ -570,7 +574,7 @@ msgstr "The ball moves a bit."
 
 #: ../../ms2/ms2_pyra.c:961
 msgid "Das Auge ist schon offen."
-msgstr "This Eye is already open."
+msgstr "This eye is already open."
 
 #: ../../ms2/ms2_pyra.c:965
 msgid "Herzlichen Glckwunsch!"
@@ -809,7 +813,7 @@ msgstr "Toothpaste"
 
 #: ../../ms2/ms2_pyra.c:1326 ../../ms2/ms2_pyra.c:1327
 msgid "Kugel"
-msgstr "Ball"
+msgstr "Sphere"
 
 #: ../../ms2/ms2_pyra.c:1326 ../../ms2/ms2_pyra.c:1327
 msgid "Hmm, die Kugel sieht lose aus."
@@ -869,7 +873,7 @@ msgstr "You insert the chip|into the device."
 
 #: ../../ms2/ms2_r1.c:137
 msgid "Du berspielst die CD|auf den Musikchip."
-msgstr "You transfer the CD|to the Music chip."
+msgstr "You transfer the CD content|to the Music chip."
 
 #: ../../ms2/ms2_r1.c:141
 msgid ""
@@ -1018,8 +1022,8 @@ msgid ""
 "An der Wand steht:|\"Ich kenne eine tolle Geheimschrift:|A=Z, B=Y, C=X ...|"
 "0=0, 1=9, 2=8 ...\""
 msgstr ""
-"On the Wall is:|\"I know a great cypher:|A=Z, B=Y, C=X ...|0=0, 1=9, 2=8 ..."
-"\""
+"Something is written on the wall:|\"I know a great cipher:|A=Z, B=Y, C=X "
+"...|0=0, 1=9, 2=8 ...\""
 
 #: ../../ms2/ms2_r1.c:657
 msgid "Ok, ich nehme es."
@@ -1165,7 +1169,7 @@ msgstr "What disguise?"
 
 #: ../../ms2/ms2_r1.c:758
 msgid "Na, tun Sie nicht so!"
-msgstr "Stop pretending you don't know!"
+msgstr "Don't pretend you don't know!"
 
 #: ../../ms2/ms2_r1.c:759
 msgid ""
@@ -1679,7 +1683,7 @@ msgid ""
 "Sie sind Teilnehmer! Fragen|Sie bitte an der Kasse nach,|wann Sie auftreten "
 "k”nnen."
 msgstr ""
-"You are a participant!|Please ask at the checkout|when you can go on stage."
+"You are a participant!|Please ask at the ticket office|when you can perform."
 
 #: ../../ms2/ms2_r2.c:247
 msgid "Žh, nein."
@@ -1835,7 +1839,7 @@ msgstr "Good joke. Then why do you look like Horst Hummel?"
 #: ../../ms2/ms2_r2.c:420
 msgid ""
 "Na, nun h”ren Sie auf! So perfekt ist|ihre Verkleidung auch wieder nicht."
-msgstr "Oh come on! Your disguise isn't that perfect."
+msgstr "Oh come on! Your disguise isn't that good."
 
 #: ../../ms2/ms2_r2.c:421
 msgid ""
@@ -1865,7 +1869,7 @@ msgid ""
 "Es ist der Gewinner des gestrigen|Musikwettbewerbs im Kulturpalast,|der dort "
 "vor allem durch seine|Verkleidung aufgefallen war."
 msgstr ""
-"He is the winner of yesterday's music competition in the Palace of Culture.|"
+"He is the winner of yesterday's|music competition in the Palace of Culture.|"
 "He was particularly noteworthy|because of his disguise."
 
 #: ../../ms2/ms2_r2.c:489
@@ -1929,7 +1933,7 @@ msgstr "Hmm, I do not remember that."
 #: ../../ms2/ms2_r2.c:509
 msgid ""
 "Sie wollen mir doch nicht weismachen,|daá Sie den Namen vergessen haben!"
-msgstr "Do you really expect me to believe you cannot remember the name?"
+msgstr "Do you really expect me to believe|you cannot remember the name?"
 
 #: ../../ms2/ms2_r2.c:510
 msgid "Schlieálich haben Sie|zehn Jahre dort gearbeitet!"
@@ -2402,7 +2406,7 @@ msgstr "That is already connected."
 
 #: ../../ms2/ms2_r2.c:1129
 msgid "Die Leitung ist hier|schon ganz richtig."
-msgstr "The cable is already|at the right place."
+msgstr "The cable is already|in the right place."
 
 #: ../../ms2/ms2_r2.c:1137
 msgid "Roger W.! Wie kommen Sie denn hierher?"
@@ -2439,14 +2443,14 @@ msgstr "They are pretending that the tower|has always been that slanted!"
 
 #: ../../ms2/ms2_r2.c:1148
 msgid "Hat er auch, schon seit|mehreren Jahrhunderten!"
-msgstr "It has, for|several centuries, actually!"
+msgstr "It has, for several|centuries actually!"
 
 #: ../../ms2/ms2_r2.c:1151
 msgid ""
 "Žh ... ach so. Und von wo|kommen Sie? Sie hatten's ja|wohl auch ziemlich "
 "eilig."
 msgstr ""
-"Uh ... I see. And where are you coming from? It seems you were in quite a "
+"Uh ... I see. And where|are you coming from? It seems|you were in quite a "
 "hurry as well."
 
 #: ../../ms2/ms2_r2.c:1152
@@ -2731,7 +2735,7 @@ msgid ""
 "Aha, mich interessiert auáerdem,|ob es hier auf Axacuss etwas gibt,|das Sie "
 "besonders m”gen."
 msgstr ""
-"I see. I'm also interested in|whether there's anything here on Axacuss that "
+"I see. I'm also interested in|whether there's anything here on Axacuss |that "
 "you particularly like."
 
 #: ../../ms2/ms2_s.c:152
@@ -2789,9 +2793,3 @@ msgid ""
 "werden!\""
 msgstr ""
 "\"These bastards from Artus GmbH and|Commander Sumoti must be unmasked!\""
-
-#: ../../ms2_mus.c:319
-msgid ""
-"Es gelingt dir, zu fliehen."
-msgstr ""
-"You manage to escape."
diff --git a/dists/engine-data/supernova.dat b/dists/engine-data/supernova.dat
index 9131925..92dc0e8 100644
Binary files a/dists/engine-data/supernova.dat and b/dists/engine-data/supernova.dat differ
diff --git a/dists/engine-data/supernova2.dat b/dists/engine-data/supernova2.dat
deleted file mode 100644
index ead25f6..0000000
Binary files a/dists/engine-data/supernova2.dat and /dev/null differ


Commit: e734872fc84c2406c783cb291fb4ccf05acc8613
    https://github.com/scummvm/scummvm/commit/e734872fc84c2406c783cb291fb4ccf05acc8613
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix some code issues pointed by Criezy

Remove 2 unused variables and a function call with wrong datatype

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/game-manager.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova2/rooms.h
    engines/supernova/supernova2/state.h


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index e98218d..2672a6f 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -192,7 +192,6 @@ void GameManager::initState() {
 		_rowsStart[i] = 0;
 	}
 
-	_prevImgId = 0;
 	_dead = false;
 }
 
diff --git a/engines/supernova/game-manager.h b/engines/supernova/game-manager.h
index 1700ab8..07c1576 100644
--- a/engines/supernova/game-manager.h
+++ b/engines/supernova/game-manager.h
@@ -199,9 +199,6 @@ public:
 	void reply(const char *text, int aus1, int aus2);
 	void mousePosDialog(int x, int y);
 	virtual void takeMoney(int amount);
-
-private:
-	int _prevImgId;
 };
 
 }
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 10a460a..8ab38e4 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -528,7 +528,7 @@ Common::Error SupernovaEngine::showTextReader(const char *extension) {
 			filename = Common::String::format("ms2.%s", extension);
 
 		if (!file.open(filename)) {
-			GUIErrorMessageFormat(_("Unable to find '%s' in game folder or the engine data file."), filename);
+			GUIErrorMessageFormat(_("Unable to find '%s' in game folder or the engine data file."), filename.c_str());
 			return Common::kReadingFailed;
 		}
 		stream = file.readStream(file.size());
diff --git a/engines/supernova/supernova2/rooms.h b/engines/supernova/supernova2/rooms.h
index 6d43b4c..2520db8 100644
--- a/engines/supernova/supernova2/rooms.h
+++ b/engines/supernova/supernova2/rooms.h
@@ -107,9 +107,6 @@ public:
 	virtual void onEntrance();
 	virtual void animation();
 	virtual bool interact(Action verb, Object &obj1, Object &obj2);
-
-private:
-	bool _paid;
 };
 
 class Kiosk : public Room2 {
diff --git a/engines/supernova/supernova2/state.h b/engines/supernova/supernova2/state.h
index 64d070d..4d98673 100644
--- a/engines/supernova/supernova2/state.h
+++ b/engines/supernova/supernova2/state.h
@@ -128,9 +128,6 @@ public:
 	void securityEntrance();
 	void pressureAlarmCount();
 	void pressureAlarmEntrance();
-
-private:
-	int _prevImgId;
 };
 
 }


Commit: 0366f3da27fe23bc148735f949fcf384af3886b1
    https://github.com/scummvm/scummvm/commit/0366f3da27fe23bc148735f949fcf384af3886b1
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add help screen translation

Changed paths:
  A devtools/create_supernova/create_image/027/clickfield_info
  A devtools/create_supernova/create_image/027/image0.bmp
  A devtools/create_supernova/create_image/027/img0.xcf
  A devtools/create_supernova/create_image/027/palette
  A devtools/create_supernova/create_image/027/section_info
  A devtools/create_supernova/create_image/create_ms2_data.027.sh
  A devtools/create_supernova/ms2_data.027-en
    devtools/create_supernova/create_supernova.cpp
    engines/supernova/graphics.cpp
    engines/supernova/supernova.cpp


diff --git a/devtools/create_supernova/create_image/027/clickfield_info b/devtools/create_supernova/create_image/027/clickfield_info
new file mode 100644
index 0000000..6207269
--- /dev/null
+++ b/devtools/create_supernova/create_image/027/clickfield_info
@@ -0,0 +1,7 @@
+1
+
+0
+319
+0
+199
+0
diff --git a/devtools/create_supernova/create_image/027/image0.bmp b/devtools/create_supernova/create_image/027/image0.bmp
new file mode 100644
index 0000000..e26ca46
Binary files /dev/null and b/devtools/create_supernova/create_image/027/image0.bmp differ
diff --git a/devtools/create_supernova/create_image/027/img0.xcf b/devtools/create_supernova/create_image/027/img0.xcf
new file mode 100644
index 0000000..aa2a91e
Binary files /dev/null and b/devtools/create_supernova/create_image/027/img0.xcf differ
diff --git a/devtools/create_supernova/create_image/027/palette b/devtools/create_supernova/create_image/027/palette
new file mode 100644
index 0000000..66476d1
--- /dev/null
+++ b/devtools/create_supernova/create_image/027/palette
@@ -0,0 +1,241 @@
+239
+
+0 0 0
+0 6 0
+0 6 4
+0 6 8
+4 6 0
+4 6 3
+4 6 8
+8 6 0
+5 6 6
+5 6 11
+1 7 6
+7 6 3
+0 9 0
+7 6 8
+10 5 4
+9 6 4
+0 9 1
+7 7 2
+0 9 4
+3 8 4
+0 9 6
+5 7 2
+5 7 5
+1 9 3
+3 9 0
+1 9 5
+2 9 2
+4 9 3
+5 9 2
+1 10 8
+4 9 7
+1 10 3
+1 10 1
+5 9 1
+2 9 9
+12 7 2
+7 9 2
+6 9 7
+8 9 0
+5 9 9
+8 9 3
+5 10 5
+0 12 0
+8 9 8
+5 10 7
+9 9 5
+8 9 7
+1 12 3
+8 9 10
+5 10 6
+10 8 10
+7 10 7
+5 10 13
+0 12 8
+8 10 5
+1 12 2
+12 9 4
+11 9 8
+12 9 0
+2 12 6
+4 12 0
+3 11 8
+4 12 3
+13 8 7
+5 12 1
+3 12 5
+4 12 7
+4 12 6
+5 12 4
+9 9 16
+9 11 4
+2 12 10
+1 14 0
+7 11 5
+5 12 0
+8 12 0
+7 12 4
+2 12 14
+8 12 8
+7 11 12
+6 12 8
+9 11 10
+9 12 8
+6 12 12
+0 16 0
+11 13 4
+12 13 1
+12 12 8
+2 16 8
+4 16 3
+4 16 2
+12 13 12
+4 16 7
+7 16 2
+6 16 5
+4 16 10
+8 15 8
+16 13 9
+9 15 14
+8 16 7
+8 16 4
+12 15 1
+17 14 5
+7 16 13
+15 14 10
+13 14 16
+11 15 13
+5 17 15
+7 17 11
+12 16 3
+7 16 20
+11 15 20
+11 16 8
+10 16 11
+13 16 8
+13 16 9
+4 20 3
+12 17 7
+12 16 12
+3 20 7
+19 14 17
+15 17 8
+12 17 17
+7 20 3
+10 19 7
+16 17 12
+6 20 11
+8 20 7
+16 17 16
+12 19 11
+11 20 2
+15 19 2
+20 16 12
+12 19 8
+12 21 11
+9 21 17
+13 21 16
+15 21 8
+16 21 12
+7 24 7
+10 22 25
+16 21 16
+7 24 12
+10 24 4
+15 21 20
+20 21 7
+5 26 5
+20 21 12
+24 20 12
+12 24 8
+6 25 16
+9 25 2
+19 21 23
+12 24 11
+20 21 16
+20 21 20
+24 20 18
+11 24 15
+22 21 15
+7 26 11
+16 24 7
+17 22 19
+17 24 8
+16 24 12
+18 21 33
+25 20 24
+13 24 24
+15 24 16
+12 25 21
+16 26 4
+20 24 7
+16 25 15
+15 26 13
+16 25 19
+20 25 12
+20 24 20
+20 25 16
+12 28 8
+11 28 11
+11 28 16
+16 28 8
+16 28 12
+22 27 4
+12 29 21
+16 28 16
+18 27 24
+20 28 7
+19 28 12
+24 27 9
+17 28 28
+20 28 16
+22 27 18
+23 27 21
+24 27 18
+18 28 21
+16 30 17
+22 28 11
+21 28 22
+12 32 9
+30 26 11
+12 32 18
+21 28 33
+21 29 25
+24 28 26
+35 25 16
+18 33 11
+17 31 35
+18 33 18
+17 33 24
+23 33 12
+24 33 18
+19 36 7
+25 34 24
+17 36 30
+19 37 16
+27 33 33
+21 35 39
+29 33 43
+32 35 18
+32 35 26
+21 38 45
+35 37 12
+26 39 31
+23 41 19
+26 40 26
+37 36 33
+20 43 25
+25 40 49
+33 41 15
+32 39 43
+27 44 13
+34 41 25
+42 40 23
+26 43 55
+28 44 40
+34 44 24
+37 43 35
+33 49 29
+44 49 23
diff --git a/devtools/create_supernova/create_image/027/section_info b/devtools/create_supernova/create_image/027/section_info
new file mode 100644
index 0000000..5ced3d3
--- /dev/null
+++ b/devtools/create_supernova/create_image/027/section_info
@@ -0,0 +1,9 @@
+1
+
+0
+319
+0
+199
+0
+0
+0
diff --git a/devtools/create_supernova/create_image/create_ms2_data.027.sh b/devtools/create_supernova/create_image/create_ms2_data.027.sh
new file mode 100755
index 0000000..f9a7441
--- /dev/null
+++ b/devtools/create_supernova/create_image/create_ms2_data.027.sh
@@ -0,0 +1 @@
+./create_image ms2_data 27 1146
diff --git a/devtools/create_supernova/create_supernova.cpp b/devtools/create_supernova/create_supernova.cpp
index 72d478a..16820c0 100644
--- a/devtools/create_supernova/create_supernova.cpp
+++ b/devtools/create_supernova/create_supernova.cpp
@@ -356,6 +356,7 @@ void writeMS2(File &outputFile) {
 	while(*l) {
 		writeImage(outputFile, "img3", *l);
 		writeDatafile(outputFile, 15, *l, 2);
+		writeDatafile(outputFile, 27, *l, 2);
 		writeDatafile(outputFile, 28, *l, 2);
 		writeStrings(outputFile, *l, 2);
 		writeDocFile(outputFile, "inf", *l, 2);
diff --git a/devtools/create_supernova/ms2_data.027-en b/devtools/create_supernova/ms2_data.027-en
new file mode 100644
index 0000000..8ae5fd3
Binary files /dev/null and b/devtools/create_supernova/ms2_data.027-en differ
diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp
index a9ef2e5..8dab28c 100644
--- a/engines/supernova/graphics.cpp
+++ b/engines/supernova/graphics.cpp
@@ -121,6 +121,8 @@ bool MSNImage::loadFromEngineDataFile() {
 	} else if (_vm->_MSPart == 2) {
 		if (_filenumber == 15)
 			name = "M015";
+		else if (_filenumber == 27)
+			name = "M027";
 		else if (_filenumber == 28)
 			name = "M028";
 		else
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 8ab38e4..7969731 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -438,14 +438,6 @@ void SupernovaEngine::showHelpScreen2() {
 	paletteFadeOut();
 	setCurrentImage(27);
 	renderImage(0);
-	renderBox(10, 70, 192, 100, kColorWhite35);
-	renderText(kStringHelpOverview1, 15, 80, kColorWhite99);
-	renderText(kStringHelpOverview2, 15, 92, kColorWhite99);
-	renderText(kStringHelpOverview3, 15, 104, kColorWhite99);
-	renderText(kStringHelpOverview4, 15, 116, kColorWhite99);
-	renderText(kStringHelpOverview5, 15, 128, kColorWhite99);
-	renderText(kStringHelpOverview6, 15, 140, kColorWhite99);
-	renderText(kStringHelpOverview7, 15, 152, kColorWhite99);
 	paletteFadeIn();
 	_gm->getKeyInput();
 


Commit: ee9d7ee9c74366384306ddcebfb039bbc6bbb9d1
    https://github.com/scummvm/scummvm/commit/ee9d7ee9c74366384306ddcebfb039bbc6bbb9d1
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Implement choosing verbs by keyboard.

Only in improved mode.

Changed paths:
    engines/supernova/game-manager.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index 2672a6f..cb4d81b 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -293,6 +293,52 @@ void GameManager::processInput(Common::KeyState &state) {
 	default:
 		break;
 	}
+	if (_vm->_improved && _guiEnabled) {
+		switch (state.keycode) {
+		case Common::KEYCODE_1:
+			resetInputState();
+			_inputVerb = ACTION_WALK;
+			break;
+		case Common::KEYCODE_2:
+			resetInputState();
+			_inputVerb = ACTION_LOOK;
+			break;
+		case Common::KEYCODE_3:
+			resetInputState();
+			_inputVerb = ACTION_TAKE;
+			break;
+		case Common::KEYCODE_4:
+			resetInputState();
+			_inputVerb = ACTION_OPEN;
+			break;
+		case Common::KEYCODE_5:
+			resetInputState();
+			_inputVerb = ACTION_CLOSE;
+			break;
+		case Common::KEYCODE_6:
+			resetInputState();
+			_inputVerb = ACTION_PRESS;
+			break;
+		case Common::KEYCODE_7:
+			resetInputState();
+			_inputVerb = ACTION_PULL;
+			break;
+		case Common::KEYCODE_8:
+			resetInputState();
+			_inputVerb = ACTION_USE;
+			break;
+		case Common::KEYCODE_9:
+			resetInputState();
+			_inputVerb = ACTION_TALK;
+			break;
+		case Common::KEYCODE_0:
+			resetInputState();
+			_inputVerb = ACTION_GIVE;
+			break;
+		default:
+			break;
+		}
+	}
 }
 
 void GameManager::resetInputState() {


Commit: df008c12908c7b4b6d4841821d31b9b6fd9be622
    https://github.com/scummvm/scummvm/commit/df008c12908c7b4b6d4841821d31b9b6fd9be622
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Add correct help screen image

Changed paths:
    devtools/create_supernova/create_image/027/img0.xcf


diff --git a/devtools/create_supernova/create_image/027/img0.xcf b/devtools/create_supernova/create_image/027/img0.xcf
index aa2a91e..938715b 100644
Binary files a/devtools/create_supernova/create_image/027/img0.xcf and b/devtools/create_supernova/create_image/027/img0.xcf differ


Commit: 448db9f4321f5854385e1726284d2ba35c76866f
    https://github.com/scummvm/scummvm/commit/448db9f4321f5854385e1726284d2ba35c76866f
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Make improved mode an engine option.

Changed paths:
    engines/supernova/detection.cpp
    engines/supernova/supernova.cpp


diff --git a/engines/supernova/detection.cpp b/engines/supernova/detection.cpp
index 417d06f..1f5ada0 100644
--- a/engines/supernova/detection.cpp
+++ b/engines/supernova/detection.cpp
@@ -22,7 +22,9 @@
 
 #include "base/plugins.h"
 #include "common/file.h"
+#include "common/gui_options.h"
 #include "common/savefile.h"
+#include "common/translation.h"
 #include "common/system.h"
 #include "graphics/thumbnail.h"
 #include "engines/advancedDetector.h"
@@ -31,11 +33,23 @@
 
 #define GAMEOPTION_IMPROVED GUIO_GAMEOPTIONS1
 
+static const ADExtraGuiOptionsMap optionsList[] = {
+	{
+		GAMEOPTION_IMPROVED,
+		{
+			_s("Improved mode"),
+			_s("Removes some repetitive actions, adds possibility to change verbs by keyboard"),
+			"improved",
+			false
+		}
+	},
+
+	AD_EXTRA_GUI_OPTIONS_TERMINATOR
+};
+
 static const PlainGameDescriptor supernovaGames[] = {
 	{"msn1", "Mission Supernova 1"},
 	{"msn2", "Mission Supernova 2"},
-	{"msn1-i", "Mission Supernova 1 improved"},
-	{"msn2-i", "Mission Supernova 2 improved"},
 	{nullptr, nullptr}
 };
 
@@ -49,28 +63,10 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::DE_DEU,
 		Common::kPlatformDOS,
 		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-	{
-		"msn1",
-		nullptr,
-		AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163),
-		Common::EN_ANY,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-	{
-		"msn1-i",
-		nullptr,
-		AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163),
-		Common::DE_DEU,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
 		GUIO1(GAMEOPTION_IMPROVED)
 	},
 	{
-		"msn1-i",
+		"msn1",
 		nullptr,
 		AD_ENTRY1s("msn_data.000", "f64f16782a86211efa919fbae41e7568", 24163),
 		Common::EN_ANY,
@@ -86,28 +82,10 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::DE_DEU,
 		Common::kPlatformDOS,
 		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-	{
-		"msn2",
-		nullptr,
-		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
-		Common::EN_ANY,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
-		GUIO1(GUIO_NONE)
-	},
-	{
-		"msn2-i",
-		nullptr,
-		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
-		Common::DE_DEU,
-		Common::kPlatformDOS,
-		ADGF_UNSTABLE,
 		GUIO1(GAMEOPTION_IMPROVED)
 	},
 	{
-		"msn2-i",
+		"msn2",
 		nullptr,
 		AD_ENTRY1s("ms2_data.000", "e595610cba4a6d24a763e428d05cc83f", 24805),
 		Common::EN_ANY,
@@ -121,7 +99,7 @@ static const ADGameDescription gameDescriptions[] = {
 
 class SupernovaMetaEngine: public AdvancedMetaEngine {
 public:
-	SupernovaMetaEngine() : AdvancedMetaEngine(Supernova::gameDescriptions, sizeof(ADGameDescription), supernovaGames) {
+	SupernovaMetaEngine() : AdvancedMetaEngine(Supernova::gameDescriptions, sizeof(ADGameDescription), supernovaGames, optionsList) {
 //		_singleId = "supernova";
 	}
 
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 7969731..894cdce 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -96,14 +96,10 @@ SupernovaEngine::SupernovaEngine(OSystem *syst)
 		_MSPart = 1;
 	else if (ConfMan.get("gameid") == "msn2")
 		_MSPart = 2;
-	else if (ConfMan.get("gameid") == "msn1-i") {
-		_MSPart = 1;
-		_improved = true;
-	} else if (ConfMan.get("gameid") == "msn2-i") {
-		_MSPart = 2;
-		_improved = true;
-	} else
+	else
 		_MSPart = 0;
+
+	_improved = ConfMan.getBool("improved");
 	DebugMan.addDebugChannel(kDebugGeneral, "general", "Supernova general debug channel");
 }
 


Commit: c2177f84539472defe31c6fba80ad4a6f3357266
    https://github.com/scummvm/scummvm/commit/c2177f84539472defe31c6fba80ad4a6f3357266
Author: Jaromir Wysoglad (jaromirwysoglad at gmail.com)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Merge getInput and waitOnInput methods.

Changed paths:
    engines/supernova/game-manager.cpp
    engines/supernova/game-manager.h
    engines/supernova/supernova.cpp
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova1/state.cpp
    engines/supernova/supernova2/rooms.cpp
    engines/supernova/supernova2/state.cpp


diff --git a/engines/supernova/game-manager.cpp b/engines/supernova/game-manager.cpp
index cb4d81b..bf4cbc6 100644
--- a/engines/supernova/game-manager.cpp
+++ b/engines/supernova/game-manager.cpp
@@ -591,7 +591,7 @@ void GameManager::say(const char *text) {
 	_vm->renderBox(0, 141, 320, numRows * 10 - 1, kColorWhite25);
 	for (uint r = 0; r < numRows; ++r)
 		_vm->renderText(row[r], 1, 142 + r * 10, kColorDarkGreen);
-	waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+	wait((t.size() + 20) * _vm->_textSpeed / 10, true);
 	_vm->renderBox(0, 138, 320, 62, kColorBlack);
 }
 
@@ -608,12 +608,12 @@ void GameManager::reply(const char *text, int aus1, int aus2) {
 	for (int z = (strlen(text) + 20) * _vm->_textSpeed / 40; z > 0; --z) {
 		if (aus1)
 			_vm->renderImage(aus1);
-		waitOnInput(2);
+		wait(2, true);
 		if (_keyPressed || _mouseClicked)
 			z = 1;
 		if (aus2)
 			_vm->renderImage(aus2);
-		waitOnInput(2);
+		wait(2, true);
 		if (_keyPressed || _mouseClicked)
 			z = 1;
 	}
@@ -718,33 +718,10 @@ void GameManager::drawInventory() {
 	}
 }
 
-int GameManager::getKeyInput() {
+void GameManager::getInput(bool onlyKeys) {
 	while (!_vm->shouldQuit()) {
 		updateEvents();
-		if (_keyPressed) {
-			return _key.ascii;
-		}
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	return 0;
-}
-
-Common::EventType GameManager::getMouseInput() {
-	while (!_vm->shouldQuit()) {
-		updateEvents();
-		if (_mouseClicked)
-			return _mouseClickType;
-		g_system->updateScreen();
-		g_system->delayMillis(_vm->_delay);
-	}
-	return Common::EVENT_INVALID;
-}
-
-void GameManager::getInput() {
-	while (!_vm->shouldQuit()) {
-		updateEvents();
-		if (_mouseClicked || _keyPressed)
+		if ((_mouseClicked && !onlyKeys) || _keyPressed)
 			break;
 		g_system->updateScreen();
 		g_system->delayMillis(_vm->_delay);
@@ -768,22 +745,16 @@ void GameManager::changeRoom(RoomId id) {
 	}
 }
 
-void GameManager::wait(int ticks) {
-	int32 end = _time + ticksToMsec(ticks);
-	do {
-		g_system->delayMillis(_vm->_delay);
-		updateEvents();
-		g_system->updateScreen();
-	} while (_time < end && !_vm->shouldQuit());
-}
-
-void GameManager::waitOnInput(int ticks) {
+void GameManager::wait(int ticks, bool checkInput) {
 	int32 end = _time + ticksToMsec(ticks);
+	bool inputEvent = false;
 	do {
 		g_system->delayMillis(_vm->_delay);
 		updateEvents();
 		g_system->updateScreen();
-	} while (_time < end && !_vm->shouldQuit() && !_keyPressed && !_mouseClicked);
+		if (checkInput)
+			inputEvent = _keyPressed || _mouseClicked;
+	} while (_time < end && !_vm->shouldQuit() && !inputEvent);
 }
 
 bool GameManager::waitOnInput(int ticks, Common::KeyCode &keycode) {
@@ -897,7 +868,7 @@ void GameManager::edit(Common::String &input, int x, int y, uint length) {
 			_vm->renderBox(_vm->_screen->getTextCursorPos().x, y - 1, 1, 9, kColorWhite99);
 		}
 
-		getKeyInput();
+		getInput(true);
 		if (_vm->shouldQuit())
 			break;
 		switch (_key.keycode) {
diff --git a/engines/supernova/game-manager.h b/engines/supernova/game-manager.h
index 07c1576..2ea8d7b 100644
--- a/engines/supernova/game-manager.h
+++ b/engines/supernova/game-manager.h
@@ -164,11 +164,8 @@ public:
 	void initGui();
 	virtual bool canSaveGameStateCurrently();
 	virtual bool genericInteract(Action verb, Object &obj1, Object &obj2);
-	Common::EventType getMouseInput();
-	int getKeyInput();
-	void getInput();
-	void wait(int ticks);
-	void waitOnInput(int ticks);
+	void getInput(bool onlyKeys = false);
+	void wait(int ticks, bool checkInput = false);
 	bool waitOnInput(int ticks, Common::KeyCode &keycode);
 	void screenShake();
 	virtual void roomBrightness();
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 894cdce..431438e 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -417,7 +417,7 @@ void SupernovaEngine::showHelpScreen1() {
 	renderText(kStringHelpOverview6, 105, 155, kColorWhite99);
 	renderText(kStringHelpOverview7, 105, 165, kColorWhite99);
 	paletteFadeIn();
-	_gm->getKeyInput();
+	_gm->getInput(true);
 
 	paletteFadeOut();
 
@@ -435,7 +435,7 @@ void SupernovaEngine::showHelpScreen2() {
 	setCurrentImage(27);
 	renderImage(0);
 	paletteFadeIn();
-	_gm->getKeyInput();
+	_gm->getInput(true);
 
 	paletteFadeOut();
 
@@ -559,7 +559,7 @@ Common::Error SupernovaEngine::showTextReader(const char *extension) {
 				break;
 			_screen->renderText(line, 6, y, kColorWhite99);
 		}
-		_gm->getKeyInput();
+		_gm->getInput(true);
 		switch (_gm->_key.keycode) {
 		case Common::KEYCODE_ESCAPE:
 			exitReader = true;
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index af86450..a419ec9 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -762,10 +762,10 @@ void ShipSleepCabin::animation() {
 void ShipSleepCabin::onEntrance() {
 	if (_gm->_state._dream && (_gm->_rooms[CAVE]->getObject(1)->_exitRoom == MEETUP3)) {
 		_vm->renderMessage(kStringShipSleepCabin14);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringShipSleepCabin15);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringShipSleepCabin16);
 		_gm->_state._dream = false;
@@ -2084,7 +2084,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->renderMessage(kStringArsanoEntrance20);
 			else {
 				_vm->renderMessage(kStringArsanoEntrance21);
-				_gm->waitOnInput(_gm->_messageDuration);
+				_gm->wait(_gm->_messageDuration, true);
 				_vm->removeMessage();
 				_vm->renderMessage(kStringArsanoEntrance22);
 				_gm->takeObject(*getObject(16));
@@ -2131,7 +2131,7 @@ bool ArsanoEntrance::interact(Action verb, Object &obj1, Object &obj2) {
 			_gm->_rooms[AIRLOCK]->getObject(4)->setProperty(WORN);
 			_gm->_rooms[AIRLOCK]->getObject(5)->setProperty(WORN);
 			_gm->_rooms[AIRLOCK]->getObject(6)->setProperty(WORN);
-			_gm->waitOnInput(_gm->_messageDuration);
+			_gm->wait(_gm->_messageDuration, true);
 			_vm->removeMessage();
 		}
 		return false;
@@ -2445,7 +2445,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->_screen->setGuiBrightness(255);
 		_vm->paletteBrightness();
 		_vm->renderMessage(kStringArsanoRoger39);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_vm->_screen->setGuiBrightness(0);
 		_vm->paletteBrightness();
@@ -2462,7 +2462,7 @@ bool ArsanoRoger::interact(Action verb, Object &obj1, Object &obj2) {
 		getObject(6)->_click = 7;
 		_vm->paletteFadeIn();
 		_vm->renderMessage(kStringArsanoRoger40);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 	} else
 		return false;
@@ -2689,7 +2689,7 @@ bool ArsanoMeetup2::interact(Action verb, Object &obj1, Object &obj2) {
 				_gm->wait(18);
 				_vm->renderMessage(kStringArsanoMeetup2_12);
 				_gm->great(0);
-				_gm->waitOnInput(_gm->_messageDuration);
+				_gm->wait(_gm->_messageDuration, true);
 				_vm->removeMessage();
 				_vm->paletteFadeOut();
 				g_system->fillScreen(kColorBlack);
@@ -3998,7 +3998,7 @@ bool AxacussElevator::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->_screen->setGuiBrightness(255);
 		_vm->paletteBrightness();
 		_vm->renderMessage(kStringAxacussElevator_3);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_vm->_screen->setGuiBrightness(0);
 		_vm->paletteBrightness();
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index 443053d..ee1fe46 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -501,7 +501,7 @@ void GameManager1::telomat(int nr) {
 			_vm->renderRoom(*_currentRoom);
 			_vm->paletteBrightness();
 			_vm->renderMessage(kStringTelomat17, kMessageTop, name2[i]);
-			waitOnInput(_messageDuration);
+			wait(_messageDuration, true);
 			_vm->removeMessage();
 			if (_state._nameSeen[nr]) {
 				Common::String string = _vm->getGameString(kStringTelomat2);
@@ -513,7 +513,7 @@ void GameManager1::telomat(int nr) {
 
 			switch (dialog(3, rows1, dial1, 1)) {
 			case 1: _vm->renderMessage(kStringTelomat18, kMessageTop);
-				waitOnInput(_messageDuration);
+				wait(_messageDuration, true);
 				_vm->removeMessage();
 				if ((_state._destination == 255) && !_rooms[BCORRIDOR]->isSectionVisible(7)) {
 					_state._eventTime = _time + ticksToMsec(150);
@@ -523,7 +523,7 @@ void GameManager1::telomat(int nr) {
 				}
 				break;
 			case 0: _vm->renderMessage(kStringTelomat19, kMessageTop);
-				waitOnInput(_messageDuration);
+				wait(_messageDuration, true);
 				_vm->removeMessage();
 				if (dialog(4, rows2, dial2, 0) != 3) {
 					wait(10);
@@ -688,7 +688,7 @@ void GameManager1::supernovaEvent() {
 	CursorMan.showMouse(false);
 	if (_currentRoom->getId() <= CAVE) {
 		_vm->renderMessage(kStringSupernova1);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->paletteFadeOut();
 		changeRoom(MEETUP);
@@ -701,7 +701,7 @@ void GameManager1::supernovaEvent() {
 		_vm->paletteFadeIn();
 	}
 	_vm->renderMessage(kStringSupernova2);
-	waitOnInput(_messageDuration);
+	wait(_messageDuration, true);
 	_vm->removeMessage();
 	_vm->setCurrentImage(26);
 	_vm->renderImage(0);
@@ -714,23 +714,23 @@ void GameManager1::supernovaEvent() {
 
 	if (_currentRoom->getId() == GLIDER) {
 		_vm->renderMessage(kStringSupernova3);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->_screen->setGuiBrightness(0);
 		_vm->paletteBrightness();
 		_vm->renderRoom(*_currentRoom);
 		_vm->paletteFadeIn();
 		_vm->renderMessage(kStringSupernova4, kMessageTop);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringSupernova5, kMessageTop);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringSupernova6, kMessageTop);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringSupernova7, kMessageTop);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		changeRoom(MEETUP2);
 		_rooms[MEETUP2]->setSectionVisible(1, true);
@@ -740,7 +740,7 @@ void GameManager1::supernovaEvent() {
 		_inventory.remove(*(_rooms[ROGER]->getObject(8)));
 	} else {
 		_vm->renderMessage(kStringSupernova8);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->_screen->setGuiBrightness(0);
 		_vm->paletteBrightness();
@@ -1164,10 +1164,10 @@ bool GameManager1::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		saveTime();
 
 		_vm->renderMessage(kStringGenericInteract_10);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringGenericInteract_11);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->setCurrentImage(2);
 		_vm->renderImage(0);
@@ -1368,7 +1368,7 @@ bool GameManager1::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderMessage(kStringGenericInteract_30);
 	else if ((verb == ACTION_LOOK) && (obj1._id == BOOK2)) {
 		_vm->renderMessage(kStringGenericInteract_31);
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringGenericInteract_32);
 	} else
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index 38d83b5..b058f04 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -233,7 +233,6 @@ bool Intro2::tvDialogue() {
 
 	if(!_gm->talk(8, 6, 7, kMessageLeft, kStringIntroTV2))
 		return false;
-	debug("%d", _vm->shouldQuit());
 
 	_vm->renderImage(10);
 
@@ -483,7 +482,7 @@ bool Street::interact(Action verb, Object &obj1, Object &obj2) {
 	} else if (verb == ACTION_WALK && obj1._id == REAR_STREET) {
 		Common::String text = _vm->getGameString(kStringOnlyShop);
 		_vm->renderMessage(text);
-		_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+		_gm->wait((text.size() + 20) * _vm->_textSpeed / 10, true);
 		_vm->removeMessage();
 		return false;
 	} else 
@@ -595,7 +594,7 @@ bool Cabin2::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->_screen->setViewportBrightness(255);
 				Common::String text = _vm->getGameString(kStringWillPassOut);
 				_vm->renderMessage(text);
-				_gm->waitOnInput((text.size() + 20) * _vm->_textSpeed / 10);
+				_gm->wait((text.size() + 20) * _vm->_textSpeed / 10, true);
 				_vm->removeMessage();
 				_vm->paletteFadeOut();
 				_vm->saveGame(kSleepAutosaveSlot, "autosave");
@@ -1021,19 +1020,19 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 					_gm->dialog(3, _gm->_dials, dialStage1, 0);
 					_gm->dialog(2, _gm->_dials, dialStage2, 0);
 					_vm->renderMessage(kStringCheckout20, 100, 70);
-					_gm->waitOnInput(_gm->_messageDuration);
+					_gm->wait(_gm->_messageDuration, true);
 					_vm->removeMessage();
 					_vm->renderMessage(kStringCheckout21, 200, 40);
-					_gm->waitOnInput(_gm->_messageDuration);
+					_gm->wait(_gm->_messageDuration, true);
 					_vm->removeMessage();
 					_gm->say(kStringCheckout22);
 					_gm->dialog(3, _gm->_dials, dialStage3, 0);
 					_vm->renderMessage(kStringCheckout23, 120, 70);
-					_gm->waitOnInput(_gm->_messageDuration);
+					_gm->wait(_gm->_messageDuration, true);
 					_vm->removeMessage();
 					_gm->say(kStringCheckout24);
 					_vm->renderMessage(kStringCheckout25, 40, 100);
-					_gm->waitOnInput(_gm->_messageDuration);
+					_gm->wait(_gm->_messageDuration, true);
 					_vm->removeMessage();
 					_gm->dialog(2, _gm->_dials, dialStage4, 0);
 					_vm->playSound(kAudioStage1);
@@ -1064,10 +1063,10 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 					_vm->removeMessage();
 					_vm->playSound(kAudioStage2);
 					_vm->renderMessage(kStringCheckout26, 180, 50);
-					_gm->waitOnInput(_gm->_messageDuration);
+					_gm->wait(_gm->_messageDuration, true);
 					_vm->removeMessage();
 					_vm->renderMessage(kStringCheckout28, 50, 110);
-					_gm->waitOnInput(_gm->_messageDuration);
+					_gm->wait(_gm->_messageDuration, true);
 					_vm->removeMessage();
 					_gm->say(kStringCheckout29);
 					_vm->renderRoom(*this);
@@ -1080,7 +1079,7 @@ bool Checkout::interact(Action verb, Object &obj1, Object &obj2) {
 				}
 			} else {
 				_vm->renderMessage(kStringCheckout32);
-				_gm->waitOnInput(_gm->_messageDuration);
+				_gm->wait(_gm->_messageDuration, true);
 				_vm->removeMessage();
 				_vm->renderMessage(kStringCheckout33);
 			}
@@ -1382,22 +1381,22 @@ void Checkout::appearance() {
 	_vm->_screen->setGuiBrightness(255);
 	_vm->paletteBrightness();
 	_vm->renderMessage(kStringAppearance22);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance23);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance24);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance25);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance26);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance27);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->_screen->setViewportBrightness(0);
 	_vm->_screen->setGuiBrightness(0);
@@ -1429,16 +1428,16 @@ void Checkout::appearance() {
 	_vm->_screen->setGuiBrightness(255);
 	_vm->paletteBrightness();
 	_vm->renderMessage(kStringAppearance28);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance29);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance30);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringAppearance31);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_gm->changeRoom(SHIP);
 	_gm->_state._dark = true;
@@ -1601,7 +1600,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_gm->wait(3);
 				_vm->renderImage(1 + kSectionInvert);
 				_vm->renderMessage(kStringElevator12);
-				_gm->waitOnInput(_gm->_messageDuration);
+				_gm->wait(_gm->_messageDuration, true);
 				_vm->removeMessage();
 				_vm->renderImage(1);
 				_gm->wait(3);
@@ -1617,7 +1616,7 @@ bool Elevator2::interact(Action verb, Object &obj1, Object &obj2) {
 				_vm->_system->fillScreen(kColorBlack);
 				_vm->_screen->setViewportBrightness(255);
 				_vm->renderMessage(kStringElevator14);
-				_gm->waitOnInput(_gm->_messageDuration);
+				_gm->wait(_gm->_messageDuration, true);
 				_vm->removeMessage();
 				_vm->_screen->setViewportBrightness(0);
 				_vm->setCurrentImage(26);
@@ -1723,7 +1722,7 @@ void Elevator2::jobDescription() {
 	_gm->reply(kStringElevator32, 1, 1 + kSectionInvert);
 	_vm->setCurrentImage(30);
 	_vm->renderImage(0);
-	_gm->waitOnInput(72);
+	_gm->wait(72, true);
 	_gm->reply(kStringElevator33, 0, 0);
 	_gm->reply(kStringElevator34, 0, 0);
 	_gm->reply(kStringElevator35, 0, 0);
@@ -1767,7 +1766,7 @@ void Elevator2::jobDescription() {
 	_vm->_system->fillScreen(kColorBlack);
 	_vm->_screen->setViewportBrightness(255);
 	_vm->renderMessage(kStringElevator55);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->_screen->setViewportBrightness(0);
 	_gm->_state._tipsy = false;
@@ -1783,10 +1782,10 @@ void Elevator2::jobDescription() {
 	_vm->renderImage(0);
 	_vm->paletteFadeIn();
 	_vm->renderMessage(kStringElevator56);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringElevator57);
-	_gm->waitOnInput(_gm->_messageDuration);
+	_gm->wait(_gm->_messageDuration, true);
 	_vm->removeMessage();
 	_vm->renderMessage(kStringElevator58);
 	_gm->drawGUI();
@@ -1836,7 +1835,7 @@ bool Apartment::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->playSound(kAudioSuccess2);
 		} else {
 			_vm->renderMessage(kStringApartment3);
-			_gm->waitOnInput(_gm->_messageDuration);
+			_gm->wait(_gm->_messageDuration, true);
 			_vm->removeMessage();
 			_vm->renderMessage(kStringApartment4);
 		}
@@ -2035,27 +2034,27 @@ bool Ship::interact(Action verb, Object &obj1, Object &obj2) {
 		_vm->renderImage(0);
 		_gm->wait(16);
 		_vm->renderMessage(kStringShip7, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_gm->reply(kStringShip8, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip9, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_gm->reply(kStringShip10, 1, 1 + kSectionInvert);
 		_gm->reply(kStringShip11, 1, 1 + kSectionInvert);
 		_gm->reply(kStringShip12, 1, 1 + kSectionInvert);
 		_gm->reply(kStringShip13, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip14, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_gm->reply(kStringShip15, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip16, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_gm->reply(kStringAha, 1, 1 + kSectionInvert);
 		_gm->reply(kStringShip17, 1, 1 + kSectionInvert);
 		_vm->renderMessage(kStringShip18, kMessageRight);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_gm->reply(kStringShip19, 1, 1 + kSectionInvert);
 		_gm->wait(16);
@@ -2120,7 +2119,7 @@ void Ship::outro() {
 	do {
 		volume = _vm->_sound->getVolume() - 10;
 		_vm->_sound->setVolume(volume);
-		_gm->waitOnInput(1);
+		_gm->wait(1, true);
 	} while (volume > 10 && !_vm->shouldQuit());
 	Common::Event event;
 	event.type = Common::EVENT_RTL;
@@ -2280,7 +2279,7 @@ void PyrEntrance::animation() {
 	if (_gm->_state._pyraS == 8 && _gm->_state._pyraZ == 5) {
 		if (g_system->getMillis() >= _waitTime) { // around 1 minute
 			_vm->renderMessage(kStringPyramid4);
-			_gm->waitOnInput(_gm->_messageDuration);
+			_gm->wait(_gm->_messageDuration, true);
 			_vm->removeMessage();
 			_gm->_state._pyraZ++;
 			_gm->_state._pyraDirection = 0;
@@ -3773,14 +3772,14 @@ void Museum::onEntrance() {
 		_gm->_state._alarmOn = false;
 		_gm->_state._haste = false;
 		_vm->renderMessage(kStringMuseum1);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_gm->_state._sirenOn = false;
 		_vm->stopSound();
 		_vm->paletteFadeOut();
 		_vm->_system->fillScreen(kColorBlack);
 		_vm->_screen->setViewportBrightness(255);
 		_vm->renderMessage(kStringMuseum2);
-		_gm->waitOnInput(_gm->_messageDuration);
+		_gm->wait(_gm->_messageDuration, true);
 		_vm->removeMessage();
 		_vm->_screen->setViewportBrightness(0);
 		_vm->setCurrentImage(26);
@@ -3825,7 +3824,7 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 				}
 			} else 
 				_vm->renderMessage(kStringMuseum12);
-			_gm->waitOnInput(_gm->_messageDuration);
+			_gm->wait(_gm->_messageDuration, true);
 			_vm->removeMessage();
 			_vm->paletteFadeOut();
 			_vm->_system->fillScreen(kColorBlack);
@@ -3833,7 +3832,7 @@ bool Museum::interact(Action verb, Object &obj1, Object &obj2) {
 			_vm->_screen->setGuiBrightness(255);
 			_vm->_screen->paletteBrightness();
 			_vm->renderMessage(kStringMuseum13);
-			_gm->waitOnInput(_gm->_messageDuration);
+			_gm->wait(_gm->_messageDuration, true);
 			_vm->removeMessage();
 			_vm->_screen->setViewportBrightness(0);
 			_vm->_screen->setGuiBrightness(0);
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index 8f6b8d6..26f83ff 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -475,7 +475,7 @@ bool GameManager2::genericInteract(Action verb, Object &obj1, Object &obj2) {
 				   _currentRoom == _rooms[CITY2]) {
 			Common::String t = _vm->getGameString(kStringTaxiArrives);
 			_vm->renderMessage(t);
-			waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+			wait((t.size() + 20) * _vm->_textSpeed / 10, true);
 			_vm->removeMessage();
 			taxi();
 		} else
@@ -578,7 +578,7 @@ bool GameManager2::genericInteract(Action verb, Object &obj1, Object &obj2) {
 		_vm->setCurrentImage(30);
 		_vm->renderImage(0);
 		//karte_an = true
-		waitOnInput(100000);
+		wait(100000, true);
 		//karte_an = false
 		_vm->removeMessage();
 		_vm->renderRoom(*_currentRoom);
@@ -757,7 +757,7 @@ void GameManager2::taxiUnknownDestination() {
 	_vm->renderImage(0);
 	_vm->renderImage(1);
 	_vm->renderImage(4);
-	waitOnInput(_vm->_textSpeed * 3);
+	wait(_vm->_textSpeed * 3, true);
 	_vm->renderImage(invertSection(4));
 	_vm->renderImage(0);
 	_vm->renderImage(1);
@@ -774,7 +774,7 @@ void GameManager2::taxiPayment(int price, int destination) {
 	} else if (_state._money < price) {
 		Common::String t = _vm->getGameString(kStringNotEnoughMoney);
 		_vm->renderMessage(t);
-		waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+		wait((t.size() + 20) * _vm->_textSpeed / 10, true);
 		_vm->removeMessage();
 		leaveTaxi();
 	} else {
@@ -790,7 +790,7 @@ void GameManager2::taxiPayment(int price, int destination) {
 		_vm->playSound(kAudioTaxiLeaving);
 		while(_vm->_sound->isPlaying())
 			wait(1);
-		waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+		wait((t.size() + 20) * _vm->_textSpeed / 10, true);
 		_vm->removeMessage();
 
 		_vm->paletteFadeOut();
@@ -804,7 +804,7 @@ void GameManager2::taxiPayment(int price, int destination) {
 		_vm->playSound(kAudioTaxiArriving);
 		while(_vm->_sound->isPlaying())
 			wait(1);
-		waitOnInput((t2.size() + 20) * _vm->_textSpeed / 10);
+		wait((t2.size() + 20) * _vm->_textSpeed / 10, true);
 		_vm->removeMessage();
 		_vm->paletteFadeOut();
 
@@ -883,7 +883,7 @@ void GameManager2::taxi() {
 				else {
 					Common::String t = _vm->getGameString(kStringCheater);
 					_vm->renderMessage(t);
-					waitOnInput((t.size() + 20) * _vm->_textSpeed / 10);
+					wait((t.size() + 20) * _vm->_textSpeed / 10, true);
 					_vm->removeMessage();
 
 					leaveTaxi();
@@ -978,7 +978,7 @@ bool GameManager2::talkRest(int mod1, int mod2, int rest) {
 
 void GameManager2::pyramidEnd() {
 	_vm->renderMessage(kStringPyramid0);
-	waitOnInput(_messageDuration);
+	wait(_messageDuration, true);
 	_vm->removeMessage();
 	_vm->paletteFadeOut();
 	_vm->loadGame(kSleepAutosaveSlot);
@@ -1278,7 +1278,7 @@ void GameManager2::caught() {
 void GameManager2::caught2() {
 	_vm->renderMessage(kStringMuseum8);
 	_vm->playSound(kAudioCaught);
-	waitOnInput(_messageDuration);
+	wait(_messageDuration, true);
 	_vm->removeMessage();
 	_state._sirenOn = false;
 	_mapOn = false;
@@ -1359,7 +1359,7 @@ bool GameManager2::crackDoor(int time) {
 	if (_dead)
 		return false;
 	if (_state._alarmOn != _alarmBefore) {
-		waitOnInput(_messageDuration);
+		wait(_messageDuration, true);
 		_vm->removeMessage();
 		_vm->renderMessage(kStringMuseum16);
 	}


Commit: fc3ae4c9b955f6b7e702993f38c25f61d49b593c
    https://github.com/scummvm/scummvm/commit/fc3ae4c9b955f6b7e702993f38c25f61d49b593c
Author: Jaromir Wysoglad (xwysog00 at stud.fit.vutbr.cz)
Date: 2019-07-28T15:09:14+01:00

Commit Message:
SUPERNOVA: Fix most of Codacy issues

* Fix mismatched delete in create_image.cpp
* Add shebangs to create_ms2_data.***.sh
* Reduce scopes of some variables
* Substitute bitwise and for logical and in
    GamaManager2::passageConstruction

Changed paths:
    devtools/create_supernova/create_image/create_image.cpp
    devtools/create_supernova/create_image/create_ms2_data.015.sh
    devtools/create_supernova/create_image/create_ms2_data.027.sh
    devtools/create_supernova/create_image/create_ms2_data.028.sh
    engines/supernova/supernova.cpp
    engines/supernova/supernova1/state.cpp
    engines/supernova/supernova2/state.cpp


diff --git a/devtools/create_supernova/create_image/create_image.cpp b/devtools/create_supernova/create_image/create_image.cpp
index 1bf1e24..6f71a0c 100644
--- a/devtools/create_supernova/create_image/create_image.cpp
+++ b/devtools/create_supernova/create_image/create_image.cpp
@@ -120,7 +120,7 @@ int writePixelData(std::ofstream &output, int imageNum, int skip) {
 	char *buf = new char[length];
 	image.read(buf, length);
 	output.write(buf, length);
-	delete buf;
+	delete[] buf;
 	return length;
 }
 
diff --git a/devtools/create_supernova/create_image/create_ms2_data.015.sh b/devtools/create_supernova/create_image/create_ms2_data.015.sh
index 883cff6..be3b253 100755
--- a/devtools/create_supernova/create_image/create_ms2_data.015.sh
+++ b/devtools/create_supernova/create_image/create_ms2_data.015.sh
@@ -1,3 +1,3 @@
-#!/bin/bash
+#!/bin/sh
 
 ./create_image ms2_data 15 1146
diff --git a/devtools/create_supernova/create_image/create_ms2_data.027.sh b/devtools/create_supernova/create_image/create_ms2_data.027.sh
index f9a7441..fcac944 100755
--- a/devtools/create_supernova/create_image/create_ms2_data.027.sh
+++ b/devtools/create_supernova/create_image/create_ms2_data.027.sh
@@ -1 +1,3 @@
+#!/bin/sh
+
 ./create_image ms2_data 27 1146
diff --git a/devtools/create_supernova/create_image/create_ms2_data.028.sh b/devtools/create_supernova/create_image/create_ms2_data.028.sh
index 66fda85..1ebc280 100755
--- a/devtools/create_supernova/create_image/create_ms2_data.028.sh
+++ b/devtools/create_supernova/create_image/create_ms2_data.028.sh
@@ -1 +1,3 @@
+#!/bin/sh
+
 ./create_image ms2_data 28 829
diff --git a/engines/supernova/supernova.cpp b/engines/supernova/supernova.cpp
index 431438e..8a72107 100644
--- a/engines/supernova/supernova.cpp
+++ b/engines/supernova/supernova.cpp
@@ -468,10 +468,9 @@ Common::SeekableReadStream *SupernovaEngine::getBlockFromDatFile(Common::String
 		return nullptr;
 	}
 
-	int part;
 	uint32 gameBlockSize;
 	while (!f.eos()) {
-		part = f.readByte();
+		int part = f.readByte();
 		gameBlockSize = f.readUint32LE();
 		if (f.eos()){
 			GUIErrorMessageFormat(_("Unable to find block for part %d"), _MSPart);
diff --git a/engines/supernova/supernova1/state.cpp b/engines/supernova/supernova1/state.cpp
index ee1fe46..8130b2b 100644
--- a/engines/supernova/supernova1/state.cpp
+++ b/engines/supernova/supernova1/state.cpp
@@ -1040,8 +1040,8 @@ void GameManager1::shock() {
 void GameManager1::drawMapExits() {
 	_vm->renderBox(281, 161, 39, 39, kColorWhite25);
 
-	int idx;
 	for (int i = 0; i < 25; i++) {
+		int idx;
 		if ((idx = _exitList[i]) != -1) {
 			byte r = _currentRoom->getObject(idx)->_direction;
 			int x = 284 + 7 * (r % 5);
diff --git a/engines/supernova/supernova2/state.cpp b/engines/supernova/supernova2/state.cpp
index 26f83ff..8c94f1e 100644
--- a/engines/supernova/supernova2/state.cpp
+++ b/engines/supernova/supernova2/state.cpp
@@ -431,8 +431,8 @@ void GameManager2::drawMapExits() {
 		(_currentRoom->getId() >= FLOORDOOR && _currentRoom->getId() <= BST_DOOR))
 		compass();
 	else {
-		int idx;
 		for (int i = 0; i < 25; i++) {
+			int idx;
 			if ((idx = _exitList[i]) != -1) {
 				byte r = _currentRoom->getObject(idx)->_direction;
 				int x = 284 + 7 * (r % 5);
@@ -1068,16 +1068,16 @@ void GameManager2::passageConstruction() {
 		}
 	}
 	_rooms[PYR_ENTRANCE]->setSectionVisible(9, 
-			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &&
 			!_rooms[PYR_ENTRANCE]->isSectionVisible(1));
 	_rooms[PYR_ENTRANCE]->setSectionVisible(10, 
-			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(7) &&
 			!_rooms[PYR_ENTRANCE]->isSectionVisible(2));
 	_rooms[PYR_ENTRANCE]->setSectionVisible(11, 
-			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &&
 			!_rooms[PYR_ENTRANCE]->isSectionVisible(3));
 	_rooms[PYR_ENTRANCE]->setSectionVisible(12, 
-			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &
+			 _rooms[PYR_ENTRANCE]->isSectionVisible(8) &&
 			!_rooms[PYR_ENTRANCE]->isSectionVisible(4));
 }
 
@@ -1141,8 +1141,8 @@ byte GameManager2::wall(int s, int z, int direction, int stepsForward, int steps
 			{0,0,0,0,0,0,0,0,0,0,0,0}
 		}
 	};
-	int newR;
 	if (stepsRight) {
+		int newR;
 		if (stepsRight > 0)
 			newR = (direction + 1) & 3;
 		else {
@@ -1337,9 +1337,9 @@ void GameManager2::crack(int time) {
 	_cracking = true;
 	_vm->_screen->changeCursor(ResourceManager::kCursorWait);
 	int t = 0;
-	int z;
 	int zv = 0;
 	do {
+		int z;
 		do {
 			wait(1);
 		} while ((z = (g_system->getMillis() - _state._startTime) / 600) == zv);





More information about the Scummvm-git-logs mailing list