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

bluegr noreply at scummvm.org
Sat May 28 13:48:06 UTC 2022


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

Summary:
3be24c759b AGI: Group preAGI games into a separate folder
f7a55f3251 NEWS: Added some not mentioned changes for version 2.6.0


Commit: 3be24c759b504ad026073c0106e9b337ebad821f
    https://github.com/scummvm/scummvm/commit/3be24c759b504ad026073c0106e9b337ebad821f
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2022-05-28T16:47:47+03:00

Commit Message:
AGI: Group preAGI games into a separate folder

Changed paths:
  R engines/agi/preagi.cpp
  R engines/agi/preagi.h
  R engines/agi/preagi_mickey.cpp
  R engines/agi/preagi_mickey.h
  R engines/agi/preagi_troll.cpp
  R engines/agi/preagi_troll.h
  R engines/agi/preagi_winnie.cpp
  R engines/agi/preagi_winnie.h
    engines/agi/console.cpp
    engines/agi/metaengine.cpp
    engines/agi/module.mk


diff --git a/engines/agi/console.cpp b/engines/agi/console.cpp
index 83ab6828244..ec244dd2719 100644
--- a/engines/agi/console.cpp
+++ b/engines/agi/console.cpp
@@ -23,9 +23,9 @@
 #include "agi/opcodes.h"
 #include "agi/graphics.h"
 
-#include "agi/preagi.h"
-#include "agi/preagi_mickey.h"
-#include "agi/preagi_winnie.h"
+#include "agi/preagi/preagi.h"
+#include "agi/preagi/mickey.h"
+#include "agi/preagi/winnie.h"
 
 namespace Agi {
 
diff --git a/engines/agi/metaengine.cpp b/engines/agi/metaengine.cpp
index a5df8de54c6..a30671fbb65 100644
--- a/engines/agi/metaengine.cpp
+++ b/engines/agi/metaengine.cpp
@@ -32,10 +32,10 @@
 #include "engines/advancedDetector.h"
 
 #include "agi/agi.h"
-#include "agi/preagi.h"
-#include "agi/preagi_mickey.h"
-#include "agi/preagi_troll.h"
-#include "agi/preagi_winnie.h"
+#include "agi/preagi/preagi.h"
+#include "agi/preagi/mickey.h"
+#include "agi/preagi/troll.h"
+#include "agi/preagi/winnie.h"
 
 #include "agi/detection.h"
 
diff --git a/engines/agi/module.mk b/engines/agi/module.mk
index 75e3721a33c..045f2644ed3 100644
--- a/engines/agi/module.mk
+++ b/engines/agi/module.mk
@@ -24,10 +24,6 @@ MODULE_OBJS := \
 	op_dbg.o \
 	op_test.o \
 	picture.o \
-	preagi.o \
-	preagi_mickey.o \
-	preagi_troll.o \
-	preagi_winnie.o \
 	saveload.o \
 	sound.o \
 	sound_2gs.o \
@@ -39,8 +35,11 @@ MODULE_OBJS := \
 	systemui.o \
 	text.o \
 	view.o \
-	words.o
-
+	words.o \
+	preagi/preagi.o \
+	preagi/mickey.o \
+	preagi/troll.o \
+	preagi/winnie.o
 
 # This module can be built as a plugin
 ifeq ($(ENABLE_AGI), DYNAMIC_PLUGIN)
diff --git a/engines/agi/preagi.cpp b/engines/agi/preagi.cpp
deleted file mode 100644
index ce2421d6939..00000000000
--- a/engines/agi/preagi.cpp
+++ /dev/null
@@ -1,263 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "audio/mixer.h"
-#include "audio/softsynth/pcspk.h"
-
-#include "common/debug-channels.h"
-#include "common/events.h"
-#include "common/random.h"
-
-#include "agi/preagi.h"
-#include "agi/graphics.h"
-
-namespace Agi {
-
-PreAgiEngine::PreAgiEngine(OSystem *syst, const AGIGameDescription *gameDesc) : AgiBase(syst, gameDesc) {
-
-	// Setup mixer
-	syncSoundSettings();
-
-	memset(&_debug, 0, sizeof(struct AgiDebug));
-
-	_speakerHandle = new Audio::SoundHandle();
-}
-
-void PreAgiEngine::initialize() {
-	initRenderMode();
-
-	_font = new GfxFont(this);
-	_gfx = new GfxMgr(this, _font);
-	_picture = new PictureMgr(this, _gfx);
-
-	_font->init();
-
-	_game.gameFlags = 0;
-
-	//_game._vm->_text->charAttrib_Set(15, 0);
-
-	_defaultColor = 0xF;
-
-	_game.name[0] = '\0';
-
-	//_game._vm->_text->configureScreen(0); // hardcoded
-
-	_gfx->initVideo();
-
-	_speakerStream = new Audio::PCSpeaker(_mixer->getOutputRate());
-	_mixer->playStream(Audio::Mixer::kSFXSoundType, _speakerHandle,
-	                   _speakerStream, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true);
-
-	debugC(2, kDebugLevelMain, "Detect game");
-
-	// clear all resources and events
-	for (int i = 0; i < MAX_DIRECTORY_ENTRIES; i++) {
-		_game.pictures[i].reset();
-		_game.sounds[i] = nullptr; // _game.sounds contains pointers now
-		_game.dirPic[i].reset();
-		_game.dirSound[i].reset();
-	}
-}
-
-PreAgiEngine::~PreAgiEngine() {
-	_mixer->stopHandle(*_speakerHandle);
-	delete _speakerStream;
-	delete _speakerHandle;
-
-	delete _picture;
-	delete _gfx;
-	delete _font;
-}
-
-int PreAgiEngine::rnd(int hi) {
-	return (_rnd->getRandomNumber(hi - 1) + 1);
-}
-
-// Screen functions
-void PreAgiEngine::clearScreen(int attr, bool overrideDefault) {
-	if (overrideDefault)
-		_defaultColor = attr;
-
-	_gfx->clearDisplay((attr & 0xF0) / 0x10);
-}
-
-void PreAgiEngine::clearGfxScreen(int attr) {
-	_gfx->drawDisplayRect(0, 0, DISPLAY_DEFAULT_WIDTH - 1, IDI_MAX_ROW_PIC * 8 - 1, (attr & 0xF0) / 0x10);
-}
-
-// String functions
-
-void PreAgiEngine::drawStr(int row, int col, int attr, const char *buffer) {
-	int code;
-
-	if (attr == kColorDefault)
-		attr = _defaultColor;
-
-	for (int iChar = 0; iChar < (int)strlen(buffer); iChar++) {
-		code = buffer[iChar];
-
-		switch (code) {
-		case '\n':
-		case 0x8D:
-			if (++row == 200 / 8) return;
-			col = 0;
-			break;
-
-		case '|':
-			// swap attribute nibbles
-			break;
-
-		default:
-			_gfx->drawCharacter(row, col, code, attr & 0x0f, attr >> 4, false);
-
-			if (++col == 320 / 8) {
-				col = 0;
-				if (++row == 200 / 8) return;
-			}
-		}
-	}
-}
-
-void PreAgiEngine::drawStrMiddle(int row, int attr, const char *buffer) {
-	int col = (25 / 2) - (strlen(buffer) / 2);  // 25 = 320 / 8 (maximum column)
-	drawStr(row, col, attr, buffer);
-}
-
-void PreAgiEngine::clearTextArea() {
-	int start = IDI_MAX_ROW_PIC;
-
-	if (getGameID() == GID_TROLL)
-		start = 21;
-
-	for (int row = start; row < 200 / 8; row++) {
-		clearRow(row);
-	}
-}
-
-void PreAgiEngine::clearRow(int row) {
-	drawStr(row, 0, IDA_DEFAULT, "                                        ");   // 40 spaces
-}
-
-void PreAgiEngine::printStr(const char *szMsg) {
-	clearTextArea();
-	drawStr(21, 0, IDA_DEFAULT, szMsg);
-	g_system->updateScreen();
-}
-
-void PreAgiEngine::XOR80(char *buffer) {
-	for (size_t i = 0; i < strlen(buffer); i++)
-		if (buffer[i] & 0x80)
-			buffer[i] ^= 0x80;
-}
-
-void PreAgiEngine::printStrXOR(char *szMsg) {
-	XOR80(szMsg);
-	printStr(szMsg);
-}
-
-// Input functions
-
-int PreAgiEngine::getSelection(SelectionTypes type) {
-	Common::Event event;
-
-	while (!shouldQuit()) {
-		while (_eventMan->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_RETURN_TO_LAUNCHER:
-			case Common::EVENT_QUIT:
-				return 0;
-			case Common::EVENT_RBUTTONUP:
-				return 0;
-			case Common::EVENT_LBUTTONUP:
-				if (type == kSelYesNo || type == kSelAnyKey)
-					return 1;
-				break;
-			case Common::EVENT_KEYDOWN:
-				switch (event.kbd.keycode) {
-				case Common::KEYCODE_y:
-					if (type == kSelYesNo)
-						return 1;
-					break;
-				case Common::KEYCODE_n:
-					if (type == kSelYesNo)
-						return 0;
-					break;
-				case Common::KEYCODE_ESCAPE:
-					if (type == kSelNumber || type == kSelAnyKey)
-						return 0;
-					break;
-				case Common::KEYCODE_1:
-				case Common::KEYCODE_2:
-				case Common::KEYCODE_3:
-				case Common::KEYCODE_4:
-				case Common::KEYCODE_5:
-				case Common::KEYCODE_6:
-				case Common::KEYCODE_7:
-				case Common::KEYCODE_8:
-				case Common::KEYCODE_9:
-					if (type == kSelNumber)
-						return event.kbd.keycode - Common::KEYCODE_1 + 1;
-					break;
-				case Common::KEYCODE_SPACE:
-					if (type == kSelSpace)
-						return 1;
-					break;
-				case Common::KEYCODE_BACKSPACE:
-					if (type == kSelBackspace)
-						return 0;
-					break;
-				default:
-					if (event.kbd.flags & Common::KBD_CTRL)
-						break;
-					if (type == kSelYesNo) {
-						return 2;
-					} else if (type == kSelNumber) {
-						return 10;
-					} else if (type == kSelAnyKey || type == kSelBackspace) {
-						return 1;
-					}
-				}
-				break;
-			default:
-				break;
-			}
-		}
-		_system->updateScreen();
-		_system->delayMillis(10);
-	}
-	return 0;
-}
-
-void PreAgiEngine::playNote(int16 frequency, int32 length) {
-	_speakerStream->play(Audio::PCSpeaker::kWaveFormSquare, frequency, length);
-	waitForTimer(length);
-}
-
-void PreAgiEngine::waitForTimer(int msec_delay) {
-	uint32 start_time = _system->getMillis();
-
-	while (_system->getMillis() < start_time + msec_delay) {
-		g_system->updateScreen();
-		_system->delayMillis(10);
-	}
-}
-
-} // End of namespace Agi
diff --git a/engines/agi/preagi.h b/engines/agi/preagi.h
deleted file mode 100644
index 9ff62a50657..00000000000
--- a/engines/agi/preagi.h
+++ /dev/null
@@ -1,119 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef AGI_PREAGI_H
-#define AGI_PREAGI_H
-
-#include "agi/agi.h"
-
-namespace Audio {
-class SoundHandle;
-class PCSpeaker;
-}
-
-namespace Agi {
-
-// default attributes
-#define IDA_DEFAULT     0x0F
-#define IDA_DEFAULT_REV 0xF0
-
-#define IDI_SND_OSCILLATOR_FREQUENCY    1193180
-#define IDI_SND_TIMER_RESOLUTION        0.0182
-
-#define kColorDefault 0x1337
-
-#define IDI_MAX_ROW_PIC 20
-
-enum SelectionTypes {
-	kSelYesNo,
-	kSelNumber,
-	kSelSpace,
-	kSelAnyKey,
-	kSelBackspace
-};
-
-class PreAgiEngine : public AgiBase {
-	int _gameId;
-
-protected:
-	void initialize() override;
-
-	void pollTimer() {}
-	int getKeypress() override { return 0; }
-	bool isKeypress() override { return false; }
-	void clearKeyQueue() override {}
-
-	PreAgiEngine(OSystem *syst, const AGIGameDescription *gameDesc);
-	~PreAgiEngine() override;
-	int getGameId() {
-		return _gameId;
-	}
-
-	PictureMgr *_picture;
-
-	void clearImageStack() override {}
-	void recordImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
-	                          int16 p4, int16 p5, int16 p6, int16 p7) override {}
-	void replayImageStackCall(uint8 type, int16 p1, int16 p2, int16 p3,
-	                          int16 p4, int16 p5, int16 p6, int16 p7) override {}
-	void releaseImageStack() override {}
-	int saveGame(const Common::String &fileName, const Common::String &saveName) { return -1; }
-	int loadGame(const Common::String &fileName, bool checkId = true) { return -1; }
-
-	// Game
-	Common::String getTargetName() { return _targetName; }
-
-	// Screen
-	void clearScreen(int attr, bool overrideDefault = true);
-	void clearGfxScreen(int attr);
-	void setDefaultTextColor(int attr) { _defaultColor = attr; }
-
-	// Keyboard
-	int getSelection(SelectionTypes type);
-
-	int rnd(int hi);
-
-	// Text
-	void drawStr(int row, int col, int attr, const char *buffer);
-	void drawStrMiddle(int row, int attr, const char *buffer);
-	void clearTextArea();
-	void clearRow(int row);
-	void XOR80(char *buffer);
-	void printStr(const char *szMsg);
-	void printStrXOR(char *szMsg);
-
-	// Saved Games
-	Common::SaveFileManager *getSaveFileMan() { return _saveFileMan; }
-
-	void playNote(int16 frequency, int32 length);
-	void waitForTimer(int msec_delay);
-
-private:
-	int _defaultColor;
-
-	Audio::PCSpeaker *_speakerStream;
-	Audio::SoundHandle *_speakerHandle;
-};
-
-} // End of namespace Agi
-
-
-#endif
diff --git a/engines/agi/preagi_mickey.cpp b/engines/agi/preagi_mickey.cpp
deleted file mode 100644
index 79121a911b0..00000000000
--- a/engines/agi/preagi_mickey.cpp
+++ /dev/null
@@ -1,2358 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "common/events.h"
-#include "common/savefile.h"
-#include "common/textconsole.h"
-
-#include "graphics/cursorman.h"
-
-#include "agi/preagi.h"
-#include "agi/preagi_mickey.h"
-#include "agi/graphics.h"
-
-namespace Agi {
-
-int MickeyEngine::getDat(int iRoom) {
-	if (((iRoom > 0) && (iRoom < 24)) || iRoom == 154 || iRoom == 155) return IDI_MSA_PLANET_EARTH;
-	if ((iRoom >= 30) && (iRoom <= 39)) return IDI_MSA_PLANET_VENUS;
-	if ((iRoom >= 40) && (iRoom <= 69)) return IDI_MSA_PLANET_NEPTUNE;
-	if ((iRoom >= 70) && (iRoom <= 82)) return IDI_MSA_PLANET_MERCURY;
-	if ((iRoom >= 83) && (iRoom <= 92)) return IDI_MSA_PLANET_SATURN;
-	if ((iRoom >= 93) && (iRoom <= 103)) return IDI_MSA_PLANET_PLUTO;
-	if ((iRoom >= 106) && (iRoom <= 120)) return IDI_MSA_PLANET_JUPITER;
-	if ((iRoom >= 121) && (iRoom <= 132)) return IDI_MSA_PLANET_MARS;
-	if ((iRoom >= 133) && (iRoom <= 145)) return IDI_MSA_PLANET_URANUS;
-	return IDI_MSA_PLANET_SPACESHIP;
-}
-
-void MickeyEngine::readExe(int ofs, uint8 *buffer, long buflen) {
-	Common::File infile;
-	if (!infile.open("mickey.exe"))
-		return;
-	infile.seek(ofs, SEEK_SET);
-	infile.read(buffer, buflen);
-	infile.close();
-}
-
-void MickeyEngine::getDatFileName(int iRoom, char *szFile) {
-	sprintf(szFile, IDS_MSA_PATH_DAT, IDS_MSA_NAME_DAT[getDat(iRoom)]);
-}
-
-void MickeyEngine::readDatHdr(char *szFile, MSA_DAT_HEADER *hdr) {
-	Common::File infile;
-
-	if (!infile.open(szFile))
-		return;
-
-	hdr->filelen = infile.readByte();
-	hdr->filelen += infile.readByte() * 0x100;
-
-	for (int i = 0; i < IDI_MSA_MAX_ROOM; i++) {
-		hdr->ofsRoom[i] = infile.readByte();
-		hdr->ofsRoom[i] += infile.readByte() * 0x100;
-	}
-	for (int i = 0; i < IDI_MSA_MAX_ROOM; i++) {
-		hdr->ofsDesc[i] = infile.readByte();
-		hdr->ofsDesc[i] += infile.readByte() * 0x100;
-	}
-	for (int i = 0; i < IDI_MSA_MAX_ROOM; i++) {
-		hdr->ofsStr[i] = infile.readByte();
-		hdr->ofsStr[i] += infile.readByte() * 0x100;
-	}
-
-	infile.close();
-}
-
-void MickeyEngine::readOfsData(int offset, int iItem, uint8 *buffer, long buflen) {
-	uint16 ofs[256];
-
-	readExe(offset, buffer, buflen);
-	memcpy(ofs, buffer, sizeof(ofs));
-
-	for (int i = 0; i < 256; i++)
-		ofs[i] = buffer[i * 2] + 256 * buffer[i * 2 + 1];
-
-	readExe(ofs[iItem] + IDI_MSA_OFS_EXE, buffer, buflen);
-}
-
-// User Interface
-
-bool MickeyEngine::chooseY_N(int ofsPrompt, bool fErrorMsg) {
-	printExeStr(ofsPrompt);
-
-	while (!shouldQuit()) {
-		switch (getSelection(kSelYesNo)) {
-		case 0:
-			return false;
-		case 1:
-			return true;
-		default:
-			if (fErrorMsg) {
-				printExeStr(IDO_MSA_PRESS_YES_OR_NO);
-				waitAnyKey();
-				printExeStr(ofsPrompt);
-			}
-			break;
-		}
-	}
-
-	return false;
-}
-
-int MickeyEngine::choose1to9(int ofsPrompt) {
-	int answer = 0;
-	printExeStr(ofsPrompt);
-
-	while (!shouldQuit()) {
-		answer = getSelection(kSelNumber);
-		if (answer == 10) {
-			printExeStr(IDO_MSA_PRESS_1_TO_9);
-			if (getSelection(kSelAnyKey) == 0)
-				return 0;
-			printExeStr(ofsPrompt);
-		} else return answer;
-	}
-
-	return 0;
-}
-
-void MickeyEngine::printStr(char *buffer) {
-	int pc = 1;
-	int nRows, iCol, iRow;
-
-	nRows = *buffer + IDI_MSA_ROW_MENU_0;
-
-	clearTextArea();
-
-	for (iRow = IDI_MSA_ROW_MENU_0; iRow < nRows; iRow++) {
-		iCol = *(buffer + pc++);
-		drawStr(iRow, iCol, IDA_DEFAULT, buffer + pc);
-		pc += strlen(buffer + pc) + 1;
-	}
-
-	// Show the string on screen
-	_gfx->updateScreen();
-}
-
-void MickeyEngine::printLine(const char *buffer) {
-	clearTextArea();
-
-	drawStr(22, 18 - strlen(buffer) / 2, IDA_DEFAULT, buffer);
-
-	// Show the string on screen
-	_gfx->updateScreen();
-
-	waitAnyKey(true);
-}
-
-void MickeyEngine::printExeStr(int ofs) {
-	uint8 buffer[256] = {0};
-
-	if (!ofs)
-		return;
-
-	readExe(ofs, buffer, sizeof(buffer));
-	printStr((char *)buffer);
-}
-
-void MickeyEngine::printExeMsg(int ofs) {
-	if (!ofs)
-		return;
-
-	printExeStr(ofs);
-	waitAnyKey(true);
-}
-
-void MickeyEngine::printDatString(int iStr) {
-	char buffer[256];
-	int iDat = getDat(_gameStateMickey.iRoom);
-
-	MSA_DAT_HEADER hdr;
-	char szFile[256] = {0};
-
-	sprintf(szFile, IDS_MSA_PATH_DAT, IDS_MSA_NAME_DAT[iDat]);
-	readDatHdr(szFile, &hdr);
-
-	Common::File infile;
-
-	if (!infile.open(szFile))
-		return;
-
-	infile.seek(hdr.ofsStr[iStr] + IDI_MSA_OFS_DAT, SEEK_SET);
-	infile.read((uint8 *)buffer, 256);
-	infile.close();
-
-	printStr(buffer);
-}
-
-void MickeyEngine::printDesc(int iRoom) {
-	MSA_DAT_HEADER hdr;
-	char szFile[256] = {0};
-
-	getDatFileName(iRoom, szFile);
-	readDatHdr(szFile, &hdr);
-
-	Common::File infile;
-
-	if (!infile.open(szFile))
-		return;
-
-	char *buffer = (char *)malloc(256);
-	memset(buffer, 0, 256);
-
-	infile.seek(hdr.ofsDesc[iRoom - 1] + IDI_MSA_OFS_DAT, SEEK_SET);
-	infile.read(buffer, 256);
-	infile.close();
-
-	printStr(buffer);
-	free(buffer);
-}
-
-bool MickeyEngine::checkMenu() {
-	MSA_MENU menu;
-	int iSel0, iSel1;
-	MSA_DAT_HEADER hdr;
-	char szFile[256] = {0};
-	Common::File infile;
-
-	getDatFileName(_gameStateMickey.iRoom, szFile);
-	readDatHdr(szFile, &hdr);
-	if (!infile.open(szFile))
-		return false;
-
-	char *buffer = new char[sizeof(MSA_MENU)];
-	infile.seek(hdr.ofsRoom[_gameStateMickey.iRoom - 1] + IDI_MSA_OFS_DAT, SEEK_SET);
-	infile.read((uint8 *)buffer, sizeof(MSA_MENU));
-	infile.close();
-
-	memcpy(&menu, buffer, sizeof(MSA_MENU));
-	patchMenu(&menu);
-	memcpy(buffer, &menu, sizeof(MSA_MENU));
-
-	getMenuSel(buffer, &iSel0, &iSel1);
-	delete[] buffer;
-
-	return parse(menu.cmd[iSel0].data[iSel1], menu.arg[iSel0].data[iSel1]);
-}
-
-void MickeyEngine::drawMenu(MSA_MENU &menu, int sel0, int sel1) {
-	int iWord;
-	int iRow;
-	int sel;
-	uint8 attr;
-
-	// draw menu
-
-	clearTextArea();
-
-	for (iRow = 0; iRow < 2; iRow++) {
-		for (iWord = 0; iWord < menu.row[iRow].count; iWord++) {
-			if (iRow)
-				sel = sel1;
-			else
-				sel = sel0;
-
-			if (iWord == sel)
-				attr = IDA_DEFAULT_REV;
-			else
-				attr = IDA_DEFAULT;
-
-			drawStr(IDI_MSA_ROW_MENU_0 + iRow, menu.row[iRow].entry[iWord].x0,
-			        attr, (char *)menu.row[iRow].entry[iWord].szText);
-		}
-	}
-
-	// Menu created, show it on screen
-	_gfx->updateScreen();
-}
-
-void MickeyEngine::getMouseMenuSelRow(MSA_MENU &menu, int *sel0, int *sel1, int iRow, int x, int y) {
-	int iWord;
-	int *sel = nullptr;
-
-	switch (iRow) {
-	case 0:
-		if (y != IDI_MSA_ROW_MENU_0) return;
-		sel = sel0;
-		break;
-	case 1:
-		if (y != IDI_MSA_ROW_MENU_1) return;
-		sel = sel1;
-		break;
-	default:
-		return;
-	}
-
-	for (iWord = 0; iWord < menu.row[iRow].count; iWord++) {
-		if ((x >= menu.row[iRow].entry[iWord].x0) &&
-		        (x < (int)(menu.row[iRow].entry[iWord].x0 +
-		                   strlen((char *)menu.row[iRow].entry[iWord].szText)))) {
-			*sel = iWord;
-			break;
-		}
-	}
-}
-
-bool MickeyEngine::getMenuSelRow(MSA_MENU &menu, int *sel0, int *sel1, int iRow) {
-	Common::Event event;
-	int *sel = nullptr;
-	int nWords;
-	int x, y;
-	int goIndex = -1, northIndex = -1, southIndex = -1, eastIndex = -1, westIndex = -1;
-
-	switch (iRow) {
-	case 0:
-		sel = sel0;
-		break;
-	case 1:
-		sel = sel1;
-		break;
-	default:
-		break;
-	}
-	nWords = menu.row[iRow].count;
-	_clickToMove = false;
-
-	for (int i = 0; i <= menu.row[0].count; i++)
-		if (menu.row[0].entry[i].szText[0] == 71 && menu.row[0].entry[i].szText[1] == 79)   // GO
-			goIndex = i;
-
-	if (goIndex >= 0) {
-		for (int j = 0; j <= menu.row[1].count; j++) {
-			if (menu.row[1].entry[j].szText[0] == 78 && menu.row[1].entry[j].szText[1] == 79 &&
-			        menu.row[1].entry[j].szText[2] == 82 && menu.row[1].entry[j].szText[3] == 84 &&
-			        menu.row[1].entry[j].szText[4] == 72)
-				northIndex = j;
-			if (menu.row[1].entry[j].szText[0] == 83 && menu.row[1].entry[j].szText[1] == 79 &&
-			        menu.row[1].entry[j].szText[2] == 85 && menu.row[1].entry[j].szText[3] == 84 &&
-			        menu.row[1].entry[j].szText[4] == 72)
-				southIndex = j;
-			if (menu.row[1].entry[j].szText[0] == 69 && menu.row[1].entry[j].szText[1] == 65 &&
-			        menu.row[1].entry[j].szText[2] == 83 && menu.row[1].entry[j].szText[3] == 84)
-				eastIndex = j;
-			if (menu.row[1].entry[j].szText[0] == 87 && menu.row[1].entry[j].szText[1] == 69 &&
-			        menu.row[1].entry[j].szText[2] == 83 && menu.row[1].entry[j].szText[3] == 84)
-				westIndex = j;
-		}
-	}
-
-	drawMenu(menu, *sel0, *sel1);
-
-	while (!shouldQuit()) {
-		while (_system->getEventManager()->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_RETURN_TO_LAUNCHER:
-			case Common::EVENT_QUIT:
-				return 0;
-			case Common::EVENT_MOUSEMOVE:
-				if (iRow < 2) {
-					x = event.mouse.x / 8;
-					y = event.mouse.y / 8;
-					// If the mouse hovers over the menu, refresh the menu
-					if ((iRow == 0 && y == IDI_MSA_ROW_MENU_0) || (iRow == 1 && y == IDI_MSA_ROW_MENU_1)) {
-						getMouseMenuSelRow(menu, sel0, sel1, iRow, x, y);
-						drawMenu(menu, *sel0, *sel1);
-					}
-
-					// Change cursor
-					if (northIndex >= 0 && (event.mouse.x >= 20 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2) &&
-					        (event.mouse.y >= 0 && event.mouse.y <= 10)) {
-						//_gfx->setCursorPalette(true);
-						// TODO:?????
-					} else if (southIndex >= 0 && (event.mouse.x >= 20 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2) &&
-					           (event.mouse.y >= IDI_MSA_PIC_HEIGHT - 10 && event.mouse.y <= IDI_MSA_PIC_HEIGHT)) {
-						//_gfx->setCursorPalette(true);
-					} else if (westIndex >= 0 && (event.mouse.y >= 0  && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
-					           (event.mouse.x >= 20 && event.mouse.x <= 30)) {
-						//_gfx->setCursorPalette(true);
-					} else if (eastIndex >= 0 && (event.mouse.y >= 0  && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
-					           (event.mouse.x >= IDI_MSA_PIC_WIDTH * 2 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2)) {
-						//_gfx->setCursorPalette(true);
-					} else {
-						//_gfx->setCursorPalette(false);
-					}
-				}
-				break;
-			case Common::EVENT_LBUTTONUP:
-				// Click to move
-				if (northIndex >= 0 && (event.mouse.x >= 20 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2) &&
-				        (event.mouse.y >= 0 && event.mouse.y <= 10)) {
-					*sel0 = goIndex;
-					*sel1 = northIndex;
-
-					drawMenu(menu, *sel0, *sel1);
-
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					_clickToMove = true;
-				} else if (southIndex >= 0 && (event.mouse.x >= 20 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2) &&
-				           (event.mouse.y >= IDI_MSA_PIC_HEIGHT - 10 && event.mouse.y <= IDI_MSA_PIC_HEIGHT)) {
-					*sel0 = goIndex;
-					*sel1 = southIndex;
-
-					drawMenu(menu, *sel0, *sel1);
-
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					_clickToMove = true;
-				} else if (westIndex >= 0 && (event.mouse.y >= 0  && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
-				           (event.mouse.x >= 20 && event.mouse.x <= 30)) {
-					*sel0 = goIndex;
-					*sel1 = westIndex;
-
-					drawMenu(menu, *sel0, *sel1);
-
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					_clickToMove = true;
-				} else if (eastIndex >= 0 && (event.mouse.y >= 0  && event.mouse.y <= IDI_MSA_PIC_HEIGHT) &&
-				           (event.mouse.x >= IDI_MSA_PIC_WIDTH * 2 && event.mouse.x <= (IDI_MSA_PIC_WIDTH + 10) * 2)) {
-					*sel0 = goIndex;
-					*sel1 = eastIndex;
-
-					drawMenu(menu, *sel0, *sel1);
-
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					_clickToMove = true;
-				} else {
-					//_gfx->setCursorPalette(false);
-					// TODO???
-				}
-				return true;
-			case Common::EVENT_RBUTTONUP:
-				*sel0 = 0;
-				*sel1 = -1;
-				return false;
-			case Common::EVENT_WHEELUP:
-				if (iRow < 2) {
-					*sel -= 1;
-
-					if (*sel < 0)
-						*sel = nWords - 1;
-
-					drawMenu(menu, *sel0, *sel1);
-				}
-				break;
-			case Common::EVENT_WHEELDOWN:
-				if (iRow < 2) {
-					*sel += 1;
-
-					if (*sel == nWords)
-						*sel = 0;
-
-					drawMenu(menu, *sel0, *sel1);
-				}
-				break;
-			case Common::EVENT_KEYDOWN:
-				switch (event.kbd.keycode) {
-				case Common::KEYCODE_2:
-					// Hidden message
-					if (_gameStateMickey.iRoom == IDI_MSA_PIC_MERCURY_CAVE_0) {
-						for (int i = 0; i < 5; i++) {
-							printExeMsg(IDO_MSA_HIDDEN_MSG[i]);
-						}
-						clearTextArea();
-						waitAnyKey();
-					}
-					break;
-				case Common::KEYCODE_8:
-					if (event.kbd.flags & Common::KBD_CTRL) {
-						*sel0 = 0;
-						*sel1 = -1;
-
-						return false;
-					}
-					break;
-				case Common::KEYCODE_ESCAPE:
-					*sel0 = 0;
-					*sel1 = -1;
-
-					return false;
-				case Common::KEYCODE_s:
-					flipFlag(VM_FLAG_SOUND_ON);
-					break;
-				case Common::KEYCODE_c:
-					inventory();
-					drawRoom();
-
-					*sel0 = 0;
-					*sel1 = -1;
-
-					return false;
-				case Common::KEYCODE_b:
-					printRoomDesc();
-					drawMenu(menu, *sel0, *sel1);
-
-					*sel0 = 0;
-					*sel1 = -1;
-
-					return false;
-				case Common::KEYCODE_LEFT:
-				case Common::KEYCODE_KP4:
-				case Common::KEYCODE_4:
-					if (iRow < 2) {
-						*sel -= 1;
-
-						if (*sel < 0)
-							*sel = nWords - 1;
-
-						drawMenu(menu, *sel0, *sel1);
-					}
-					break;
-				case Common::KEYCODE_RIGHT:
-				case Common::KEYCODE_SPACE:
-				case Common::KEYCODE_KP6:
-				case Common::KEYCODE_6:
-					if (iRow < 2) {
-						*sel += 1;
-
-						if (*sel == nWords)
-							*sel = 0;
-
-						drawMenu(menu, *sel0, *sel1);
-					}
-					break;
-				case Common::KEYCODE_RETURN:
-				case Common::KEYCODE_KP_ENTER:
-					return true;
-				default:
-					break;
-				}
-				break;
-			default:
-				break;
-			}
-			animate();
-			drawMenu(menu, *sel0, *sel1);
-		}
-		animate();
-		drawMenu(menu, *sel0, *sel1);
-	}
-
-	return false;
-}
-
-void MickeyEngine::getMenuSel(char *buffer, int *sel0, int *sel1) {
-	MSA_MENU menu;
-
-	memcpy(&menu, buffer, sizeof(MSA_MENU));
-
-	*sel0 = 0;
-	*sel1 = -1;
-
-	// Show the mouse cursor for the menu
-	CursorMan.showMouse(true);
-
-	while (!shouldQuit()) {
-		while (!shouldQuit()) {
-			if (getMenuSelRow(menu, sel0, sel1, 0)) {
-				if (_clickToMove)
-					break;
-
-				*sel1 = 0;
-
-				if (getMenuSelRow(menu, sel0, sel1, 1)) {
-					break;
-				}
-			}
-		}
-
-		if (_clickToMove || getMenuSelRow(menu, sel0, sel1, 2)) {
-			break;
-		}
-	}
-
-	// Menu selection made, hide the mouse cursor
-	CursorMan.showMouse(false);
-}
-
-void MickeyEngine::centerMenu(MSA_MENU *menu) {
-	int iWord;
-	int iRow;
-	int w, x;
-
-	for (iRow = 0; iRow < 2; iRow++) {
-		w = 0;
-		for (iWord = 0; iWord < menu->row[iRow].count; iWord++) {
-			w += strlen((char *)menu->row[iRow].entry[iWord].szText);
-		}
-		w += menu->row[iRow].count - 1;
-		x = (40 - w) / 2;   // FIX
-
-		for (iWord = 0; iWord < menu->row[iRow].count; iWord++) {
-			menu->row[iRow].entry[iWord].x0 = x;
-			x += strlen((char *)menu->row[iRow].entry[iWord].szText) + 1;
-		}
-	}
-}
-
-void MickeyEngine::patchMenu(MSA_MENU *menu) {
-	uint8 buffer[512];
-	uint8 menubuf[sizeof(MSA_MENU)];
-	int nPatches;
-	int pBuf = 0;
-
-	// change planet name in ship airlock menu
-	if (_gameStateMickey.iRoom == IDI_MSA_PIC_SHIP_AIRLOCK) {
-		strcpy((char *)menu->row[1].entry[2].szText, IDS_MSA_NAME_PLANET[_gameStateMickey.iPlanet]);
-	}
-
-	// exit if fix unnecessary
-	if (!_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
-		centerMenu(menu);
-		return;
-	}
-
-	// copy menu to menubuf
-	memcpy(menubuf, menu, sizeof(menubuf));
-
-	// read patches
-	readOfsData(
-	    IDOFS_MSA_MENU_PATCHES,
-	    _gameStateMickey.nRmMenu[_gameStateMickey.iRoom] + _gameStateMickey.iRmMenu[_gameStateMickey.iRoom] - 1,
-	    buffer, sizeof(buffer)
-	);
-
-	// get number of patches
-	nPatches = buffer[pBuf++];
-
-	// patch menubuf
-	for (int iPatch = 0; iPatch < nPatches; iPatch++) {
-		if (buffer[pBuf] > sizeof(menubuf)) {
-			// patch address out of bounds
-		}
-		menubuf[buffer[pBuf]] = buffer[pBuf + 1];
-		pBuf += 2;
-	}
-
-	// copy menubuf back to menu
-	memcpy(menu, menubuf, sizeof(MSA_MENU));
-
-	// center menu
-	centerMenu(menu);
-}
-
-void MickeyEngine::printDatMessage(int iStr) {
-	printDatString(iStr);
-	waitAnyKey(true);
-}
-
-// Sound
-
-void MickeyEngine::playNote(MSA_SND_NOTE note) {
-	if (!note.counter) {
-		// Pause
-		_system->delayMillis((uint)(note.length / IDI_SND_TIMER_RESOLUTION));
-	} else {
-		PreAgiEngine::playNote(IDI_SND_OSCILLATOR_FREQUENCY / note.counter, (int32)(note.length / IDI_SND_TIMER_RESOLUTION));
-	}
-}
-
-void MickeyEngine::playSound(ENUM_MSA_SOUND iSound) {
-	if (!getFlag(VM_FLAG_SOUND_ON))
-		return;
-
-	Common::Event event;
-	MSA_SND_NOTE note;
-	uint8 *buffer = new uint8[1024];
-	int pBuf = 1;
-
-	switch (iSound) {
-	case IDI_MSA_SND_XL30:
-		for (int iNote = 0; iNote < 6; iNote++) {
-			note.counter = rnd(59600) + 59;
-			note.length = 4;
-			playNote(note);
-		}
-		break;
-	default:
-		readOfsData(IDOFS_MSA_SOUND_DATA, iSound, buffer, 1024);
-
-		for (;;) {
-			memcpy(&note, buffer + pBuf, sizeof(note));
-			if (!note.counter && !note.length)
-				break;
-
-			playNote(note);
-
-			pBuf += 3;
-
-			if (iSound == IDI_MSA_SND_THEME) {
-				while (_system->getEventManager()->pollEvent(event)) {
-					switch (event.type) {
-					case Common::EVENT_RETURN_TO_LAUNCHER:
-					case Common::EVENT_QUIT:
-					case Common::EVENT_LBUTTONUP:
-					case Common::EVENT_RBUTTONUP:
-					case Common::EVENT_KEYDOWN:
-						delete[] buffer;
-						return;
-					default:
-						break;
-					}
-				}
-			}
-		}
-
-		break;
-	}
-
-	delete[] buffer;
-}
-
-// Graphics
-
-void MickeyEngine::drawObj(ENUM_MSA_OBJECT iObj, int x0, int y0) {
-	char szFile[255] = {0};
-	sprintf(szFile, IDS_MSA_PATH_OBJ, IDS_MSA_NAME_OBJ[iObj]);
-
-	Common::File file;
-	if (!file.open(szFile))
-		return;
-
-	uint8 *buffer = new uint8[4096];
-	uint32 size = file.size();
-	file.read(buffer, size);
-	file.close();
-
-	if (iObj == IDI_MSA_OBJECT_CRYSTAL)
-		_picture->setPictureFlags(kPicFStep);
-
-	_picture->setOffset(x0, y0);
-	_picture->decodePicture(buffer, size, false, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
-	_picture->setOffset(0, 0);
-	_picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
-}
-
-void MickeyEngine::drawPic(int iPic) {
-	char szFile[255] = {0};
-	sprintf(szFile, IDS_MSA_PATH_PIC, iPic);
-
-	Common::File file;
-	if (!file.open(szFile))
-		return;
-
-	uint8 *buffer = new uint8[4096];
-	uint32 size = file.size();
-	file.read(buffer, size);
-	file.close();
-
-	// Note that decodePicture clears the screen
-	_picture->setOffset(10, 0);
-	_picture->decodePicture(buffer, size, true, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
-	_picture->setOffset(0, 0);
-	_picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
-}
-
-void MickeyEngine::drawRoomAnimation() {
-	uint8 objLight[] = {
-		0xF0, 1, 0xF9, 2, 43, 45, 0xFF
-	};
-
-	switch (_gameStateMickey.iRoom) {
-	case IDI_MSA_PIC_EARTH_SHIP:
-	case IDI_MSA_PIC_VENUS_SHIP:
-	case IDI_MSA_PIC_NEPTUNE_SHIP:
-	case IDI_MSA_PIC_MERCURY_SHIP:
-	case IDI_MSA_PIC_SATURN_SHIP:
-	case IDI_MSA_PIC_PLUTO_SHIP:
-	case IDI_MSA_PIC_JUPITER_SHIP:
-	case IDI_MSA_PIC_MARS_SHIP:
-	case IDI_MSA_PIC_URANUS_SHIP:
-	case IDI_MSA_PIC_SHIP_VENUS:
-	case IDI_MSA_PIC_SHIP_NEPTUNE:
-	case IDI_MSA_PIC_SHIP_MERCURY:
-	case IDI_MSA_PIC_SHIP_SATURN:
-	case IDI_MSA_PIC_SHIP_PLUTO:
-	case IDI_MSA_PIC_SHIP_JUPITER:
-	case IDI_MSA_PIC_SHIP_MARS:
-	case IDI_MSA_PIC_SHIP_URANUS: {
-		// draw blinking ship lights
-
-		uint8 iColor = 0;
-
-		_picture->setPattern(2, 0);
-
-		for (int i = 0; i < 12; i++) {
-			iColor = _gameStateMickey.nFrame + i;
-			if (iColor > 15)
-				iColor -= 15;
-
-			objLight[1] = iColor;
-			objLight[4] += 7;
-
-			_picture->setPictureData(objLight);
-			_picture->setPictureFlags(kPicFCircle);
-			_picture->drawPicture();
-		}
-		_picture->showPic(10, 0, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
-
-
-		_gameStateMickey.nFrame--;
-		if (_gameStateMickey.nFrame < 0)
-			_gameStateMickey.nFrame = 15;
-
-		playSound(IDI_MSA_SND_PRESS_BLUE);
-	}
-	break;
-
-	case IDI_MSA_PIC_SHIP_CONTROLS:
-
-		// draw XL30 screen
-		if (_gameStateMickey.fAnimXL30) {
-			if (_gameStateMickey.nFrame > 5)
-				_gameStateMickey.nFrame = 0;
-
-			drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_XL31 + _gameStateMickey.nFrame), 0, 4);
-			_gameStateMickey.nFrame++;
-		};
-
-		break;
-
-	default:
-
-		// draw crystal
-		if (_gameStateMickey.iRoom == IDI_MSA_XTAL_ROOM_XY[_gameStateMickey.iPlanet][0]) {
-			if (!_gameStateMickey.fHasXtal) {
-				switch (_gameStateMickey.iPlanet) {
-				case IDI_MSA_PLANET_VENUS:
-					if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] != 2)
-						break;
-					// fall through
-				default:
-					drawObj(
-					    IDI_MSA_OBJECT_CRYSTAL,
-					    IDI_MSA_XTAL_ROOM_XY[_gameStateMickey.iPlanet][1],
-					    IDI_MSA_XTAL_ROOM_XY[_gameStateMickey.iPlanet][2]
-					);
-					break;
-				}
-			}
-		}
-
-		break;
-	}
-}
-
-void MickeyEngine::drawRoom() {
-	uint8 buffer[512];
-	int pBuf = 0;
-	int nObjs;
-
-	// Draw room picture
-	if (_gameStateMickey.iRoom == IDI_MSA_PIC_TITLE) {
-		drawPic(IDI_MSA_PIC_TITLE);
-	} else {
-		drawPic(_gameStateMickey.iRmPic[_gameStateMickey.iRoom]);
-
-		if (_gameStateMickey.iRoom == IDI_MSA_PIC_SHIP_CONTROLS) {
-			// Draw ship control room window
-			if (_gameStateMickey.fFlying) {
-				drawObj(IDI_MSA_OBJECT_W_SPACE, 0, 0);
-			} else {
-				drawObj((ENUM_MSA_OBJECT)(IDI_MSA_OBJECT_W_EARTH + _gameStateMickey.iPlanet), 0, 1);
-			}
-		}
-	}
-
-	// Draw room objects
-	if (_gameStateMickey.iRoom >= IDI_MSA_MAX_PIC_ROOM) {
-		drawRoomAnimation();
-		return;
-	}
-
-	if (_gameStateMickey.iRmObj[_gameStateMickey.iRoom] != IDI_MSA_OBJECT_NONE) {
-		readOfsData(IDO_MSA_ROOM_OBJECT_XY_OFFSETS,
-		            _gameStateMickey.iRmObj[_gameStateMickey.iRoom], buffer, sizeof(buffer));
-
-		nObjs = buffer[pBuf++];
-
-		for (int iObj = 0; iObj < nObjs; iObj++) {
-			drawObj((ENUM_MSA_OBJECT)buffer[pBuf], buffer[pBuf + 1], buffer[pBuf + 2]);
-			pBuf += 3;
-		}
-	}
-
-	// Draw room animation
-	drawRoomAnimation();
-}
-
-// Straight mapping, CGA colors to CGA
-const byte BCGColorMappingCGAToCGA[4] = {
-	0, 1, 2, 3
-};
-
-// Mapping table to map CGA colors to EGA
-const byte BCGColorMappingCGAToEGA[4] = {
-	0, 11, 13, 15
-};
-
-void MickeyEngine::drawLogo() {
-	const int width = 80;
-	const int height = 85 * 2;
-	byte  color1, color2, color3, color4;
-	byte  *fileBuffer = nullptr;
-	uint32 fileBufferSize = 0;
-	byte  *dataBuffer;
-	byte   curByte;
-	const byte *BCGColorMapping = BCGColorMappingCGAToEGA;
-
-	// disable color mapping in case we are in CGA mode
-	if (_renderMode == Common::kRenderCGA)
-		BCGColorMapping = BCGColorMappingCGAToCGA;
-
-	// read logos.bcg
-	Common::File infile;
-	if (!infile.open(IDS_MSA_PATH_LOGO))
-		return;
-
-	fileBufferSize = infile.size();
-	fileBuffer = new byte[fileBufferSize];
-	infile.read(fileBuffer, fileBufferSize);
-	infile.close();
-
-	if (fileBufferSize < (width * height / 4))
-		error("logos.bcg: unexpected end of file");
-
-	// Show BCG picture
-	// It's basically uncompressed CGA 4-color data (4 pixels per byte)
-	dataBuffer = fileBuffer;
-	for (int y = 0; y < height; y++) {
-		for (int x = 0; x < width; x++) {
-			curByte = *dataBuffer++;
-
-			color1 = BCGColorMapping[(curByte >> 6) & 0x03];
-			color2 = BCGColorMapping[(curByte >> 4) & 0x03];
-			color3 = BCGColorMapping[(curByte >> 2) & 0x03];
-			color4 = BCGColorMapping[(curByte >> 0) & 0x03];
-
-			_gfx->putPixelOnDisplay(x * 4 + 0, y, color1);
-			_gfx->putPixelOnDisplay(x * 4 + 1, y, color2);
-			_gfx->putPixelOnDisplay(x * 4 + 2, y, color3);
-			_gfx->putPixelOnDisplay(x * 4 + 3, y, color4);
-		}
-	}
-
-	_gfx->copyDisplayToScreen();
-
-	delete[] fileBuffer;
-}
-
-void MickeyEngine::animate() {
-	_system->delayMillis(IDI_MSA_ANIM_DELAY);
-	drawRoomAnimation();
-}
-
-void MickeyEngine::printRoomDesc() {
-	// print room description
-	printDesc(_gameStateMickey.iRoom);
-	waitAnyKey(true);
-
-	// print extended room description
-	if (_gameStateMickey.oRmTxt[_gameStateMickey.iRoom]) {
-		printExeMsg(_gameStateMickey.oRmTxt[_gameStateMickey.iRoom] + IDI_MSA_OFS_EXE);
-	}
-}
-
-bool MickeyEngine::loadGame() {
-	Common::InSaveFile *infile;
-	char szFile[256] = {0};
-	bool diskerror = true;
-	int sel;
-	int saveVersion = 0;
-	int i = 0;
-
-	while (diskerror) {
-		sel = choose1to9(IDO_MSA_LOAD_GAME[1]);
-		if (!sel)
-			return false;
-
-		// load game
-		sprintf(szFile, "%s.s%02d", getTargetName().c_str(), sel);
-		if (!(infile = getSaveFileMan()->openForLoading(szFile))) {
-			printLine("PLEASE CHECK THE DISK DRIVE");
-
-			if (getSelection(kSelAnyKey) == 0)
-				return false;
-		} else {
-			if (infile->readUint32BE() != MKTAG('M', 'I', 'C', 'K')) {
-				warning("MickeyEngine::loadGame wrong save game format");
-				return false;
-			}
-
-			saveVersion = infile->readByte();
-			if (saveVersion < 2) {
-				warning("The planet data in this save game is corrupted. Load aborted");
-				return false;
-			}
-
-			if (saveVersion != MSA_SAVEGAME_VERSION)
-				warning("Old save game version (%d, current version is %d). Will try and read anyway, but don't be surprised if bad things happen", saveVersion, MSA_SAVEGAME_VERSION);
-
-			_gameStateMickey.iRoom = infile->readByte();
-			_gameStateMickey.iPlanet = infile->readByte();
-			_gameStateMickey.iDisk = infile->readByte();
-
-			_gameStateMickey.nAir = infile->readByte();
-			_gameStateMickey.nButtons = infile->readByte();
-			_gameStateMickey.nRocks = infile->readByte();
-
-			_gameStateMickey.nXtals = infile->readByte();
-
-			for (i = 0; i < IDI_MSA_MAX_DAT; i++)
-				_gameStateMickey.iPlanetXtal[i] = infile->readByte();
-
-			for (i = 0; i < IDI_MSA_MAX_PLANET; i++)
-				_gameStateMickey.iClue[i] = infile->readUint16LE();
-
-			infile->read(_gameStateMickey.szAddr, IDI_MSA_MAX_BUTTON + 1);
-
-			_gameStateMickey.fHasXtal = infile->readByte() == 1;
-			_gameStateMickey.fIntro = infile->readByte() == 1;
-			_gameStateMickey.fSuit = infile->readByte() == 1;
-			_gameStateMickey.fShipDoorOpen = infile->readByte() == 1;
-			_gameStateMickey.fFlying = infile->readByte() == 1;
-			_gameStateMickey.fStoryShown = infile->readByte() == 1;
-			_gameStateMickey.fPlanetsInitialized = infile->readByte() == 1;
-			_gameStateMickey.fTempleDoorOpen = infile->readByte() == 1;
-			_gameStateMickey.fAnimXL30 = infile->readByte() == 1;
-
-			for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
-				_gameStateMickey.fItem[i] = infile->readByte() == 1;
-
-			for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
-				_gameStateMickey.fItemUsed[i] = infile->readByte() == 1;
-
-			for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
-				_gameStateMickey.iItem[i] = infile->readSByte();
-
-			_gameStateMickey.nItems = infile->readByte();
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				_gameStateMickey.iRmObj[i] = infile->readSByte();
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				_gameStateMickey.iRmPic[i] = infile->readByte();
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				_gameStateMickey.oRmTxt[i] = infile->readUint16LE();
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				_gameStateMickey.iRmMenu[i] = infile->readByte();
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				_gameStateMickey.nRmMenu[i] = infile->readByte();
-
-			_gameStateMickey.nFrame = infile->readSByte();
-
-			diskerror = false;
-			delete infile;
-		}
-	}
-
-	printExeMsg(IDO_MSA_LOAD_GAME[2]);
-	return true;
-}
-
-void MickeyEngine::saveGame() {
-	Common::OutSaveFile *outfile;
-	char szFile[256] = {0};
-	bool diskerror = true;
-	int sel;
-	int i = 0;
-
-	bool fOldDisk = chooseY_N(IDO_MSA_SAVE_GAME[0], false);
-
-	if (fOldDisk)
-		printExeStr(IDO_MSA_SAVE_GAME[1]);
-	else
-		printExeStr(IDO_MSA_SAVE_GAME[2]);
-
-	if (getSelection(kSelAnyKey) == 0)
-		return;
-
-	while (diskerror) {
-		sel = choose1to9(IDO_MSA_SAVE_GAME[3]);
-		if (!sel)
-			return;
-
-		if (fOldDisk)
-			printExeStr(IDO_MSA_SAVE_GAME[5]);
-		else
-			printExeStr(IDO_MSA_SAVE_GAME[4]);
-
-		if (getSelection(kSelAnyKey) == 0)
-			return;
-
-		// save game
-		sprintf(szFile, "%s.s%02d", getTargetName().c_str(), sel);
-		if (!(outfile = getSaveFileMan()->openForSaving(szFile))) {
-			printLine("PLEASE CHECK THE DISK DRIVE");
-
-			if (getSelection(kSelAnyKey) == 0)
-				return;
-		} else {
-			outfile->writeUint32BE(MKTAG('M', 'I', 'C', 'K')); // header
-			outfile->writeByte(MSA_SAVEGAME_VERSION);
-
-			outfile->writeByte(_gameStateMickey.iRoom);
-			outfile->writeByte(_gameStateMickey.iPlanet);
-			outfile->writeByte(_gameStateMickey.iDisk);
-
-			outfile->writeByte(_gameStateMickey.nAir);
-			outfile->writeByte(_gameStateMickey.nButtons);
-			outfile->writeByte(_gameStateMickey.nRocks);
-
-			outfile->writeByte(_gameStateMickey.nXtals);
-
-			for (i = 0; i < IDI_MSA_MAX_DAT; i++)
-				outfile->writeByte(_gameStateMickey.iPlanetXtal[i]);
-
-			for (i = 0; i < IDI_MSA_MAX_PLANET; i++)
-				outfile->writeUint16LE(_gameStateMickey.iClue[i]);
-
-			outfile->write(_gameStateMickey.szAddr, IDI_MSA_MAX_BUTTON + 1);
-
-			outfile->writeByte(_gameStateMickey.fHasXtal ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fIntro ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fSuit ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fShipDoorOpen ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fFlying ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fStoryShown ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fPlanetsInitialized ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fTempleDoorOpen ? 1 : 0);
-			outfile->writeByte(_gameStateMickey.fAnimXL30 ? 1 : 0);
-
-			for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
-				outfile->writeByte(_gameStateMickey.fItem[i] ? 1 : 0);
-
-			for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
-				outfile->writeByte(_gameStateMickey.fItemUsed[i] ? 1 : 0);
-
-			for (i = 0; i < IDI_MSA_MAX_ITEM; i++)
-				outfile->writeSByte(_gameStateMickey.iItem[i]);
-
-			outfile->writeByte(_gameStateMickey.nItems);
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				outfile->writeSByte(_gameStateMickey.iRmObj[i]);
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				outfile->writeByte(_gameStateMickey.iRmPic[i]);
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				outfile->writeUint16LE(_gameStateMickey.oRmTxt[i]);
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				outfile->writeByte(_gameStateMickey.iRmMenu[i]);
-
-			for (i = 0; i < IDI_MSA_MAX_ROOM; i++)
-				outfile->writeByte(_gameStateMickey.nRmMenu[i]);
-
-			outfile->writeSByte(_gameStateMickey.nFrame);
-
-			outfile->finalize();
-
-			if (outfile->err())
-				warning("Can't write file '%s'. (Disk full?)", szFile);
-
-			diskerror = false;
-			delete outfile;
-		}
-	}
-
-	printExeMsg(IDO_MSA_SAVE_GAME[6]);
-}
-
-void MickeyEngine::showPlanetInfo() {
-	for (int i = 0; i < 4; i++) {
-		printExeStr(IDO_MSA_PLANET_INFO[_gameStateMickey.iPlanet][i]);
-		waitAnyKey();
-	}
-}
-
-void MickeyEngine::printStory() {
-	char buffer[IDI_MSA_LEN_STORY] = {0};
-	char szLine[41] = {0};
-	int iRow;
-	int pBuf = 0;
-
-	readExe(IDO_MSA_GAME_STORY, (uint8 *)buffer, sizeof(buffer));
-
-	clearScreen(IDA_DEFAULT);
-	for (iRow = 0; iRow < 25; iRow++) {
-		Common::strlcpy(szLine, buffer + pBuf, 41);
-		drawStr(iRow, 0, IDA_DEFAULT, szLine);
-		pBuf += strlen(szLine) + 1;
-	}
-	waitAnyKey();
-
-	clearScreen(IDA_DEFAULT);
-	for (iRow = 0; iRow < 21; iRow++) {
-		Common::strlcpy(szLine, buffer + pBuf, 41);
-		drawStr(iRow, 0, IDA_DEFAULT, szLine);
-		pBuf += strlen(szLine) + 1;
-	}
-	waitAnyKey();
-
-	//Set back to black
-	_gfx->clearDisplay(0);
-	_gfx->updateScreen();
-
-	drawRoom();
-
-	_gameStateMickey.fStoryShown = true;
-}
-
-int MickeyEngine::getPlanet() {
-	if (!_gameStateMickey.nButtons)
-		return -1;
-
-	for (int iPlanet = 0; iPlanet < IDI_MSA_MAX_DAT - 1; iPlanet++) {
-		if (!strcmp(IDS_MSA_ADDR_PLANET[iPlanet], _gameStateMickey.szAddr)) {
-			return iPlanet;
-		}
-	}
-
-	return -1;
-}
-
-void MickeyEngine::pressOB(int iButton) {
-	char szButtons[12] = {0};
-
-	// check if too many buttons pressed
-	if (_gameStateMickey.nButtons == IDI_MSA_MAX_BUTTON) {
-		_gameStateMickey.nButtons = 0;
-		memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
-		printExeMsg(IDO_MSA_TOO_MANY_BUTTONS_PRESSED);
-		return;
-	}
-
-	// add button press to address
-	_gameStateMickey.nButtons++;
-	_gameStateMickey.szAddr[_gameStateMickey.nButtons - 1] = (char)iButton;
-
-	// format buttons string
-	for (int i = 0; i < IDI_MSA_MAX_BUTTON; i++) {
-		szButtons[i * 2] = _gameStateMickey.szAddr[i];
-		if (_gameStateMickey.szAddr[i + 1]) szButtons[(i * 2) + 1] = ',';
-	}
-
-	// print pressed buttons
-	printLine("MICKEY HAS PRESSED:                  ");
-	drawStr(20, 22, IDA_DEFAULT, szButtons);
-	waitAnyKey();
-}
-
-void MickeyEngine::insertDisk(int iDisk) {
-	clearTextArea();
-	drawStr(IDI_MSA_ROW_INSERT_DISK, IDI_MSA_COL_INSERT_DISK, IDA_DEFAULT, (const char *)IDS_MSA_INSERT_DISK[iDisk]);
-	waitAnyKey();
-}
-
-void MickeyEngine::gameOver() {
-	// We shouldn't run the game over segment if we're quitting.
-	if (shouldQuit())
-		return;
-
-	drawPic(IDI_MSA_PIC_EARTH_SHIP_LEAVING);
-	printExeMsg(IDO_MSA_GAME_OVER[3]);
-	playSound(IDI_MSA_SND_GAME_OVER);
-
-	if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER]) {
-		drawPic(IDI_MSA_PIC_EARTH_MINNIE);
-		printExeMsg(IDO_MSA_GAME_OVER[4]);
-		printExeMsg(IDO_MSA_GAME_OVER[5]);
-	} else {
-		printExeMsg(IDO_MSA_GAME_OVER[6]);
-		printExeMsg(IDO_MSA_GAME_OVER[7]);
-	}
-
-	waitAnyKey();
-}
-
-void MickeyEngine::flipSwitch() {
-	if (_gameStateMickey.fHasXtal || _gameStateMickey.nXtals) {
-		if (!_gameStateMickey.fStoryShown)
-			printStory();
-
-		// Initialize planet data
-		if (!_gameStateMickey.fPlanetsInitialized) {
-			int iHint = 0;
-			int iPlanet = 0;
-
-			memset(_gameStateMickey.iPlanetXtal, 0, sizeof(_gameStateMickey.iPlanetXtal));
-			memset(_gameStateMickey.iClue, 0, sizeof(_gameStateMickey.iClue));
-
-			_gameStateMickey.iPlanetXtal[0] = IDI_MSA_PLANET_EARTH;
-			_gameStateMickey.iPlanetXtal[8] = IDI_MSA_PLANET_URANUS;
-
-			for (int i = 1; i < IDI_MSA_MAX_PLANET; i++) {
-				if (i < 8) {
-					do {
-						// Earth (planet 0) and Uranus (planet 8) are excluded
-						iPlanet = rnd(IDI_MSA_MAX_PLANET - 2);
-					} while (planetIsAlreadyAssigned(iPlanet));
-				} else {
-					iPlanet = IDI_MSA_PLANET_URANUS;    // Uranus is always last
-				}
-
-				_gameStateMickey.iPlanetXtal[i] = iPlanet;
-				iHint = rnd(5) - 1; // clues are 0-4
-				_gameStateMickey.iClue[i] = IDO_MSA_NEXT_PIECE[iPlanet][iHint];
-			}
-
-			_gameStateMickey.fPlanetsInitialized = true;
-		}
-
-		// activate screen animation
-		_gameStateMickey.fAnimXL30 = true;
-
-		clearTextArea();
-		playSound(IDI_MSA_SND_XL30);
-		printExeMsg(IDO_MSA_XL30_SPEAKING);
-
-		if (_gameStateMickey.fHasXtal) {
-			_gameStateMickey.fHasXtal = false;
-			printExeMsg(IDO_MSA_CRYSTAL_PIECE_FOUND);
-		}
-
-		if (_gameStateMickey.nXtals == IDI_MSA_MAX_PLANET) {
-			printExeMsg(IDO_MSA_GAME_OVER[0]);
-			printExeMsg(IDO_MSA_GAME_OVER[1]);
-			printExeMsg(IDO_MSA_GAME_OVER[2]);
-
-#if 0
-			// DEBUG
-			strcpy(_gameStateMickey.szAddr, (char *)IDS_MSA_ADDR_PLANET[IDI_MSA_PLANET_EARTH]);
-			_gameStateMickey.nButtons = strlen(_gameStateMickey.szAddr);
-#endif
-
-		} else {
-			printExeStr(_gameStateMickey.iClue[_gameStateMickey.nXtals]);
-
-#if 0
-			// DEBUG
-			drawStr(24, 12, IDA_DEFAULT, (char *)IDS_MSA_NAME_PLANET_2[_gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]]);
-			drawStr(24, 22, IDA_DEFAULT, (char *)IDS_MSA_ADDR_PLANET[_gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]]);
-			strcpy(_gameStateMickey.szAddr, (char *)IDS_MSA_ADDR_PLANET[_gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]]);
-			_gameStateMickey.nButtons = strlen(_gameStateMickey.szAddr);
-			_gfx->doUpdate();
-#endif
-
-			waitAnyKey(true);
-		}
-	} else {
-		printStory();
-	}
-}
-
-void MickeyEngine::inventory() {
-	int iRow = IDI_MSA_ROW_INV_ITEMS;
-	char szCrystals[12] = {0};
-
-	sprintf(szCrystals, IDS_MSA_CRYSTALS, IDS_MSA_CRYSTAL_NO[_gameStateMickey.nXtals]);
-
-	CursorMan.showMouse(false);
-
-	clearScreen(IDA_DEFAULT);
-	drawStr(IDI_MSA_ROW_INV_TITLE, IDI_MSA_COL_INV_TITLE, IDA_DEFAULT, IDS_MSA_INVENTORY);
-	drawStr(IDI_MSA_ROW_INV_CRYSTALS, IDI_MSA_COL_INV_ITEMS, IDA_DEFAULT, szCrystals);
-
-	for (int iItem = 0; iItem < IDI_MSA_MAX_ITEM; iItem++) {
-		if (_gameStateMickey.fItem[_gameStateMickey.iItem[iItem]] && (_gameStateMickey.iItem[iItem] != IDI_MSA_OBJECT_NONE)) {
-			drawStr(iRow++, IDI_MSA_COL_INV_ITEMS, IDA_DEFAULT, (const char *)IDS_MSA_NAME_ITEM[_gameStateMickey.iItem[iItem]]);
-		}
-	}
-
-	waitAnyKey();
-
-	clearScreen(IDA_DEFAULT);
-
-	CursorMan.showMouse(true);
-}
-
-void MickeyEngine::intro() {
-	// Draw Sierra logo
-	drawLogo();     // Original does not even show this, so we skip it too
-	waitAnyKey();       // Not in the original, but needed so that the logo is visible
-
-	// draw title picture
-	_gameStateMickey.iRoom = IDI_MSA_PIC_TITLE;
-	drawRoom();
-
-	// show copyright and play theme
-	printExeMsg(IDO_MSA_COPYRIGHT);
-
-	// Quit if necessary
-	if (shouldQuit())
-		return;
-
-	playSound(IDI_MSA_SND_THEME);
-
-	// load game
-	_gameStateMickey.fIntro = true;
-	if (chooseY_N(IDO_MSA_LOAD_GAME[0], true)) {
-		if (loadGame()) {
-			_gameStateMickey.iPlanet = IDI_MSA_PLANET_EARTH;
-			_gameStateMickey.fIntro = false;
-			_gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_CORRIDOR;
-			return;
-		}
-	}
-
-	// Quit if necessary
-	if (shouldQuit())
-		return;
-
-	// play spaceship landing scene
-	_gameStateMickey.iPlanet = IDI_MSA_PLANET_EARTH;
-	_gameStateMickey.iRoom = IDI_MSA_PIC_EARTH_ROAD_4;
-
-	drawRoom();
-	printRoomDesc();
-
-	// Quit if necessary
-	if (shouldQuit())
-		return;
-
-	playSound(IDI_MSA_SND_SHIP_LAND);
-
-	// Flash screen 3 times
-	for (byte i = 0; i < 3; i++) {
-		playSound(IDI_MSA_SND_PRESS_BLUE);
-
-		//Set screen to white
-		_gfx->clearDisplay(15);
-		_gfx->updateScreen();
-
-		_system->delayMillis(IDI_MSA_ANIM_DELAY);
-
-		//Set back to black
-		_gfx->clearDisplay(0);
-		_gfx->updateScreen();
-
-		drawRoom();
-		printDesc(_gameStateMickey.iRoom);
-	}
-
-	printExeMsg(IDO_MSA_INTRO);
-}
-
-void MickeyEngine::getItem(ENUM_MSA_ITEM iItem) {
-	_gameStateMickey.fItem[iItem] = true;
-	_gameStateMickey.iItem[_gameStateMickey.nItems++] = iItem;
-	_gameStateMickey.oRmTxt[_gameStateMickey.iRoom] = 0;
-	playSound(IDI_MSA_SND_TAKE);
-	drawRoom();
-}
-
-void MickeyEngine::getXtal(int iStr) {
-	_gameStateMickey.oRmTxt[_gameStateMickey.iRoom] = 0;
-	_gameStateMickey.fHasXtal = true;
-	_gameStateMickey.nXtals++;
-	playSound(IDI_MSA_SND_CRYSTAL);
-	drawRoom();
-	printDatMessage(iStr);
-}
-
-bool MickeyEngine::parse(int cmd, int arg) {
-	switch (cmd) {
-
-	// BASIC
-
-	case IDI_MSA_ACTION_GOTO_ROOM:
-		_gameStateMickey.iRoom = arg;
-		return true;
-	case IDI_MSA_ACTION_SHOW_INT_STR:
-		printLine(IDS_MSA_ERRORS[arg]);
-		break;
-	case IDI_MSA_ACTION_SHOW_DAT_STR:
-		printDatMessage(arg);
-		break;
-
-	// GENERAL
-
-	case IDI_MSA_ACTION_PLANET_INFO:
-		showPlanetInfo();
-		break;
-	case IDI_MSA_ACTION_SAVE_GAME:
-		saveGame();
-		break;
-	case IDI_MSA_ACTION_LOOK_MICKEY:
-		printLine("YOU CAN SEE MICKEY ALREADY");
-		break;
-
-	// EARTH
-
-	case IDI_MSA_ACTION_GET_ROPE:
-		if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] == 2) {
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 3;
-			getItem(IDI_MSA_ITEM_ROPE);
-			printLine("MICKEY TAKES THE ROPE");
-		} else {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			printDatMessage(11);
-		}
-		break;
-	case IDI_MSA_ACTION_UNTIE_ROPE:
-		_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_TIRE_SWING_1;
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 0;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
-		drawRoom();
-		printDatMessage(12);
-		break;
-	case IDI_MSA_ACTION_GET_BONE:
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-		getItem(IDI_MSA_ITEM_BONE);
-		printDatMessage(arg);
-		break;
-	case IDI_MSA_ACTION_GET_XTAL_EARTH:
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-		getXtal(arg);
-		break;
-	case IDI_MSA_ACTION_LOOK_DESK:
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 2;
-		drawRoom();
-		printDatMessage(arg);
-		break;
-	case IDI_MSA_ACTION_WRITE_LETTER:
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 3;
-		_gameStateMickey.iRmMenu[IDI_MSA_PIC_EARTH_MAILBOX] = 1;
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
-		getItem(IDI_MSA_ITEM_LETTER);
-		printDatMessage(arg);
-		break;
-	case IDI_MSA_ACTION_MAIL_LETTER:
-		_gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER] = true;
-		_gameStateMickey.fItem[IDI_MSA_ITEM_LETTER] = false;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
-		printDatMessage(arg);
-		break;
-	case IDI_MSA_ACTION_OPEN_MAILBOX:
-		if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER]) {
-			printDatMessage(110);
-		} else {
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_OPEN_CUPBOARD:
-		if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
-			if (_gameStateMickey.iRmObj[_gameStateMickey.iRoom] == IDI_MSA_OBJECT_NONE) {
-				printDatMessage(78);
-			} else {
-				printDatMessage(arg);
-			}
-		} else {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_KITCHEN_1;
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 3;
-			drawRoom();
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_FLASHLIGHT:
-		if (!mickeyHasItem(IDI_MSA_ITEM_FLASHLIGHT)) {
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
-			getItem(IDI_MSA_ITEM_FLASHLIGHT);
-			drawRoom();
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_OPEN_CABINET:
-		if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
-			printDatMessage(109);
-		} else {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_GARAGE_1;
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 15;
-			drawRoom();
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_CROWBAR:
-		if (!mickeyHasItem(IDI_MSA_ITEM_CROWBAR)) {
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom]--;
-			getItem(IDI_MSA_ITEM_CROWBAR);
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_WRENCH:
-		if (!mickeyHasItem(IDI_MSA_ITEM_WRENCH)) {
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] -= 2;
-			getItem(IDI_MSA_ITEM_WRENCH);
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_OPEN_CLOSET:
-		if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
-			printDatMessage(99);
-		} else {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_EARTH_BEDROOM_1;
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 7;
-			drawRoom();
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_MATTRESS:
-		if (!mickeyHasItem(IDI_MSA_ITEM_MATTRESS)) {
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom]--;
-			getItem(IDI_MSA_ITEM_MATTRESS);
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_SCARF:
-		if (!mickeyHasItem(IDI_MSA_ITEM_SCARF)) {
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] -= 2;
-			getItem(IDI_MSA_ITEM_SCARF);
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_SUNGLASSES:
-		if (!mickeyHasItem(IDI_MSA_ITEM_SUNGLASSES)) {
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom]--;
-			getItem(IDI_MSA_ITEM_SUNGLASSES);
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_SCALE:
-		if (!mickeyHasItem(IDI_MSA_ITEM_SCALE)) {
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_VENUS_WEIGH] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_NEPTUNE_WEIGH] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_MERCURY_WEIGH] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_WEIGH] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_PLUTO_WEIGH] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_JUPITER_WEIGH] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_MARS_WEIGH] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_URANUS_WEIGH] = 1;
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] -= 2;
-			getItem(IDI_MSA_ITEM_SCALE);
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GOTO_SPACESHIP:
-		_gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_AIRLOCK;
-		if (_gameStateMickey.iPlanet != IDI_MSA_PLANET_EARTH)
-			insertDisk(0);
-		return true;
-
-	// VENUS
-
-	case IDI_MSA_ACTION_DOWN_CHASM:
-		if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROPE]) {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-		}
-		printDatMessage(arg);
-		break;
-	case IDI_MSA_ACTION_DOWN_ROPE:
-		if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_ROPE]) {
-			_gameStateMickey.iRoom = IDI_MSA_PIC_VENUS_PROBE;
-			return true;
-		} else {
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_USE_ROPE:
-		if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_ROPE]) {
-			printDatMessage(22);
-		} else {
-			_gameStateMickey.fItemUsed[IDI_MSA_ITEM_ROPE] = true;
-			_gameStateMickey.fItem[IDI_MSA_ITEM_ROPE] = false;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_VENUS_CHASM_1;
-			drawRoom();
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_OPEN_HATCH:
-		if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_WRENCH]) {
-			if ((_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] == 3) || (_gameStateMickey.iRmPic[_gameStateMickey.iRoom] == IDI_MSA_PIC_VENUS_PROBE_1))
-				printDatMessage(39);
-			else {
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
-				_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_VENUS_PROBE_1;
-				drawRoom();
-				printDatMessage(24);
-			}
-		} else {
-			if (_gameStateMickey.fItem[IDI_MSA_ITEM_WRENCH]) {
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			}
-
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_USE_WRENCH:
-		_gameStateMickey.fItemUsed[IDI_MSA_ITEM_WRENCH] = true;
-		printDatString(arg);
-
-		if (_gameStateMickey.iRmPic[_gameStateMickey.iRoom] == IDI_MSA_PIC_VENUS_PROBE_1) {
-			clearRow(22);
-		}
-
-		waitAnyKey();
-		break;
-	case IDI_MSA_ACTION_GET_XTAL_VENUS:
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 3;
-		getXtal(arg);
-		break;
-
-	// TRITON (NEPTUNE)
-
-	case IDI_MSA_ACTION_LOOK_CASTLE:
-		if (!_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-		}
-		printDatMessage(arg);
-		break;
-	case IDI_MSA_ACTION_ENTER_OPENING:
-		if (_gameStateMickey.fItemUsed[IDI_MSA_ITEM_CROWBAR]) {
-			_gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_CASTLE_4;
-
-			return true;
-		} else {
-			if (_gameStateMickey.fItem[IDI_MSA_ITEM_CROWBAR]) {
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
-			}
-
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_USE_CROWBAR:
-		_gameStateMickey.fItemUsed[IDI_MSA_ITEM_CROWBAR] = true;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-		_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_NEPTUNE_ENTRANCE_1;
-		drawRoom();
-		printDatMessage(arg);
-		break;
-	case IDI_MSA_ACTION_GET_XTAL_NEPTUNE:
-		if (_gameStateMickey.fHasXtal) {
-			printDatMessage(71);
-		} else {
-			if (_gameStateMickey.fItem[IDI_MSA_ITEM_SCARF]) {
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			}
-
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_TALK_LEADER:
-		_gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY;
-
-		printDatMessage(arg);
-		return true;
-	case IDI_MSA_ACTION_GIVE_SCARF:
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 18;
-		getXtal(arg);
-		_gameStateMickey.fItem[IDI_MSA_ITEM_SCARF] = false;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
-		_gameStateMickey.iRmMenu[IDI_MSA_PIC_EARTH_BEDROOM] = 2;
-		_gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_ENTRYWAY;
-
-		return true;
-
-	// MERCURY
-
-	case IDI_MSA_ACTION_GET_XTAL_MERCURY:
-		if (_gameStateMickey.fHasXtal) {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
-			printDatMessage(32);
-		} else {
-			if (_gameStateMickey.fItem[IDI_MSA_ITEM_SUNGLASSES]) {
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			}
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GIVE_SUNGLASSES:
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 17;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 2;
-		_gameStateMickey.fItem[IDI_MSA_ITEM_SUNGLASSES] = false;
-
-		getXtal(arg);
-
-		break;
-
-	// TITAN (SATURN)
-
-	case IDI_MSA_ACTION_CROSS_LAKE:
-		if (_gameStateMickey.fItem[IDI_MSA_ITEM_MATTRESS]) {
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_0] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_1] = 1;
-			_gameStateMickey.iRmMenu[IDI_MSA_PIC_SATURN_LAKE_2] = 1;
-		}
-
-		printDatMessage(arg);
-
-		break;
-	case IDI_MSA_ACTION_USE_MATTRESS:
-		_gameStateMickey.iRoom = IDI_MSA_PIC_SATURN_ISLAND;
-
-		printDatMessage(arg);
-
-		return true;
-	case IDI_MSA_ACTION_GET_XTAL_SATURN:
-		if (_gameStateMickey.fHasXtal) {
-			printDatMessage(29);
-		} else {
-			getXtal(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_LEAVE_ISLAND:
-		_gameStateMickey.iRoom = IDI_MSA_PIC_SATURN_LAKE_1;
-
-		printDatMessage(arg);
-
-		return true;
-
-	// PLUTO
-
-	case IDI_MSA_ACTION_GET_XTAL_PLUTO:
-		if (_gameStateMickey.fHasXtal) {
-			printDatMessage(19);
-		} else {
-			if (_gameStateMickey.fItem[IDI_MSA_ITEM_BONE]) {
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			}
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GIVE_BONE:
-		_gameStateMickey.fItem[IDI_MSA_ITEM_BONE] = false;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = 16;
-
-		getXtal(arg);
-
-		break;
-
-	// IO (JUPITER)
-
-	case IDI_MSA_ACTION_GET_ROCK_0:
-	case IDI_MSA_ACTION_GET_ROCK_1:
-		if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROCK]) {
-			printDatMessage(38);
-		} else {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			_gameStateMickey.iRmObj[_gameStateMickey.iRoom] = IDI_MSA_OBJECT_NONE;
-			getItem(IDI_MSA_ITEM_ROCK);
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_XTAL_JUPITER:
-		if (_gameStateMickey.fHasXtal) {
-			printDatMessage(15);
-		} else {
-			switch (_gameStateMickey.nRocks) {
-			case 0:
-				if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROCK]) {
-					_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-				}
-				printDatMessage(arg);
-				break;
-			case 1:
-				if (_gameStateMickey.fItem[IDI_MSA_ITEM_ROCK]) {
-					_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-				}
-				printDatMessage(34);
-				break;
-			case 2:
-				getXtal(35);
-				break;
-			default:
-				break;
-			}
-		}
-		break;
-	case IDI_MSA_ACTION_THROW_ROCK:
-		_gameStateMickey.fItem[IDI_MSA_ITEM_ROCK] = false;
-		_gameStateMickey.nItems--;
-		_gameStateMickey.iRmObj[_gameStateMickey.iRoom]++;
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
-
-		drawRoom();
-
-		if (_gameStateMickey.nRocks) {
-			printDatMessage(37);
-		} else {
-			printDatMessage(arg);
-		}
-
-		_gameStateMickey.nRocks++;
-		break;
-
-	// MARS
-
-	case IDI_MSA_ACTION_GO_TUBE:
-		if (_gameStateMickey.fItem[IDI_MSA_ITEM_FLASHLIGHT]) {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-		}
-
-		printDatMessage(arg);
-
-		break;
-	case IDI_MSA_ACTION_USE_FLASHLIGHT:
-		_gameStateMickey.iRoom = IDI_MSA_PIC_MARS_TUBE_1;
-
-		printDatMessage(15);
-
-		return true;
-	case IDI_MSA_ACTION_PLUTO_DIG:
-		if (_gameStateMickey.fHasXtal) {
-			printDatMessage(21);
-		} else {
-			getXtal(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_XTAL_MARS:
-		if (_gameStateMickey.fHasXtal) {
-			printDatMessage(23);
-		} else {
-			printDatMessage(arg);
-		}
-		break;
-
-	// OBERON (URANUS)
-
-	case IDI_MSA_ACTION_ENTER_TEMPLE:
-		_gameStateMickey.iRoom = IDI_MSA_PIC_URANUS_TEMPLE;
-
-		return true;
-	case IDI_MSA_ACTION_USE_CRYSTAL:
-		if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
-			printDatMessage(25);
-		} else {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE_1;
-
-			drawRoom();
-
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE;
-
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_OPEN_DOOR:
-		if (_gameStateMickey.fTempleDoorOpen) {
-			printDatMessage(36);
-		} else {
-			_gameStateMickey.fTempleDoorOpen = 1;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_URANUS_TEMPLE_2;
-
-			drawRoom();
-
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_ENTER_DOOR:
-		if (_gameStateMickey.fTempleDoorOpen) {
-			_gameStateMickey.iRoom = IDI_MSA_PIC_URANUS_STEPS;
-
-			return true;
-		} else {
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GET_XTAL_URANUS:
-		if (_gameStateMickey.fHasXtal) {
-			printDatMessage(34);
-		} else {
-			if (_gameStateMickey.fItem[IDI_MSA_ITEM_CROWBAR]) {
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			}
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_USE_CROWBAR_1:
-		_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
-
-		getXtal(arg);
-
-		break;
-
-	// SPACESHIP
-
-	case IDI_MSA_ACTION_GO_NORTH:
-		if (_gameStateMickey.fShipDoorOpen) {
-			if (_gameStateMickey.fSuit) {
-				printDatMessage(45);
-			} else {
-				_gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_CORRIDOR;
-				return true;
-			}
-		} else {
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_GO_PLANET:
-		if (!_gameStateMickey.fShipDoorOpen) {
-			if ((_gameStateMickey.nXtals == IDI_MSA_MAX_PLANET) && (_gameStateMickey.iPlanet == IDI_MSA_PLANET_EARTH))
-				gameOver();
-			if ((_gameStateMickey.iPlanet == _gameStateMickey.iPlanetXtal[_gameStateMickey.nXtals]) || (_gameStateMickey.iPlanet == IDI_MSA_PLANET_EARTH)) {
-				_gameStateMickey.fHasXtal = false;
-				_gameStateMickey.iRoom = IDI_MSA_HOME_PLANET[_gameStateMickey.iPlanet];
-
-				if (_gameStateMickey.iPlanet != IDI_MSA_PLANET_EARTH)
-					insertDisk(1);
-
-				return true;
-			} else {
-				_gameStateMickey.iRoom = IDI_MSA_SHIP_PLANET[_gameStateMickey.iPlanet];
-
-				return true;
-			}
-		} else {
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_PRESS_BUTTON:
-		if (_gameStateMickey.fShipDoorOpen) {       // inner door open
-			if (_gameStateMickey.iPlanet && !_gameStateMickey.fSuit) {
-				printDatMessage(arg);
-			} else {
-				_gameStateMickey.fShipDoorOpen = false;
-				_gameStateMickey.iRmPic[_gameStateMickey.iRoom]--;
-
-				drawRoom();
-
-				printDatMessage(2);
-			}
-		} else {
-			_gameStateMickey.fShipDoorOpen = true;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom]++;
-
-			drawRoom();
-
-			printDatMessage(14);
-		}
-		break;
-	case IDI_MSA_ACTION_WEAR_SPACESUIT:
-		if (_gameStateMickey.fSuit) {
-			if (_gameStateMickey.fShipDoorOpen) {
-				_gameStateMickey.fSuit = false;
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 0;
-				_gameStateMickey.iRmPic[_gameStateMickey.iRoom] -= 2;
-
-				drawRoom();
-
-				printDatMessage(13);
-			} else {
-				printDatMessage(3);
-			}
-		} else {
-			if (_gameStateMickey.iPlanet) {
-				_gameStateMickey.fSuit = true;
-				_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-				_gameStateMickey.iRmPic[_gameStateMickey.iRoom] += 2;
-
-				drawRoom();
-
-				printDatMessage(arg);
-			} else {
-				printDatMessage(12);
-			}
-		}
-		break;
-	case IDI_MSA_ACTION_READ_GAUGE:
-		printDatString(arg);
-		drawStr(21, 15, IDA_DEFAULT, (const char *)IDS_MSA_TEMP_C[_gameStateMickey.iPlanet]);
-		drawStr(21, 23, IDA_DEFAULT, (const char *)IDS_MSA_TEMP_F[_gameStateMickey.iPlanet]);
-
-		waitAnyKey();
-
-		break;
-	case IDI_MSA_ACTION_PRESS_ORANGE:
-		if (_gameStateMickey.fFlying) {
-			printDatMessage(4);
-		} else {
-			playSound(IDI_MSA_SND_PRESS_ORANGE);
-			printDatMessage(arg);
-			pressOB(IDI_MSA_BUTTON_ORANGE);
-		}
-		break;
-	case IDI_MSA_ACTION_PRESS_BLUE:
-		if (_gameStateMickey.fFlying) {
-			printDatMessage(4);
-		} else {
-			playSound(IDI_MSA_SND_PRESS_BLUE);
-			printDatMessage(arg);
-			pressOB(IDI_MSA_BUTTON_BLUE);
-		}
-		break;
-	case IDI_MSA_ACTION_FLIP_SWITCH:
-		flipSwitch();
-		break;
-	case IDI_MSA_ACTION_PUSH_THROTTLE:
-		if (_gameStateMickey.fFlying) {
-			_gameStateMickey.fFlying = false;
-			_gameStateMickey.nButtons = 0;
-
-			memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
-
-			drawRoom();
-
-			printDatString(22);
-
-			drawStr(IDI_MSA_ROW_PLANET, IDI_MSA_COL_PLANET, IDA_DEFAULT,
-			        (const char *)IDS_MSA_PLANETS[_gameStateMickey.iPlanet]);
-
-			waitAnyKey(true);
-
-			showPlanetInfo();
-		} else {
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_PULL_THROTTLE:
-		if (_gameStateMickey.fFlying) {
-			printDatMessage(18);
-		} else {
-			if (getPlanet() != -1) {
-				_gameStateMickey.fFlying = true;
-				_gameStateMickey.iPlanet = getPlanet();
-
-				drawRoom();
-
-				printDatMessage(16);
-			} else {
-				_gameStateMickey.nButtons = 0;
-
-				memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
-
-				printDatMessage(17);
-			}
-		}
-		break;
-	case IDI_MSA_ACTION_LEAVE_ROOM:
-		if (_gameStateMickey.fFlying) {
-			printDatMessage(24);
-		} else {
-			_gameStateMickey.iRoom = arg;
-			return true;
-		}
-		break;
-	case IDI_MSA_ACTION_OPEN_CABINET_1:
-		if (_gameStateMickey.iRmMenu[_gameStateMickey.iRoom]) {
-			printLine("THE CABINET IS ALREADY OPEN");
-		} else {
-			_gameStateMickey.iRmMenu[_gameStateMickey.iRoom] = 1;
-			_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_SHIP_KITCHEN_1;
-
-			drawRoom();
-
-			printDatMessage(arg);
-		}
-		break;
-	case IDI_MSA_ACTION_READ_MAP:
-		_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_STAR_MAP;
-
-		drawRoom();
-
-		printDatMessage(46);
-		printDatMessage(47);
-		printDatMessage(48);
-
-		_gameStateMickey.iRmPic[_gameStateMickey.iRoom] = IDI_MSA_PIC_SHIP_BEDROOM;
-
-		drawRoom();
-		break;
-	case IDI_MSA_ACTION_GO_WEST:
-		_gameStateMickey.nButtons = 0;
-
-		memset(_gameStateMickey.szAddr, 0, sizeof(_gameStateMickey.szAddr));
-
-		_gameStateMickey.iRoom = arg;
-
-		return true;
-		break;
-
-	default:
-		break;
-	}
-
-	return false;
-}
-
-// Keyboard
-
-void MickeyEngine::waitAnyKey(bool anim) {
-	Common::Event event;
-
-	if (!anim)
-		_gfx->updateScreen();
-
-	while (!shouldQuit()) {
-		while (_system->getEventManager()->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_RETURN_TO_LAUNCHER:
-			case Common::EVENT_QUIT:
-			case Common::EVENT_KEYDOWN:
-			case Common::EVENT_LBUTTONUP:
-			case Common::EVENT_RBUTTONUP:
-				return;
-			default:
-				break;
-			}
-		}
-
-		if (anim) {
-			animate();
-		}
-
-		_gfx->updateScreen();
-		_system->delayMillis(10);
-	}
-}
-
-// Console-related functions
-
-void MickeyEngine::debugCurRoom() {
-	getDebugger()->debugPrintf("Current Room = %d\n", _gameStateMickey.iRoom);
-
-	if (_gameStateMickey.iRmObj[_gameStateMickey.iRoom] != IDI_MSA_OBJECT_NONE) {
-		getDebugger()->debugPrintf("Object %d is in the room\n", _gameStateMickey.iRmObj[_gameStateMickey.iRoom]);
-	}
-}
-
-void MickeyEngine::debugGotoRoom(int room) {
-	_gameStateMickey.iRoom = room;
-	drawRoom();
-}
-
-MickeyEngine::MickeyEngine(OSystem *syst, const AGIGameDescription *gameDesc) : PreAgiEngine(syst, gameDesc) {
-	setDebugger(new MickeyConsole(this));
-}
-
-MickeyEngine::~MickeyEngine() {
-	//_console deleted by Engine
-}
-
-void MickeyEngine::init() {
-	uint8 buffer[512];
-
-	// clear game struct
-	memset(&_gameStateMickey, 0, sizeof(_gameStateMickey));
-	memset(&_gameStateMickey.iItem, IDI_MSA_OBJECT_NONE, sizeof(_gameStateMickey.iItem));
-	// read room extended desc flags
-	//readExe(IDO_MSA_ROOM_TEXT, buffer, sizeof(buffer));
-	//memcpy(_gameStateMickey.fRmTxt, buffer, sizeof(_gameStateMickey.fRmTxt));
-
-	// read room extended desc offsets
-	readExe(IDO_MSA_ROOM_TEXT_OFFSETS, buffer, sizeof(buffer));
-	memcpy(_gameStateMickey.oRmTxt, buffer, sizeof(_gameStateMickey.oRmTxt));
-	for (int i = 0; i < IDI_MSA_MAX_ROOM; i++)
-		_gameStateMickey.oRmTxt[i] = buffer[i * 2] + 256 * buffer[i * 2 + 1];
-
-	// read room object indices
-	//readExe(IDO_MSA_ROOM_OBJECT, buffer, sizeof(buffer));
-	//memcpy(_gameStateMickey.iRmObj, buffer, sizeof(_gameStateMickey.iRmObj));
-
-	// read room picture indices
-	//readExe(IDO_MSA_ROOM_PICTURE, buffer, sizeof(buffer));
-	//memcpy(_gameStateMickey.iRmPic, buffer, sizeof(_gameStateMickey.iRmPic));
-
-	// read room menu patch indices
-	readExe(IDO_MSA_ROOM_MENU_FIX, buffer, sizeof(buffer));
-	memcpy(_gameStateMickey.nRmMenu, buffer, sizeof(_gameStateMickey.nRmMenu));
-
-	// set room picture and room object indices
-	for (int i = 0; i < IDI_MSA_MAX_ROOM; i++) {
-		_gameStateMickey.iRmPic[i] = i;
-		_gameStateMickey.iRmObj[i] = -1;
-	}
-	_gameStateMickey.iRmPic[IDI_MSA_PIC_SHIP_AIRLOCK] = IDI_MSA_PIC_SHIP_AIRLOCK_0;
-	_gameStateMickey.iRmObj[IDI_MSA_PIC_EARTH_BATHROOM] = 11;
-	_gameStateMickey.iRmObj[IDI_MSA_PIC_JUPITER_LAVA] = 21;
-	_gameStateMickey.iRmObj[IDI_MSA_PIC_JUPITER_ROCK_0] = 20;
-	_gameStateMickey.iRmObj[IDI_MSA_PIC_JUPITER_ROCK_1] = 19;
-	_gameStateMickey.iRmObj[IDI_MSA_PIC_EARTH_IN_DOGHOUSE] = 1;
-
-#if 0
-	// DEBUG
-	_gameStateMickey.iPlanet = IDI_MSA_PLANET_EARTH;
-	_gameStateMickey.iRoom = IDI_MSA_PIC_SHIP_CONTROLS;
-	_gameStateMickey.fHasXtal = true;
-	_gameStateMickey.nXtals = 9;
-	_gameStateMickey.fItemUsed[IDI_MSA_ITEM_LETTER] = true;
-
-#endif
-
-	setFlag(VM_FLAG_SOUND_ON, true); // enable sound
-}
-
-Common::Error MickeyEngine::go() {
-	init();
-
-	// Game intro
-	intro();
-
-	// Game loop
-	while (!shouldQuit()) {
-		drawRoom();
-
-		if (_gameStateMickey.fIntro) {
-			_gameStateMickey.fIntro = false;
-		} else {
-			printRoomDesc();
-		}
-
-		bool done;
-		if (_gameStateMickey.iRoom == IDI_MSA_PIC_NEPTUNE_GUARD) {
-			_gameStateMickey.iRoom = IDI_MSA_PIC_NEPTUNE_LEADER;
-			done = true;
-		} else {
-			done = false;
-		}
-
-		while (!done && !shouldQuit()) {
-			// Check air supply
-			if (_gameStateMickey.fSuit) {
-				_gameStateMickey.nAir -= 1;
-				for (int i = 0; i < 4; i++) {
-					if (_gameStateMickey.nAir == IDI_MSA_AIR_SUPPLY[i]) {
-						playSound(IDI_MSA_SND_XL30);
-						printExeMsg(IDO_MSA_XL30_SPEAKING);
-						printExeMsg(IDO_MSA_AIR_SUPPLY[i]);
-						if (i == 3)
-							return Common::kNoError;
-					}
-				}
-			} else {
-				_gameStateMickey.nAir = 50; // max air supply
-			}
-
-			done = checkMenu();
-		}
-
-		_gameStateMickey.nFrame = 0;
-	}
-
-	gameOver();
-
-	return Common::kNoError;
-}
-
-} // End of namespace Agi
diff --git a/engines/agi/preagi_mickey.h b/engines/agi/preagi_mickey.h
deleted file mode 100644
index a92fe82e36f..00000000000
--- a/engines/agi/preagi_mickey.h
+++ /dev/null
@@ -1,759 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef AGI_PREAGI_MICKEY_H
-#define AGI_PREAGI_MICKEY_H
-
-namespace Agi {
-
-#define MSA_SAVEGAME_VERSION            2
-
-// strings
-#define IDS_MSA_PATH_DAT    "dat/%s"
-#define IDS_MSA_PATH_OBJ    "obj/%s.ooo"
-#define IDS_MSA_PATH_PIC    "%d.pic"
-#define IDS_MSA_PATH_LOGO   "logos.bcg"
-
-#define IDS_MSA_INVENTORY   "MICKEY IS CARRYING THE FOLLOWING:"
-#define IDS_MSA_CRYSTALS    "%s CRYSTALS"
-
-const char IDS_MSA_CRYSTAL_NO[][3] = {
-	"NO", " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9"
-};
-const char IDS_MSA_TEMP_C[][5] = {
-	" 20 ", " 480", "-200", " 430", "-185", "-230", "-130", "-150", "-215"
-};
-const char IDS_MSA_TEMP_F[][5] = {
-	" 68 ", " 897", "-328", " 807", "-301", "-382", "-202", "-238", "-355"
-};
-const char IDS_MSA_PLANETS[][10] = {
-	"EARTH.  ", "VENUS.  ", "TRITON. ", "MERCURY.", "TITAN.  ",
-	"PLUTO.  ", "IO.     ", "MARS.   ", "OBERON. "
-};
-
-const char IDS_MSA_ERRORS[][40] = {
-	"THAT CANNOT BE UNDERSTOOD",
-	"TRY GOING THERE INSTEAD",
-	"THAT CAN'T BE DONE",
-	"MICKEY WOULDN'T WANT TO DO THAT!",
-	"WHICH DIRECTION?",
-	"THAT DOESN'T MAKE SENSE!",
-	"MICKEY WOULDN'T WANT TO DO THAT!"
-};
-
-// patch Mickey.exe offset 0x21E to value 0x01 to enable debug mode
-
-const char IDS_MSA_INSERT_DISK[][40] = {
-	"Please insert disk 1 and press any key", "Please insert disk 2 and press any key"
-};
-
-// max values
-
-#define IDI_MSA_MAX_PLANET              9
-#define IDI_MSA_MAX_DAT                 10
-#define IDI_MSA_MAX_PIC_ROOM            224
-#define IDI_MSA_MAX_ROOM                160
-
-#define IDI_MSA_MAX_BUTTON              6
-#define IDI_MSA_MAX_ITEM                11
-
-#define IDI_MSA_ANIM_DELAY              25
-
-#define IDI_MSA_LEN_STORY               1372
-
-// rows
-
-#define IDI_MSA_ROW_MENU_0              20
-#define IDI_MSA_ROW_MENU_1              21
-#define IDI_MSA_ROW_INV_TITLE           2
-#define IDI_MSA_ROW_INV_CRYSTALS        4
-#define IDI_MSA_ROW_INV_ITEMS           5
-#define IDI_MSA_ROW_TEMPERATURE         21
-#define IDI_MSA_ROW_PLANET              22
-#define IDI_MSA_ROW_INSERT_DISK         23
-
-#define IDI_MSA_COL_INV_TITLE           4
-#define IDI_MSA_COL_INV_ITEMS           15
-#define IDI_MSA_COL_PLANET              28
-#define IDI_MSA_COL_INSERT_DISK         1
-
-// screen
-
-#define IDI_MSA_PIC_WIDTH   140
-#define IDI_MSA_PIC_HEIGHT  159
-
-// pictures
-
-#define IDI_MSA_PIC_EARTH_TIRE_SWING    1
-#define IDI_MSA_PIC_EARTH_TIRE_SWING_1  200     // rope taken, swing on ground
-#define IDI_MSA_PIC_EARTH_DOGHOUSE      2
-#define IDI_MSA_PIC_EARTH_IN_DOGHOUSE   154
-#define IDI_MSA_PIC_EARTH_TREE          3
-#define IDI_MSA_PIC_EARTH_GARDEN        4
-#define IDI_MSA_PIC_EARTH_FRONT_HOUSE   5
-#define IDI_MSA_PIC_EARTH_HAMMOCK       6
-#define IDI_MSA_PIC_EARTH_BUTTERFLY     7
-#define IDI_MSA_PIC_EARTH_MAILBOX       8
-#define IDI_MSA_PIC_EARTH_ROAD_0        9
-#define IDI_MSA_PIC_EARTH_ROAD_1        10
-#define IDI_MSA_PIC_EARTH_ROAD_2        11
-#define IDI_MSA_PIC_EARTH_ROAD_3        12
-#define IDI_MSA_PIC_EARTH_ROAD_4        13      // starting room
-#define IDI_MSA_PIC_EARTH_ROAD_5        14
-#define IDI_MSA_PIC_EARTH_ROAD_6        15
-#define IDI_MSA_PIC_EARTH_ROAD_7        18
-#define IDI_MSA_PIC_EARTH_UNDER_TREE    16
-#define IDI_MSA_PIC_EARTH_UP_IN_TREE    155     // CRYSTAL
-#define IDI_MSA_PIC_EARTH_SHIP          17
-#define IDI_MSA_PIC_EARTH_LIVING_ROOM   19
-#define IDI_MSA_PIC_EARTH_KITCHEN       20
-#define IDI_MSA_PIC_EARTH_KITCHEN_1     159     // cupboard open
-#define IDI_MSA_PIC_EARTH_GARAGE        21
-#define IDI_MSA_PIC_EARTH_GARAGE_1      160     // cabinet open
-#define IDI_MSA_PIC_EARTH_BEDROOM       22
-#define IDI_MSA_PIC_EARTH_BEDROOM_1     161     // closet open
-#define IDI_MSA_PIC_EARTH_BATHROOM      23      // WEIGH MICKEY
-#define IDI_MSA_PIC_EARTH_SHIP_LEAVING  24
-#define IDI_MSA_PIC_EARTH_MINNIE        25
-
-#define IDI_MSA_PIC_SHIP_AIRLOCK        25
-#define IDI_MSA_PIC_SHIP_AIRLOCK_0      201     // door closed
-#define IDI_MSA_PIC_SHIP_AIRLOCK_1      202     // door open
-#define IDI_MSA_PIC_SHIP_AIRLOCK_2      203     // door closed, spacesuits on
-#define IDI_MSA_PIC_SHIP_AIRLOCK_3      204     // door open, spacesuits on
-#define IDI_MSA_PIC_SHIP_BEDROOM        29
-#define IDI_MSA_PIC_SHIP_CONTROLS       26
-#define IDI_MSA_PIC_SHIP_CORRIDOR       27
-#define IDI_MSA_PIC_SHIP_KITCHEN        28
-#define IDI_MSA_PIC_SHIP_KITCHEN_1      172     // cabinet open
-
-#define IDI_MSA_PIC_SHIP_VENUS          146
-#define IDI_MSA_PIC_SHIP_NEPTUNE        147
-#define IDI_MSA_PIC_SHIP_MERCURY        148
-#define IDI_MSA_PIC_SHIP_SATURN         149
-#define IDI_MSA_PIC_SHIP_PLUTO          150
-#define IDI_MSA_PIC_SHIP_JUPITER        151
-#define IDI_MSA_PIC_SHIP_MARS           152
-#define IDI_MSA_PIC_SHIP_URANUS         153
-
-#define IDI_MSA_PIC_VENUS_0             30
-#define IDI_MSA_PIC_VENUS_1             31
-#define IDI_MSA_PIC_VENUS_2             32
-#define IDI_MSA_PIC_VENUS_3             34
-#define IDI_MSA_PIC_VENUS_4             36
-#define IDI_MSA_PIC_VENUS_5             38
-#define IDI_MSA_PIC_VENUS_CHASM         35
-#define IDI_MSA_PIC_VENUS_CHASM_1       183     // rope lowered
-#define IDI_MSA_PIC_VENUS_PROBE         39      // CRYSTAL, USE WRENCH
-#define IDI_MSA_PIC_VENUS_PROBE_1       184     // hatch open
-#define IDI_MSA_PIC_VENUS_SHIP          33
-#define IDI_MSA_PIC_VENUS_WEIGH         37      // WEIGH MICKEY
-
-#define IDI_MSA_PIC_NEPTUNE_0           40
-#define IDI_MSA_PIC_NEPTUNE_1           42
-#define IDI_MSA_PIC_NEPTUNE_2           43
-#define IDI_MSA_PIC_NEPTUNE_3           44
-#define IDI_MSA_PIC_NEPTUNE_4           45
-#define IDI_MSA_PIC_NEPTUNE_5           48
-#define IDI_MSA_PIC_NEPTUNE_6           50
-#define IDI_MSA_PIC_NEPTUNE_7           52
-#define IDI_MSA_PIC_NEPTUNE_8           53
-#define IDI_MSA_PIC_NEPTUNE_9           54
-#define IDI_MSA_PIC_NEPTUNE_10          55
-#define IDI_MSA_PIC_NEPTUNE_11          56
-#define IDI_MSA_PIC_NEPTUNE_BABIES      61
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_0    46
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_1    51
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_2    57
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_3    58
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_4    59
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_5    60
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_6    66
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_7    67
-#define IDI_MSA_PIC_NEPTUNE_CASTLE_8    68
-#define IDI_MSA_PIC_NEPTUNE_EATING_AREA 62
-#define IDI_MSA_PIC_NEPTUNE_ENTRANCE    47
-#define IDI_MSA_PIC_NEPTUNE_ENTRANCE_1  185     // entrance open
-#define IDI_MSA_PIC_NEPTUNE_ENTRYWAY    63
-#define IDI_MSA_PIC_NEPTUNE_GUARD       69
-#define IDI_MSA_PIC_NEPTUNE_LEADER      64      // CRYSTAL, GIVE SCARF
-#define IDI_MSA_PIC_NEPTUNE_SHIP        49
-#define IDI_MSA_PIC_NEPTUNE_SLEEP_AREA  65
-#define IDI_MSA_PIC_NEPTUNE_WEIGH       41
-
-#define IDI_MSA_PIC_MERCURY_0           71
-#define IDI_MSA_PIC_MERCURY_1           73
-#define IDI_MSA_PIC_MERCURY_2           75
-#define IDI_MSA_PIC_MERCURY_3           77
-#define IDI_MSA_PIC_MERCURY_4           80
-#define IDI_MSA_PIC_MERCURY_ALIEN_0     72      // CRYSTAL, GIVE SUNGLASSES
-#define IDI_MSA_PIC_MERCURY_ALIEN_1     74
-#define IDI_MSA_PIC_MERCURY_ALIEN_2     81
-#define IDI_MSA_PIC_MERCURY_CAVE_0      70      // hidden feature, press '2' here
-#define IDI_MSA_PIC_MERCURY_CAVE_1      78
-#define IDI_MSA_PIC_MERCURY_CAVE_2      79
-#define IDI_MSA_PIC_MERCURY_SHIP        76
-#define IDI_MSA_PIC_MERCURY_WEIGH       82
-
-#define IDI_MSA_PIC_SATURN_0            84
-#define IDI_MSA_PIC_SATURN_1            86
-#define IDI_MSA_PIC_SATURN_2            90
-#define IDI_MSA_PIC_SATURN_3            91
-#define IDI_MSA_PIC_SATURN_ISLAND       89      // CRYSTAL
-#define IDI_MSA_PIC_SATURN_LAKE_0       85      // USE MATTRESS
-#define IDI_MSA_PIC_SATURN_LAKE_1       88      // USE MATTRESS
-#define IDI_MSA_PIC_SATURN_LAKE_2       92      // USE MATTRESS
-#define IDI_MSA_PIC_SATURN_SHIP         87
-#define IDI_MSA_PIC_SATURN_WEIGH        83      // WEIGH MICKEY
-
-#define IDI_MSA_PIC_PLUTO_0             93
-#define IDI_MSA_PIC_PLUTO_1             96
-#define IDI_MSA_PIC_PLUTO_2             97
-#define IDI_MSA_PIC_PLUTO_3             98
-#define IDI_MSA_PIC_PLUTO_4             101
-#define IDI_MSA_PIC_PLUTO_ALIENS        100     // CRYSTAL, GIVE BONE
-#define IDI_MSA_PIC_PLUTO_CAVE_0        99
-#define IDI_MSA_PIC_PLUTO_CAVE_1        103
-#define IDI_MSA_PIC_PLUTO_CRATER        102
-#define IDI_MSA_PIC_PLUTO_SHIP          95
-#define IDI_MSA_PIC_PLUTO_WEIGH         94      // WEIGH MICKEY
-
-#define IDI_MSA_PIC_JUPITER_0           106
-#define IDI_MSA_PIC_JUPITER_1           107
-#define IDI_MSA_PIC_JUPITER_2           108
-#define IDI_MSA_PIC_JUPITER_3           109
-#define IDI_MSA_PIC_JUPITER_4           113
-#define IDI_MSA_PIC_JUPITER_5           116
-#define IDI_MSA_PIC_JUPITER_6           117
-#define IDI_MSA_PIC_JUPITER_7           120
-#define IDI_MSA_PIC_JUPITER_CRACK       114
-#define IDI_MSA_PIC_JUPITER_LAVA        110     // CRYSTAL, THROW ROCK
-#define IDI_MSA_PIC_JUPITER_ROCK_0      112     // GET ROCK
-#define IDI_MSA_PIC_JUPITER_ROCK_1      119     // GET ROCK
-#define IDI_MSA_PIC_JUPITER_SHIP        115
-#define IDI_MSA_PIC_JUPITER_WEIGH       118     // WEIGH MICKEY
-
-#define IDI_MSA_PIC_MARS_0              121
-#define IDI_MSA_PIC_MARS_1              124
-#define IDI_MSA_PIC_MARS_2              125
-#define IDI_MSA_PIC_MARS_3              126
-#define IDI_MSA_PIC_MARS_4              127
-#define IDI_MSA_PIC_MARS_5              128
-#define IDI_MSA_PIC_MARS_6              130
-#define IDI_MSA_PIC_MARS_SHIP           123
-#define IDI_MSA_PIC_MARS_TUBE_0         129
-#define IDI_MSA_PIC_MARS_TUBE_1         131
-#define IDI_MSA_PIC_MARS_VOLCANO        132     // CRYSTAL, DIG PLUTO
-#define IDI_MSA_PIC_MARS_WEIGH          122     // WEIGH MICKEY
-
-#define IDI_MSA_PIC_URANUS_0            133
-#define IDI_MSA_PIC_URANUS_1            134
-#define IDI_MSA_PIC_URANUS_2            135
-#define IDI_MSA_PIC_URANUS_3            138
-#define IDI_MSA_PIC_URANUS_4            139
-#define IDI_MSA_PIC_URANUS_5            140
-#define IDI_MSA_PIC_URANUS_6            142
-#define IDI_MSA_PIC_URANUS_CHAMBER      145     // CRYSTAL, USE CROWBAR
-#define IDI_MSA_PIC_URANUS_SHIP         137
-#define IDI_MSA_PIC_URANUS_STEPS        144
-#define IDI_MSA_PIC_URANUS_ENTRANCE     141     // ENTER TEMPLE
-#define IDI_MSA_PIC_URANUS_TEMPLE       143     // USE CRYSTAL, ENTER DOOR
-#define IDI_MSA_PIC_URANUS_TEMPLE_1     206     // crystal used
-#define IDI_MSA_PIC_URANUS_TEMPLE_2     207     // door open
-#define IDI_MSA_PIC_URANUS_WEIGH        136     // WEIGH MICKEY
-
-#define IDI_MSA_PIC_STAR_MAP            165
-#define IDI_MSA_PIC_TITLE               240
-
-// objects
-
-enum ENUM_MSA_OBJECT {
-	IDI_MSA_OBJECT_NONE = -1,
-	IDI_MSA_OBJECT_ROCK_0,
-	IDI_MSA_OBJECT_WRENCH,
-	IDI_MSA_OBJECT_SCALE,
-	IDI_MSA_OBJECT_CROWBAR,
-	IDI_MSA_OBJECT_BONE,
-	IDI_MSA_OBJECT_SUNGLASSES,
-	IDI_MSA_OBJECT_DESK_STUFF,
-	IDI_MSA_OBJECT_MATTRESS,
-	IDI_MSA_OBJECT_SCARF,
-	IDI_MSA_OBJECT_FLASHLIGHT,
-	IDI_MSA_OBJECT_ROPE,
-	IDI_MSA_OBJECT_ROCK_1,
-	IDI_MSA_OBJECT_SCARF_C64,
-	IDI_MSA_OBJECT_ROCK_2,
-	IDI_MSA_OBJECT_ROCK_3,
-	IDI_MSA_OBJECT_W_EARTH,
-	IDI_MSA_OBJECT_W_VENUS,
-	IDI_MSA_OBJECT_W_TRITON,
-	IDI_MSA_OBJECT_W_MERCURY,
-	IDI_MSA_OBJECT_W_TITAN,
-	IDI_MSA_OBJECT_W_PLUTO,
-	IDI_MSA_OBJECT_W_IO,
-	IDI_MSA_OBJECT_W_MARS,
-	IDI_MSA_OBJECT_W_OBERON,
-	IDI_MSA_OBJECT_W_SPACE,
-	IDI_MSA_OBJECT_XL31,
-	IDI_MSA_OBJECT_XL31E,
-	IDI_MSA_OBJECT_XL32,
-	IDI_MSA_OBJECT_XL32E,
-	IDI_MSA_OBJECT_XL33,
-	IDI_MSA_OBJECT_XL33E,
-	IDI_MSA_OBJECT_CRYSTAL
-};
-
-const char IDS_MSA_NAME_OBJ[][9] = {
-	"rok1", "wrench", "scale", "cbar", "bone", "glasses", "deskstuf", "raft",
-	"scarf", "flashlit", "rope", "rok1", "scarfc64", "rok2", "rock35", "earthw",
-	"venw", "trw", "merw", "titw", "plw", "iow", "mrw", "obw", "spw", "xl31",
-	"xl31e", "xl32", "xl32e", "xl33", "xl33e", "crys1"
-};
-
-const int IDI_MSA_XTAL_ROOM_XY[IDI_MSA_MAX_PLANET][3] = {
-	// room                         x       y
-	{IDI_MSA_PIC_EARTH_UP_IN_TREE,  14,     76},
-	{IDI_MSA_PIC_VENUS_PROBE,       74,     80},
-	{IDI_MSA_PIC_NEPTUNE_LEADER,    70,     27},
-	{IDI_MSA_PIC_MERCURY_ALIEN_0,   123,    64},
-	{IDI_MSA_PIC_SATURN_ISLAND,     110,    115},
-	{IDI_MSA_PIC_PLUTO_ALIENS,      60,     104},
-	{IDI_MSA_PIC_JUPITER_LAVA,      56,     54},
-	{IDI_MSA_PIC_MARS_VOLCANO,      107,    100},
-	{IDI_MSA_PIC_URANUS_CHAMBER,    90,     4}
-};
-
-// planets
-
-enum ENUM_MSA_PLANET {
-	IDI_MSA_PLANET_EARTH = 0,
-	IDI_MSA_PLANET_VENUS,
-	IDI_MSA_PLANET_NEPTUNE,
-	IDI_MSA_PLANET_MERCURY,
-	IDI_MSA_PLANET_SATURN,
-	IDI_MSA_PLANET_PLUTO,
-	IDI_MSA_PLANET_JUPITER,
-	IDI_MSA_PLANET_MARS,
-	IDI_MSA_PLANET_URANUS,
-	IDI_MSA_PLANET_SPACESHIP
-};
-
-const char IDS_MSA_NAME_DAT[][13] = {
-	"earth.dat", "venus.dat", "neptune.dat", "mercury.dat", "saturn.dat",
-	"pluto.dat", "jupiter.dat", "mars.dat", "uranus.dat", "spacship.dat"
-};
-
-const char IDS_MSA_NAME_PLANET[][10] = {
-	"EARTH", "VENUS", "TRITON", "MERCURY", "TITAN",
-	"PLUTO", "IO", "MARS", "OBERON"
-};
-
-const char IDS_MSA_NAME_PLANET_2[][10] = {
-	"EARTH", "VENUS", "NEPTUNE", "MERCURY", "SATURN",
-	"PLUTO", "JUPITER", "MARS", "URANUS"
-};
-
-const char IDS_MSA_ADDR_PLANET[][7] = {
-	"OB", "B", "OOBBB", "O", "OOBB",
-	"OOOBBB", "OBB", "OOB", "OOOBB"
-};
-
-const int IDI_MSA_HOME_PLANET[] = {
-	IDI_MSA_PIC_EARTH_SHIP, IDI_MSA_PIC_VENUS_SHIP, IDI_MSA_PIC_NEPTUNE_SHIP, IDI_MSA_PIC_MERCURY_SHIP,
-	IDI_MSA_PIC_SATURN_SHIP, IDI_MSA_PIC_PLUTO_SHIP, IDI_MSA_PIC_JUPITER_SHIP, IDI_MSA_PIC_MARS_SHIP,
-	IDI_MSA_PIC_URANUS_SHIP
-};
-
-const int IDI_MSA_SHIP_PLANET[] = {
-	0, IDI_MSA_PIC_SHIP_VENUS, IDI_MSA_PIC_SHIP_NEPTUNE, IDI_MSA_PIC_SHIP_MERCURY, IDI_MSA_PIC_SHIP_SATURN,
-	IDI_MSA_PIC_SHIP_PLUTO, IDI_MSA_PIC_SHIP_JUPITER, IDI_MSA_PIC_SHIP_MARS, IDI_MSA_PIC_SHIP_URANUS
-};
-
-// items
-
-enum ENUM_MSA_ITEM {
-	IDI_MSA_ITEM_FLASHLIGHT = 0,
-	IDI_MSA_ITEM_ROPE,
-	IDI_MSA_ITEM_BONE,
-	IDI_MSA_ITEM_LETTER,
-	IDI_MSA_ITEM_CROWBAR,
-	IDI_MSA_ITEM_WRENCH,
-	IDI_MSA_ITEM_MATTRESS,
-	IDI_MSA_ITEM_SCARF,
-	IDI_MSA_ITEM_SUNGLASSES,
-	IDI_MSA_ITEM_SCALE,
-	IDI_MSA_ITEM_ROCK
-};
-
-const char IDS_MSA_NAME_ITEM[][15] = {
-	"A FLASHLIGHT", "A ROPE ", "A BONE ", "A LETTER", "A CROWBAR", "A WRENCH",
-	"A MATTRESS", "A SCARF", "SUNGLASSES", "A SCALE ", "A ROCK "
-};
-
-// buttons
-
-#define IDI_MSA_BUTTON_ORANGE       0x4F    // 'O'
-#define IDI_MSA_BUTTON_BLUE         0x42    // 'B'
-
-// file structures
-
-struct MSA_TEXT_ENTRY {
-	uint8   x0;
-	uint8   szText[11];
-};
-
-struct MSA_TEXT_BLOCK {
-	uint8   count;
-	MSA_TEXT_ENTRY  entry[5];
-};
-
-struct MSA_MSG_BLOCK {
-	uint8   data[5];
-};
-
-struct MSA_MENU {
-	MSA_TEXT_BLOCK row[2];
-	MSA_MSG_BLOCK cmd[5];
-	MSA_MSG_BLOCK arg[5];
-};
-
-struct MSA_DAT_HEADER {
-	uint16  filelen;
-	uint16  ofsRoom[IDI_MSA_MAX_ROOM];
-	uint16  ofsDesc[IDI_MSA_MAX_ROOM];
-	uint16  ofsStr[IDI_MSA_MAX_ROOM];
-};
-
-struct MSA_SND_NOTE {
-	uint16  counter;    // freq = 1193180 / counter
-	uint8   length;     // msec = length / 0.0182
-};
-
-// file offset modifiers
-
-#define IDI_MSA_OFS_DAT                 0x0002
-#define IDI_MSA_OFS_EXE                 0x35C0
-
-// actions
-
-#define IDI_MSA_ACTION_GOTO_ROOM        0x00
-#define IDI_MSA_ACTION_SHOW_INT_STR     0x01
-#define IDI_MSA_ACTION_UNUSED           0x02
-#define IDI_MSA_ACTION_SHOW_DAT_STR     0x03
-
-#define IDI_MSA_ACTION_GET_ROPE         0x7F
-#define IDI_MSA_ACTION_UNTIE_ROPE       0x80
-#define IDI_MSA_ACTION_GET_BONE         0x81
-#define IDI_MSA_ACTION_GET_XTAL_EARTH   0x82
-#define IDI_MSA_ACTION_LOOK_DESK        0x83
-#define IDI_MSA_ACTION_WRITE_LETTER     0x84
-#define IDI_MSA_ACTION_MAIL_LETTER      0x85
-#define IDI_MSA_ACTION_OPEN_CUPBOARD    0x86
-#define IDI_MSA_ACTION_GET_FLASHLIGHT   0x87
-#define IDI_MSA_ACTION_OPEN_CABINET     0x88
-#define IDI_MSA_ACTION_GET_CROWBAR      0x89
-#define IDI_MSA_ACTION_GET_WRENCH       0x8A
-#define IDI_MSA_ACTION_OPEN_CLOSET      0x8B
-#define IDI_MSA_ACTION_GET_MATTRESS     0x8C
-#define IDI_MSA_ACTION_GET_SCARF        0x8D
-#define IDI_MSA_ACTION_GET_SUNGLASSES   0x8E
-#define IDI_MSA_ACTION_GET_SCALE        0x8F
-#define IDI_MSA_ACTION_GOTO_SPACESHIP   0x90
-
-#define IDI_MSA_ACTION_DOWN_CHASM       0x91
-#define IDI_MSA_ACTION_DOWN_ROPE        0x92
-#define IDI_MSA_ACTION_USE_ROPE         0x93
-#define IDI_MSA_ACTION_OPEN_HATCH       0x94
-#define IDI_MSA_ACTION_USE_WRENCH       0x95
-#define IDI_MSA_ACTION_GET_XTAL_VENUS   0x96
-
-#define IDI_MSA_ACTION_LOOK_CASTLE      0x97
-#define IDI_MSA_ACTION_ENTER_OPENING    0x98
-#define IDI_MSA_ACTION_USE_CROWBAR      0x99
-#define IDI_MSA_ACTION_GET_XTAL_NEPTUNE 0x9A
-#define IDI_MSA_ACTION_TALK_LEADER      0x9B
-#define IDI_MSA_ACTION_GIVE_SCARF       0x9C
-
-#define IDI_MSA_ACTION_GET_XTAL_MERCURY 0x9D
-#define IDI_MSA_ACTION_GIVE_SUNGLASSES  0x9E
-#define IDI_MSA_ACTION_CROSS_LAKE       0x9F
-#define IDI_MSA_ACTION_USE_MATTRESS     0xA0
-#define IDI_MSA_ACTION_GET_XTAL_SATURN  0xA1
-#define IDI_MSA_ACTION_LEAVE_ISLAND     0xA2
-
-#define IDI_MSA_ACTION_GET_XTAL_PLUTO   0xA3
-#define IDI_MSA_ACTION_GIVE_BONE        0xA4
-
-#define IDI_MSA_ACTION_GET_ROCK_0       0xA5
-#define IDI_MSA_ACTION_GET_ROCK_1       0xA6
-#define IDI_MSA_ACTION_GET_XTAL_JUPITER 0xA7
-#define IDI_MSA_ACTION_THROW_ROCK       0xA8
-
-#define IDI_MSA_ACTION_GO_TUBE          0xA9
-#define IDI_MSA_ACTION_USE_FLASHLIGHT   0xAA
-#define IDI_MSA_ACTION_PLUTO_DIG        0xAB
-#define IDI_MSA_ACTION_GET_XTAL_MARS    0xAC
-
-#define IDI_MSA_ACTION_USE_CRYSTAL      0xAD
-#define IDI_MSA_ACTION_OPEN_DOOR        0xAE
-#define IDI_MSA_ACTION_ENTER_DOOR       0xAF
-#define IDI_MSA_ACTION_GET_XTAL_URANUS  0xB0
-#define IDI_MSA_ACTION_USE_CROWBAR_1    0xB1
-
-#define IDI_MSA_ACTION_GO_NORTH         0xB2
-#define IDI_MSA_ACTION_GO_PLANET        0xB3
-#define IDI_MSA_ACTION_PRESS_BUTTON     0xB4
-#define IDI_MSA_ACTION_WEAR_SPACESUIT   0xB5
-#define IDI_MSA_ACTION_READ_GAUGE       0xB6
-#define IDI_MSA_ACTION_PRESS_ORANGE     0xB7
-#define IDI_MSA_ACTION_PRESS_BLUE       0xB8
-#define IDI_MSA_ACTION_FLIP_SWITCH      0xB9
-#define IDI_MSA_ACTION_PUSH_THROTTLE    0xBA
-#define IDI_MSA_ACTION_PULL_THROTTLE    0xBB
-#define IDI_MSA_ACTION_LEAVE_ROOM       0xBC
-#define IDI_MSA_ACTION_OPEN_CABINET_1   0xBD
-#define IDI_MSA_ACTION_READ_MAP         0xBE
-#define IDI_MSA_ACTION_GO_WEST          0xBF
-
-#define IDI_MSA_ACTION_PLANET_INFO      0xC0
-#define IDI_MSA_ACTION_ENTER_TEMPLE     0xC1
-#define IDI_MSA_ACTION_OPEN_MAILBOX     0xC2
-#define IDI_MSA_ACTION_SAVE_GAME        0xC3
-#define IDI_MSA_ACTION_LOOK_MICKEY      0xC4
-
-// sounds
-
-enum ENUM_MSA_SOUND {
-	IDI_MSA_SND_THEME,
-	IDI_MSA_SND_CRYSTAL,
-	IDI_MSA_SND_TAKE,
-	IDI_MSA_SND_GAME_OVER,
-	IDI_MSA_SND_PRESS_BLUE,
-	IDI_MSA_SND_PRESS_ORANGE,
-	IDI_MSA_SND_SHIP_LAND,
-	IDI_MSA_SND_XL30
-};
-
-// message offsets within mickey.exe
-
-const int IDO_MSA_HIDDEN_MSG[] = {
-	0x8C44, 0x8C83, 0x8D23, 0x8D97, 0x8E2A
-};
-
-const int IDO_MSA_GAME_OVER[] = {
-	0x7914, 0x7978, 0x7A17, 0x7A94, 0x7B04, 0x7B8F, 0x7BEB, 0x7C79
-};
-
-const int IDO_MSA_SAVE_GAME[] = {
-	0x73FA, 0x7436, 0x746C, 0x74E9, 0x75F6, 0x766A, 0x758B
-	// do you have a formatted disk, insert disk, insert disk 2, save by number
-	// everything will be lost, previous game will be lost, game saved
-};
-
-const int IDO_MSA_LOAD_GAME[] = {
-	0x76CE, 0x770B, 0x7777
-	// do you want to load game, insert game save disk, game restored
-};
-
-const int IDO_MSA_AIR_SUPPLY[] = {
-	0x7D10, 0x7D31, 0x7D51, 0x7D9B
-	// be aware, low, dangerously low, out of air
-};
-
-const int IDI_MSA_AIR_SUPPLY[] = { 30, 20, 10, 0 };
-
-// planet information
-
-const int IDO_MSA_PLANET_INFO[IDI_MSA_MAX_PLANET][4] = {
-	{0x6313, 0x63B2, 0x6449, 0},        // EARTH
-	{0x61EB, 0x6288, 0,      0},        // VENUS
-	{0x6B64, 0x6C06, 0x6CA3, 0},        // NEPTUNE
-	{0x609B, 0x612C, 0x61CA, 0},        // MERCURY
-	{0x6879, 0x6916, 0x6984, 0},        // SATURN
-	{0x6CCF, 0x6D72, 0x6E10, 0},        // PLUTO
-	{0x667C, 0x6714, 0x67B1, 0x684E},   // JUPITER
-	{0x6471, 0x650F, 0x65AD, 0x6651},   // MARS
-	{0x69C3, 0x6A62, 0x6B00, 0}         // URANUS
-};
-
-// next crystal piece hints
-
-const int IDO_MSA_NEXT_PIECE[IDI_MSA_MAX_PLANET][5] = {
-	{0,     0,      0,      0,      0},             // earth
-	{0x4DCC,    0x4E20, 0x4E64, 0x4E9E, 0x4F0B},    // venus
-	{0x5900,    0x599B, 0x5A07, 0x5A8E, 0x5B07},    // neptune
-	{0x4F57,    0x4FA3, 0x4FF1, 0x5056, 0x50BD},    // mercury
-	{0x5471,    0x54DF, 0x5548, 0x55C2, 0x562A},    // saturn
-	{0x5B78,    0x5BB6, 0x5C29, 0x5C76, 0x5CE1},    // pluto
-	{0x526B,    0x52DA, 0x5340, 0x53A1, 0x540C},    // jupiter
-	{0x50F6,    0x512C, 0x5170, 0x51D5, 0x5228},    // mars
-	{0x56AA,    0x571C, 0x579E, 0x5807, 0x5875}     // uranus
-};
-
-// message offsets
-
-#define IDO_MSA_COPYRIGHT                       0x7801
-#define IDO_MSA_INTRO                           0x4679
-#define IDO_MSA_GAME_STORY                      0x6E9C
-
-#define IDO_MSA_PRESS_1_TO_9                    0x7530
-#define IDO_MSA_PRESS_YES_OR_NO                 0x480D
-#define IDO_MSA_TOO_MANY_BUTTONS_PRESSED        0x5DF7
-
-#define IDO_MSA_XL30_SPEAKING                   0x4725
-#define IDO_MSA_CRYSTAL_PIECE_FOUND             0x600C
-
-#define IDO_MSA_ROOM_TEXT_OFFSETS               0x8B01
-#define IDO_MSA_ROOM_OBJECT_XY_OFFSETS          0x8EA8
-#define IDO_MSA_ROOM_MENU_FIX                   0x4a27
-
-// offsets to offset arrays
-
-#define IDOFS_MSA_MENU_PATCHES                  0x5e7a
-#define IDOFS_MSA_SOUND_DATA                    0x9deb
-
-// game structure
-
-struct MSA_GAME {
-	uint8 iRoom;
-	uint8 iPlanet;
-	uint8 iDisk;
-
-	uint8 nAir;
-	uint8 nButtons;
-	uint8 nRocks;
-
-	uint8 nXtals;
-	uint8 iPlanetXtal[IDI_MSA_MAX_DAT];
-	uint16 iClue[IDI_MSA_MAX_PLANET];
-	char szAddr[IDI_MSA_MAX_BUTTON + 1];
-
-	// Flags
-	bool fHasXtal;
-	bool fIntro;
-	bool fSuit;
-	bool fShipDoorOpen;
-	bool fFlying;
-	bool fStoryShown;
-	bool fPlanetsInitialized;
-	bool fTempleDoorOpen;
-	bool fAnimXL30;
-	bool fItem[IDI_MSA_MAX_ITEM];
-	bool fItemUsed[IDI_MSA_MAX_ITEM];
-
-	int8 iItem[IDI_MSA_MAX_ITEM];
-	uint8 nItems;
-
-	//uint8 fRmTxt[IDI_MSA_MAX_ROOM];
-	int8 iRmObj[IDI_MSA_MAX_ROOM];
-	uint8 iRmPic[IDI_MSA_MAX_ROOM];
-	uint16 oRmTxt[IDI_MSA_MAX_ROOM];
-
-	uint8 iRmMenu[IDI_MSA_MAX_ROOM];
-	uint8 nRmMenu[IDI_MSA_MAX_ROOM];
-
-	int8 nFrame;
-};
-
-class PreAgiEngine;
-
-class MickeyEngine : public PreAgiEngine {
-public:
-	MickeyEngine(OSystem *syst, const AGIGameDescription *gameDesc);
-	~MickeyEngine() override;
-
-	void init();
-	Common::Error go() override;
-
-	void debugCurRoom();
-	void debugGotoRoom(int);
-	void drawPic(int);
-	void drawObj(ENUM_MSA_OBJECT, int, int);
-
-protected:
-	MSA_GAME _gameStateMickey;
-	bool _clickToMove;
-
-	int getDat(int);
-	void readExe(int, uint8 *, long);
-	void getDatFileName(int, char *);
-	void readDatHdr(char *, MSA_DAT_HEADER *);
-	void readOfsData(int, int, uint8 *, long);
-	bool chooseY_N(int, bool);
-	int choose1to9(int);
-	void printStr(char *);
-	void printLine(const char *);
-	void printExeStr(int);
-	void printExeMsg(int);
-	void printDesc(int);
-	bool checkMenu();
-	void drawMenu(MSA_MENU &, int, int);
-	void getMouseMenuSelRow(MSA_MENU &, int *, int *, int, int, int);
-	bool getMenuSelRow(MSA_MENU &, int *, int *, int);
-	void getMenuSel(char *, int *, int *);
-	void centerMenu(MSA_MENU *);
-	void patchMenu(MSA_MENU *);
-	void printDatString(int);
-	void printDatMessage(int);
-	void playNote(MSA_SND_NOTE);
-	void playSound(ENUM_MSA_SOUND);
-	void drawRoomAnimation();
-	void drawRoom();
-	void drawLogo();
-	void animate();
-	void printRoomDesc();
-	bool loadGame();
-	void saveGame();
-	void showPlanetInfo();
-	void printStory();
-	int getPlanet();
-	void pressOB(int);
-	void insertDisk(int);
-	void gameOver();
-	void inventory();
-	void intro();
-	void getItem(ENUM_MSA_ITEM);
-	void getXtal(int);
-	bool parse(int, int);
-	void flipSwitch();
-	void waitAnyKey(bool anim = false);
-
-	bool planetIsAlreadyAssigned(int planet) {
-		for (int j = 0; j < IDI_MSA_MAX_PLANET; j++) {
-			if (_gameStateMickey.iPlanetXtal[j] == planet)
-				return true;
-		}
-		return false;
-	}
-
-	bool mickeyHasItem(int item) {
-		if (_gameStateMickey.fItem[item]) {
-			printDatMessage(90);    // Mickey already has item
-			return true;
-		} else {
-			return false;
-		}
-	}
-};
-
-} // End of namespace Agi
-
-#endif
diff --git a/engines/agi/preagi_troll.cpp b/engines/agi/preagi_troll.cpp
deleted file mode 100644
index 888fe564109..00000000000
--- a/engines/agi/preagi_troll.cpp
+++ /dev/null
@@ -1,770 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "agi/preagi.h"
-#include "agi/preagi_troll.h"
-#include "agi/graphics.h"
-
-#include "common/events.h"
-#include "common/textconsole.h"
-
-#include "graphics/cursorman.h"
-
-namespace Agi {
-
-TrollEngine::TrollEngine(OSystem *syst, const AGIGameDescription *gameDesc) : PreAgiEngine(syst, gameDesc) {
-}
-
-TrollEngine::~TrollEngine() {
-}
-
-// User Interface
-
-void TrollEngine::pressAnyKey(int col) {
-	drawStr(24, col, kColorDefault, IDS_TRO_PRESSANYKEY);
-	g_system->updateScreen();
-	getSelection(kSelAnyKey);
-}
-
-void TrollEngine::drawMenu(const char *szMenu, int iSel) {
-	clearTextArea();
-	drawStr(21, 0, kColorDefault, szMenu);
-	drawStr(22 + iSel, 0, kColorDefault, " *");
-	g_system->updateScreen();
-}
-
-bool TrollEngine::getMenuSel(const char *szMenu, int *iSel, int nSel) {
-	Common::Event event;
-	int y;
-
-	drawMenu(szMenu, *iSel);
-
-	while (!shouldQuit()) {
-		while (_system->getEventManager()->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_RETURN_TO_LAUNCHER:
-			case Common::EVENT_QUIT:
-				return 0;
-			case Common::EVENT_MOUSEMOVE:
-				y = event.mouse.y / 8;
-
-				if (y >= 22)
-					if (nSel > y - 22)
-						*iSel = y - 22;
-
-				drawMenu(szMenu, *iSel);
-				break;
-			case Common::EVENT_LBUTTONUP:
-				return true;
-			case Common::EVENT_KEYDOWN:
-				switch (event.kbd.keycode) {
-				case Common::KEYCODE_t:
-				case Common::KEYCODE_f:
-					inventory();
-
-					return false;
-				case Common::KEYCODE_DOWN:
-				case Common::KEYCODE_SPACE:
-					*iSel += 1;
-
-					if (*iSel == nSel)
-						*iSel = IDI_TRO_SEL_OPTION_1;
-
-					drawMenu(szMenu, *iSel);
-					break;
-				case Common::KEYCODE_UP:
-					*iSel -= 1;
-
-					if (*iSel == IDI_TRO_SEL_OPTION_1 - 1)
-						*iSel = nSel - 1;
-
-					drawMenu(szMenu, *iSel);
-					break;
-				case Common::KEYCODE_RETURN:
-				case Common::KEYCODE_KP_ENTER:
-					return true;
-				case Common::KEYCODE_s:
-					if (event.kbd.hasFlags(Common::KBD_CTRL)) {
-						if (_soundOn) {
-							playTune(2, 1);
-							_soundOn = !_soundOn;
-						} else {
-							_soundOn = !_soundOn;
-							playTune(3, 1);
-						}
-					}
-				default:
-					break;
-				}
-				break;
-			default:
-				break;
-			}
-		}
-		_system->updateScreen();
-		_system->delayMillis(10);
-	}
-
-	return true;
-}
-
-// Graphics
-
-void TrollEngine::drawPic(int iPic, bool f3IsCont, bool clr, bool troll) {
-	_picture->setDimensions(IDI_TRO_PIC_WIDTH, IDI_TRO_PIC_HEIGHT);
-
-	if (clr) {
-		clearScreen(0x0f, false);
-		_picture->clear();
-	}
-
-	_picture->setPictureData(_gameData + IDO_TRO_FRAMEPIC);
-	_picture->drawPicture();
-
-	_picture->setPictureData(_gameData + _pictureOffsets[iPic]);
-
-	int addFlag = 0;
-
-	if (troll)
-		addFlag = kPicFTrollMode;
-
-	if (f3IsCont) {
-		_picture->setPictureFlags(kPicFf3Cont | addFlag);
-	} else {
-		_picture->setPictureFlags(kPicFf3Stop | addFlag);
-	}
-
-	_picture->drawPicture();
-
-	_picture->showPic(); // TODO: *HAVE* to add coordinates + height/width!!
-	g_system->updateScreen();
-}
-
-// Game Logic
-
-void TrollEngine::inventory() {
-	clearScreen(0x07);
-	drawStr(1, 12, kColorDefault, IDS_TRO_TREASURE_0);
-	drawStr(2, 12, kColorDefault, IDS_TRO_TREASURE_1);
-
-	for (int i = 0; i < IDI_TRO_MAX_TREASURE - _treasuresLeft; i++) {
-		int n = _inventory[i] - 1;
-		drawStr(2 + i, 10, _items[n].bg << 4 | 0x0f, Common::String::format(" %2d ", i + 1).c_str());
-		drawStr(2 + i, 14, _items[n].bg << 4 | _items[n].fg, _items[n].name);
-	}
-
-	switch (_treasuresLeft) {
-	case 1:
-		drawStr(20, 10, kColorDefault, Common::String::format(IDS_TRO_TREASURE_5, _treasuresLeft).c_str());
-		break;
-	case 0:
-		drawStr(20, 1, kColorDefault, IDS_TRO_TREASURE_6);
-		break;
-	case IDI_TRO_MAX_TREASURE:
-		drawStr(3, 17, kColorDefault, IDS_TRO_TREASURE_2);
-		break;
-	default:
-		drawStr(20, 10, kColorDefault, Common::String::format(IDS_TRO_TREASURE_4, _treasuresLeft).c_str());
-		break;
-	}
-
-	pressAnyKey(6);
-}
-
-void TrollEngine::waitAnyKeyIntro() {
-	Common::Event event;
-	int iMsg = 0;
-
-	while (!shouldQuit()) {
-		while (_system->getEventManager()->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_RETURN_TO_LAUNCHER:
-			case Common::EVENT_QUIT:
-			case Common::EVENT_LBUTTONUP:
-			case Common::EVENT_KEYDOWN:
-				return;
-			default:
-				break;
-			}
-		}
-
-		switch (iMsg) {
-		case 200:
-			iMsg = 0;
-			// fall through
-		case 0:
-			drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_2);
-			g_system->updateScreen();
-			break;
-		case 100:
-			drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_3);
-			g_system->updateScreen();
-			break;
-		default:
-			break;
-		}
-
-		iMsg++;
-
-		_system->updateScreen();
-		_system->delayMillis(10);
-	}
-}
-
-void TrollEngine::credits() {
-	clearScreen(0x07);
-
-	drawStr(1, 2, kColorDefault, IDS_TRO_CREDITS_0);
-
-	int color = 10;
-	char str[2];
-
-	str[1] = 0;
-
-	for (uint i = 0; i < strlen(IDS_TRO_CREDITS_1); i++) {
-		str[0] = IDS_TRO_CREDITS_1[i];
-		drawStr(7, 19 + i, color++, str);
-		if (color > 15)
-			color = 9;
-	}
-
-	drawStr(8, 19, kColorDefault, IDS_TRO_CREDITS_2);
-
-	drawStr(13, 11, 9, IDS_TRO_CREDITS_3);
-	drawStr(15, 8, 10, IDS_TRO_CREDITS_4);
-	drawStr(17, 7, 12, IDS_TRO_CREDITS_5);
-	drawStr(19, 2, 14, IDS_TRO_CREDITS_6);
-
-	g_system->updateScreen();
-
-	pressAnyKey();
-}
-
-void TrollEngine::tutorial() {
-	bool done = false;
-	int iSel = 0;
-	//char szTreasure[16] = {0};
-
-	while (!shouldQuit()) {
-		clearScreen(0xFF);
-
-		printStr(IDS_TRO_TUTORIAL_0);
-		getSelection(kSelSpace);
-
-		clearScreen(0x55);
-		setDefaultTextColor(0x0F);
-
-		done = false;
-		while (!done && !shouldQuit()) {
-			getMenuSel(IDS_TRO_TUTORIAL_1, &iSel, IDI_TRO_MAX_OPTION);
-
-			switch (iSel) {
-			case IDI_TRO_SEL_OPTION_1:
-				clearScreen(0x22, false);
-				g_system->updateScreen();
-				break;
-			case IDI_TRO_SEL_OPTION_2:
-				clearScreen(0x00, false);
-				g_system->updateScreen();
-				break;
-			case IDI_TRO_SEL_OPTION_3:
-				done = true;
-				break;
-			default:
-				break;
-			}
-		}
-
-		// do you need more practice ?
-		clearScreen(0x4F);
-		drawStr(7, 4, kColorDefault, IDS_TRO_TUTORIAL_5);
-		drawStr(9, 4, kColorDefault, IDS_TRO_TUTORIAL_6);
-		g_system->updateScreen();
-
-		if (!getSelection(kSelYesNo))
-			break;
-	}
-
-	// show info texts
-	clearScreen(0x5F);
-	drawStr(4, 1, kColorDefault, IDS_TRO_TUTORIAL_7);
-	drawStr(5, 1, kColorDefault, IDS_TRO_TUTORIAL_8);
-	g_system->updateScreen();
-	pressAnyKey();
-
-	clearScreen(0x2F);
-	drawStr(6, 1, kColorDefault, IDS_TRO_TUTORIAL_9);
-	g_system->updateScreen();
-	pressAnyKey();
-
-	clearScreen(0x19);
-	drawStr(7, 1, kColorDefault, IDS_TRO_TUTORIAL_10);
-	drawStr(8, 1, kColorDefault, IDS_TRO_TUTORIAL_11);
-	g_system->updateScreen();
-	pressAnyKey();
-
-	clearScreen(0x6E);
-	drawStr(9, 1, kColorDefault, IDS_TRO_TUTORIAL_12);
-	drawStr(10, 1, kColorDefault, IDS_TRO_TUTORIAL_13);
-	g_system->updateScreen();
-	pressAnyKey();
-
-	clearScreen(0x4C);
-	drawStr(11, 1, kColorDefault, IDS_TRO_TUTORIAL_14);
-	drawStr(12, 1, kColorDefault, IDS_TRO_TUTORIAL_15);
-	g_system->updateScreen();
-	pressAnyKey();
-
-	clearScreen(0x5D);
-	drawStr(13, 1, kColorDefault, IDS_TRO_TUTORIAL_16);
-	drawStr(14, 1, kColorDefault, IDS_TRO_TUTORIAL_17);
-	drawStr(15, 1, kColorDefault, IDS_TRO_TUTORIAL_18);
-	g_system->updateScreen();
-	pressAnyKey();
-
-	// show treasures
-	clearScreen(0x2A);
-	drawStr(2, 1, kColorDefault, IDS_TRO_TUTORIAL_19);
-	for (int i = 0; i < IDI_TRO_MAX_TREASURE; i++)
-		drawStr(19 - i, 11, kColorDefault, _items[i].name);
-
-	g_system->updateScreen();
-
-	pressAnyKey();
-}
-
-void TrollEngine::intro() {
-	// sierra on-line presents
-	clearScreen(0x2F);
-	drawStr(9, 10, kColorDefault, IDS_TRO_INTRO_0);
-	drawStr(14, 15, kColorDefault, IDS_TRO_INTRO_1);
-	g_system->updateScreen();
-	_system->delayMillis(3200);
-
-	CursorMan.showMouse(true);
-
-	// Draw logo
-	setDefaultTextColor(0x0f);
-	drawPic(45, false, true);
-	g_system->updateScreen();
-
-	// wait for keypress and alternate message
-	waitAnyKeyIntro();
-
-	// have you played this game before?
-	drawStr(22, 3, kColorDefault, IDS_TRO_INTRO_4);
-	drawStr(23, 6, kColorDefault, IDS_TRO_INTRO_5);
-	g_system->updateScreen();
-
-	if (!getSelection(kSelYesNo))
-		tutorial();
-
-	credits();
-}
-
-void TrollEngine::gameOver() {
-	// We do a check to see if the game should quit. Without this, the game show the picture, plays the
-	// music, and then quits. So if the game is quitting, we shouldn't run the "game over" part.
-	if (shouldQuit())
-		return;
-
-	char szMoves[40];
-
-	clearTextArea();
-	drawPic(42, true, true);
-
-	playTune(4, 25);
-
-	printUserMessage(16);
-
-	printUserMessage(33);
-
-	clearTextArea();
-
-	drawPic(46, true, true);
-
-	sprintf(szMoves, IDS_TRO_GAMEOVER_0, _moves);
-	drawStr(21, 1, kColorDefault, szMoves);
-	drawStr(22, 1, kColorDefault, IDS_TRO_GAMEOVER_1);
-	g_system->updateScreen();
-
-	pressAnyKey();
-}
-
-void TrollEngine::drawTroll() {
-	for (int i = 0; i < IDI_TRO_NUM_NONTROLL; i++)
-		if (_currentRoom == _nonTrollRooms[i]) {
-			_isTrollAway = true;
-			return;
-		}
-
-	drawPic(43, false, false, true);
-}
-
-int TrollEngine::drawRoom(char *menu) {
-	bool contFlag = false;
-
-	if (_currentRoom == 1) {
-		_picture->setDimensions(IDI_TRO_PIC_WIDTH, IDI_TRO_PIC_HEIGHT);
-		clearScreen(0x00, false);
-		_picture->clear();
-	} else {
-
-		if (_currentRoom != 42) {
-			if (_roomPicDeltas[_currentRoom]) {
-				contFlag = true;
-			}
-		}
-
-		drawPic(_currentRoom, contFlag, true);
-		g_system->updateScreen();
-
-		if (_currentRoom == 42) {
-			drawPic(44, false, false); // don't clear
-		} else {
-			if (!_isTrollAway) {
-				drawTroll();
-			}
-		}
-	}
-
-	g_system->updateScreen();
-
-	int n = 0;
-	strncat(menu, (char *)_gameData + _locMessagesIdx[_currentRoom], 39);
-
-	for (int i = 0; i < 3; i++) {
-		if (_roomDescs[_roomPicture - 1].options[i]) {
-			strncat(menu, Common::String::format("\n  %d.", i).c_str(), 5);
-
-			strncat(menu, (char *)_gameData + _options[_roomDescs[_roomPicture - 1].options[i] - 1], 35);
-
-			n = i + 1;
-		}
-	}
-
-	return n;
-}
-
-void TrollEngine::playTune(int tune, int len) {
-	if (!_soundOn)
-		return;
-
-	int freq, duration;
-	int ptr = _tunes[tune - 1];
-
-	for (int i = 0; i < len; i++) {
-		freq = READ_LE_UINT16(_gameData + ptr);
-		ptr += 2;
-		duration = READ_LE_UINT16(_gameData + ptr);
-		ptr += 2;
-
-		playNote(freq, duration);
-	}
-}
-
-void TrollEngine::pickupTreasure(int treasureId) {
-	_inventory[IDI_TRO_MAX_TREASURE - _treasuresLeft] = treasureId;
-
-	if (_currentRoom != 24) {
-		clearTextArea();
-		drawPic(_currentRoom, false, true);
-		g_system->updateScreen();
-	}
-
-	printUserMessage(treasureId + 16);
-
-	clearTextArea();
-
-	_treasuresLeft--;
-
-	switch (_treasuresLeft) {
-	case 1:
-		drawStr(22, 1, kColorDefault, IDS_TRO_TREASURE_7);
-		break;
-	case 0:
-		drawStr(22, 1, kColorDefault, IDS_TRO_TREASURE_8);
-		drawStr(23, 4, kColorDefault, IDS_TRO_TREASURE_9);
-
-		_roomStates[6] = 1;
-
-		_locMessagesIdx[6] = IDO_TRO_ALLTREASURES;
-		break;
-	default:
-		drawStr(22, 1, kColorDefault, Common::String::format(IDS_TRO_TREASURE_3, _treasuresLeft).c_str());
-		break;
-	}
-
-	pressAnyKey();
-}
-
-void TrollEngine::printUserMessage(int msgId) {
-	int i;
-
-	clearTextArea();
-
-	for (i = 0; i < _userMessages[msgId - 1].num; i++) {
-		drawStr(21 + i, 1, kColorDefault, _userMessages[msgId - 1].msg[i]);
-	}
-
-	if (msgId == 34) {
-		for (i = 0; i < 2; i++)
-			playTune(5, 11);
-	}
-	pressAnyKey();
-}
-
-void TrollEngine::gameLoop() {
-	bool done = false;
-	char menu[160 + 5];
-	int currentOption, numberOfOptions;
-	int roomParam;
-	int haveFlashlight;
-
-	_moves = 0;
-	_roomPicture = 1;
-	_treasuresLeft = IDI_TRO_MAX_TREASURE;
-	haveFlashlight = false;
-	_currentRoom = 0;
-	_isTrollAway = true;
-	_soundOn = true;
-
-	memset(_roomStates, 0, sizeof(_roomStates));
-
-	memset(_inventory, 0, sizeof(_inventory));
-
-	while (!done && !shouldQuit()) {
-		*menu = 0;
-
-		currentOption = 0;
-
-		numberOfOptions = drawRoom(menu);
-
-		if (getMenuSel(menu, &currentOption, numberOfOptions)) {
-			_moves++;
-		} else {
-			continue;
-		}
-
-		roomParam = _roomDescs[_roomPicture - 1].roomDescIndex[currentOption];
-
-		switch (_roomDescs[_roomPicture - 1].optionTypes[currentOption]) {
-		case OT_FLASHLIGHT:
-			if (!haveFlashlight) {
-				printUserMessage(13);
-				break;
-			}
-			// fall through
-		case OT_GO:
-			_currentRoom = roomParam;
-			_roomPicture = _roomPicStartIdx[_currentRoom];
-			_roomPicture += _roomStates[_currentRoom];
-
-			if (_currentRoom < 6 || _treasuresLeft == 0) {
-				_isTrollAway = true;
-			} else { // make odd 1:3
-				_isTrollAway = (rnd(3) != 2);
-			}
-			break;
-		case OT_GET:
-			if (!_isTrollAway) {
-				printUserMessage(34);
-			} else {
-				for (int i = 0; i < 4; i++) {
-					playTune(1, 3);
-					// delayMillis()
-				}
-
-				_roomStates[_currentRoom] = 1;
-				_roomPicDeltas[_currentRoom] = 0;
-
-				_roomPicture++;
-
-				if (_roomConnects[roomParam - 1] != 0xff) {
-					_roomStates[_roomConnects[roomParam - 1]] = 1;
-				}
-
-				if (roomParam == 1)
-					haveFlashlight = true;
-
-				_locMessagesIdx[_currentRoom] = IDO_TRO_LOCMESSAGES +
-				                                (roomParam + 42) * 39;
-
-				pickupTreasure(roomParam);
-			}
-			break;
-		case OT_DO:
-			if (roomParam != 16) {
-				printUserMessage(roomParam);
-				break;
-			}
-
-			done = true;
-			break;
-		default:
-			break;
-		}
-	}
-
-}
-
-void TrollEngine::fillOffsets() {
-	int i;
-
-	for (i = 0; i < IDI_TRO_PICNUM; i++)
-		_pictureOffsets[i] = READ_LE_UINT16(_gameData + IDO_TRO_PIC_START + i * 2);
-
-	for (i = 0; i < IDI_TRO_NUM_OPTIONS; i++)
-		_options[i] = READ_LE_UINT16(_gameData + IDO_TRO_OPTIONS + i * 2);
-
-	for (i = 0; i < IDI_TRO_NUM_NUMROOMS; i++) {
-		_roomPicStartIdx[i] = _gameData[IDO_TRO_PICSTARTIDX + i];
-		_roomPicDeltas[i] = _gameData[IDO_TRO_ROOMPICDELTAS + i];
-		_roomConnects[i] = _gameData[IDO_TRO_ROOMCONNECTS + i];
-	}
-
-	for (i = 0; i < IDI_TRO_NUM_LOCDESCS; i++)
-		_locMessagesIdx[i] = IDO_TRO_LOCMESSAGES + i * 39;
-
-	int start = READ_LE_UINT16(_gameData + IDO_TRO_ROOMDESCS);
-	int ptr;
-	int j;
-
-	for (i = 0; i < IDI_TRO_NUM_ROOMDESCS; i++, start += 2) {
-		ptr = READ_LE_UINT16(_gameData + start);
-
-		for (j = 0; j < 3; j++)
-			_roomDescs[i].options[j] = _gameData[ptr++];
-
-		for (j = 0; j < 3; j++) {
-			switch (_gameData[ptr++]) {
-			case 0:
-				_roomDescs[i].optionTypes[j] = OT_GO;
-				break;
-			case 1:
-				_roomDescs[i].optionTypes[j] = OT_GET;
-				break;
-			case 2:
-				_roomDescs[i].optionTypes[j] = OT_DO;
-				break;
-			case 3:
-				_roomDescs[i].optionTypes[j] = OT_FLASHLIGHT;
-				break;
-			default:
-				error("Bad data @ (%x) %d", ptr - 1, i);
-			}
-		}
-
-		for (j = 0; j < 3; j++)
-			_roomDescs[i].roomDescIndex[j] = _gameData[ptr++];
-	}
-
-	start = IDO_TRO_USERMESSAGES;
-
-	for (i = 0; i < IDI_TRO_NUM_USERMSGS; i++, start += 2) {
-		ptr = READ_LE_UINT16(_gameData + start);
-
-		_userMessages[i].num = _gameData[ptr++];
-
-		for (j = 0; j < _userMessages[i].num; j++, ptr += 39) {
-			memcpy(_userMessages[i].msg[j], _gameData + ptr, 39);
-			_userMessages[i].msg[j][39] = 0;
-		}
-	}
-
-	start = IDO_TRO_ITEMS;
-
-	for (i = 0; i < IDI_TRO_MAX_TREASURE; i++, start += 2) {
-		ptr = READ_LE_UINT16(_gameData + start);
-		_items[i].bg = _gameData[ptr++];
-		_items[i].fg = _gameData[ptr++];
-		memcpy(_items[i].name, _gameData + ptr, 15);
-		_items[i].name[15] = 0;
-	}
-
-	for (i = 0; i < IDO_TRO_NONTROLLROOMS; i++)
-		_nonTrollRooms[i] = _gameData[IDO_TRO_NONTROLLROOMS + i];
-
-	_tunes[0] = 0x3BFD;
-	_tunes[1] = 0x3C09;
-	_tunes[2] = 0x3C0D;
-	_tunes[3] = 0x3C11;
-	_tunes[4] = 0x3C79;
-	_tunes[5] = 0x3CA5;
-}
-
-// Init
-
-void TrollEngine::init() {
-	_picture->setPictureVersion(AGIPIC_V15);
-	//SetScreenPar(320, 200, (char *)ibm_fontdata);
-
-	const int gaps[] = { 0x3A40,  0x4600,  0x4800,  0x5800,  0x5a00,  0x6a00,
-	                     0x6c00,  0x7400,  0x7600,  0x7c00,  0x7e00,  0x8e00,
-	                     0x9000,  0xa000,  0xa200,  0xb200,  0xb400,  0xc400,
-	                     0xc600,  0xd600,  0xd800,  0xe800,  0xea00,  0xfa00,
-	                     0xfc00,  0x10c00, 0x10e00, 0x11e00, 0x12000, 0x13000
-	                   };
-
-	Common::File infile;
-	if (!infile.open(IDA_TRO_BINNAME))
-		return;
-
-	_gameData = (byte *)malloc(0xD9C0);
-
-	bool flip = true;
-	byte *ptr = _gameData;
-	int diff;
-
-	for (int i = 0; i < ARRAYSIZE(gaps) - 1; i++) {
-		diff = gaps[i + 1] - gaps[i];
-
-		if (flip) {
-			infile.seek(gaps[i]);
-			infile.read(ptr, diff);
-			ptr += diff;
-		} else {
-		}
-		flip = !flip;
-	}
-
-	// One sector is off
-	infile.seek(0x18470);
-	infile.read(_gameData + 15632, 592);
-
-	infile.close();
-
-	fillOffsets();
-}
-
-Common::Error TrollEngine::go() {
-	init();
-
-	while (!shouldQuit()) {
-		intro();
-		gameLoop();
-		gameOver();
-	}
-
-	return Common::kNoError;
-}
-
-} // End of namespace Agi
diff --git a/engines/agi/preagi_troll.h b/engines/agi/preagi_troll.h
deleted file mode 100644
index 7c4c765c4c8..00000000000
--- a/engines/agi/preagi_troll.h
+++ /dev/null
@@ -1,224 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef AGI_PREAGI_TROLL_H
-#define AGI_PREAGI_TROLL_H
-
-namespace Agi {
-
-// strings
-
-#define IDS_TRO_DISK        "ERROR ERROR !"
-#define IDS_TRO_PATH_PIC    "%s"
-
-#define IDS_TRO_PRESSANYKEY "PRESS ANY KEY TO CONTINUE:"
-
-#define IDS_TRO_INTRO_0     "SIERRA ON-LINE INC."
-#define IDS_TRO_INTRO_1     "Presents :"
-#define IDS_TRO_INTRO_2     "Copyright 1984 Sierra On-Line Inc."
-#define IDS_TRO_INTRO_3     "    Press any key to continue.    "
-#define IDS_TRO_INTRO_4     "HAVE YOU PLAYED THIS GAME BEFORE ?"
-#define IDS_TRO_INTRO_5     "PRESS <Y> OR <N>"
-
-#define IDS_TRO_TUTORIAL_0  " First press the <space bar>.\n  1. Turn the screen GREEN.\n  2. Turn the screen BLACK.\n *3. SEE a SURPRISE, and then more."
-#define IDS_TRO_TUTORIAL_1  " Press <return> to make your choice.\n  1. Turn the screen GREEN.\n  2. Turn the screen BLACK.\n  3. SEE a SURPRISE, and then more."
-//#define IDS_TRO_TUTORIAL_0    "First press the <space bar>."
-//#define IDS_TRO_TUTORIAL_1    "1. Turn the screen GREEN."
-//#define IDS_TRO_TUTORIAL_2    "2. Turn the screen BLACK."
-//#define IDS_TRO_TUTORIAL_3    "3. SEE a SURPRISE, and then more."
-//#define IDS_TRO_TUTORIAL_4    "Press <return> to make your choice."
-#define IDS_TRO_TUTORIAL_5  "Would you like more practice ?"
-#define IDS_TRO_TUTORIAL_6  "Press <Y> for yes, <N> for no."
-#define IDS_TRO_TUTORIAL_7  "The evil TROLL has hidden all the"
-#define IDS_TRO_TUTORIAL_8  "Treasures of MARK, the Dwarf King."
-#define IDS_TRO_TUTORIAL_9  "Help KING MARK find his Treasures."
-#define IDS_TRO_TUTORIAL_10 "You can't take a Treasure if the TROLL"
-#define IDS_TRO_TUTORIAL_11 "is in the same picture as the Treasure."
-#define IDS_TRO_TUTORIAL_12 "To make the TROLL go away you have to"
-#define IDS_TRO_TUTORIAL_13 "make the picture change."
-#define IDS_TRO_TUTORIAL_14 "During the game see the Treasures you"
-#define IDS_TRO_TUTORIAL_15 "have already found by pressing <F>."
-#define IDS_TRO_TUTORIAL_16 "During the game you can turn the sound"
-#define IDS_TRO_TUTORIAL_17 "on or off by pressing the <S> key "
-#define IDS_TRO_TUTORIAL_18 "while holding down the <Ctrl> key."
-#define IDS_TRO_TUTORIAL_19 "The TROLL has hidden these Treasures:"
-
-#define IDS_TRO_CREDITS_0   "Prepare to enter the world of . . ."
-#define IDS_TRO_CREDITS_1   "TROLL'S TALE (tm)"
-#define IDS_TRO_CREDITS_2   "------------"
-#define IDS_TRO_CREDITS_3   "Written by MIKE MACCHESNEY"
-#define IDS_TRO_CREDITS_4   "Conversion by PETER OLIPHANT"
-#define IDS_TRO_CREDITS_5   "Graphic Art by DOUG MACNEILL"
-#define IDS_TRO_CREDITS_6   "Original Version by AL LOWE"
-
-#define IDS_TRO_TREASURE_0  "TREASURES FOUND"
-#define IDS_TRO_TREASURE_1  "---------------"
-#define IDS_TRO_TREASURE_2  "NONE"
-#define IDS_TRO_TREASURE_3  "THERE ARE STILL %d TREASURES TO FIND"
-#define IDS_TRO_TREASURE_4  "%d TREASURES TO FIND"
-#define IDS_TRO_TREASURE_5  "%d TREASURE TO FIND"
-#define IDS_TRO_TREASURE_6  "YOU HAVE FOUND ALL OF THE TREASURES!!"
-#define IDS_TRO_TREASURE_7  "THERE'S ONLY ONE MORE TREASURE TO FIND."
-#define IDS_TRO_TREASURE_8  "GREAT!! YOU HAVE FOUND EVERY TREASURE."
-#define IDS_TRO_TREASURE_9  "TAKE THE TREASURES TO THE GUARD."
-
-#define IDS_TRO_GAMEOVER_0  "You took %d moves to complete TROLL'S"
-#define IDS_TRO_GAMEOVER_1  "TALE. Do you think you can do better?"
-
-// picture
-
-#define IDI_TRO_PICNUM 47
-
-#define IDI_TRO_PIC_WIDTH   160
-#define IDI_TRO_PIC_HEIGHT  168
-#define IDI_TRO_PIC_X0      0
-#define IDI_TRO_PIC_Y0      0
-#define IDI_TRO_PIC_FLAGS   IDF_AGI_PIC_V15
-
-// max values
-
-#define IDI_TRO_MAX_TREASURE    16
-#define IDI_TRO_MAX_OPTION      3
-
-#define IDI_TRO_SEL_OPTION_1    0
-#define IDI_TRO_SEL_OPTION_2    1
-#define IDI_TRO_SEL_OPTION_3    2
-
-#define IDI_TRO_MAX_ROW_PIC 21
-
-#define IDI_TRO_NUM_ROOMDESCS   65
-#define IDI_TRO_NUM_OPTIONS     129
-#define IDI_TRO_NUM_NUMROOMS    43
-
-#define IDI_TRO_NUM_USERMSGS    34
-
-#define IDI_TRO_NUM_LOCDESCS    59
-
-#define IDI_TRO_NUM_NONTROLL    9
-
-// offsets
-
-#define IDA_TRO_BINNAME "troll.img"
-
-#define IDO_TRO_DATA_START    0x3A40
-#define IDO_TRO_PIC_START     0x3EF5
-#define IDO_TRO_LOCMESSAGES   0x1F7C
-#define IDO_TRO_USERMESSAGES  0x34A4
-#define IDO_TRO_ROOMDESCS     0x0082
-#define IDO_TRO_OPTIONS       0x0364
-#define IDO_TRO_PICSTARTIDX   0x02CD
-#define IDO_TRO_ROOMPICDELTAS 0x030C
-#define IDO_TRO_ALLTREASURES  0x3B24
-#define IDO_TRO_ITEMS         0x34E8
-#define IDO_TRO_FRAMEPIC      0x3EC2
-#define IDO_TRO_ROOMCONNECTS  0x02FA
-#define IDO_TRO_NONTROLLROOMS 0x3CF9
-
-enum OptionType {
-	OT_GO,
-	OT_GET,
-	OT_DO,
-	OT_FLASHLIGHT
-};
-
-struct RoomDesc {
-	int options[3];
-	OptionType optionTypes[3];
-	int roomDescIndex[3];
-};
-
-struct UserMsg {
-	int num;
-	char msg[3][40];
-};
-
-struct Item {
-	byte bg;
-	byte fg;
-	char name[16];
-};
-
-class TrollEngine : public PreAgiEngine {
-public:
-	TrollEngine(OSystem *syst, const AGIGameDescription *gameDesc);
-	~TrollEngine() override;
-
-	Common::Error go() override;
-
-private:
-	int _roomPicture;
-	int _treasuresLeft;
-	int _currentRoom;
-	int _moves;
-
-	bool _isTrollAway;
-
-	int _inventory[IDI_TRO_MAX_TREASURE];
-
-	bool _soundOn;
-
-	byte *_gameData;
-
-	void init();
-	void intro();
-	void drawPic(int iPic, bool f3IsCont, bool clear, bool troll = false);
-	void drawTroll();
-	void gameLoop();
-	void gameOver();
-	void tutorial();
-	void credits();
-
-	void inventory();
-	void pickupTreasure(int treasureId);
-
-	int drawRoom(char *menu);
-	void printUserMessage(int msgId);
-
-	void pressAnyKey(int col = 4);
-	void waitAnyKeyIntro();
-
-	void playTune(int tune, int len);
-
-	bool getMenuSel(const char *, int *, int);
-
-	void drawMenu(const char *szMenu, int iSel);
-
-	void fillOffsets();
-
-	// These are come from game data
-	int _pictureOffsets[IDI_TRO_PICNUM];
-	int _roomPicStartIdx[IDI_TRO_NUM_NUMROOMS];
-	int _roomPicDeltas[IDI_TRO_NUM_NUMROOMS];
-	int _roomStates[IDI_TRO_NUM_NUMROOMS];
-	UserMsg _userMessages[IDI_TRO_NUM_USERMSGS];
-	int _locMessagesIdx[IDI_TRO_NUM_LOCDESCS];
-	RoomDesc _roomDescs[IDI_TRO_NUM_ROOMDESCS];
-	int _options[IDI_TRO_NUM_OPTIONS];
-	Item _items[IDI_TRO_MAX_TREASURE];
-	int _roomConnects[IDI_TRO_NUM_OPTIONS];
-	int _nonTrollRooms[IDO_TRO_NONTROLLROOMS];
-
-	int _tunes[6];
-};
-
-} // End of namespace Agi
-
-#endif
diff --git a/engines/agi/preagi_winnie.cpp b/engines/agi/preagi_winnie.cpp
deleted file mode 100644
index 839f41f4fb0..00000000000
--- a/engines/agi/preagi_winnie.cpp
+++ /dev/null
@@ -1,1392 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "agi/preagi.h"
-#include "agi/preagi_winnie.h"
-#include "agi/graphics.h"
-
-#include "graphics/cursorman.h"
-
-#include "common/events.h"
-#include "common/memstream.h"
-#include "common/savefile.h"
-#include "common/textconsole.h"
-
-#include "audio/mididrv.h"
-
-namespace Agi {
-
-void WinnieEngine::parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len) {
-	int i;
-
-	Common::MemoryReadStreamEndian readS(buffer, len, _isBigEndian);
-
-	roomHdr->roomNumber = readS.readByte();
-	roomHdr->objId = readS.readByte();
-	roomHdr->ofsPic = readS.readUint16();
-	roomHdr->fileLen = readS.readUint16();
-	roomHdr->reserved0 = readS.readUint16();
-
-	for (i = 0; i < IDI_WTP_MAX_DIR; i++)
-		roomHdr->roomNew[i] = readS.readByte();
-
-	roomHdr->objX = readS.readByte();
-	roomHdr->objY = readS.readByte();
-
-	roomHdr->reserved1 = readS.readUint16();
-
-	for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
-		roomHdr->ofsDesc[i] = readS.readUint16();
-
-	for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
-		roomHdr->ofsBlock[i] = readS.readUint16();
-
-	for (i = 0; i < IDI_WTP_MAX_STR; i++)
-		roomHdr->ofsStr[i] = readS.readUint16();
-
-	roomHdr->reserved2 = readS.readUint32();
-
-	for (i = 0; i < IDI_WTP_MAX_BLOCK; i++)
-		for (byte j = 0; j < IDI_WTP_MAX_BLOCK; j++)
-			roomHdr->opt[i].ofsOpt[j] = readS.readUint16();
-}
-
-void WinnieEngine::parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len) {
-	int i;
-
-	Common::MemoryReadStreamEndian readS(buffer, len, _isBigEndian);
-
-	objHdr->fileLen = readS.readUint16();
-	objHdr->objId = readS.readUint16();
-
-	for (i = 0; i < IDI_WTP_MAX_OBJ_STR_END; i++)
-		objHdr->ofsEndStr[i] = readS.readUint16();
-
-	for (i = 0; i < IDI_WTP_MAX_OBJ_STR; i++)
-		objHdr->ofsStr[i] = readS.readUint16();
-
-	objHdr->ofsPic = readS.readUint16();
-}
-
-uint32 WinnieEngine::readRoom(int iRoom, uint8 *buffer, WTP_ROOM_HDR &roomHdr) {
-	Common::String fileName;
-
-	if (getPlatform() == Common::kPlatformDOS)
-		fileName = Common::String::format(IDS_WTP_ROOM_DOS, iRoom);
-	else if (getPlatform() == Common::kPlatformAmiga)
-		fileName = Common::String::format(IDS_WTP_ROOM_AMIGA, iRoom);
-	else if (getPlatform() == Common::kPlatformC64)
-		fileName = Common::String::format(IDS_WTP_ROOM_C64, iRoom);
-	else if (getPlatform() == Common::kPlatformApple2)
-		fileName = Common::String::format(IDS_WTP_ROOM_APPLE, iRoom);
-
-	Common::File file;
-	if (!file.open(fileName)) {
-		warning("Could not open file \'%s\'", fileName.c_str());
-		return 0;
-	}
-
-	uint32 filelen = file.size();
-	if (getPlatform() == Common::kPlatformC64) { // Skip the loading address
-		filelen -= 2;
-		file.seek(2, SEEK_CUR);
-	}
-
-	memset(buffer, 0, 4096);
-	file.read(buffer, filelen);
-	file.close();
-
-	parseRoomHeader(&roomHdr, buffer, filelen);
-
-	return filelen;
-}
-
-uint32 WinnieEngine::readObj(int iObj, uint8 *buffer) {
-	Common::String fileName;
-
-	if (getPlatform() == Common::kPlatformDOS)
-		fileName = Common::String::format(IDS_WTP_OBJ_DOS, iObj);
-	else if (getPlatform() == Common::kPlatformAmiga)
-		fileName = Common::String::format(IDS_WTP_OBJ_AMIGA, iObj);
-	else if (getPlatform() == Common::kPlatformC64)
-		fileName = Common::String::format(IDS_WTP_OBJ_C64, iObj);
-	else if (getPlatform() == Common::kPlatformApple2)
-		fileName = Common::String::format(IDS_WTP_OBJ_APPLE, iObj);
-
-	Common::File file;
-	if (!file.open(fileName)) {
-		warning("Could not open file \'%s\'", fileName.c_str());
-		return 0;
-	}
-
-	uint32 filelen = file.size();
-	if (getPlatform() == Common::kPlatformC64) { // Skip the loading address
-		filelen -= 2;
-		file.seek(2, SEEK_CUR);
-	}
-
-	memset(buffer, 0, 2048);
-	file.read(buffer, filelen);
-	file.close();
-	return filelen;
-}
-
-void WinnieEngine::randomize() {
-	int iObj = 0;
-	int iRoom = 0;
-	bool done;
-
-	for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) {
-		done = false;
-
-		while (!done) {
-			iObj = rnd(IDI_WTP_MAX_OBJ - 1);
-			done = true;
-
-			for (int j = 0; j < IDI_WTP_MAX_OBJ_MISSING; j++) {
-				if (_gameStateWinnie.iUsedObj[j] == iObj) {
-					done = false;
-					break;
-				}
-			}
-		}
-
-		_gameStateWinnie.iUsedObj[i] = iObj;
-
-		done = false;
-		while (!done) {
-			iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
-			done = true;
-
-			for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
-				if (_gameStateWinnie.iObjRoom[j] == iRoom) {
-					done = false;
-					break;
-				}
-			}
-		}
-
-		_gameStateWinnie.iObjRoom[iObj] = iRoom;
-	}
-}
-
-void WinnieEngine::intro() {
-	drawPic(IDS_WTP_FILE_LOGO);
-	printStr(IDS_WTP_INTRO_0);
-	g_system->updateScreen();
-	_system->delayMillis(0x640);
-
-	if (getPlatform() == Common::kPlatformAmiga)
-		_gfx->clearDisplay(0);
-
-	drawPic(IDS_WTP_FILE_TITLE);
-
-	printStr(IDS_WTP_INTRO_1);
-	g_system->updateScreen();
-	_system->delayMillis(0x640);
-
-	if (!playSound(IDI_WTP_SND_POOH_0))
-		return;
-
-	if (!playSound(IDI_WTP_SND_POOH_1))
-		return;
-
-	if (!playSound(IDI_WTP_SND_POOH_2))
-		return;
-}
-
-int WinnieEngine::getObjInRoom(int iRoom) {
-	for (int iObj = 1; iObj < IDI_WTP_MAX_ROOM_OBJ; iObj++)
-		if (_gameStateWinnie.iObjRoom[iObj] == iRoom)
-			return iObj;
-	return 0;
-}
-
-void WinnieEngine::setTakeDrop(int fCanSel[]) {
-	fCanSel[IDI_WTP_SEL_TAKE] = getObjInRoom(_room);
-	fCanSel[IDI_WTP_SEL_DROP] = _gameStateWinnie.iObjHave;
-}
-
-void WinnieEngine::setWinnieFlag(int iFlag) {
-	_gameStateWinnie.fGame[iFlag] = 1;
-}
-
-void WinnieEngine::clearWinnieFlag(int iFlag) {
-	_gameStateWinnie.fGame[iFlag] = 0;
-}
-
-int WinnieEngine::parser(int pc, int index, uint8 *buffer) {
-	WTP_ROOM_HDR hdr;
-	int startpc = pc;
-	int8 opcode;
-	int iNewRoom = 0;
-
-	int iSel, iDir, iBlock;
-	int fCanSel[IDI_WTP_SEL_LAST + 1];
-	char szMenu[121] = {0};
-	bool done;
-	int fBlock;
-
-	// extract header from buffer
-	parseRoomHeader(&hdr, buffer, sizeof(WTP_ROOM_HDR));
-
-	while (!shouldQuit()) {
-		pc = startpc;
-
-		// check if block is to be run
-
-		iBlock = *(buffer + pc++);
-		if (iBlock == 0)
-			return IDI_WTP_PAR_OK;
-
-		fBlock = *(buffer + pc++);
-		if (_gameStateWinnie.fGame[iBlock] != fBlock)
-			return IDI_WTP_PAR_OK;
-
-		// extract text from block
-
-		opcode = *(buffer + pc);
-		switch (opcode) {
-		case 0:
-		case IDO_WTP_OPTION_0:
-		case IDO_WTP_OPTION_1:
-		case IDO_WTP_OPTION_2:
-			// clear fCanSel block
-			memset(fCanSel, 0, sizeof(fCanSel));
-
-			// check if NSEW directions should be displayed
-			if (hdr.roomNew[0]) {
-				fCanSel[IDI_WTP_SEL_NORTH] = fCanSel[IDI_WTP_SEL_SOUTH] =
-				fCanSel[IDI_WTP_SEL_EAST] = fCanSel[IDI_WTP_SEL_WEST] = true;
-			}
-
-			// check if object in room or player carrying one
-			setTakeDrop(fCanSel);
-
-			// check which rows have a menu option
-			for (iSel = 0; iSel < IDI_WTP_MAX_OPTION; iSel++) {
-				opcode = *(buffer + pc++);
-				if (opcode) {
-					fCanSel[opcode - IDO_WTP_OPTION_0] = true;
-					fCanSel[iSel + IDI_WTP_SEL_REAL_OPT_1] = opcode - 0x14;
-				}
-			}
-
-			// extract menu string
-			Common::strlcpy(szMenu, (char *)(buffer + pc), 121);
-			XOR80(szMenu);
-			break;
-		default:
-			// print description
-			printStrWinnie((char *)(buffer + pc));
-			if (getSelection(kSelBackspace) == 1)
-				return IDI_WTP_PAR_OK;
-			else
-				return IDI_WTP_PAR_BACK;
-		}
-
-		// input handler
-
-		done = false;
-		while (!done) {
-			// run wind if it's time
-			if (_doWind)
-				wind();
-
-			// get menu selection
-			getMenuSel(szMenu, &iSel, fCanSel);
-
-			if (++_gameStateWinnie.nMoves == IDI_WTP_MAX_MOVES_UNTIL_WIND)
-				_doWind = true;
-
-			if (_winnieEvent && (_room <= IDI_WTP_MAX_ROOM_TELEPORT)) {
-				if (!_tiggerMist) {
-					_tiggerMist = 1;
-					tigger();
-				} else {
-					_tiggerMist = 0;
-					mist();
-				}
-				_winnieEvent = false;
-				return IDI_WTP_PAR_GOTO;
-			}
-
-			// process selection
-			switch (iSel) {
-			case IDI_WTP_SEL_HOME:
-				switch (_room) {
-				case IDI_WTP_ROOM_HOME:
-				case IDI_WTP_ROOM_MIST:
-				case IDI_WTP_ROOM_TIGGER:
-					break;
-				default:
-					_room = IDI_WTP_ROOM_HOME;
-					return IDI_WTP_PAR_GOTO;
-				}
-				break;
-			case IDI_WTP_SEL_BACK:
-				return IDI_WTP_PAR_BACK;
-			case IDI_WTP_SEL_OPT_1:
-			case IDI_WTP_SEL_OPT_2:
-			case IDI_WTP_SEL_OPT_3:
-				done = true;
-				break;
-			case IDI_WTP_SEL_NORTH:
-			case IDI_WTP_SEL_SOUTH:
-			case IDI_WTP_SEL_EAST:
-			case IDI_WTP_SEL_WEST:
-				iDir = iSel - IDI_WTP_SEL_NORTH;
-
-				if (hdr.roomNew[iDir] == IDI_WTP_ROOM_NONE) {
-					printStr(IDS_WTP_CANT_GO);
-					getSelection(kSelAnyKey);
-				} else {
-					_room = hdr.roomNew[iDir];
-					return IDI_WTP_PAR_GOTO;
-				}
-				break;
-			case IDI_WTP_SEL_TAKE:
-				takeObj(_room);
-				setTakeDrop(fCanSel);
-				break;
-			case IDI_WTP_SEL_DROP:
-				dropObj(_room);
-				setTakeDrop(fCanSel);
-				break;
-			default:
-				break;
-			}
-		}
-
-		// jump to the script block of the selected option
-		pc = hdr.opt[index].ofsOpt[iSel] - _roomOffset;
-
-		opcode = *(buffer + pc);
-		if (!opcode) pc++;
-
-		// process script
-		do {
-			opcode = *(buffer + pc++);
-			switch (opcode) {
-			case IDO_WTP_GOTO_ROOM:
-				opcode = *(buffer + pc++);
-				iNewRoom = opcode;
-				break;
-			case IDO_WTP_PRINT_MSG:
-				opcode = *(buffer + pc++);
-				printRoomStr(_room, opcode);
-				getSelection(kSelAnyKey);
-				break;
-			case IDO_WTP_PRINT_STR:
-				opcode = *(buffer + pc++);
-				printRoomStr(_room, opcode);
-				break;
-			case IDO_WTP_DROP_OBJ:
-				opcode = *(buffer + pc++);
-				opcode = -1;
-				dropObjRnd();
-				break;
-			case IDO_WTP_FLAG_CLEAR:
-				opcode = *(buffer + pc++);
-				clearWinnieFlag(opcode);
-				break;
-			case IDO_WTP_FLAG_SET:
-				opcode = *(buffer + pc++);
-				setWinnieFlag(opcode);
-				break;
-			case IDO_WTP_GAME_OVER:
-				gameOver();
-				break;
-			case IDO_WTP_WALK_MIST:
-				_mist--;
-				if (!_mist) {
-					_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
-					return IDI_WTP_PAR_GOTO;
-				}
-				break;
-			case IDO_WTP_PLAY_SOUND:
-				opcode = *(buffer + pc++);
-				playSound((ENUM_WTP_SOUND)opcode);
-				break;
-			case IDO_WTP_SAVE_GAME:
-				saveGame();
-				_room = IDI_WTP_ROOM_HOME;
-				return IDI_WTP_PAR_GOTO;
-			case IDO_WTP_LOAD_GAME:
-				loadGame();
-				_room = IDI_WTP_ROOM_HOME;
-				return IDI_WTP_PAR_GOTO;
-			case IDO_WTP_OWL_HELP:
-				opcode = *(buffer + pc++);
-				showOwlHelp();
-				break;
-			case IDO_WTP_GOTO_RND:
-				_room = rnd(IDI_WTP_MAX_ROOM_TELEPORT) + 1;
-				return IDI_WTP_PAR_GOTO;
-			default:
-				opcode = 0;
-				break;
-			}
-		} while (opcode && !shouldQuit());
-
-		if (iNewRoom) {
-			_room = iNewRoom;
-			return IDI_WTP_PAR_GOTO;
-		}
-
-		if (iBlock == 1)
-			return IDI_WTP_PAR_OK;
-		g_system->updateScreen();
-	}
-
-	return IDI_WTP_PAR_OK;
-}
-
-void WinnieEngine::keyHelp() {
-	playSound(IDI_WTP_SND_KEYHELP);
-	printStr(IDS_WTP_HELP_0);
-	getSelection(kSelAnyKey);
-	printStr(IDS_WTP_HELP_1);
-	getSelection(kSelAnyKey);
-}
-
-void WinnieEngine::inventory() {
-	if (_gameStateWinnie.iObjHave)
-		printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_TAKE);
-	else {
-		clearTextArea();
-		drawStr(IDI_WTP_ROW_MENU, IDI_WTP_COL_MENU, IDA_DEFAULT, IDS_WTP_INVENTORY_0);
-	}
-
-	Common::String missing = Common::String::format(IDS_WTP_INVENTORY_1, _gameStateWinnie.nObjMiss);
-
-	drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_MENU, IDA_DEFAULT, missing.c_str());
-	g_system->updateScreen();
-	getSelection(kSelAnyKey);
-}
-
-void WinnieEngine::printObjStr(int iObj, int iStr) {
-	WTP_OBJ_HDR hdr;
-	uint8 *buffer = (uint8 *)malloc(2048);
-
-	readObj(iObj, buffer);
-	parseObjHeader(&hdr, buffer, sizeof(hdr));
-
-	printStrWinnie((char *)(buffer + hdr.ofsStr[iStr] - _objOffset));
-	free(buffer);
-}
-
-bool WinnieEngine::isRightObj(int iRoom, int iObj, int *iCode) {
-	WTP_ROOM_HDR roomhdr;
-	WTP_OBJ_HDR objhdr;
-	uint8 *roomdata = (uint8 *)malloc(4096);
-	uint8 *objdata = (uint8 *)malloc(2048);
-
-	readRoom(iRoom, roomdata, roomhdr);
-	readObj(iObj, objdata);
-	parseObjHeader(&objhdr, objdata, sizeof(WTP_OBJ_HDR));
-
-	free(roomdata);
-	free(objdata);
-
-	*iCode = objhdr.objId;
-
-	if (objhdr.objId == 11) objhdr.objId = 34;
-
-	if (roomhdr.objId == objhdr.objId)
-		return true;
-	else
-		return false;
-}
-
-void WinnieEngine::takeObj(int iRoom) {
-	if (_gameStateWinnie.iObjHave) {
-		// player is already carrying an object, can't take
-		printStr(IDS_WTP_CANT_TAKE);
-		getSelection(kSelAnyKey);
-	} else {
-		// take object
-		int iObj = getObjInRoom(iRoom);
-
-		_gameStateWinnie.iObjHave = iObj;
-		_gameStateWinnie.iObjRoom[iObj] = 0;
-
-		printStr(IDS_WTP_OK);
-		playSound(IDI_WTP_SND_TAKE);
-
-		drawRoomPic();
-
-		// print object "take" string
-		printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_TAKE);
-		getSelection(kSelAnyKey);
-
-		// HACK WARNING
-		if (iObj == 18) {
-			_gameStateWinnie.fGame[0x0d] = 1;
-		}
-	}
-}
-
-void WinnieEngine::dropObj(int iRoom) {
-	int iCode;
-
-	if (getObjInRoom(iRoom)) {
-		// there already is an object in the room, can't drop
-		printStr(IDS_WTP_CANT_DROP);
-		getSelection(kSelAnyKey);
-	} else {
-		// HACK WARNING
-		if (_gameStateWinnie.iObjHave == 18) {
-			_gameStateWinnie.fGame[0x0d] = 0;
-		}
-
-		if (isRightObj(iRoom, _gameStateWinnie.iObjHave, &iCode)) {
-			// object has been dropped in the right place
-			printStr(IDS_WTP_OK);
-			getSelection(kSelAnyKey);
-			playSound(IDI_WTP_SND_DROP_OK);
-			printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_DROP);
-			getSelection(kSelAnyKey);
-
-			// increase amount of objects returned, decrease amount of objects missing
-			_gameStateWinnie.nObjMiss--;
-			_gameStateWinnie.nObjRet++;
-
-			// xor the dropped object with 0x80 to signify it has been dropped in the right place
-			for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) {
-				if (_gameStateWinnie.iUsedObj[i] == _gameStateWinnie.iObjHave) {
-					_gameStateWinnie.iUsedObj[i] ^= 0x80;
-					break;
-				}
-			}
-
-			// set flag according to dropped object's id
-			_gameStateWinnie.fGame[iCode] = 1;
-
-			// player is carrying nothing
-			_gameStateWinnie.iObjHave = 0;
-
-			if (!_gameStateWinnie.nObjMiss) {
-				// all objects returned, tell player to find party
-				playSound(IDI_WTP_SND_FANFARE);
-				printStr(IDS_WTP_GAME_OVER_0);
-				getSelection(kSelAnyKey);
-				printStr(IDS_WTP_GAME_OVER_1);
-				getSelection(kSelAnyKey);
-			}
-		} else {
-			// drop object in the given room
-			_gameStateWinnie.iObjRoom[_gameStateWinnie.iObjHave] = iRoom;
-
-			// object has been dropped in the wrong place
-			printStr(IDS_WTP_WRONG_PLACE);
-			getSelection(kSelAnyKey);
-
-			playSound(IDI_WTP_SND_DROP);
-			drawRoomPic();
-
-			printStr(IDS_WTP_WRONG_PLACE);
-			getSelection(kSelAnyKey);
-
-			// print object description
-			printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_DESC);
-			getSelection(kSelAnyKey);
-
-			_gameStateWinnie.iObjHave = 0;
-		}
-	}
-}
-
-void WinnieEngine::dropObjRnd() {
-	if (!_gameStateWinnie.iObjHave)
-		return;
-
-	int iRoom = 0;
-	bool done = false;
-
-	while (!done) {
-		iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
-		done = true;
-		if (iRoom == _room)
-			done = false;
-		for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
-			if (_gameStateWinnie.iObjRoom[j] == iRoom) {
-				done = false;
-			}
-		}
-	}
-
-	_gameStateWinnie.iObjRoom[_gameStateWinnie.iObjHave] = iRoom;
-	_gameStateWinnie.iObjHave = 0;
-}
-
-void WinnieEngine::wind() {
-	int iRoom = 0;
-	bool done;
-
-	_doWind = 0;
-	_gameStateWinnie.nMoves = 0;
-	if (!_gameStateWinnie.nObjMiss)
-		return;
-
-	printStr(IDS_WTP_WIND_0);
-	playSound(IDI_WTP_SND_WIND_0);
-	getSelection(kSelAnyKey);
-
-	printStr(IDS_WTP_WIND_1);
-	playSound(IDI_WTP_SND_WIND_0);
-	getSelection(kSelAnyKey);
-
-	dropObjRnd();
-
-	// randomize positions of objects at large
-	for (int i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++) {
-		if (!(_gameStateWinnie.iUsedObj[i] & IDI_XOR_KEY)) {
-			done = false;
-			while (!done) {
-				iRoom = rnd(IDI_WTP_MAX_ROOM_NORMAL);
-				done = true;
-
-				for (int j = 0; j < IDI_WTP_MAX_ROOM_OBJ; j++) {
-					if (_gameStateWinnie.iObjRoom[j] == iRoom) {
-						done = false;
-					}
-				}
-			}
-			_gameStateWinnie.iObjRoom[_gameStateWinnie.iUsedObj[i]] = iRoom;
-		}
-	}
-}
-
-void WinnieEngine::mist() {
-	// mist length in turns is (2-5)
-	_mist = rnd(4) + 2;
-
-	_room = IDI_WTP_ROOM_MIST;
-	drawRoomPic();
-
-	printStr(IDS_WTP_MIST);
-}
-
-void WinnieEngine::tigger() {
-	_room = IDI_WTP_ROOM_TIGGER;
-
-	drawRoomPic();
-	printStr(IDS_WTP_TIGGER);
-
-	dropObjRnd();
-}
-
-void WinnieEngine::showOwlHelp() {
-	if (_gameStateWinnie.iObjHave) {
-		printStr(IDS_WTP_OWL_0);
-		getSelection(kSelAnyKey);
-		printObjStr(_gameStateWinnie.iObjHave, IDI_WTP_OBJ_HELP);
-		getSelection(kSelAnyKey);
-	}
-	if (getObjInRoom(_room)) {
-		printStr(IDS_WTP_OWL_0);
-		getSelection(kSelAnyKey);
-		printObjStr(getObjInRoom(_room), IDI_WTP_OBJ_HELP);
-		getSelection(kSelAnyKey);
-	}
-}
-
-
-void WinnieEngine::drawMenu(char *szMenu, int iSel, int fCanSel[]) {
-	int iRow = 0, iCol = 0;
-
-	clearTextArea();
-	drawStr(IDI_WTP_ROW_MENU, IDI_WTP_COL_MENU, IDA_DEFAULT, szMenu);
-
-	if (fCanSel[IDI_WTP_SEL_NORTH])
-		drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_NSEW, IDA_DEFAULT, IDS_WTP_NSEW);
-	if (fCanSel[IDI_WTP_SEL_TAKE])
-		drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_TAKE, IDA_DEFAULT, IDS_WTP_TAKE);
-	if (fCanSel[IDI_WTP_SEL_DROP])
-		drawStr(IDI_WTP_ROW_OPTION_4, IDI_WTP_COL_DROP, IDA_DEFAULT, IDS_WTP_DROP);
-
-	switch (iSel) {
-	case IDI_WTP_SEL_OPT_1:
-	case IDI_WTP_SEL_OPT_2:
-	case IDI_WTP_SEL_OPT_3:
-		iRow = IDI_WTP_ROW_OPTION_1 + iSel;
-		iCol = IDI_WTP_COL_OPTION;
-		break;
-	case IDI_WTP_SEL_NORTH:
-		iRow = IDI_WTP_ROW_OPTION_4;
-		iCol = IDI_WTP_COL_NORTH;
-		break;
-	case IDI_WTP_SEL_SOUTH:
-		iRow = IDI_WTP_ROW_OPTION_4;
-		iCol = IDI_WTP_COL_SOUTH;
-		break;
-	case IDI_WTP_SEL_EAST:
-		iRow = IDI_WTP_ROW_OPTION_4;
-		iCol = IDI_WTP_COL_EAST;
-		break;
-	case IDI_WTP_SEL_WEST:
-		iRow = IDI_WTP_ROW_OPTION_4;
-		iCol = IDI_WTP_COL_WEST;
-		break;
-	case IDI_WTP_SEL_TAKE:
-		iRow = IDI_WTP_ROW_OPTION_4;
-		iCol = IDI_WTP_COL_TAKE;
-		break;
-	case IDI_WTP_SEL_DROP:
-		iRow = IDI_WTP_ROW_OPTION_4;
-		iCol = IDI_WTP_COL_DROP;
-		break;
-	default:
-		break;
-	}
-	drawStr(iRow, iCol - 1, IDA_DEFAULT, ">");
-	g_system->updateScreen();
-}
-
-void WinnieEngine::incMenuSel(int *iSel, int fCanSel[]) {
-	do {
-		*iSel += 1;
-		if (*iSel > IDI_WTP_SEL_DROP) *iSel = IDI_WTP_SEL_OPT_1;
-	} while (!fCanSel[*iSel]);
-}
-
-void WinnieEngine::decMenuSel(int *iSel, int fCanSel[]) {
-	do {
-		*iSel -= 1;
-		if (*iSel < IDI_WTP_SEL_OPT_1) *iSel = IDI_WTP_SEL_DROP;
-	} while (!fCanSel[*iSel]);
-}
-
-void WinnieEngine::getMenuMouseSel(int *iSel, int fCanSel[], int x, int y) {
-	switch (y) {
-	case IDI_WTP_ROW_OPTION_1:
-	case IDI_WTP_ROW_OPTION_2:
-	case IDI_WTP_ROW_OPTION_3:
-		if (fCanSel[y - IDI_WTP_ROW_OPTION_1])  *iSel = y - IDI_WTP_ROW_OPTION_1;
-		break;
-	case IDI_WTP_ROW_OPTION_4:
-		if (fCanSel[IDI_WTP_SEL_NORTH] && (x > IDI_WTP_COL_NORTH - 1) && (x < 6)) *iSel = IDI_WTP_SEL_NORTH;
-		if (fCanSel[IDI_WTP_SEL_SOUTH] && (x > IDI_WTP_COL_SOUTH - 1) && (x < 13)) *iSel = IDI_WTP_SEL_SOUTH;
-		if (fCanSel[IDI_WTP_SEL_EAST] && (x > IDI_WTP_COL_EAST - 1) && (x < 19)) *iSel = IDI_WTP_SEL_EAST;
-		if (fCanSel[IDI_WTP_SEL_WEST] && (x > IDI_WTP_COL_WEST - 1) && (x < 25)) *iSel = IDI_WTP_SEL_WEST;
-		if (fCanSel[IDI_WTP_SEL_TAKE] && (x > IDI_WTP_COL_TAKE - 1) && (x < 33)) *iSel = IDI_WTP_SEL_TAKE;
-		if (fCanSel[IDI_WTP_SEL_DROP] && (x > IDI_WTP_COL_DROP - 1) && (x < 39)) *iSel = IDI_WTP_SEL_DROP;
-		break;
-	default:
-		break;
-	}
-}
-
-void WinnieEngine::makeSel(int *iSel, int fCanSel[]) {
-	if (fCanSel[*iSel])
-		return;
-
-	keyHelp();
-	clrMenuSel(iSel, fCanSel);
-}
-
-void WinnieEngine::getMenuSel(char *szMenu, int *iSel, int fCanSel[]) {
-	Common::Event event;
-	int x, y;
-
-	clrMenuSel(iSel, fCanSel);
-	drawMenu(szMenu, *iSel, fCanSel);
-
-	// Show the mouse cursor for the menu
-	CursorMan.showMouse(true);
-
-	while (!shouldQuit()) {
-		while (_system->getEventManager()->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_RETURN_TO_LAUNCHER:
-			case Common::EVENT_QUIT:
-				return;
-			case Common::EVENT_MOUSEMOVE:
-				x = event.mouse.x / 8;
-				y = event.mouse.y / 8;
-				getMenuMouseSel(iSel, fCanSel, x, y);
-
-				// Change cursor
-				if (fCanSel[IDI_WTP_SEL_NORTH] && hotspotNorth.contains(event.mouse.x, event.mouse.y)) {
-					//_gfx->setCursorPalette(true);
-					// ????
-				} else if (fCanSel[IDI_WTP_SEL_SOUTH] && hotspotSouth.contains(event.mouse.x, event.mouse.y)) {
-					//_gfx->setCursorPalette(true);
-				} else if (fCanSel[IDI_WTP_SEL_WEST] && hotspotWest.contains(event.mouse.x, event.mouse.y)) {
-					//_gfx->setCursorPalette(true);
-				} else if (fCanSel[IDI_WTP_SEL_EAST] && hotspotEast.contains(event.mouse.x, event.mouse.y)) {
-					//_gfx->setCursorPalette(true);
-				} else {
-					//_gfx->setCursorPalette(false);
-				}
-
-				break;
-			case Common::EVENT_LBUTTONUP:
-				// Click to move
-				if (fCanSel[IDI_WTP_SEL_NORTH] && hotspotNorth.contains(event.mouse.x, event.mouse.y)) {
-					*iSel = IDI_WTP_SEL_NORTH;
-					makeSel(iSel, fCanSel);
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					return;
-				} else if (fCanSel[IDI_WTP_SEL_SOUTH] && hotspotSouth.contains(event.mouse.x, event.mouse.y)) {
-					*iSel = IDI_WTP_SEL_SOUTH;
-					makeSel(iSel, fCanSel);
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					return;
-				} else if (fCanSel[IDI_WTP_SEL_WEST] && hotspotWest.contains(event.mouse.x, event.mouse.y)) {
-					*iSel = IDI_WTP_SEL_WEST;
-					makeSel(iSel, fCanSel);
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					return;
-				} else if (fCanSel[IDI_WTP_SEL_EAST] && hotspotEast.contains(event.mouse.x, event.mouse.y)) {
-					*iSel = IDI_WTP_SEL_EAST;
-					makeSel(iSel, fCanSel);
-					//_gfx->setCursorPalette(false);
-					// TODO???
-					return;
-				} else {
-					//_gfx->setCursorPalette(false);
-					// TODO???
-				}
-
-				switch (*iSel) {
-				case IDI_WTP_SEL_OPT_1:
-				case IDI_WTP_SEL_OPT_2:
-				case IDI_WTP_SEL_OPT_3:
-					for (int iSel2 = 0; iSel2 < IDI_WTP_MAX_OPTION; iSel2++) {
-						if (*iSel == (fCanSel[iSel2 + IDI_WTP_SEL_REAL_OPT_1] - 1)) {
-							*iSel = iSel2;
-							// Menu selection made, hide the mouse cursor
-							CursorMan.showMouse(false);
-							return;
-						}
-					}
-					break;
-				default:
-					if (fCanSel[*iSel]) {
-						// Menu selection made, hide the mouse cursor
-						CursorMan.showMouse(false);
-						return;
-					}
-					break;
-				}
-				break;
-			case Common::EVENT_RBUTTONUP:
-				*iSel = IDI_WTP_SEL_BACK;
-				// Menu selection made, hide the mouse cursor
-				CursorMan.showMouse(false);
-				return;
-			case Common::EVENT_WHEELUP:
-				decMenuSel(iSel, fCanSel);
-				break;
-			case Common::EVENT_WHEELDOWN:
-				incMenuSel(iSel, fCanSel);
-				break;
-			case Common::EVENT_KEYDOWN:
-				switch (event.kbd.keycode) {
-				case Common::KEYCODE_ESCAPE:
-					*iSel = IDI_WTP_SEL_HOME;
-					// Menu selection made, hide the mouse cursor
-					CursorMan.showMouse(false);
-					return;
-				case Common::KEYCODE_BACKSPACE:
-					*iSel = IDI_WTP_SEL_BACK;
-					// Menu selection made, hide the mouse cursor
-					CursorMan.showMouse(false);
-					return;
-				case Common::KEYCODE_c:
-					inventory();
-					break;
-				case Common::KEYCODE_SPACE:
-				case Common::KEYCODE_RIGHT:
-				case Common::KEYCODE_DOWN:
-					incMenuSel(iSel, fCanSel);
-					break;
-				case Common::KEYCODE_LEFT:
-				case Common::KEYCODE_UP:
-					decMenuSel(iSel, fCanSel);
-					break;
-				case Common::KEYCODE_1:
-				case Common::KEYCODE_2:
-				case Common::KEYCODE_3:
-					*iSel = event.kbd.keycode - Common::KEYCODE_1;
-					if (fCanSel[*iSel + IDI_WTP_SEL_REAL_OPT_1]) {
-						// Menu selection made, hide the mouse cursor
-						CursorMan.showMouse(false);
-						return;
-					} else {
-						keyHelp();
-						clrMenuSel(iSel, fCanSel);
-					}
-					break;
-				case Common::KEYCODE_n:
-					*iSel = IDI_WTP_SEL_NORTH;
-					makeSel(iSel, fCanSel);
-					break;
-				case Common::KEYCODE_s:
-					if (event.kbd.flags & Common::KBD_CTRL) {
-						flipFlag(VM_FLAG_SOUND_ON);
-					} else {
-						*iSel = IDI_WTP_SEL_SOUTH;
-						makeSel(iSel, fCanSel);
-					}
-					break;
-				case Common::KEYCODE_e:
-					*iSel = IDI_WTP_SEL_EAST;
-					makeSel(iSel, fCanSel);
-					break;
-				case Common::KEYCODE_w:
-					*iSel = IDI_WTP_SEL_WEST;
-					makeSel(iSel, fCanSel);
-					break;
-				case Common::KEYCODE_t:
-					*iSel = IDI_WTP_SEL_TAKE;
-					makeSel(iSel, fCanSel);
-					break;
-				case Common::KEYCODE_d:
-					*iSel = IDI_WTP_SEL_DROP;
-					makeSel(iSel, fCanSel);
-					break;
-				case Common::KEYCODE_RETURN:
-					switch (*iSel) {
-					case IDI_WTP_SEL_OPT_1:
-					case IDI_WTP_SEL_OPT_2:
-					case IDI_WTP_SEL_OPT_3:
-						for (int iSel2 = 0; iSel2 < IDI_WTP_MAX_OPTION; iSel2++) {
-							if (*iSel == (fCanSel[iSel2 + IDI_WTP_SEL_REAL_OPT_1] - 1)) {
-								*iSel = iSel2;
-								// Menu selection made, hide the mouse cursor
-								CursorMan.showMouse(false);
-								return;
-							}
-						}
-						break;
-					default:
-						if (fCanSel[*iSel]) {
-							// Menu selection made, hide the mouse cursor
-							CursorMan.showMouse(false);
-							return;
-						}
-						break;
-					}
-					break;
-				default:
-					if (!event.kbd.flags) { // if the control/alt/shift keys are not pressed
-						keyHelp();
-						clrMenuSel(iSel, fCanSel);
-					}
-					break;
-				}
-				break;
-			default:
-				break;
-			}
-
-			drawMenu(szMenu, *iSel, fCanSel);
-		}
-	}
-}
-
-void WinnieEngine::gameLoop() {
-	WTP_ROOM_HDR hdr;
-	uint8 *roomdata = (uint8 *)malloc(4096);
-	int iBlock;
-	uint8 decodePhase = 0;
-
-	while (!shouldQuit()) {
-		if (decodePhase == 0) {
-			if (!_gameStateWinnie.nObjMiss && (_room == IDI_WTP_ROOM_PICNIC))
-				_room = IDI_WTP_ROOM_PARTY;
-
-			readRoom(_room, roomdata, hdr);
-			drawRoomPic();
-			g_system->updateScreen();
-			decodePhase = 1;
-		}
-
-		if (decodePhase == 1) {
-			if (getObjInRoom(_room)) {
-				printObjStr(getObjInRoom(_room), IDI_WTP_OBJ_DESC);
-				getSelection(kSelAnyKey);
-			}
-			decodePhase = 2;
-		}
-
-		if (decodePhase == 2) {
-			for (iBlock = 0; iBlock < IDI_WTP_MAX_BLOCK; iBlock++) {
-				if (parser(hdr.ofsDesc[iBlock] - _roomOffset, iBlock, roomdata) == IDI_WTP_PAR_BACK) {
-					decodePhase = 1;
-					break;
-				}
-			}
-			if (decodePhase == 2)
-				decodePhase = 3;
-		}
-
-		if (decodePhase == 3) {
-			for (iBlock = 0; iBlock < IDI_WTP_MAX_BLOCK; iBlock++) {
-				if (parser(hdr.ofsBlock[iBlock] - _roomOffset, iBlock, roomdata) == IDI_WTP_PAR_GOTO) {
-					decodePhase = 0;
-					break;
-				} else if (parser(hdr.ofsBlock[iBlock] - _roomOffset, iBlock, roomdata) == IDI_WTP_PAR_BACK) {
-					decodePhase = 2;
-					break;
-				}
-			}
-		}
-	}
-
-	free(roomdata);
-}
-
-void WinnieEngine::drawPic(const char *szName) {
-	Common::String fileName = szName;
-
-	if (getPlatform() != Common::kPlatformAmiga)
-		fileName += ".pic";
-	else
-		fileName = "misc/" + fileName;
-
-	Common::File file;
-
-	if (!file.open(fileName)) {
-		warning("Could not open file \'%s\'", fileName.c_str());
-		return;
-	}
-
-	uint8 *buffer = (uint8 *)malloc(4096);
-	uint32 size = file.size();
-	file.read(buffer, size);
-	file.close();
-
-	_picture->decodePicture(buffer, size, 1, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
-	_picture->showPic(IDI_WTP_PIC_X0, IDI_WTP_PIC_Y0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
-
-	free(buffer);
-}
-
-void WinnieEngine::drawObjPic(int iObj, int x0, int y0) {
-	if (!iObj)
-		return;
-
-	WTP_OBJ_HDR objhdr;
-	uint8 *buffer = (uint8 *)malloc(2048);
-	uint32 objSize = readObj(iObj, buffer);
-	parseObjHeader(&objhdr, buffer, sizeof(WTP_OBJ_HDR));
-
-	_picture->setOffset(x0, y0);
-	_picture->decodePicture(buffer + objhdr.ofsPic - _objOffset, objSize, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
-	_picture->setOffset(0, 0);
-	_picture->showPic(10, 0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
-
-	free(buffer);
-}
-
-void WinnieEngine::drawRoomPic() {
-	WTP_ROOM_HDR roomhdr;
-	uint8 *buffer = (uint8 *)malloc(4096);
-	int iObj = getObjInRoom(_room);
-
-	// clear gfx screen
-	_gfx->clearDisplay(0);
-
-	// read room picture
-	readRoom(_room, buffer, roomhdr);
-
-	// draw room picture
-	_picture->decodePicture(buffer + roomhdr.ofsPic - _roomOffset, 4096, 1, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
-	_picture->showPic(IDI_WTP_PIC_X0, IDI_WTP_PIC_Y0, IDI_WTP_PIC_WIDTH, IDI_WTP_PIC_HEIGHT);
-
-	// draw object picture
-	drawObjPic(iObj, IDI_WTP_PIC_X0 + roomhdr.objX, IDI_WTP_PIC_Y0 + roomhdr.objY);
-
-	free(buffer);
-}
-
-bool WinnieEngine::playSound(ENUM_WTP_SOUND iSound) {
-	// TODO: Only DOS sound is supported, currently
-	if (getPlatform() != Common::kPlatformDOS) {
-		warning("STUB: playSound(%d)", iSound);
-		return false;
-	}
-
-	Common::String fileName = Common::String::format(IDS_WTP_SND_DOS, iSound);
-
-	Common::File file;
-	if (!file.open(fileName))
-		return false;
-
-	uint32 size = file.size();
-	byte *data = new byte[size];
-	file.read(data, size);
-	file.close();
-
-	_game.sounds[0] = AgiSound::createFromRawResource(data, size, 0, _soundemu);
-	_sound->startSound(0, 0);
-
-	bool cursorShowing = CursorMan.showMouse(false);
-	_system->updateScreen();
-
-	// Loop until the sound is done
-	bool skippedSound = false;
-	while (!shouldQuit() && _game.sounds[0]->isPlaying()) {
-		Common::Event event;
-		while (_system->getEventManager()->pollEvent(event)) {
-			switch (event.type) {
-			case Common::EVENT_KEYDOWN:
-				_sound->stopSound();
-				skippedSound = true;
-				break;
-			default:
-				break;
-			}
-		}
-
-		_system->delayMillis(10);
-	}
-
-	if (cursorShowing) {
-		CursorMan.showMouse(true);
-		_system->updateScreen();
-	}
-
-	delete _game.sounds[0];
-	_game.sounds[0] = nullptr;
-
-	return !shouldQuit() && !skippedSound;
-}
-
-void WinnieEngine::clrMenuSel(int *iSel, int fCanSel[]) {
-	*iSel = IDI_WTP_SEL_OPT_1;
-	while (!fCanSel[*iSel]) {
-		*iSel += 1;
-	}
-	//_gfx->setCursorPalette(false);
-	// TODO???
-}
-
-void WinnieEngine::printRoomStr(int iRoom, int iStr) {
-	WTP_ROOM_HDR hdr;
-	uint8 *buffer = (uint8 *)malloc(4096);
-
-	readRoom(iRoom, buffer, hdr);
-	printStrWinnie((char *)(buffer + hdr.ofsStr[iStr - 1] - _roomOffset));
-
-	free(buffer);
-}
-
-void WinnieEngine::gameOver() {
-	// sing the Pooh song forever
-	while (!shouldQuit()) {
-		printStr(IDS_WTP_SONG_0);
-		playSound(IDI_WTP_SND_POOH_0);
-		printStr(IDS_WTP_SONG_1);
-		playSound(IDI_WTP_SND_POOH_1);
-		printStr(IDS_WTP_SONG_2);
-		playSound(IDI_WTP_SND_POOH_2);
-		getSelection(kSelAnyKey);
-	}
-}
-
-void WinnieEngine::saveGame() {
-	int i = 0;
-
-	Common::OutSaveFile *outfile = getSaveFileMan()->openForSaving(IDS_WTP_FILE_SAVEGAME);
-
-	if (!outfile)
-		return;
-
-	outfile->writeUint32BE(MKTAG('W', 'I', 'N', 'N')); // header
-	outfile->writeByte(WTP_SAVEGAME_VERSION);
-
-	outfile->writeByte(_gameStateWinnie.fSound);
-	outfile->writeByte(_gameStateWinnie.nMoves);
-	outfile->writeByte(_gameStateWinnie.nObjMiss);
-	outfile->writeByte(_gameStateWinnie.nObjRet);
-	outfile->writeByte(_gameStateWinnie.iObjHave);
-
-	for (i = 0; i < IDI_WTP_MAX_FLAG; i++)
-		outfile->writeByte(_gameStateWinnie.fGame[i]);
-
-	for (i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++)
-		outfile->writeByte(_gameStateWinnie.iUsedObj[i]);
-
-	for (i = 0; i < IDI_WTP_MAX_ROOM_OBJ; i++)
-		outfile->writeByte(_gameStateWinnie.iObjRoom[i]);
-
-	outfile->finalize();
-
-	if (outfile->err())
-		warning("Can't write file '%s'. (Disk full?)", IDS_WTP_FILE_SAVEGAME);
-
-	delete outfile;
-}
-
-void WinnieEngine::loadGame() {
-	int saveVersion = 0;
-	int i = 0;
-
-	Common::InSaveFile *infile = getSaveFileMan()->openForLoading(IDS_WTP_FILE_SAVEGAME);
-
-	if (!infile)
-		return;
-
-	if (infile->readUint32BE() == MKTAG('W', 'I', 'N', 'N')) {
-		saveVersion = infile->readByte();
-		if (saveVersion != WTP_SAVEGAME_VERSION)
-			warning("Old save game version (%d, current version is %d). Will try and read anyway, but don't be surprised if bad things happen", saveVersion, WTP_SAVEGAME_VERSION);
-
-		_gameStateWinnie.fSound = infile->readByte();
-		_gameStateWinnie.nMoves = infile->readByte();
-		_gameStateWinnie.nObjMiss = infile->readByte();
-		_gameStateWinnie.nObjRet = infile->readByte();
-		_gameStateWinnie.iObjHave = infile->readByte();
-	} else {
-		// This is probably a save from the original interpreter, throw a warning and attempt
-		// to read it as LE
-		warning("No header found in save game, assuming it came from the original interpreter");
-		// Note that the original saves variables as 16-bit integers, but only 8 bits are used.
-		// Since we read the save file data as little-endian, we skip the first byte of each
-		// variable
-
-		infile->seek(0);                    // Jump back to the beginning of the file
-
-		infile->readUint16LE();             // skip unused field
-		infile->readByte();                 // first 8 bits of fSound
-		_gameStateWinnie.fSound = infile->readByte();
-		infile->readByte();                 // first 8 bits of nMoves
-		_gameStateWinnie.nMoves = infile->readByte();
-		infile->readByte();                 // first 8 bits of nObjMiss
-		_gameStateWinnie.nObjMiss = infile->readByte();
-		infile->readByte();                 // first 8 bits of nObjRet
-		_gameStateWinnie.nObjRet = infile->readByte();
-		infile->readUint16LE();             // skip unused field
-		infile->readUint16LE();             // skip unused field
-		infile->readUint16LE();             // skip unused field
-		infile->readByte();                 // first 8 bits of iObjHave
-		_gameStateWinnie.iObjHave = infile->readByte();
-		infile->readUint16LE();             // skip unused field
-		infile->readUint16LE();             // skip unused field
-		infile->readUint16LE();             // skip unused field
-	}
-
-	for (i = 0; i < IDI_WTP_MAX_FLAG; i++)
-		_gameStateWinnie.fGame[i] = infile->readByte();
-
-	for (i = 0; i < IDI_WTP_MAX_OBJ_MISSING; i++)
-		_gameStateWinnie.iUsedObj[i] = infile->readByte();
-
-	for (i = 0; i < IDI_WTP_MAX_ROOM_OBJ; i++)
-		_gameStateWinnie.iObjRoom[i] = infile->readByte();
-
-	// Note that saved games from the original interpreter have 2 more 16-bit fields here
-	// which are ignored
-
-	delete infile;
-}
-
-void WinnieEngine::printStrWinnie(char *szMsg) {
-	if (getPlatform() != Common::kPlatformAmiga)
-		printStrXOR(szMsg);
-	else
-		printStr(szMsg);
-}
-
-// Console-related functions
-
-void WinnieEngine::debugCurRoom() {
-	getDebugger()->debugPrintf("Current Room = %d\n", _room);
-}
-
-WinnieEngine::WinnieEngine(OSystem *syst, const AGIGameDescription *gameDesc) : PreAgiEngine(syst, gameDesc) {
-	setDebugger(new WinnieConsole(this));
-}
-
-WinnieEngine::~WinnieEngine() {
-}
-
-void WinnieEngine::init() {
-	// Initialize sound
-
-	switch (MidiDriver::getMusicType(MidiDriver::detectDevice(MDT_PCSPK | MDT_PCJR))) {
-	case MT_PCSPK:
-		_soundemu = SOUND_EMU_PC;
-		break;
-	case MT_PCJR:
-		_soundemu = SOUND_EMU_PCJR;
-		break;
-	default:
-		_soundemu = SOUND_EMU_NONE;
-		break;
-	}
-
-	_sound = new SoundMgr(this, _mixer);
-	setFlag(VM_FLAG_SOUND_ON, true); // enable sound
-
-	memset(&_gameStateWinnie, 0, sizeof(_gameStateWinnie));
-	_gameStateWinnie.fSound = 1;
-	_gameStateWinnie.nObjMiss = IDI_WTP_MAX_OBJ_MISSING;
-	_gameStateWinnie.nObjRet = 0;
-	_gameStateWinnie.fGame[0] = 1;
-	_gameStateWinnie.fGame[1] = 1;
-	_room = IDI_WTP_ROOM_HOME;
-
-	_mist = -1;
-	_doWind = false;
-	_winnieEvent = false;
-
-	if (getPlatform() != Common::kPlatformAmiga) {
-		_isBigEndian = false;
-		_roomOffset = IDI_WTP_OFS_ROOM;
-		_objOffset = IDI_WTP_OFS_OBJ;
-	} else {
-		_isBigEndian = true;
-		_roomOffset = 0;
-		_objOffset = 0;
-	}
-
-	if (getPlatform() == Common::kPlatformC64 || getPlatform() == Common::kPlatformApple2)
-		_picture->setPictureVersion(AGIPIC_C64);
-
-	hotspotNorth = Common::Rect(20, 0, (IDI_WTP_PIC_WIDTH + 10) * 2, 10);
-	hotspotSouth = Common::Rect(20, IDI_WTP_PIC_HEIGHT - 10, (IDI_WTP_PIC_WIDTH + 10) * 2, IDI_WTP_PIC_HEIGHT);
-	hotspotEast  = Common::Rect(IDI_WTP_PIC_WIDTH * 2, 0, (IDI_WTP_PIC_WIDTH + 10) * 2, IDI_WTP_PIC_HEIGHT);
-	hotspotWest  = Common::Rect(20, 0, 30, IDI_WTP_PIC_HEIGHT);
-}
-
-Common::Error WinnieEngine::go() {
-	init();
-	randomize();
-
-	// The intro is not supported on these platforms yet
-	if (getPlatform() != Common::kPlatformC64 && getPlatform() != Common::kPlatformApple2)
-		intro();
-
-	gameLoop();
-
-	return Common::kNoError;
-}
-
-} // End of namespace AGI
diff --git a/engines/agi/preagi_winnie.h b/engines/agi/preagi_winnie.h
deleted file mode 100644
index 399f640b82b..00000000000
--- a/engines/agi/preagi_winnie.h
+++ /dev/null
@@ -1,355 +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 3 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, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef AGI_PREAGI_WINNIE_H
-#define AGI_PREAGI_WINNIE_H
-
-namespace Agi {
-
-#define WTP_SAVEGAME_VERSION    1
-#define IDI_XOR_KEY             0x80
-
-// strings
-#define IDS_WTP_ROOM_DOS        "rooms/rm.%02d"
-#define IDS_WTP_ROOM_AMIGA      "rooms/room.%d"
-#define IDS_WTP_ROOM_C64        "room%02d"
-#define IDS_WTP_ROOM_APPLE      "room%d.obj"
-#define IDS_WTP_OBJ_DOS         "obj.%02d"
-#define IDS_WTP_OBJ_AMIGA       "objects/object.%d"
-#define IDS_WTP_OBJ_C64         "object%02d"
-#define IDS_WTP_OBJ_APPLE       "object%d.obj"
-#define IDS_WTP_SND_DOS         "snd.%02d"
-#define IDS_WTP_SND_AMIGA       "Sounds"
-#define IDS_WTP_SND_C64         "sound.obj"
-#define IDS_WTP_SND_APPLE       "sound.obj"
-
-#define IDS_WTP_FILE_LOGO       "logo"
-#define IDS_WTP_FILE_TITLE      "title"
-#define IDS_WTP_FILE_SAVEGAME   "savegame"
-#define IDS_WTP_FILE_RND        "rnd"
-
-#define IDS_WTP_DISK_ERROR      "There is a problem with your disk drive.Please make sure your Winnie-the-Pooh   disk is in the drive correctly."
-
-#define IDS_WTP_INTRO_0         "                 PRESENT"
-#define IDS_WTP_INTRO_1         "       TM designates trademark of\n          Sierra On-Line, Inc.\n    (c) 1985 Walt Disney Productions"
-
-#define IDS_WTP_HELP_0          "The <SPACE BAR> moves the pointer.      Press <RETURN> when it is by the choice you want.  Press the <Backspace> key to see what you just finished reading."
-#define IDS_WTP_HELP_1          "Press <C> to see what you are carrying. <Ctrl-S> turns the sound off and on.    <ESC> takes you to the playroom (in caseyou get lost or want to save the game)."
-
-#define IDS_WTP_GAME_OVER_0     "Congratulations!!  You did it!  You     returned everything that was lost.  Now,Christopher Robin invites you to a Hero party."
-#define IDS_WTP_GAME_OVER_1     "The good news is:  YOU are the Hero!!   The bad news is:  you have to find the  party by yourself.  Good luck!"
-
-#define IDS_WTP_OWL_0           "\"For example, that object you are       carrying now is interesting.  I know    I've seen it before.  Hmmm.  Let me     think about this . . .\""
-#define IDS_WTP_OWL_1           "\"You know, this object here beside me isfamiliar.  I'm sure I could give you    some sort of clue about it.             Let me see. . .\""
-
-#define IDS_WTP_WIND_0          "Oh, no!  The Blustery Wind begins to    howl.  It has returned, and mixed up    all the objects in the Wood."
-#define IDS_WTP_WIND_1          "But don't worry.  Everyone still has theobjects you returned to them.\n\n             (Today must be Winds-day!)"
-#define IDS_WTP_TIGGER          "\"Hallooooo, there!!!!  It's ME, Tigger! Let's BOUNCE!\""
-#define IDS_WTP_MIST            "Oh, look out!  The mysterious mist is   coming in.  It gets so thick that you   can't see through it.  Just keep walkingand it will soon clear up."
-
-#define IDS_WTP_SONG_0          "Winnie-the-Pooh, Winnie-the-Pooh, Tubby little cubby all stuffed with fluff,    He's Winnie-the-Pooh, Winnie-the-Pooh,  Willy, nilly, silly, old bear."
-#define IDS_WTP_SONG_1          "Deep in the Hundred Acre Wood,          Where Christopher Robin plays,          You will find the enchanted neighborhoodof Christopher's childhood days."
-#define IDS_WTP_SONG_2          "A donkey named Eeyore is his friend,    and Kanga and little Roo.  There's      Rabbit and Piglet and there's Owl       But most of all Winnie-the-Pooh!"
-
-#define IDS_WTP_NSEW            "North  South  East  West"
-#define IDS_WTP_TAKE            "Take"
-#define IDS_WTP_DROP            "Drop"
-#define IDS_WTP_CANT_GO         "\nSorry, but you can't go that way."
-#define IDS_WTP_CANT_TAKE       "You can't take it.  You can only carry  one object at a time."
-#define IDS_WTP_CANT_DROP       "You can't drop it.  Another object is   already here."
-#define IDS_WTP_WRONG_PLACE     "\nOk, but it doesn't belong here."
-#define IDS_WTP_OK              "\nOk."
-
-#define IDS_WTP_INVENTORY_0     "You are carrying nothing."
-#define IDS_WTP_INVENTORY_1     "Number of objects still missing:  %d"
-
-// COMMODORE 64 version strings
-
-#define IDS_WTP_FILE_SAVEGAME_C64   "saved game"
-#define IDS_WTP_DISK_ERROR_C64      "There is a problem with your disk drive.Please make sure your disk is in the    drive correctly."
-#define IDS_WTP_HELP_0_C64          "The <SPACE BAR> moves the pointer.      Press <RETURN> when it is by the choice you want.  <F1> brings back what you    have already read."
-#define IDS_WTP_HELP_1_C64          "<F3> takes you back to the playroom (if you get lost, or want to save the game).<F5> turns the sound off and on.        <F7> shows what you're carrying."
-#define IDS_WTP_WRONG_PLACE_C64 "\nOk, but this is not the right place."
-
-// maximum values
-
-#define IDI_WTP_MAX_OBJ_MISSING 10
-
-#define IDI_WTP_MAX_ROOM        62
-#define IDI_WTP_MAX_OBJ         40
-#define IDI_WTP_MAX_SND         14
-#define IDI_WTP_MAX_PIC         2
-
-#define IDI_WTP_MAX_ROOM_NORMAL         57
-#define IDI_WTP_MAX_ROOM_TELEPORT       30
-#define IDI_WTP_MAX_ROOM_OBJ            42
-#define IDI_WTP_MAX_BLOCK               4
-#define IDI_WTP_MAX_STR                 6
-#define IDI_WTP_MAX_OBJ_STR             4
-#define IDI_WTP_MAX_OBJ_STR_END         2
-#define IDI_WTP_MAX_FLAG                40
-#define IDI_WTP_MAX_OPTION              3
-#define IDI_WTP_MAX_DIR                 4
-#define IDI_WTP_MAX_MOVES_UNTIL_WIND    150
-
-// positions
-
-#define IDI_WTP_ROW_MENU        21
-#define IDI_WTP_ROW_OPTION_1    21
-#define IDI_WTP_ROW_OPTION_2    22
-#define IDI_WTP_ROW_OPTION_3    23
-#define IDI_WTP_ROW_OPTION_4    24
-
-#define IDI_WTP_COL_MENU        0
-#define IDI_WTP_COL_OPTION      1
-#define IDI_WTP_COL_NSEW        1
-#define IDI_WTP_COL_NORTH       1
-#define IDI_WTP_COL_SOUTH       8
-#define IDI_WTP_COL_EAST        15
-#define IDI_WTP_COL_WEST        21
-#define IDI_WTP_COL_TAKE        29
-#define IDI_WTP_COL_DROP        35
-#define IDI_WTP_COL_PRESENT     17
-
-// data file offset modifiers
-
-#define IDI_WTP_OFS_ROOM        0x5400
-#define IDI_WTP_OFS_OBJ         0x0800
-
-// picture
-
-#define IDI_WTP_PIC_WIDTH   140
-#define IDI_WTP_PIC_HEIGHT  159
-#define IDI_WTP_PIC_X0      10
-#define IDI_WTP_PIC_Y0      0
-#define IDI_WTP_PIC_FLAGS   IDF_AGI_PIC_V2
-
-// selections
-
-enum {
-	IDI_WTP_SEL_HOME = -2,
-	IDI_WTP_SEL_BACK,
-	IDI_WTP_SEL_OPT_1,
-	IDI_WTP_SEL_OPT_2,
-	IDI_WTP_SEL_OPT_3,
-	IDI_WTP_SEL_NORTH,
-	IDI_WTP_SEL_SOUTH,
-	IDI_WTP_SEL_EAST,
-	IDI_WTP_SEL_WEST,
-	IDI_WTP_SEL_TAKE,
-	IDI_WTP_SEL_DROP,
-	IDI_WTP_SEL_REAL_OPT_1,
-	IDI_WTP_SEL_REAL_OPT_2,
-	IDI_WTP_SEL_REAL_OPT_3
-};
-
-#define IDI_WTP_SEL_LAST    IDI_WTP_SEL_REAL_OPT_3
-
-// rooms
-
-enum {
-	IDI_WTP_ROOM_NONE = -1,
-	IDI_WTP_ROOM_NORTH,
-	IDI_WTP_ROOM_SOUTH,
-	IDI_WTP_ROOM_EAST,
-	IDI_WTP_ROOM_WEST
-};
-
-#define IDI_WTP_ROOM_HIDE   0
-
-#define IDI_WTP_ROOM_PICNIC 2
-#define IDI_WTP_ROOM_HOME   28
-#define IDI_WTP_ROOM_PARTY  58
-#define IDI_WTP_ROOM_MIST   59
-#define IDI_WTP_ROOM_TIGGER 61
-
-// sound
-
-enum ENUM_WTP_SOUND {
-	IDI_WTP_SND_POOH_0 = 1,
-	IDI_WTP_SND_TIGGER,
-	IDI_WTP_SND_TAKE,
-	IDI_WTP_SND_DROP,
-	IDI_WTP_SND_DROP_OK,
-	IDI_WTP_SND_FANFARE,
-	IDI_WTP_SND_POOH_1,
-	IDI_WTP_SND_KEYHELP,
-	IDI_WTP_SND_POOH_2,
-	IDI_WTP_SND_WIND_0,
-	IDI_WTP_SND_WIND_1
-};
-
-// script opcodes
-
-#define IDO_WTP_GOTO_ROOM   0x06
-#define IDO_WTP_PRINT_MSG   0x08
-#define IDO_WTP_PRINT_STR   0x0A
-#define IDO_WTP_DROP_OBJ    0x0C
-#define IDO_WTP_FLAG_CLEAR  0x0E
-#define IDO_WTP_FLAG_SET    0x10
-#define IDO_WTP_GAME_OVER   0x12
-#define IDO_WTP_WALK_MIST   0x14
-#define IDO_WTP_PLAY_SOUND  0x16
-#define IDO_WTP_SAVE_GAME   0x18
-#define IDO_WTP_LOAD_GAME   0x1A
-#define IDO_WTP_OWL_HELP    0x1C
-#define IDO_WTP_GOTO_RND    0x1E
-
-#define IDO_WTP_OPTION_0    0x15
-#define IDO_WTP_OPTION_1    0x16
-#define IDO_WTP_OPTION_2    0x17
-
-enum {
-	IDI_WTP_OBJ_DESC = 0,
-	IDI_WTP_OBJ_TAKE,
-	IDI_WTP_OBJ_DROP,
-	IDI_WTP_OBJ_HELP
-};
-
-enum {
-	IDI_WTP_PAR_OK = 0,
-	IDI_WTP_PAR_GOTO,
-	IDI_WTP_PAR_BACK
-};
-
-// room file option block
-
-struct WTP_ROOM_BLOCK {
-	uint16  ofsOpt[IDI_WTP_MAX_BLOCK];
-};
-
-// room file header
-
-struct WTP_ROOM_HDR {
-	uint8   roomNumber;
-	uint8   objId;
-	uint16  ofsPic;
-	uint16  fileLen;
-	uint16  reserved0;
-	int8    roomNew[IDI_WTP_MAX_DIR];
-	uint8   objX;
-	uint8   objY;
-	uint16  reserved1;
-	uint16  ofsDesc[IDI_WTP_MAX_BLOCK];
-	uint16  ofsBlock[IDI_WTP_MAX_BLOCK];
-	uint16  ofsStr[IDI_WTP_MAX_STR];
-	uint32  reserved2;
-	WTP_ROOM_BLOCK  opt[IDI_WTP_MAX_BLOCK];
-};
-
-// object file header
-
-struct WTP_OBJ_HDR {
-	uint16  fileLen;
-	uint16  objId;
-	uint16  ofsEndStr[IDI_WTP_MAX_OBJ_STR_END];
-	uint16  ofsStr[IDI_WTP_MAX_OBJ_STR];
-	uint16  ofsPic;
-};
-
-// savegame
-
-struct WTP_SAVE_GAME {
-	uint8   fSound;
-	uint8   nMoves;
-	uint8   nObjMiss;
-	uint8   nObjRet;
-	uint8   iObjHave;
-	uint8   fGame[IDI_WTP_MAX_FLAG];
-	uint8   iUsedObj[IDI_WTP_MAX_OBJ_MISSING];
-	uint8   iObjRoom[IDI_WTP_MAX_ROOM_OBJ];
-};
-
-class PreAgiEngine;
-
-class WinnieEngine : public PreAgiEngine {
-public:
-	WinnieEngine(OSystem *syst, const AGIGameDescription *gameDesc);
-	~WinnieEngine() override;
-
-	void init();
-	Common::Error go() override;
-
-	void debugCurRoom();
-
-private:
-	WTP_SAVE_GAME _gameStateWinnie;
-	int _room;
-	int _mist;
-	bool _doWind;
-	bool _winnieEvent;
-	int _tiggerMist;
-
-	int _roomOffset;
-	int _objOffset;
-	bool _isBigEndian;
-	Common::Rect hotspotNorth, hotspotSouth, hotspotEast, hotspotWest;
-
-	void randomize();
-	void intro();
-	void drawPic(const char *);
-	void gameLoop();
-
-	void parseRoomHeader(WTP_ROOM_HDR *roomHdr, byte *buffer, int len);
-	void parseObjHeader(WTP_OBJ_HDR *objHdr, byte *buffer, int len);
-	uint32 readRoom(int, uint8 *, WTP_ROOM_HDR &);
-
-	void drawRoomPic();
-	int parser(int, int, uint8 *);
-	int getObjInRoom(int);
-	bool getSelOkBack();
-	void getMenuSel(char *, int *, int[]);
-	void keyHelp();
-	void clrMenuSel(int *, int[]);
-	void incMenuSel(int *, int[]);
-	void decMenuSel(int *, int[]);
-	void drawMenu(char *, int, int[]);
-	void printRoomStr(int, int);
-	void inventory();
-	void printObjStr(int, int);
-	uint32 readObj(int, uint8 *);
-	void takeObj(int);
-	void dropObj(int);
-	bool isRightObj(int, int, int *);
-	void drawObjPic(int, int, int);
-	void getMenuMouseSel(int *, int[], int, int);
-	void setWinnieFlag(int);
-	void clearWinnieFlag(int);
-	void gameOver();
-	void saveGame();
-	void loadGame();
-	void dropObjRnd();
-	void setTakeDrop(int[]);
-	void makeSel(int *, int[]);
-
-	void wind();
-	void mist();
-	void tigger();
-
-	void showOwlHelp();
-	bool playSound(ENUM_WTP_SOUND);
-
-	void printStrWinnie(char *szMsg);
-};
-
-} // End of namespace Agi
-
-#endif


Commit: f7a55f3251dc8205059de9c3f2622e8c146924e8
    https://github.com/scummvm/scummvm/commit/f7a55f3251dc8205059de9c3f2622e8c146924e8
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2022-05-28T16:47:47+03:00

Commit Message:
NEWS: Added some not mentioned changes for version 2.6.0

Changed paths:
    NEWS.md


diff --git a/NEWS.md b/NEWS.md
index 8bad6775f89..5f9c218c18d 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -17,15 +17,21 @@ For a more comprehensive changelog of the latest experimental code, see:
  General:
    - The project license has been upgraded to GPLv3+.
    - Now ScummVM requires C++11 for building.
+   - Removed support for VS2008, as it doesn't support C++11.
    - Implemented enhanced filtering in the Search box. See "Understanding
      the search box" in the documentation for details.
    - Implemented Icon view in GUI (GSoC task).
    - Added support for the RetroWave OPL3 sound card.
+   - Added OpenDingux beta port.
    - Removed Symbian port.
+   - Added the create_engine tool to aid when creating new engines.
 
  AGI:
    - Added support for Macintosh versions of Manhunter 1-2.
 
+ AGS:
+   - Synced changes from upstream AGS.
+
  AGOS:
    - Elvira 1: Added support for Casio MT-540/CT-460/CSM-1 and CMS/GameBlaster.
    - Elvira 1 & 2, Waxworks, Simon the Sorcerer: Added AdLib OPL3 mode.
@@ -67,6 +73,9 @@ For a more comprehensive changelog of the latest experimental code, see:
  Dreamweb:
    - Added text to speech for dialogs and object descriptions.
 
+ Glk:
+   - Added support for ZX Spectrum games with graphics in the Scott sub-engine.
+
  Kyra:
    - Added support for the Traditional Chinese versions of Legend of Kyrandia 1 - 3.
    - Added sound support for the Macintosh version of Legend of Kyrandia.
@@ -84,6 +93,8 @@ For a more comprehensive changelog of the latest experimental code, see:
      KQ1, KQ4, KQ5, KQ6, KQ7, LB1, LB2, LIGHTHOUSE, LONGBOW, LSL1, LSL2, LSL3,
      LSL5, LSL6, LSL6HIRES, LSL7, PEPPER, PHANT2, PQ1, PQ2, PQ3, PQ4, PQSWAT,
      QFG1, QFG1VGA, QFG2, QFG3, QFG4, SHIVERS, SQ1, SQ3, SQ4, SQ5, SQ6, TORIN.
+   - Fixed many script bugs in KQ6, KQ7, GK2, QFG3, QFG4, Hoyle4.
+   - Fixed loading autosaves in Shivers and Phantasmagoria 2.
 
  SCUMM:
    - New Digital iMUSE engine.
@@ -108,6 +119,7 @@ For a more comprehensive changelog of the latest experimental code, see:
      of Monkey Island in accordance to the original interpreters.
    - Rewrote timer handling routines to better approximate both the original
      hardware behavior and the intepreters' quirks.
+   - Fix lip syncing in Backyard Baseball 2003.
 
  Sherlock:
    - Fixed slowdown in Serrated Scalpel intro when playing the game from a small
@@ -126,6 +138,10 @@ For a more comprehensive changelog of the latest experimental code, see:
    - Fixed wrong shooting direction for some actors.
    - Fixed door movement in some situations.
 
+ Android port:
+   - Added hardware acceleration for 3D graphics.
+   - Improved touch controls.
+
  macOS port:
    - Added support for displaying OSD messages on the Touch Bar.
 




More information about the Scummvm-git-logs mailing list